Thực hành n8n đa kênh · Bài 8

Nhắc lịch và chăm sóc khách theo mốc bằng n8n

Khách đăng ký rồi im lặng, lịch hẹn sắp tới mà không ai nhắc: những việc này hợp với workflow chạy theo lịch. Bài viết dựng từng bước một chuỗi chăm sóc theo mốc ngày và một luồng nhắc lịch hẹn, có bảng lưu trạng thái, chốt chặn gửi trùng và điểm dừng khi khách không muốn nhận. Đối chiếu tài liệu n8n bản 2.44.4 và ghi chú bản 2.45, kiểm tra tháng 10/2026.

Cập nhật 21/10/2026⏱ 10 phút đọcCài đặt & bắt đầuTrung cấp

Khách đăng ký rồi im lặng, lịch hẹn tới mà không ai nhắc

Một trung tâm đào tạo ghi lịch gọi lại khách vào sổ tay: tuần bận thì quên, tuần rảnh lại nhắn cùng một câu ba lần. Có khách đến khai giảng muộn vì không ai nhắc, có khách chặn trang vì bị nhắn quá nhiều. (Tình huống minh hoạ.)

Bài này dựng hai workflow: chăm sóc theo mốc (ngày 1, ngày 3, ngày 7 sau khi khách để lại thông tin) và nhắc lịch hẹn (trước một ngày và trước giờ hẹn). Phân loại khách nóng, ấm, lạnh đã có ở n8n cho Sales & CSKH; ở đây tập trung vào lịch, trạng thái và điểm dừng.

Chăm sóc khách theo mốc bằng n8n là gì?

Chăm sóc khách theo mốc bằng n8n là dùng workflow chạy theo lịch để đọc bảng trạng thái khách, chọn đúng mốc cần chạm hôm nay, gửi tin hoặc báo nhân viên, rồi ghi lại mốc kế tiếp; khách từ chối, đã mua hay hết khung được nhắn thì chuỗi dừng.

Hai cách thiết kế nhắc lịch và chăm sóc khách theo mốc trong n8n: cách một dùng node Wait chờ trong một execution, execution được lưu vào cơ sở dữ liệu khi chờ quá 65 giây và Wait dùng giờ máy chủ; cách hai dùng Schedule Trigger 8:00 mỗi sáng quét bảng trạng thái gồm cột khách, mốc, ngày, chọn khách chưa chạm hôm nay, chạm đúng khách đến hạn rồi ghi mốc kế tiếp; gợi ý chờ ngắn dùng Wait, chuỗi nhiều ngày dùng quét bảng
Hình: Chờ trong workflow hay quét bảng trạng thái mỗi ngày (minh hoạ)
Wait trong một executionSchedule Trigger quét bảng
Cách chạyDừng ở node Wait, chạy tiếp sau một khoảng, tới giờ đặt sẵn hoặc khi có webhook, formMỗi ngày một lượt, lấy các dòng đến hạn
Trạng thái nằm ở đâuTrong execution đang chờ (lưu vào cơ sở dữ liệu nếu chờ từ 65 giây trở lên)Trong bảng: nhìn là biết khách ở mốc nào
GiờLuôn dùng giờ máy chủ n8n, bỏ qua múi giờ của workflowTheo múi giờ workflow, không có thì múi giờ instance
Hợp vớiChờ ngắn trong một luồng: nhắc trước giờ hẹn, chờ nhân viên xử lýChuỗi nhiều ngày, nhiều khách

Nguồn: Wait node · Schedule Trigger · Workflow settings – Timezone

Bước 1. Chọn nơi lưu trạng thái và tạo bảng

Nơi lưuHợp không?Theo tài liệu
Data tables của n8nHợp: có sẵn, không cần cơ sở dữ liệu ngoàiNode Data Table có Get, Insert, Update, Upsert, If Row Exists…; tổng dung lượng mặc định 200 MiB mỗi instance; mặc định mọi thành viên project xem được
Google SheetsHợp khi đội sale cần xem, sửa trên bảng tínhGoogle giới hạn 60 lượt đọc và 60 lượt ghi mỗi phút cho mỗi người dùng; xem Google Sheets làm CRM
Custom variables ($vars)KhôngChỉ đọc trong workflow; chỉ có ở Cloud Pro, Enterprise, tự cài Business, Enterprise

