Hướng dẫn Admin: Tự động hoá tin nhắn Zalo
Tài liệu nội bộ. Trang này dành cho quản trị viên, không hiển thị ở menu hay chân trang và không được đưa vào sitemap. Chỉ chia sẻ link cho người vận hành.
Cập nhật lần cuối: 15/09/2026
Tự động hoá tin nhắn là module gửi tin Zalo cho khách theo kịch bản. Vào Tăng trưởng → Tự động hoá tin nhắn.
Module có bốn tab, và thứ tự đọc tài liệu này đúng bằng thứ tự phải làm:
| Tab | Dùng để làm gì | Phải xong trước? |
|---|---|---|
| Kết nối | Nối cửa hàng với Official Account của shop | Bắt buộc làm đầu tiên |
| Thư viện template | Đồng bộ mẫu tin từ Zalo, gán nguồn dữ liệu cho từng tham số | Bắt buộc, trước khi gửi tin theo mẫu |
| Automation | Kịch bản tự chạy khi có sự kiện (bỏ giỏ, quan tâm OA…) | — |
| Chiến dịch | Gửi hàng loạt tới một tệp khách do mình chọn | Cần một kịch bản “Chiến dịch thủ công” |
Một điều cần hiểu trước. Bước gửi tin không chọn kênh. Người vận hành chỉ khai loại nội dung (Giao dịch / Chăm sóc khách / Khuyến mãi); hệ thống tự chọn kênh rẻ nhất còn hợp lệ cho từng khách tại đúng thời điểm chạy. Cùng một bước, khách A có thể nhận tin 0đ còn khách B tốn 200đ — đó là thiết kế, không phải lỗi.
1. Kết nối Zalo OA
Chưa nối OA thì mọi thứ còn lại chỉ sửa được chứ không gửi được.
Bước 1: Nhập App ID và App Secret
Vào Cấu hình → Marketing → Zalo OA, điền App ID và App Secret của ứng dụng Zalo mà shop đã tạo trên Zalo Developers. Thiếu hai giá trị này thì nút đăng nhập OA chưa hiện ra.
Bước 2: Đăng nhập Official Account
Sang Tự động hoá tin nhắn → Kết nối, bấm Kết nối Zalo OA. Zalo sẽ hỏi chọn OA và cấp quyền. Xong thì dòng connector chuyển sang Đang kết nối.
Bước 3: Đọc bảng tình trạng
Bấm vào dòng connector để mở trang chi tiết. Đây là nơi trả lời câu “tại sao tin không gửi được”.
| Ô | Ý nghĩa |
|---|---|
| Hạn token | Hệ thống tự gia hạn khi còn dưới 120 phút. Nếu ô này ghi “không có refresh token” thì hết hạn là phải đăng nhập lại bằng tay. |
| Gửi thành công 24 giờ | Tính gộp cả tin thông báo đơn hàng lẫn tin của module này, vì chúng đi chung một OA. Ghi “chưa có dữ liệu” nghĩa là 24 giờ qua chưa gửi tin nào — không phải 0%. |
| Lỗi gần nhất | Trích nguyên văn lỗi Zalo trả về, để tra cứu cho đúng. |
| Webhook | Địa chỉ cần dán vào Zalo Developers. Bấm Chép địa chỉ thay vì gõ tay. |
Chữ ký webhook. Nếu dòng chữ ký ghi “Chưa có OA Secret Key nên không kiểm tra chữ ký” thì bất kỳ ai biết địa chỉ webhook đều có thể giả sự kiện “khách quan tâm OA”. Điền OA Secret Key trong Cấu hình → Marketing → Zalo OA rồi bật chế độ chặn.
Ba kênh gửi và cách hệ thống chọn
Phần dưới trang chi tiết liệt kê ba kênh. Hệ thống xếp theo giá từ rẻ tới đắt rồi lấy kênh đầu tiên còn hợp lệ:
| Kênh | Điều kiện dùng | Giá | Giới hạn |
|---|---|---|---|
| Tin tư vấn | Khách đã từng tương tác với OA | 0đ trong 48 giờ kể từ lần tương tác cuối; khoảng 55đ từ 48 giờ đến 7 ngày | Quá 7 ngày là hết dùng được. Không mang được nội dung khuyến mãi. |
| Tin theo mẫu qua Zalo | Khách đã quan tâm OA | 200đ tin thường, 300đ với mã xác thực / thanh toán / voucher | Bắt buộc dùng mẫu Zalo đã duyệt. Giờ cấm 22:00–06:00 với tin khuyến mãi. |
| Tin theo mẫu qua số điện thoại | Chỉ cần số điện thoại, khách không cần quan tâm OA | Từ 200đ (Zalo chỉ công bố mức sàn) | Như trên. Hạn mức ngày dùng chung với kênh gửi theo mẫu qua Zalo. |
2. Thư viện template
Tin theo mẫu chỉ gửi được bằng mẫu Zalo đã duyệt. Tab này là chỗ đối chiếu giữa khai báo ở cửa hàng và trạng thái thật bên Zalo.
Bước 1: Bấm “Đồng bộ với Zalo”
Nút nằm góc trên bên phải. Hệ thống gọi API Zalo, đọc danh sách mẫu và trạng thái duyệt, rồi ghi vào bản sao nội bộ. Ngoài ra lệnh nền cũng tự đồng bộ mỗi giờ.
Đồng bộ không bao giờ sửa cấu hình của bạn. Nó chỉ đọc và báo chênh lệch. Ánh xạ tham số là công sức người vận hành, hệ thống không tự ghi đè. Nếu Zalo lỗi, bản sao cũ được giữ nguyên kèm mốc thời gian, chứ không xoá trắng.
Bước 2: Đọc trạng thái từng mẫu
Mỗi mẫu có hai nhãn, đọc cả hai mới đủ:
- Nhãn cửa hàng — “Sẵn sàng gửi” nghĩa là đang bật và đã điền mã mẫu Zalo. “Chưa gán mẫu Zalo” nghĩa là thiếu mã mẫu.
- Nhãn Zalo — “Zalo đã duyệt” mới gửi được. “Zalo: REJECT” là chưa duyệt. Nếu chưa từng đồng bộ thì hệ thống ghi rõ là chưa biết, chứ không đoán là đã duyệt.
Bước 3: Xử lý phần “Lệch giữa cấu hình cửa hàng và Zalo”
Đây là phần đáng tiền nhất của màn hình này. Ví dụ thật trên hệ thống:
Tham số của “Order Shipped” lệch với mẫu bên Zalo. Mẫu Zalo chỉ nhận
date,name,status,order_code. Cấu hình đang thừa tham sốorder_id— Zalo sẽ từ chối với lỗi-1124.
Bấm Sửa mẫu và xoá dòng ánh xạ thừa. Không sửa thì mọi tin dùng mẫu đó đều trượt.
Bước 4: Nhập mẫu có sẵn từ Zalo
Cuối trang là danh sách mẫu đã có trên Zalo nhưng chưa khai báo ở cửa hàng. Nhập về để khỏi gõ lại mã mẫu và tên tham số.
- Lấy dữ liệu từ — chọn loại dữ liệu sẽ điền vào mẫu này (Giỏ hàng bỏ dở, Khách mới quan tâm OA, Chiến dịch thủ công…). Đây là lựa chọn quan trọng nhất: nó quyết định danh sách biến bạn được dùng ở bước sau.
- Tag đã đăng ký với Zalo — chọn đúng tag mà mẫu đã đăng ký. Zalo không trả tag qua API nên hệ thống không tự kiểm tra được; chọn sai tag là lỗi bị Zalo xử phạt OA chứ không chỉ bị từ chối tin.
- Bấm Nhập về cửa hàng. Mẫu nhập về luôn ở trạng thái tắt cho tới khi gán xong nguồn dữ liệu.
Mẫu Zalo chưa duyệt vẫn nhập về được, nhưng thư viện sẽ hiển thị đúng trạng thái REJECT và bước gửi tin không dùng được.
3. Truyền biến vào mẫu tin
Mẫu Zalo có các ô trống dạng <name>, <price>, <date>. Phần này là chỗ khai mỗi ô lấy dữ liệu từ đâu.
Vào Thư viện template, bấm Sửa ở mẫu cần gán — hoặc Marketing → Zalo OA → Mẫu tin.
Ba kiểu nguồn
| Kiểu | Khi nào dùng | Ví dụ |
|---|---|---|
| Dữ liệu | Giá trị đổi theo từng khách | <name> = Tên khách hàng |
| Giá trị cố định | Mẫu cần một câu chữ không đổi | <status> = “Đã chuyển cho đơn vị vận chuyển” |
| Giá trị mặc định | Phao cứu sinh cho kiểu “Dữ liệu” khi khách đó thiếu dữ liệu | <name> thiếu tên → dùng “quý khách” |
Quy tắc quan trọng nhất của cả module: tham số lấy từ Dữ liệu mà khách đó không có, lại bỏ trống Giá trị mặc định, thì tin không được gửi và không bị tính phí. Hệ thống cố tình bỏ qua chứ không gửi tin thủng lỗ — Zalo vẫn nhận tin có ô trống, và cửa hàng vẫn bị trừ tiền cho một câu văn cụt.
Vậy nên: ô nào bắt buộc phải có thì để trống Giá trị mặc định (thà không gửi); ô nào có cũng được thì điền một giá trị thay thế để tin vẫn đi.
Biến dùng được theo từng loại dữ liệu
Danh sách biến phụ thuộc vào ô “Lấy dữ liệu từ” của mẫu. Chọn sai loại thì ô chọn nguồn sẽ trống trơn.
| Loại dữ liệu | Biến dùng được |
|---|---|
Giỏ hàng bỏ dởabandoned_cart |
Tên khách hàng · Số điện thoại khách · Giá trị giỏ hàng (số cho Zalo) · Giá trị giỏ hàng (có định dạng) · Số sản phẩm trong giỏ · Tên sản phẩm đầu tiên · Thời điểm bỏ giỏ (cho Zalo) · Thời điểm bỏ giỏ (hiển thị) · Tên cửa hàng · Địa chỉ cửa hàng |
Khách mới quan tâm OAzalo_follow |
Tên khách hàng · Số điện thoại khách · Thời điểm quan tâm OA (cho Zalo) · Thời điểm quan tâm OA (hiển thị) · Tên cửa hàng · Địa chỉ cửa hàng |
Chiến dịch thủ côngmanual_campaign |
Tên khách hàng · Số điện thoại khách · Tên cửa hàng · Địa chỉ cửa hàng |
| Đơn hàng mới / Đã giao / Hóa đơn | Mã đơn hàng · Tên khách hàng · Tổng tiền · Ngày đặt · Trạng thái đơn · Địa chỉ giao hàng · Mã vận đơn … (tuỳ loại) |
Chiến dịch thủ công cố ý có ít biến nhất: lúc gửi, hệ thống biết khách là ai nhưng không gắn với đơn hàng hay giỏ hàng nào cả, nên không có biến đơn/giỏ để bind.
4. Automation — kịch bản tự chạy
Cách 1: Dùng mẫu có sẵn (nhanh nhất)
Ở tab Automation bấm Dùng mẫu có sẵn.
Kịch bản tạo từ mẫu chưa gán mẫu tin — vì không catalogue nào biết OA của shop đã được duyệt những mẫu nào. Sau khi tạo, phải vào từng bước gửi tin chọn mẫu.
Cách 2: Tạo từ đầu
Bấm Tạo từ đầu, đặt tên và chọn trigger.
| Trigger | Khi nào khách vào kịch bản | Trạng thái |
|---|---|---|
| Bỏ giỏ hàng | Giỏ có hàng nhưng chưa tạo đơn sau một khoảng lặng | Dùng được |
| Quan tâm OA | Khách vừa bấm quan tâm Official Account | Dùng được |
| Chiến dịch thủ công | Do người vận hành bấm gửi ở tab Chiến dịch | Dùng được |
| Sau khi mua 45 ngày | — | Chưa dùng được — chưa có lệnh quét đơn theo mốc thời gian |
| Không mua 90 ngày | — | Chưa dùng được — chưa có lệnh quét khách ngủ đông |
Trigger không đổi được sau khi tạo. Đổi trigger tức là một kịch bản khác. Chọn nhầm thì tạo cái mới.
Bốn loại bước
- Trigger — bước đầu, luôn có đúng một, không xoá được.
- Chờ — dừng một khoảng rồi đi tiếp. Khách không chiếm tài nguyên trong lúc chờ.
- Điều kiện — không thoả thì khách rời kịch bản. Điều kiện được đánh giá lại đúng lúc chạy tới, không phải lúc vào kịch bản — đó chính là mục đích của bước Chờ phía trước.
- Gửi tin — bước duy nhất tốn tiền.
Bấm dấu + giữa hai bước để chèn vào giữa, hoặc Thêm bước vào cuối ở cuối sơ đồ.
Cấu hình bước gửi tin
Bấm vào thẻ bước gửi tin, ngăn bên phải mở ra.
- Loại nội dung — chọn trước. Nó quyết định kênh nào được phép mang tin này. Nội dung khuyến mãi không đi được bằng tin tư vấn.
- Nội dung tin tư vấn — đoạn chữ tự do, dùng cho kênh 0đ. Bỏ trống thì bước này mất kênh miễn phí.
- Mẫu tin — dùng cho hai kênh gửi theo mẫu. Bỏ trống thì chưa bật được automation.
- Kênh dự kiến khi chạy — bảng chỉ để đọc, cho biết hệ thống sẽ thử kênh nào trước, kênh nào bị loại và vì sao. Dòng gạch ngang là kênh bị loại; giữ lại có chủ đích để trả lời câu “sao không đi bằng kênh miễn phí”.
Xem trước nội dung — làm trước khi bật
Cuối ngăn cấu hình có nút Xem trước. Nó chạy đúng đường resolve thật: cùng bộ dựng dữ liệu, cùng mẫu, cùng giá trị mặc định.
Nếu chưa có khách nào vào kịch bản, hệ thống dùng dữ liệu mẫu và ghi rõ là dữ liệu mẫu. Đây là cách rẻ nhất để phát hiện lỗi gán biến: thấy “Chào customer_full_name” trên màn hình này thì không cần để khách thật nhận tin mới biết sai.
Bật automation
Bấm Bật automation. Hệ thống kiểm tra trước và chặn nếu còn bước nào chưa đủ điều kiện, kèm tên bước. Cột Trạng thái ở danh sách cũng đếm sẵn “N việc cần sửa”.
Sửa kịch bản đang chạy thì sao? Mỗi lần sửa, hệ thống ghi một phiên bản mới. Khách đang dở trong kịch bản vẫn chạy hết theo phiên bản họ đã vào; chỉ khách vào sau mới theo phiên bản mới. Không có chuyện khách đang ở bước 3 bỗng nhảy sang sơ đồ khác.
5. Chiến dịch — gửi hàng loạt
Automation chờ sự kiện. Chiến dịch thì ngược lại: chọn một tệp khách rồi bấm gửi.
Bước 1: Chuẩn bị kịch bản cho chiến dịch
Chiến dịch không tự quyết định nội dung — nó mượn một kịch bản. Vào tab Chiến dịch, nếu chưa có kịch bản phù hợp, màn hình sẽ nói rõ và đưa nút tạo luôn.
- Bấm Tạo kịch bản cho chiến dịch, đặt tên, bấm Tạo automation.
- Trong builder, thêm bước gửi tin, chọn loại nội dung và mẫu tin.
- Bấm Bật automation.
- Quay lại tab Chiến dịch — có link sẵn ngay dưới tên kịch bản.
Nếu đã có kịch bản nhưng còn ở trạng thái nháp, màn hình Chiến dịch sẽ chỉ thẳng tên kịch bản đó kèm link, thay vì mời tạo thêm cái mới.
Bước 2: Chọn tệp khách
Bốn tệp, cố ý là danh sách đóng chứ không phải bộ lọc tự do — tệp nào cũng phải kiểm tra được trước khi gửi hàng nghìn tin:
| Tệp khách | Gồm những ai |
|---|---|
| Tất cả khách đã quan tâm OA | Mọi khách có sự kiện quan tâm Official Account |
| Khách thuộc nhóm | Theo nhóm khách hàng của cửa hàng (phải chọn thêm nhóm) |
| Khách đã từng mua hàng | Có ít nhất một đơn |
| Khách chưa mua lần nào | Chưa có đơn nào |
Bước 3: Đọc bảng “Tập khách nhận tin”
Chọn xong kịch bản và tệp khách, khung bên phải hiện số người thật sự nhận được tin, kèm lý do từng nhóm bị loại. Xem bảng này trước khi bấm gửi — đây là lúc duy nhất sửa được, sau khi bấm gửi là tiền thật.
Ba lý do bị loại, đều là luật của Zalo chứ không phải của hệ thống:
- Chưa xác nhận quan tâm OA. Cửa hàng có Zalo ID của khách từ một lần chạm nào đó nhưng chưa từng có sự kiện quan tâm. Gửi cho nhóm này là thứ khiến Official Account bị hạ bậc hạn mức.
- Đã từ chối nhận tin. Khách xin dừng, hoặc Zalo báo về là họ đã chặn.
- Chạm trần tin khuyến mãi trong tháng. Chỉ áp dụng với chiến dịch khuyến mãi. Zalo giới hạn số tin khuyến mãi mỗi người mỗi tháng; người đã chạm trần có gửi cũng bị từ chối.
Bước 4: Hẹn giờ, tốc độ và gửi
| Ô | Ghi chú |
|---|---|
| Gửi lúc nào | Để trống là gửi ngay. Tránh hẹn vào 22:00–06:00 nếu là tin khuyến mãi — Zalo không nhận. |
| Tốc độ gửi | Mặc định 200 tin/phút. Gửi dồn một lúc trông giống spam với Zalo, nên chiến dịch được chia thành từng đợt. |
| Gửi ngay | Chỉ bật khi đã chọn đủ kịch bản và tệp khách. |
Chiến dịch đã tạo nằm ở danh sách phía dưới với các trạng thái: nháp · đã hẹn · đang chạy · xong · đã huỷ · lỗi. Chiến dịch chưa chạy xong có thể Huỷ; phần đã gửi thì không thu hồi được.
6. Vận hành
Các lệnh chạy nền
Không có cron thì mọi thứ đứng yên, kể cả kịch bản đang bật.
| Lệnh | Tần suất | Việc |
|---|---|---|
remarketing:run | Mỗi phút | Đẩy khách đi tiếp một bước trong kịch bản |
remarketing:detect-abandoned-carts | Mỗi 5 phút | Phát hiện giỏ bỏ dở, đưa khách vào kịch bản |
remarketing:run-campaigns | Mỗi phút | Chạy các chiến dịch đã tới giờ |
zalo-oa:sync-templates | Mỗi giờ | Đọc trạng thái mẫu tin từ Zalo |
zalo-oa:refresh-token | Mỗi giờ | Gia hạn token OA trước khi hết hạn |
Chế độ diễn tập
Mặc định hệ thống chạy ở chế độ diễn tập: kịch bản chạy đủ các bước, ghi log đầy đủ, nhưng không gửi tin ra ngoài và không tính phí. Khi đang bật, một dải thông báo hiện ngay đầu trang.
Muốn gửi thật, đặt biến môi trường REMARKETING_SENDER trỏ tới bộ gửi thật rồi khởi động lại. Đây là việc của người triển khai, không sửa trong admin.
Chống gửi trùng
Một khách không vào lại cùng một kịch bản trong 24 giờ, kể cả khi sự kiện lặp lại. Giỏ hàng bị sửa ba lần trong một buổi chiều vẫn chỉ sinh ra một hành trình, không phải ba.
Đọc chi phí
Cột Chi phí tin nhắn trên danh sách là tiền thật đã tiêu, cộng từ nhật ký gửi. Tin gửi ở chế độ diễn tập không được tính vào đây. Bản nháp chưa gửi tin nào hiển thị “—” chứ không phải 0 — hai thứ đó khác nhau.
7. Sự cố thường gặp
| Hiện tượng | Nguyên nhân và cách xử lý |
|---|---|
| Bật automation nhưng không ai nhận tin | Kiểm tra theo thứ tự: (1) cron có chạy không; (2) connector có Đang kết nối không; (3) trigger có phải loại “Chưa dùng được” không; (4) có đang ở chế độ diễn tập không. |
| Bước gửi tin bị bỏ qua, ghi “thiếu dữ liệu” | Có tham số kiểu Dữ liệu mà khách đó không có, và chưa đặt Giá trị mặc định. Vào sửa mẫu, điền giá trị thay thế. |
Zalo trả lỗi -1124 |
Ánh xạ tham số lệch với mẫu bên Zalo. Xem dải “Lệch giữa cấu hình cửa hàng và Zalo” ở tab Thư viện template. |
| Mẫu hiện “Zalo: REJECT” | Zalo chưa duyệt mẫu. Phải xử lý bên Zalo Business, hệ thống không can thiệp được. |
| Không chọn được mẫu ở bước gửi tin | Danh sách lọc theo loại nội dung của bước. Chọn đúng loại nội dung trước, hoặc kiểm tra tag của mẫu. |
| Tin khuyến mãi không gửi được buổi tối | Đúng như thiết kế: Zalo cấm gửi tin khuyến mãi khung 22:00–06:00. Hệ thống hoãn tới khung cho phép. |
| Chiến dịch loại gần hết tệp khách | Phần lớn là do “chưa xác nhận quan tâm OA”. Có Zalo ID không đồng nghĩa với đã quan tâm OA. |
| Ô chọn nguồn dữ liệu trống trơn | Mẫu chưa khai Lấy dữ liệu từ. Không có loại dữ liệu thì không có danh sách biến. |
Những phần chưa có
Ghi lại để khỏi đi tìm:
- Trigger “Sau khi mua 45 ngày” và “Không mua 90 ngày” — chưa có lệnh quét nên chưa kích hoạt được. Màn hình tạo kịch bản đã ghi rõ.
- Tỉ lệ click, Đơn hàng, Doanh thu — các cột này chỉ có số khi tin đầu tiên ra đơn; hiện chưa đo được.
- Broadcast của Zalo (Zalo tự đẩy tin tới toàn bộ follower) không có trong OpenAPI, nên không làm được từ admin. Tab Chiến dịch gửi theo danh sách người nhận, không phải broadcast.