Đối soát chuyển khoản tự động bằng SePay và Casso
Đối soát chuyển khoản tự động là phần mềm tự khớp khoản tiền vào tài khoản ngân hàng với đúng đơn hàng, không cần dò sao kê bằng tay. SePay và Casso là hai dịch vụ phổ biến: chúng báo giao dịch qua webhook ngay khi tiền về, giúp shop xác nhận thanh toán trong vài giây.
Vì sao đối soát tay bằng sao kê luôn trễ và dễ sai
Cuối ngày, nhiều chủ shop tải sao kê ngân hàng về, mở song song file đơn hàng trên Excel hoặc sổ ghi tay, rồi dò từng dòng xem giao dịch nào khớp với đơn nào. Cách này còn ổn khi mỗi ngày chỉ có vài đơn, nhưng lên đến vài chục đơn một ngày thì gần như không dò kịp.
Vấn đề lớn nhất nằm ở nội dung chuyển khoản do khách tự gõ: người viết tắt tên, người quên ghi mã đơn, người nhờ tài khoản khác chuyển hộ nên tên trên sao kê không khớp tên người đặt hàng. Kế toán phải đoán, nhắn hỏi lại qua Zalo, hoặc bỏ sót một giao dịch không rõ chủ.
Hậu quả thường gặp là giao hàng trước khi xác nhận được tiền đã về — rủi ro mất hàng nếu khách chưa chuyển thật — hoặc giữ đơn quá lâu dù khách đã chuyển khoản xong, khiến khách chờ và nhắn hỏi liên tục. Đối soát tự động giải quyết đúng hai điểm này bằng cách để máy đọc giao dịch và khớp đơn ngay khi tiền báo về.
SePay và Casso đưa dữ liệu ngân hàng về hệ thống thế nào
SePay và Casso đều là dịch vụ trung gian kết nối với tài khoản ngân hàng doanh nghiệp đang dùng để nhận tiền, theo dõi biến động số dư gần như theo thời gian thực. Ngay khi có tiền vào, dịch vụ gọi đến một webhook — một địa chỉ URL do anh/chị khai báo sẵn — kèm dữ liệu giao dịch gồm số tiền, nội dung chuyển khoản, thời gian và số tài khoản nhận.
Hệ thống xử lý ở phía anh/chị, thường dựng bằng workflow n8n hoặc phần mềm bán hàng, nhận dữ liệu này và xử lý gần như ngay lập tức, thường trong vòng vài giây đến vài chục giây kể từ lúc khách bấm chuyển khoản. Ngoài webhook, cả hai còn cung cấp API để chủ động gọi lại lịch sử giao dịch, dùng khi cần đối chiếu toàn bộ hoặc khi nghi ngờ có giao dịch bị thất lạc vì mất kết nối mạng.
Bảng dưới tổng hợp một số gói phổ biến của hai bên, tham khảo 09/2026 — số giao dịch miễn phí và mức giá có thể thay đổi nên anh/chị nên kiểm tra lại trên trang chính thức trước khi đăng ký:
| Gói | Giao dịch/tháng | Giá (tham khảo 09/2026) |
|---|---|---|
| SePay Free | 50 | 0đ |
| SePay Startup | 180 trở lên (nhiều bậc) | từ 120.000đ/tháng |
| Casso Free | 30 | 0đ |
| Casso Starter | 100–700 | 379.000–489.000đ/tháng |
| Casso Pro | 340–10.000 | 1.139.000–1.449.000đ/tháng |
Thiết kế mã đơn hàng trong nội dung chuyển khoản và VietQR
Chìa khoá để đối soát tự động khớp chính xác là để hệ thống, chứ không phải con người, điền nội dung chuyển khoản. Cách làm phổ biến: sinh một mã đơn hàng ngắn, ví dụ DH1024, và nhúng sẵn mã đó vào nội dung chuyển khoản của mã VietQR ngay khi tạo đơn.
VietQR là chuẩn mã QR chuyển tiền nhanh Napas 247 được các ngân hàng tại Việt Nam dùng chung, có thể mã hoá sẵn số tài khoản, số tiền và nội dung chuyển khoản. Khách chỉ cần mở app ngân hàng quét mã và bấm xác nhận, không phải gõ tay bất cứ thông tin nào — nhờ vậy mã đơn không bị viết sai chính tả hay quên nhập.
Nếu vẫn còn kênh nhận chuyển khoản thủ công không qua QR, nên yêu cầu khách nhập đúng cú pháp mã đơn ở đầu nội dung và ghi hướng dẫn rõ ngay trên trang thanh toán. Dù vậy tỷ lệ khách gõ sai hoặc bỏ trống vẫn còn, nên hệ thống khớp lệnh cần có phương án dự phòng cho trường hợp này, thay vì chỉ trông chờ khách làm đúng.
Quy tắc khớp lệnh: đúng tiền, khớp một phần, trả dư, trùng lặp
Một hệ thống đối soát tự động đáng tin cậy cần xử lý rõ ràng từng tình huống thay vì chỉ khớp đúng số tiền và bỏ qua phần còn lại:
- Khớp đúng: tìm thấy mã đơn trong nội dung và số tiền bằng đúng giá trị đơn hàng → tự động đánh dấu đã thanh toán, không cần người can thiệp.
- Khớp một phần: khách đặt cọc hoặc trả nhiều lần cho cùng một mã đơn → cộng dồn số tiền đã nhận, chỉ đóng đơn khi đủ tổng giá trị.
- Trả dư: số tiền nhận được lớn hơn giá trị đơn → vẫn đánh dấu đã thanh toán nhưng ghi riêng phần chênh lệch để hoàn tiền hoặc cấn trừ đơn sau, không tự ý coi là tiền thừa của cửa hàng.
- Trùng lặp (idempotency): mỗi giao dịch có mã giao dịch duy nhất do ngân hàng cấp — hệ thống lưu lại mã này và bỏ qua nếu webhook gửi lại đúng mã đó, tránh cộng tiền hai lần khi SePay/Casso gửi lại do mất kết nối tạm thời.
- Đến trễ hoặc không tìm thấy mã đơn: giao dịch không khớp được đơn nào, do khách gõ sai hoặc chuyển trước khi đơn được tạo → đẩy sang danh sách cần người kiểm tra kèm đầy đủ số tiền, thời gian, nội dung gốc, tuyệt đối không tự đoán rồi gán bừa vào đơn gần đúng.
Bảo mật webhook: đừng tin số tiền do phía khách gửi lên
Vì webhook là một địa chỉ URL công khai, ai biết được địa chỉ đó cũng có thể gửi dữ liệu giả để tạo giao dịch khống nếu hệ thống không kiểm tra nguồn gốc. Nguyên tắc bắt buộc: xác nhận đơn hàng phải do server quyết định dựa trên dữ liệu ngân hàng đã xác thực, không bao giờ dựa vào việc trình duyệt hay app phía khách hàng tự báo 'tôi đã thanh toán rồi'.
SePay cho khai báo xác thực webhook bằng HMAC-SHA256, API Key hoặc OAuth 2.0 ngay trong lúc thiết lập — nên chọn một trong ba, không để chế độ không xác thực. Casso đính kèm khoá bí mật trong header Secure-Token mỗi lần gọi webhook; hệ thống phải so khớp khoá này với khoá đã lưu trên server trước khi xử lý bất kỳ giao dịch nào.
- Luôn kiểm tra chữ ký/khoá bí mật trước khi đọc nội dung webhook, không xử lý request nào chưa xác thực được nguồn gốc.
- Không tin số tiền hoặc trạng thái thanh toán gửi từ phía trình duyệt/app khách hàng; số tiền thật luôn lấy từ dữ liệu ngân hàng qua webhook đã xác thực.
- Không để log hoặc giao diện công khai hiển thị số dư, số tài khoản ngân hàng cho người ngoài xem được.
Báo Zalo ngay khi có tiền, ghi sổ Google Sheets tự động
Sau khi khớp lệnh thành công, workflow nên bắn tin Zalo cho người bán và khách hàng gần như ngay lập tức: người bán biết để chuẩn bị giao hàng, khách biết đơn đã được xác nhận nên không cần nhắn hỏi lại nhiều lần.
Song song, mỗi giao dịch nên được ghi thành một dòng trong Google Sheets đóng vai trò sổ thu: mã đơn, số tiền, thời gian, nội dung gốc, trạng thái khớp lệnh. Sổ này thay cho việc mở app ngân hàng dò tay mỗi khi cần tra lại một giao dịch cũ, và có thể chia sẻ cho kế toán mà không cần cấp quyền xem tài khoản ngân hàng thật.
Báo cáo đối soát cuối ngày để bắt phần còn sót
Webhook chạy ổn phần lớn thời gian, nhưng mạng có lúc gián đoạn khiến một vài giao dịch không tới nơi. Vì vậy nên thêm bước gọi API lấy toàn bộ giao dịch trong ngày rồi so với danh sách đã ghi vào sổ, để phát hiện phần bị sót thay vì chỉ trông chờ webhook.
Cuối ngày hoặc cuối tuần, một báo cáo ngắn gửi qua Zalo hoặc email nên nêu rõ: tổng tiền vào, số đơn khớp tự động, số đơn đang chờ người kiểm tra, số giao dịch trả dư hoặc trả thiếu chưa xử lý — giúp chủ shop biết chỗ nào cần chú ý mà không phải đọc lại toàn bộ sổ.
Checklist trước khi bật đối soát tự động
Trước khi đưa vào chạy với đơn hàng thật, kiểm tra đủ các mục sau:
- Tài khoản SePay hoặc Casso đã liên kết đúng ngân hàng đang dùng để nhận tiền.
- Mọi đơn hàng đều sinh mã đơn duy nhất và nhúng vào VietQR trước khi hiển thị cho khách.
- Webhook đã bật xác thực bằng HMAC-SHA256, API Key hoặc Secure-Token, không để chế độ không xác thực.
- Đã xử lý đủ bốn tình huống: khớp đúng, khớp một phần, trả dư, trùng lặp.
- Giao dịch không khớp được mã đơn có nơi chứa riêng cho người kiểm tra, không tự đoán gán.
- Đã thử nghiệm với ít nhất một giao dịch thật giá trị nhỏ trước khi dùng cho toàn bộ đơn hàng.
