Nhắc gọi lại lead quá hạn chưa ai xử lý
Lead đã nằm trong Sheet, tin báo đã vào nhóm, nhưng không ai nhận gọi. Bài này thêm một luồng canh: lead nào để trống trạng thái quá lâu thì nhắc lại, mỗi lead một lần.
Luồng ở bài 1 báo từng lead vào nhóm Telegram. Luồng ở bài 2 lưu lead vào Google Sheet. Nhưng tin báo vào nhóm không có nghĩa là có người gọi. Ai cũng thấy tin, ai cũng nghĩ người khác đã nhận, và lead nằm yên trong Sheet với ô trạng thái trống. Bài này dựng một luồng canh: cứ 30 phút đọc Sheet một lần, lead nào chưa ai xử lý quá ngưỡng anh chị đặt thì nhắc vào Telegram, rồi đánh dấu đã nhắc.
Tóm tắt nhanh
- Luồng:
Schedule Trigger→Google Sheets(đọc dòng) →Code(tính tuổi lead) →If(quá hạn chưa nhắc) →Telegram→Google Sheets(ghi cột đã nhắc). - Thêm một cột
da_nhacvào Sheet để mỗi lead chỉ bị nhắc một lần. - Gửi nhắc trước, đánh dấu sau. Nhắc trùng một lần vẫn hơn để sót lead.
Bước 1: Thêm cột đánh dấu vào Sheet
Dùng lại trang tính lead của bài 2. Luồng này cần ba cột đã có và một cột mới:
| Cột | Luồng dùng để làm gì |
|---|---|
thoi_gian | Tính lead đã chờ bao lâu. Phải đúng định dạng yyyy-LL-dd HH:mm:ss, giờ Việt Nam. |
trang_thai | Còn trống nghĩa là chưa ai xử lý. |
ten, sdt, trang | Đưa vào tin nhắc để người nhận gọi được ngay. |
da_nhac (mới) | Luồng ghi giờ đã nhắc vào đây. Có giá trị thì không nhắc nữa. |
Thêm cột da_nhac ở cuối dòng tiêu đề. Luồng ghi lead ở bài 2 không cần sửa: nó ánh xạ từng cột theo tên, cột mới chỉ để trống.
Bước 2: Hẹn giờ chạy trong giờ làm việc
Đặt múi giờ Asia/Ho_Chi_Minh trong Settings của workflow như bài báo cáo cuối ngày. Thêm node Schedule Trigger, chọn chế độ biểu thức cron (Custom Cron, tên có thể khác theo phiên bản):
# phút 0 và 30, từ 8 giờ đến 20 giờ, thứ Hai đến thứ Bảy
*/30 8-20 * * 1-6
Giới hạn giờ chạy để không ai bị gọi dậy lúc nửa đêm. Lead đến ban đêm vẫn không mất: sáng hôm sau, lần chạy đầu tiên thấy nó đã quá ngưỡng và nhắc ngay.
Bước 3: Đọc Sheet và tính tuổi từng lead
Thêm node Google Sheets, thao tác đọc dòng (Get Row(s)), chọn file và trang tính lead. Mỗi dòng ra một item, kèm trường row_number là số thứ tự dòng trong Sheet. Bước 6 sẽ cần trường này.
Thêm node Code, chế độ chạy một lần cho tất cả item (Run Once for All Items):
// Ngưỡng do anh chị tự đặt. 120 chỉ là giá trị ví dụ để chạy thử.
const NGUONG_PHUT = 120;
const bayGio = DateTime.now().setZone('Asia/Ho_Chi_Minh');
return $input.all().map(item => {
const r = item.json;
const t = DateTime.fromFormat(String(r.thoi_gian || ''), 'yyyy-LL-dd HH:mm:ss',
{ zone: 'Asia/Ho_Chi_Minh' });
const chuaXuLy = !String(r.trang_thai || '').trim();
const chuaNhac = !String(r.da_nhac || '').trim();
const tuoiPhut = t.isValid ? Math.floor(bayGio.diff(t, 'minutes').minutes) : null;
return { json: {
...r,
tuoi_phut: tuoiPhut,
qua_han: chuaXuLy && chuaNhac && tuoiPhut !== null && tuoiPhut >= NGUONG_PHUT
} };
});
Đoạn mã không lọc bỏ dòng nào, chỉ gắn thêm hai trường: tuoi_phut (lead đã chờ bao nhiêu phút) và qua_han (đúng hay sai). Việc chọn dòng để node If làm, nhìn vào lịch sử chạy sẽ dễ hiểu hơn.
Bước 4: Node If tách lead cần nhắc
Thêm node If, một điều kiện kiểu Boolean (đúng/sai): giá trị {{ $json.qua_han }}, phép so sánh is true. Nhánh đúng (true) đi tiếp sang Telegram. Nhánh sai (false) để trống, n8n tự dừng ở đó.
Trường hợp không có lead nào quá hạn, nhánh đúng không có item và các node phía sau không chạy. Không có tin nào được gửi. Với luồng nhắc thì im lặng là đúng: im lặng nghĩa là đội đang xử lý kịp.
Bước 5: Gửi tin nhắc vào Telegram
Thêm node Telegram, thao tác gửi tin, dùng lại credential (thông tin đăng nhập đã lưu trong n8n) và chat id của nhóm từ bài 1. Ô Text:
⏰ Lead chờ {{ Math.floor($json.tuoi_phut / 60) }} giờ {{ $json.tuoi_phut % 60 }} phút chưa ai xử lý
Tên: {{ $json.ten }}
SĐT: {{ $json.sdt }}
Trang: {{ $json.trang }}
Nhận lúc: {{ $json.thoi_gian }}
Gọi xong nhớ điền cột trang_thai.
Mỗi lead quá hạn thành một tin riêng. Nếu Sheet có cột người phụ trách, thêm một dòng nêu tên người đó để cả nhóm biết đang chờ ai.
Bước 6: Ghi cột đã nhắc
Nối sau Telegram một node Google Sheets nữa, thao tác cập nhật dòng (Update Row), cùng file và trang tính. Ở phần cột để so khớp (Column to Match On), chọn row_number. Điền hai ô:
row_number = {{ $('If').item.json.row_number }}
da_nhac = {{ $now.setZone('Asia/Ho_Chi_Minh').toFormat('yyyy-LL-dd HH:mm:ss') }}
Phải lấy row_number từ node If, vì dữ liệu ra khỏi node Telegram là phản hồi của Telegram, không còn các cột của Sheet. Nếu phiên bản n8n của anh chị không cho so khớp theo row_number, thêm vào Sheet một cột mã lead không trùng và so khớp theo cột đó. Không dùng sdt làm khoá, vì một khách gửi form hai lần sẽ có hai dòng cùng số.
Bẫy khi dựng luồng nhắc
| Bẫy | Chuyện gì xảy ra | Cách tránh |
|---|---|---|
| Đánh dấu trước, gửi sau | Telegram lỗi đúng lúc đó, dòng đã ghi “đã nhắc”. Lead im lặng mãi mãi. | Telegram đứng trước, ghi Sheet đứng sau. Lỗi ở bước ghi thì lần sau nhắc lại một lần, chấp nhận được. |
| Không có cột đánh dấu | Cứ 30 phút lại nhắc cùng một lead. Nhóm ngập tin, mọi người tắt thông báo. | Cột da_nhac và điều kiện chuaNhac trong mã. |
| Lệch múi giờ | Cột thoi_gian ghi giờ Việt Nam nhưng mã hiểu là giờ UTC. Lead mới đến đã bị coi là chờ 7 tiếng, hoặc ngược lại không bao giờ đến hạn. | Ghi zone: 'Asia/Ho_Chi_Minh' ở cả lúc đọc giờ lead lẫn lúc lấy giờ hiện tại. |
| Dòng gõ tay sai định dạng | Ai đó gõ 8/10 9h vào cột thời gian. Mã không đọc được giờ, lead đó không bao giờ bị nhắc. | Không cho gõ tay cột thoi_gian. Muốn chắc hơn, cho dòng có giờ sai định dạng đi một nhánh báo riêng. |
trang_thai thì lead vẫn bị nhắc như chưa ai gọi. Đó không phải lỗi luồng, đó là tín hiệu đội đang bỏ qua bước ghi kết quả.Bước tiếp theo: lời nhắc giải quyết từng lead. Để nhìn cả ngày, xem báo cáo lead cuối ngày, dòng “Chưa gọi” trong đó sẽ giảm dần khi luồng nhắc chạy đều.
Câu hỏi thường gặp
Ngưỡng bao lâu thì nên nhắc?
Không có con số đúng cho mọi doanh nghiệp. Anh chị nhìn giờ làm việc và số người trực của đội mình rồi tự đặt. Trong bài, ngưỡng 120 phút chỉ là giá trị ví dụ để chạy thử, sửa ở một dòng đầu đoạn mã.
Lead đến lúc nửa đêm thì có bị nhắc lúc nửa đêm không?
Không, nếu anh chị giới hạn giờ chạy trong Schedule Trigger như bài hướng dẫn, ví dụ 8:00 đến 20:30 các ngày làm việc. Lead đến ban đêm sẽ được nhắc ở lần chạy đầu tiên của sáng hôm sau, vì lúc đó nó đã quá ngưỡng.
Vì sao không nhắc lại mỗi 30 phút cho đến khi có người gọi?
Nhắc lặp nhiều lần làm nhóm Telegram ngập tin, người trong nhóm sẽ tắt thông báo và lời nhắc mất tác dụng. Bài này nhắc mỗi lead một lần. Muốn nhắc lần hai ở mốc dài hơn, thêm một cột đánh dấu thứ hai và một ngưỡng thứ hai.
Người gọi xong mà quên điền trạng thái thì sao?
Luồng sẽ coi như chưa ai gọi và vẫn nhắc. Đó là cố ý: lời nhắc cũng là cách nhắc đội ghi lại kết quả. Thống nhất trong đội rằng gọi xong phải điền ô trạng thái, một chữ ngắn là đủ.