Tạo một data table tên cham_soc_khach với các cột dưới. Mỗi khách một dòng; workflow nhận khách mới (từ form, chatbot, quảng cáo) dùng Data Table → Upsert theo ma_khach để không tạo dòng trùng, đặt moc_tiep = D1 và ngay_moc_tiep = ngày mai.

Các cột của bảng trạng tháiKhông dán vào Termius, chỉ để đối chiếu
ma_khach         # mã ngẫu nhiên, không dùng số điện thoại làm mã
kenh             # messenger / zalo_oa / email
tuong_tac_cuoi   # lần cuối khách nhắn, bấm nút, trả lời (dùng để tính khung được nhắn)
trang_thai       # dang-cham / da-mua / tam-dung / tu-choi
moc_tiep         # D1 / D3 / D7 / xong
ngay_moc_tiep    # dạng 2026-10-25
ngay_cham_cuoi   # ngày đã chạm gần nhất, chống gửi trùng
lan_cham         # số lần đã chạm
ngay_hen         # ngày lịch hẹn hoặc khai giảng (nếu có)
gio_hen          # giờ hẹn, dạng 09:00

Nguồn: Data Table – Rows · Data tables · Custom variables

Bước 2. Đặt đúng múi giờ

Bản tự cài mặc định dùng giờ New York, nên lịch "8 giờ sáng" sẽ chạy lệch giờ Việt Nam. Trên n8n Cloud hoặc khi không sửa được máy chủ, mở Workflow Settings → Timezone chọn Asia/Ho_Chi_Minh. Bản tự cài thêm hai dòng sau vào tệp .env rồi khởi động lại (cách sửa tệp: Hướng dẫn cài n8n trên VPS):

Nội dung tệp .envCopy rồi dán vào tệp trên máy chủ; thay phần trong <…>
# Tệp .env của n8n tự cài (xem bài cài n8n trên VPS)
GENERIC_TIMEZONE=Asia/Ho_Chi_Minh   # múi giờ cho Schedule Trigger và biểu thức ngày
TZ=Asia/Ho_Chi_Minh                 # giờ hệ thống của container; node Wait dùng giờ máy chủ
# Chỉ khi chạy bản 2.36.0–2.44.x và muốn dùng bộ lập lịch bền (từ 2.45.0 đã bật mặc định):
# N8N_SCHEDULER_ENABLED=true

$now, $today dùng múi giờ workflow, nếu không có thì GENERIC_TIMEZONE. Riêng node Wait luôn dùng giờ máy chủ, nên cần cả dòng TZ.

Nguồn: Workflow settings · Dates and times · Wait – giờ máy chủ

Bước 3. Workflow chăm sóc theo mốc

Hành trình chăm sóc khách theo mốc bằng n8n, ví dụ minh hoạ: ngày 0 xác nhận đăng ký, ngày 1 giải đáp băn khoăn thường gặp, ngày 3 gửi tài liệu hữu ích, ngày 7 hỏi khách có muốn tư vấn viên gọi không, trước khai giảng nhắc lịch; mỗi lần chạm một góc khác nhau; khách trả lời quan tâm thì báo Sale qua Telegram; khách từ chối thì dừng ngay và ghi trạng thái; hết khung được nhắn của kênh thì chuyển nhân viên
Hình: Mỗi mốc một góc khác nhau, dừng ngay khi khách từ chối (minh hoạ)
  1. Schedule Trigger: Trigger Interval = Days, giờ 8; hoặc Custom (Cron) 0 8 * * * (8:00 mỗi ngày). Workflow chỉ chạy theo lịch sau khi bấm Publish.
  2. Data Table (Row → Get), Must Match = All Conditions: trang_thai Equals dang-cham và ngay_cham_cuoi Not Equals ngày hôm nay; bật Return All. Điều kiện thứ hai là chốt chặn gửi trùng nếu workflow lỡ chạy hai lần trong ngày.
  3. If, kiểu Date & Time: ngay_moc_tiep "is before or equal to" ngày hôm nay. Chỉ khách đến hạn đi tiếp; khách bị lỡ hôm trước vẫn được chạm hôm nay.
  4. If thứ hai kiểm tra khung được nhắn của kênh dựa trên tuong_tac_cuoi (phép so "is after"). Ngoài khung thì rẽ sang nhánh báo nhân viên, không để bot gửi.
  5. Switch theo moc_tiep: mỗi nhánh D1, D3, D7 một mẫu tin đã duyệt, mỗi mẫu một góc tiếp cận khác nhau.
  6. Gửi qua kênh của khách: HTTP Request tới Messenger hoặc Zalo OA (Messenger, Zalo OA), hoặc Gmail, Send Email (Email tự động).
  7. Data Table (Row → Update) theo ma_khach: ghi ngay_cham_cuoi, tăng lan_cham, chuyển moc_tiep sang mốc sau; sau D7 thì xong và trang_thai = tam-dung.
