Đối soát giao dịch ngân hàng = match từng dòng biên lai vào ngân hàng với từng đơn pending trong shop. Làm tay = nhân viên FT 8h/ngày. Auto = vài giây sau khi tiền vào tài khoản.

3 cách đối soát tự động

1. Webhook push — BeePay (recommend)

Service bên ngoài (BeePay) đọc SMS biên lai từ bank, parse, POST webhook về site bạn ngay khi tiền vào.

  • ✓ Realtime (1-3 giây)
  • ✓ Không tốn quota API
  • ✓ Phí cố định ~100k/tháng, không phí giao dịch
  • ✗ Phụ thuộc service bên ngoài

2. Polling API ngân hàng — Vietcombank, MB Bank

Bank cung cấp API query lịch sử giao dịch. Cron job chạy mỗi 30s, lấy 20 giao dịch gần nhất, match với pending orders.

  • ✓ Không phụ thuộc service trung gian
  • ✗ Trễ 30-60 giây
  • ✗ Không phải bank nào cũng có API public
  • ✗ Polling nhiều = tốn quota / có thể bị block

3. Parse SMS local — server tự đặt cạnh điện thoại

Cài modem GSM hoặc Android device cũ vào server, đọc SMS biên lai bằng AT command hoặc Tasker → POST webhook về site.

  • ✓ Không phụ thuộc bên thứ 3 nào
  • ✗ Setup hardware phức tạp
  • ✗ Mất sóng / hết pin / hỏng modem = đối soát chết
  • ✗ Không scale (chỉ 1 SIM = 1 bank)

So sánh trên 3 trục

Webhook (BeePay)Polling APISMS local
Setup time30 phút2-3 giờ1-2 ngày
MaintenanceHầu như khôngRefresh token, retryHardware monitor
Latency1-3s30-60s5-15s
Cost / tháng~100k~100k (API rent)~50k SIM + hardware
Reliability99.9%~99% (token expire)~95% (hardware fail)

Khi nào dùng cách nào?

  • SME shop online <500 đơn/ngày → BeePay (webhook). 30 phút setup, ROI ngay tháng đầu.
  • Hệ thống enterprise có dev team → Polling API VCB / MB. Tự kiểm soát hoàn toàn, không phụ thuộc service ngoài.
  • Site offline / không có internet ổn định → SMS local. Chấp nhận setup phức tạp.

Pitfall thường gặp khi auto-đối soát

  1. Khách CK thiếu nội dung — order_id không match. Cần fallback: hiển thị danh sách giao dịch unmatched cho admin xác nhận tay (≤5% volume)
  2. Khách CK sai số tiền — thừa hoặc thiếu vài đồng. Logic so sánh: cho phép sai trong khoảng ±100đ thì auto-match, ngoài thì gắn cờ "amount mismatch" cho admin review
  3. Trùng order_id — 2 khách trùng lặp khi gen ID không random đủ. Dùng Date.now() + 6 ký tự random để giảm va chạm
  4. Refund / hoàn tiền — webhook chỉ báo CK in. Hoàn tiền out cần hệ thống riêng

BeePay handle hết 4 case này — code mẫu ở tích hợp Next.jsWooCommerce.