Chiến dịch ZNS & SMS — Đặc tả tính năng
I. Tổng quan
1. Vấn đề
- Doanh nghiệp cần gửi thông báo hàng loạt (xác nhận đơn hàng, nhắc thanh toán, khuyến mãi) đến khách hàng qua Zalo — kênh có tỷ lệ mở cao nhất Việt Nam — nhưng thiếu công cụ quản lý tập trung.
- Template ZNS phải qua quy trình phê duyệt phức tạp của Zalo OA; nếu không quản lý bài bản, dễ gửi template chưa duyệt gây lỗi và tốn chi phí thừa.
- Khi KH không dùng Zalo hoặc chưa follow OA, tin ZNS thất bại nhưng không có cơ chế tự động fallback sang SMS, dẫn đến bỏ sót tiếp cận.
2. Giải pháp
- Xây dựng module Chiến dịch ZNS & SMS tích hợp Zalo OA API và SMS Gateway, cung cấp:
- Quản lý vòng đời template ZNS (tạo → gửi duyệt → approved → dùng trong chiến dịch).
- Gửi tin hàng loạt có cá nhân hóa (biến động) và lên lịch gửi.
- Tự động fallback sang SMS khi ZNS thất bại.
- Báo cáo delivery rate và chi phí theo từng chiến dịch.
3. Đối tượng
- Admin / Marketing Manager: Tạo và quản lý template, tạo chiến dịch gửi tin.
- Marketing Ops: Chọn tập KH, lên lịch gửi, theo dõi báo cáo.
- Finance / Admin: Theo dõi chi phí gửi tin, tối ưu ngân sách.
4. Tầm nhìn / Insight
- Tích hợp thêm kênh: Viber, Email marketing vào cùng module thông báo.
- A/B testing template để tối ưu tỷ lệ mở.
- Phân tích hành vi sau tin nhắn: KH click link → mua hàng (attribution).
- Trigger Adaflow: “Khi tin ZNS được gửi thành công / thất bại” để xử lý logic tiếp theo.
II. Yêu cầu chức năng
1. Danh sách tính năng
| # | Tính năng | Mô tả | |:—|:—|:—| | 1 | Quản lý Template ZNS | Tạo, gửi duyệt, quản lý trạng thái template | | 2 | Quản lý Template SMS | Tạo và quản lý mẫu tin SMS Brandname | | 3 | Tạo chiến dịch gửi tin | Cấu hình chiến dịch broadcast ZNS/SMS | | 4 | Cá nhân hóa tin nhắn | Chèn biến động vào template | | 5 | Lên lịch gửi | Cấu hình thời gian gửi | | 6 | Xử lý Fallback ZNS → SMS | Tự động chuyển kênh khi ZNS thất bại | | 7 | Báo cáo chiến dịch | Delivery rate, open rate, chi phí |
2. Đặc tả chi tiết
Tính năng 1: Quản lý Template ZNS
User story: Là một [Marketing Manager], tôi muốn [quản lý tập trung các template ZNS đã được Zalo duyệt] để [dễ dàng tái sử dụng và tránh gửi template chưa hợp lệ].
Vòng đời Template ZNS:
Draft → Pending Review (gửi Zalo duyệt) → Approved / Rejected
Approved → Active (dùng trong chiến dịch)
Approved → Deprecated (ngừng sử dụng)
-
Use case 1.1 (Happy path – Tạo và gửi duyệt): Tạo template: Chọn loại template (Giao dịch / Khuyến mãi / OTP), nhập nội dung với biến động, chọn nút CTA → Bấm “Gửi duyệt Zalo” → Trạng thái chuyển sang
Pending Review→ Zalo phê duyệt → Trạng thái thànhApproved. -
Use case 1.2 (Rejected): Zalo từ chối template → Trạng thái
Rejectedkèm lý do → Người dùng sửa và gửi lại. -
Use case 1.3 (Sử dụng template đã duyệt): Chỉ template ở trạng thái
Approvedmới xuất hiện trong dropdown khi tạo chiến dịch gửi tin.
Cài đặt tạo template ZNS:
| Field | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
| Tên template | Text | ✅ | Tên nội bộ để phân biệt |
| Loại template | Dropdown | ✅ | Giao dịch (Transaction) / Khuyến mãi (Promotion) / OTP |
| OA ID | Dropdown | ✅ | Chọn Zalo OA đã kết nối |
| Nội dung tin nhắn | Textarea | ✅ | Tối đa 4096 ký tự. Hỗ trợ biến `` |
| Nút hành động (CTA) | Repeater | ❌ | Tối đa 2 nút: văn bản + URL hoặc số điện thoại |
| Hình ảnh đính kèm | File upload | ❌ | Chỉ với template loại Khuyến mãi, tỷ lệ 16:9 |
Chính sách Zalo: Template loại “Giao dịch” ưu tiên được duyệt nhanh hơn “Khuyến mãi”. Template “Khuyến mãi” chỉ gửi được cho KH đã follow OA.
Tính năng 2: Quản lý Template SMS
User story: Là một [Marketing Manager], tôi muốn [tạo và quản lý mẫu SMS Brandname] để [gửi tin nhắn thương hiệu đến KH khi ZNS thất bại hoặc khi cần tiếp cận qua SMS trực tiếp].
- Use case 2.1: Tạo template SMS với Brandname đã đăng ký → Nhập nội dung (tối đa 160 ký tự/1 tin) → Lưu và kích hoạt ngay (không cần duyệt từ bên thứ ba).
- Use case 2.2: Nội dung dài hơn 160 ký tự → Hệ thống thông báo số lượng tin sẽ bị tính (ví dụ: 2 tin SMS), hiển thị chi phí ước tính.
Cài đặt template SMS:
| Field | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
| Tên template | Text | ✅ | Tên nội bộ |
| Brandname | Dropdown | ✅ | Chọn từ danh sách Brandname đã đăng ký với nhà mạng |
| Nội dung | Textarea | ✅ | Tối đa 500 ký tự (tự tính số SMS sẽ bị charge) |
| Biến động | — | ❌ | Hỗ trợ `` |
Tính năng 3: Tạo chiến dịch gửi tin
User story: Là một [Marketing Ops], tôi muốn [tạo chiến dịch broadcast đến tập KH đã lọc với template phù hợp] để [tiếp cận đúng đối tượng đúng thời điểm].
-
Use case 3.1 (Happy path): Tạo chiến dịch → Chọn loại kênh (ZNS / SMS / ZNS với fallback SMS) → Chọn template đã duyệt → Chọn tập KH → Map biến động → Lên lịch gửi → Xác nhận và kích hoạt.
-
Use case 3.2 (Preview trước khi gửi): Hệ thống hiển thị preview tin nhắn đã điền biến động với dữ liệu mẫu của 1 KH → Người dùng xác nhận đúng nội dung.
Cài đặt chiến dịch:
| Field | Loại | Bắt buộc | Mô tả |
|---|---|---|---|
| Tên chiến dịch | Text | ✅ | |
| Kênh gửi | Dropdown | ✅ | ZNS / SMS / ZNS + Fallback SMS |
| Template | Dropdown | ✅ | Chỉ hiển thị template Approved (với ZNS) hoặc Active (với SMS) |
| Tập khách hàng | Chọn / Lọc | ✅ | Bộ lọc CRM hoặc import file |
| Mapping biến động | Bảng mapping | ✅ nếu có biến | Map biến `` → Field trong CRM |
| Thời gian gửi | Datetime picker | ✅ | Gửi ngay hoặc lên lịch |
| Giới hạn tốc độ | Number | ❌ | Tin/giây (để tránh vượt quota Zalo) |
Tính năng 4: Cá nhân hóa tin nhắn (Biến động)
Ví dụ template ZNS với biến:
Xin chào ,
Đơn hàng của bạn đã được xác nhận.
Tổng tiền: VNĐ.
Giao hàng dự kiến: .
Bảng mapping biến động:
| Biến trong template | Ánh xạ từ CRM field |
|---|---|
| `` | Contact → Họ và tên |
| `` | Deal → Mã đơn hàng |
| `` | Deal → Tổng giá trị |
| `` | Deal → Ngày giao hàng |
Nghiệp vụ: Nếu biến không có giá trị cho một KH cụ thể, hệ thống có thể: (a) bỏ qua biến đó (để trống), (b) dùng giá trị mặc định đã cấu hình, hoặc (c) bỏ qua KH đó và ghi log.
Tính năng 5: Xử lý Fallback ZNS → SMS
User story: Là một [Marketing Manager], tôi muốn [tin nhắn tự động chuyển sang SMS nếu ZNS thất bại] để [đảm bảo KH vẫn nhận được thông báo dù không dùng Zalo].
Các trường hợp ZNS thất bại trigger Fallback:
| Lý do thất bại ZNS | Hành động |
|---|---|
| KH chưa follow Zalo OA (với template Khuyến mãi) | Gửi SMS thay thế |
| SĐT không liên kết tài khoản Zalo | Gửi SMS thay thế |
| Quota ZNS vượt giới hạn | Hàng đợi → Thử lại sau / gửi SMS |
| Lỗi hệ thống Zalo (5xx) | Retry 3 lần → Fallback SMS |
- Use case 5.1: Gửi ZNS → Nhận callback
FAILEDtừ Zalo API → Trong vòng 60 giây, hệ thống tự động gửi SMS thay thế với nội dung đã được cấu hình sẵn → Ghi nhận trong báo cáo là “ZNS thất bại / SMS thành công”.
Tính năng 6: Báo cáo chiến dịch
Các chỉ số báo cáo:
| Chỉ số | ZNS | SMS |
|---|---|---|
| Tổng gửi | ✅ | ✅ |
| Gửi thành công (Delivered) | ✅ | ✅ |
| Gửi thất bại | ✅ | ✅ |
| Đã mở (Opened) | ✅ | ❌ |
| Click CTA | ✅ | ❌ |
| Fallback sang SMS | ✅ | — |
| Chi phí ước tính | ✅ | ✅ |
| Chi phí thực tế | Theo invoice Zalo | Theo invoice nhà mạng |
3. Danh sách nghiệp vụ
- Chỉ template ZNS ở trạng thái
Approvedmới được dùng trong chiến dịch. - Không được gửi tin khuyến mãi ZNS cho KH chưa follow Zalo OA — cần kiểm tra trước khi gửi.
- Tần suất gửi ZNS cho cùng một SĐT không vượt quá giới hạn của Zalo OA (thường 4 tin/ngày, tùy loại template).
- SMS Brandname phải được đăng ký với nhà mạng trước khi sử dụng.
- Tin nhắn không được gửi ngoài khung giờ 7:00–21:00 theo quy định.
- Mỗi lần gửi chiến dịch phải ghi nhận đầy đủ: template đã dùng, số phiên bản, timestamp gửi.
- Chi phí được tính theo số tin gửi thành công (không tính tin thất bại với ZNS, tính cả thất bại với SMS tùy nhà mạng).
4. Giao diện
- Trang Template: Tab “ZNS” và “SMS”, bảng danh sách template với cột Tên, Loại, Trạng thái, Ngày duyệt. Nút “Tạo template mới” và “Gửi duyệt lại”.
- Trang chiến dịch: Wizard tạo chiến dịch 4 bước: (1) Thông tin → (2) Template & Kênh → (3) Tập KH & Mapping biến → (4) Lên lịch & Xác nhận.
- Trang báo cáo: Cards tổng hợp + biểu đồ delivery funnel (Gửi → Thành công → Mở → Click).
III. Yêu cầu phi chức năng
- Throughput: Hệ thống phải xử lý ≥ 10,000 tin ZNS/phút và ≥ 5,000 SMS/phút.
- Latency callback: Xử lý callback kết quả gửi từ Zalo API trong ≤ 5 giây.
- Fallback time: Khi ZNS thất bại, SMS fallback phải được kích hoạt trong ≤ 60 giây.
- Retry policy: ZNS lỗi tạm thời (503): retry tối đa 3 lần với exponential backoff (30s, 1m, 2m).
- Quota management: Tự động throttle tốc độ gửi để không vượt quota ZNS OA của từng tài khoản.
- Audit trail: Lưu log đầy đủ mỗi tin gửi: template version, SĐT đích, thời gian gửi, kết quả.
IV. Dependency (liên quan & phụ thuộc)
- Zalo OA API: Gửi tin ZNS, quản lý template, nhận callback delivery.
- SMS Gateway (eSMS / VNPT / FPT Telecom hoặc tương đương): Gửi SMS Brandname.
- CRM – Contact Management: Nguồn dữ liệu KH và biến động.
- Campaign Library: Chia sẻ template giữa các chiến dịch.
- Adaflow: Trigger và action node liên quan đến ZNS/SMS.
dev/campaign/zns_sms/template.md— Đặc tả riêng cho module Template.
V. API Contract (Dev viết)
API 1: Tạo chiến dịch ZNS
- Method & Endpoint:
POST /api/v1/campaigns/zns - Request Body:
{ "name": "Khuyến mãi Flash Sale 7/7", "channel": "zns_with_sms_fallback", "template_id": "tpl_zns_001", "contact_filter": { "tag": "loyal_customer" }, "variable_mapping": { "ten_khach_hang": "contact.full_name", "ma_khuyen_mai": "static:FLASHSALE7" }, "scheduled_at": "2026-07-07T08:00:00+07:00" } - Response 201:
{ "id": "camp_zns_001", "status": "scheduled", "estimated_recipients": 3500 }
API 2: Webhook callback từ Zalo
- Method & Endpoint:
POST /api/v1/webhooks/zalo/delivery(Zalo gọi vào) - Payload:
{ "message_id": "zns_msg_001", "phone": "0901234567", "status": "received", "timestamp": 1720310400 }
API 3: Lấy báo cáo chiến dịch
- Method & Endpoint:
GET /api/v1/campaigns/zns/{campaign_id}/report - Response 200:
{ "total_sent": 3500, "delivered": 3100, "failed_zns": 400, "fallback_sms_sent": 350, "fallback_sms_delivered": 340, "opened": 2200, "clicked_cta": 800, "estimated_cost_vnd": 3500000 }
VI. Test case (BA hoặc Tester viết)
Template ZNS:
- TC1.1: Tạo template với biến `` → Gửi duyệt Zalo → Trạng thái chuyển
Pending Review. - TC1.2: Zalo từ chối → Trạng thái
Rejected, hiển thị lý do từ chối từ Zalo. - TC1.3: Template
Pending Reviewkhông xuất hiện trong dropdown tạo chiến dịch.
Tạo chiến dịch & Cá nhân hóa:
- TC2.1: Template có biến ``, KH có field “Họ và tên” = “Nguyễn Văn A” → Preview hiển thị đúng “Nguyễn Văn A”.
- TC2.2: KH không có dữ liệu cho biến → Hệ thống dùng giá trị mặc định hoặc ghi log bỏ qua.
Fallback:
- TC3.1: KH không dùng Zalo → ZNS trả về
FAILED→ Trong 60 giây, SMS được gửi → Báo cáo ghi “SMS fallback: Thành công”. - TC3.2: Cả ZNS và SMS đều thất bại → Báo cáo ghi “Thất bại hoàn toàn” kèm lý do.
Giới hạn & Tuân thủ:
- TC4.1: Lên lịch gửi lúc 22:00 → Hệ thống cảnh báo ngoài khung giờ cho phép và từ chối lên lịch.
- TC4.2: Gửi vượt quota Zalo OA → Hệ thống throttle và hàng đợi, không bị lỗi batch.