Biểu thức ngày dùng trong các ôKhông dán vào Termius, chỉ để đối chiếu
Ngày hôm nay:            {{ $today.toISODate() }}
Mốc kế tiếp sau 2 ngày:  {{ $today.plus({days: 2}).toISODate() }}
Ngày mai (để nhắc hẹn):  {{ $today.plus({days: 1}).toISODate() }}
Tăng số lần chạm:        {{ Number($json.lan_cham || 0) + 1 }}

Lưu ngày dạng 2026-10-25 để so sánh nhất quán; toISODate(), plus() là hàm Luxon mà n8n dùng.

MốcGóc tiếp cận (ví dụ minh hoạ)Ai gửi
D1Giải đáp ba băn khoăn khách hay hỏi nhấtBot, nếu còn trong khung của kênh
D3Gửi một tài liệu, bài hướng dẫn hữu ích liên quan nhu cầu khách đã nêuBot hoặc nhân viên
D7Hỏi khách có muốn tư vấn viên gọi không; nói rõ sẽ không nhắn thêm nếu khách không cầnNhân viên duyệt trước

Nguồn: Schedule Trigger – cron · Data Table – điều kiện · If – Date &amp; Time · n8n – ngày giờ · Luxon – DateTime

Bước 4. Workflow nhắc lịch hẹn và khai giảng

  1. Schedule Trigger mỗi ngày lúc 9:00.
  2. Data Table (Row → Get): ngay_hen Equals ngày mai, trang_thai Not Equals tu-choi.
  3. Gửi lời nhắc thứ nhất: ngày giờ, địa điểm hoặc đường dẫn phòng học trực tuyến, cách báo đổi lịch.
  4. If, kiểu Date & Time: thời điểm nhắc (hai giờ trước giờ hẹn, ghép từ ngay_hen và gio_hen) phải "is after" thời điểm hiện tại; sai hoặc trống thì rẽ sang nhánh báo người phụ trách sửa dữ liệu, không để execution chờ một mốc vô lý.
  5. Wait, Resume = At Specified Time, ô Date and Time điền biểu thức thời điểm nhắc ở trên.
  6. Data Table (Row → Get) đọc lại dòng của khách, If: khách chưa huỷ, chưa từ chối thì gửi lời nhắc thứ hai.

Execution đang chờ ở node Wait được lưu vào cơ sở dữ liệu và không bị tự dọn khi n8n xoá dữ liệu execution cũ. Đọc lại bảng sau khi chờ là bước quan trọng: trong lúc chờ, khách có thể đã đổi lịch hoặc báo không đến.

Nguồn: Wait – At Specified Time · Execution data – pruning

Bước 5. Dừng ngay khi khách từ chối, báo Sale khi khách quan tâm

Workflow nhận tin nhắn đến (chatbot Messenger, Zalo OA, email trả lời) thêm ba việc:

Nếu dùng AI Agent để nhận ra câu từ chối, khi AI không chắc hãy coi là từ chối.

Nguồn: Data Table – Update · Telegram node

Khi máy chủ khởi động lại: lượt chạy có mất không?

Phương án ổn định: tài liệu n8n ghi bản beta có thể chưa ổn định, nên máy chạy thật hãy ở bản stable (2.44.4 tại ngày kiểm tra), chỉ thử 2.45 trên máy thử. Workflow ở Bước 3 đã chịu được lượt bị lỡ với mọi bộ lập lịch: điều kiện ngay_moc_tiep "is before or equal to" hôm nay đưa khách bị lỡ vào lượt hôm sau. Muốn không mất lượt ngay trên bản stable, có thể bật N8N_SCHEDULER_ENABLED=true (có từ 2.36.0), thử trên máy thử trước; lên 2.45 thì xoá dòng này vì đã là mặc định.

