Skip to main content
Hướng dẫn Admin: Tự động hoá tin nhắn Zalo

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.

Màn hình tổng quan module Tự động hoá tin nhắn
Màn hình đầu tiên: bốn tab ở trên, các chỉ số thật ở giữa, danh sách kịch bản ở dưới.

Module có bốn tab, và thứ tự đọc tài liệu này đúng bằng thứ tự phải làm:

TabDùng để làm gìPhải xong trước?
Kết nốiNối cửa hàng với Official Account của shopBắ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
AutomationKịch bản tự chạy khi có sự kiện (bỏ giỏ, quan tâm OA…)—
Chiến dịchGửi hàng loạt tới một tệp khách do mình chọnCầ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.

Danh sách connector với trạng thái Đang kết nối
Tab Kết nối. Cột “Kênh gửi” cho biết bao nhiêu kênh đang dùng được — ở đây là 3/3.

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”.

Trang chi tiết connector Zalo OA: xác thực, tình trạng, webhook và ba kênh gửi
Chi tiết connector: ba thẻ ở trên, ba kênh gửi ở dưới.
ÔÝ nghĩa
Hạn tokenHệ 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ấtTrí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ùngGiáGiới hạn
Tin tư vấnKhách đã từng tương tác với OA0đ trong 48 giờ kể từ lần tương tác cuối; khoảng 55đ từ 48 giờ đến 7 ngàyQuá 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 ZaloKhách đã quan tâm OA200đ tin thường, 300đ với mã xác thực / thanh toán / voucherBắ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ạiChỉ cần số điện thoại, khách không cần quan tâm OATừ 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ờ.

Thư viện template sau khi đồng bộ, kèm cảnh báo lệch tham số
Dải xanh cho biết đọc được bao nhiêu mẫu và đọc lúc nào. Dải đỏ bên dưới là phần lệch cấu hình.

Đồ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ố.

Danh sách mẫu có trên Zalo chưa có ở cửa hàng, kèm hai ô chọn
Mỗi mẫu cần chọn Lấy dữ liệu từ và Tag đã đăng ký với Zalo rồi mới bấm Nhập về cửa hàng.
  1. 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.
  2. 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.
  3. 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.

Màn hình ánh xạ tham số với cột nguồn dữ liệu và giá trị mặc định
Mẫu “Nhắc giỏ hàng bỏ dở”: mỗi tham số Zalo bên trái, nguồn dữ liệu bên phải, ô Giá trị mặc định nằm ngay dưới.

Ba kiểu nguồn

KiểuKhi nào dùngVí dụ
Dữ liệuGiá trị đổi theo từng khách<name> = Tên khách hàng
Giá trị cố địnhMẫ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 địnhPhao 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”
Mẫu dùng toàn giá trị cố định
Mẫu kiểm thử dùng toàn Giá trị cố định: mọi khách nhận đúng một nội dung. Kiểu này không cần giá trị mặc định vì nó không bao giờ thiếu.

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ệuBiế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 OA
zalo_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ông
manual_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.

Thư viện kịch bản mẫu, nhóm theo mục tiêu
Mỗi thẻ ghi sẵn số bước, số tin và dải chi phí thật khi chạy.

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.

Màn hình tạo automation với danh sách trigger
Trigger mờ là loại chưa có nguồn kích hoạt — hệ thống nói thẳng thay vì giấu đi.
TriggerKhi nào khách vào kịch bảnTrạng thái
Bỏ giỏ hàngGiỏ có hàng nhưng chưa tạo đơn sau một khoảng lặngDùng được
Quan tâm OAKhách vừa bấm quan tâm Official AccountDùng được
Chiến dịch thủ côngDo người vận hành bấm gửi ở tab Chiến dịchDù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.

Sơ đồ kịch bản bên trái, ngăn cấu hình bước gửi tin bên phải
Ngăn cấu hình: loại nội dung, nội dung tin tư vấn, mẫu tin, và bảng kênh dự kiến khi chạy.
  1. 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.
  2. 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í.
  3. Mẫu tin — dùng cho hai kênh gửi theo mẫu. Bỏ trống thì chưa bật được automation.
  4. 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.

Kết quả xem trước nội dung tin
Xem trước nói thẳng bước này sẽ bị bỏ qua và vì sao — ở đây là chưa chọn mẫu tin.

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.

Tab Chiến dịch khi chưa có kịch bản phù hợp
Bấm Tạo kịch bản cho chiến dịch — trigger “Chiến dịch thủ công” đã được chọn sẵn, chỉ cần đặt tên.
  1. Bấm Tạo kịch bản cho chiến dịch, đặt tên, bấm Tạo automation.
  2. Trong builder, thêm bước gửi tin, chọn loại nội dung và mẫu tin.
  3. Bấm Bật automation.
  4. 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áchGồm những ai
Tất cả khách đã quan tâm OAMọi khách có sự kiện quan tâm Official Account
Khách thuộc nhómTheo 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àngCó ít nhất một đơn
Khách chưa mua lần nàoChư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ửiMặ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 ngayChỉ 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ệnhTần suấtViệc
remarketing:runMỗi phútĐẩy khách đi tiếp một bước trong kịch bản
remarketing:detect-abandoned-cartsMỗi 5 phútPhát hiện giỏ bỏ dở, đưa khách vào kịch bản
remarketing:run-campaignsMỗi phútChạy các chiến dịch đã tới giờ
zalo-oa:sync-templatesMỗi giờĐọc trạng thái mẫu tin từ Zalo
zalo-oa:refresh-tokenMỗ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ượngNguyê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.