Khi dùng bộ lập lịch bền, chọn Run the Most Recent Missed Execution là hợp lý; điều kiện ngay_cham_cuoi giúp khách không bị nhắn hai lần. Gắn thêm error workflow: Giám sát lỗi, sao lưu và phiên bản workflow.

Nguồn: Durable scheduler · Schedule Trigger – If Execution Is Missed · Changelog n8n

Cách Aduca đang làm (mức nguyên tắc)

Aduca vận hành chatbot tư vấn trên n8n ở Zalo OA, Messenger và website, đọc kịch bản trong Second Brain. Cùng hệ thống có luồng tự chăm sóc khách theo mốc, nhắc khai giảng và báo Sale khách nóng qua Telegram. Kịch bản sửa ở một nơi, có bộ câu hỏi thử để chạy lại sau mỗi lần sửa (xem Chatbot n8n đọc kịch bản từ Second Brain).

Workflow trong bài là ví dụ minh hoạ cho mọi doanh nghiệp, không phải cấu hình của Aduca.

An toàn và chính sách

KênhĐược nhắn chủ động khi nàoNgoài khung
MessengerTrong 24 giờ sau hành động của khách (tới 7 ngày nếu khách đến từ quảng cáo Click-to-Messenger)Thẻ HUMAN_AGENT chỉ cho người thật trả lời; không dùng thẻ để chào bán
Zalo OATin Tư vấn miễn phí trong 48 giờ từ tương tác cuối; qua API chỉ gửi được khi khách tương tác trong 7 ngàyTừ 48 giờ đến 7 ngày tính phí theo bảng giá Zalo (55 đ/tin tại 10/2026, giá có thể thay đổi) hoặc trừ hạn mức của gói OA; quá 7 ngày API không gửi được
EmailThư quảng cáo cần đồng ý trước, tối đa 3 thư/24 giờ theo Nghị định 91/2020Xem Email tự động

Tổng hợp đầy đủ theo kênh, gồm SMS: Bám đuổi khách đúng chính sách. Bài viết không phải tư vấn pháp lý.

Nguồn: Meta – Messenger policy · Zalo – điều kiện gửi tin Tư vấn · Zalo OA – các loại tin nhắn · Zalo OA – bảng giá · Luật 91/2025/QH15

Kiểm tra đã chạy đúng

Lỗi thường gặp

Hiện tượngNguyên nhân thường gặpCách xử lý
Lịch chạy lệch nhiều giờChưa đặt múi giờ, đang dùng giờ New YorkĐặt Timezone trong Workflow Settings hoặc GENERIC_TIMEZONE
Lời nhắc của Wait lệch giờWait dùng giờ máy chủĐặt TZ cho container
Schedule Trigger không chạyWorkflow chưa publishBấm Publish; xem tab Executions
Sửa biến trong biểu thức cron không có tác dụngBiến chỉ được tính lúc publishUnpublish rồi publish lại
Khách nhận cùng một tin hai lầnThiếu điều kiện ngay_cham_cuoiThêm điều kiện, cập nhật bảng ngay sau khi gửi
Lỗi khi ghi bảngData tables vượt 200 MiB, hoặc Google Sheets báo 429Dọn dòng cũ; với Sheets đọc một lần mỗi lượt, giãn nhịp ghi

Nguồn: Schedule Trigger · Wait · Data tables – giới hạn

Bắt đầu từ đâu?

  1. Hôm nay: đặt múi giờ, tạo bảng trạng thái và nhập vài khách thử.
  2. Tuần này: dựng workflow chăm sóc theo mốc với một kênh, chạy với khách thử đến khi đủ mục kiểm tra; ba mẫu tin ba góc khác nhau, có người duyệt.
  3. Sau đó: thêm nhắc lịch hẹn, nối điểm dừng vào chatbot, rồi đọc Bám đuổi khách đúng chính sách trước khi mở rộng sang kênh khác.

Muốn được tư vấn hoặc cùng thiết kế chuỗi chăm sóc phù hợp quy trình bán hàng của bạn, bạn có thể đăng ký Tư vấn 1-1 hoặc Coaching 1-1 cho doanh nghiệp; chi phí báo sau buổi tư vấn.

Đọc tiếp: Bám đuổi khách đúng chính sách →

Câu hỏi thường gặp

Nên dùng node Wait chờ 3 ngày hay Schedule Trigger quét bảng mỗi ngày?

Cả hai đều chạy được. Chờ vài phút đến vài giờ trong một luồng thì Wait gọn hơn. Chuỗi chăm sóc nhiều ngày, nhiều khách thì quét bảng mỗi ngày dễ theo dõi hơn: nhìn bảng là biết khách đang ở mốc nào, sửa nội dung một mốc thì lượt quét sau dùng nội dung mới. Tài liệu n8n không so sánh hai cách, đây là lựa chọn thiết kế.

Máy chủ n8n khởi động lại thì lịch có bị mất lượt không?

Phụ thuộc phiên bản. Trước 2.45, bộ lập lịch chạy trong bộ nhớ bỏ qua lượt lỡ khi máy chủ tắt. Từ 2.45.0, bộ lập lịch bền (durable scheduler) bật mặc định, lưu lượt chạy vào cơ sở dữ liệu nên khởi động lại không mất lượt; lượt lỡ có chạy bù hay không tuỳ thời gian ân hạn và chính sách bạn chọn. Tại ngày kiểm tra, 2.45.0 vẫn là bản beta.

Có lưu trạng thái khách trong biến $vars được không?

Không. Theo tài liệu n8n, custom variables chỉ đọc trong workflow, chỉ có ở Cloud Pro, Enterprise và bản tự cài Business, Enterprise. Trạng thái thay đổi theo từng khách nên lưu ở Data tables, Google Sheets hoặc cơ sở dữ liệu.

Khách không trả lời tin nào thì chăm sóc đến bao giờ?

Hãy đặt sẵn điểm kết thúc, ví dụ sau mốc cuối mà khách vẫn im lặng thì chuyển trạng thái tạm dừng. Theo Luật Bảo vệ dữ liệu cá nhân 91/2025/QH15, im lặng không được coi là đồng ý; mỗi kênh còn có khung thời gian được nhắn riêng.

Tin chăm sóc nên do bot gửi hay nhân viên gửi?

Tin mẫu đã duyệt, còn trong khung thời gian của kênh và khách đã đồng ý thì bot gửi được. Ngoài khung, tin cần cá nhân hoá hoặc khách đang hỏi mua thì workflow nên báo nhân viên qua Telegram để người thật quyết định.

Tài liệu liên quan

Xem tất cả tài liệu hướng dẫn →

Bước tiếp theo

Đăng ký tư vấn 1:1

Chuyên gia Aduca cùng bạn xem quy trình hiện tại, chọn việc nên giao cho AI Agent trước và cách kiểm soát rủi ro.

Về AducaChuỗi bài do đội ngũ Aduca biên soạn từ kinh nghiệm đào tạo và triển khai AI Agent cho Marketing – Sales. Aduca Academy do Nguyễn Đức – Chủ tịch Aduca Group sáng lập; ông kinh doanh thương mại điện tử từ 2012, chạy quảng cáo Facebook từ 2014 và đào tạo từ 2016. Phần thực hành từng bước nằm trong các thư mục OpenClaw, Hermes Agent, Claude, ChatGPT và n8n, Second Brain.

Nguồn tham khảo

Lịch sử cập nhật

Miễn trừ trách nhiệm

Bài viết thuộc chuỗi kiến thức của Công ty Cổ phần Giáo dục Aduca, chia sẻ miễn phí cho mục đích học tập. Thông tin kỹ thuật đối chiếu với tài liệu chính thức của các dự án và nền tảng tại ngày cập nhật (có ghi nguồn); phần nhận định là quan điểm của Aduca. OpenClaw, Hermes Agent, Claude (thương hiệu của Anthropic), ChatGPT (thương hiệu của OpenAI), n8n (thương hiệu của n8n GmbH), các phần mềm chạy model và các model AI mở (Ollama, LM Studio, Qwen, Gemma, gpt-oss…), Obsidian, Notion, phương pháp Building a Second Brain (Tiago Forte) cùng các phần mềm, dịch vụ nêu trong bài thuộc về chủ sở hữu tương ứng, không thuộc Aduca; Aduca không phải đối tác chính thức của các công ty này. Tính năng, gói và giá có thể thay đổi bất cứ lúc nào – hãy kiểm tra trang chính thức trước khi mua. Kết quả áp dụng phụ thuộc quy trình, dữ liệu và con người của từng doanh nghiệp; bài viết không cam kết doanh thu hay hiệu quả cụ thể. © 2026 Aduca — được trích dẫn khi ghi rõ nguồn aduca.vn.