Engine Bot menangani checkout e-commerce penuh — dari inquiry produk, cart, alamat, ongkir, pembayaran, hingga follow-up terjadwal. Ada dua varian: physical dan digital.
Tenant Scope
Semua cart/product/order query terikat store_id. Cart checkout hanya memakai cart milik customer aktif. Lihat Multi-tenant.
Product dan Cart
Produk mendukung:
physicaldandigital- Harga normal dan sale
- Multiple variants dengan SKU, stock, harga, weight, image
- Shipping dimensions dan origin
attachment_linkpada snapshot digital product
Cart (models/carts.js) menyimpan:
wa_customerstore_idproduct_id- optional
variant_id quantitytype_product- custom UUID
id
Checkout Flow
product inquiry
-> addToCarts
-> cart items
-> initiateOrChangeProductOrder(id_carts)
-> create/update Orders
-> create/update Order_Items snapshots
-> physical: ask_shipping_address
-> digital: ask_payment_methodMixed physical dan digital cart ditolak oleh order service saat checkout.
Physical Order Flow
ask_shipping_address
-> checkAddressCustomer
-> address disimpan dan dikonfirmasi
-> checkShippingCost
-> RajaOngkir + custom courier
-> ask_shipping_method
-> getServicesShipping
-> shipping disimpan
-> ask_payment_method
-> getPaymentMethod
-> confirm_order
-> confirmOrder
-> payment_reminderFast path — konfirmasi alamat
Controller memiliki fast path: balasan konfirmasi alamat seperti sudah benar, benar, oke, atau lanjut langsung menjalankan checkShippingCost bila address fields lengkap. Fast path tidak melewati main orchestrator.
Digital Order Flow
checkout
-> ask_payment_method
-> getPaymentMethod
-> confirm_order
-> confirmOrder
-> payment_reminder
-> payment success
-> attachment_link dikirim ke customerFollow-up State
Checkpoint valid di setOrderFollowup:
| Checkpoint | Butuh order? |
|---|---|
call_to_order | ❌ |
ask_product_qty | ❌ |
ask_shipping_address | ✅ |
ask_shipping_method | ✅ |
ask_payment_method | ✅ |
confirm_order | ✅ |
payment_reminder | ✅ |
Dua checkpoint pertama tidak membutuhkan order. Sisanya mengikuti order aktif.
Order Status
Nilai yang aktif di code:
| Field | Nilai |
|---|---|
status | pending, process, cancel |
payment_status | unpaid, paid |
followup_step | checkpoint di atas |
proof_pending_verification | menahan reminder tertentu |
Payment Methods
Metode berasal dari settings.shipping.payment_method:
| Code | Metode |
|---|---|
bank transfer | Transfer manual ke rekening |
cod | Cash on delivery |
qr | QRIS |
instant_payment | DazoApp + DOKU checkout |
Label dan code berasal dari settings. Saat instant payment aktif, payment agent menyembunyikan bank transfer dan QRIS — COD tetap dapat ditampilkan bila aktif.
Manual Proof Flow
image URL
-> fetch dan MIME check
-> base64
-> OpenAI vision description
-> proofTransactionHandler
-> addProofTransaction
-> nominal dibandingkan dengan total order
-> payment/order state diperbaruiTarget: semua manual proof masuk proof_pending_verification; hanya payment gateway, rekonsiliasi bank, atau admin terautentikasi yang boleh menandai paid.
Instant Payment Flow
confirmOrder
-> DazoApp create-checkout
-> checkout URL dikirim ke customer
-> DOKU memproses pembayaran
-> DazoApp update order
-> DazoApp callback Engine Bot
-> Engine Bot kirim WhatsApp notification| Tanggung jawab | Sistem |
|---|---|
| Percakapan, pilih metode, request checkout, cek status, kirim WhatsApp | Engine Bot |
| Create checkout, simpan payment metadata/status, terima webhook DOKU | DazoApp |
| Payment page dan payment processing | DOKU |
Engine Bot tidak memanggil DOKU langsung. Detail contract ada di Instant Payment.
Paid Flow
customer memilih instant_payment
-> payment agent menyimpan metode
-> confirmOrder
-> confirmOrderProccessInstantPayment
-> DazoApp create checkout
-> checkout URL dikirim
-> customer membayar di DOKU
-> DazoApp update database
-> DazoApp callback Engine Bot
-> Engine Bot cancel follow-up
-> Engine Bot load order/store/device
-> Engine Bot send WhatsApp success messageUntuk produk digital, callback/status response menampilkan attachment_link dari order item snapshot bila tersedia. Produk fisik menerima pesan proses packing.
Error mapping
| Kondisi | Engine Bot behavior |
|---|---|
Timeout/ETIMEDOUT | Minta customer mencoba lagi atau hubungi admin |
| HTTP 422 | Data order tidak valid |
| HTTP 404 | Order tidak ditemukan |
| HTTP 5xx | Sistem payment bermasalah |
| Invalid response | Generic payment error |
Rollback operasional
Rollback paling kecil: nonaktifkan instant_payment di settings.shipping.payment_method untuk store terdampak. Metode lain tetap mengikuti settings. Jangan menghapus order instant payment yang sudah terbentuk — rekonsiliasi status dengan DazoApp/DOKU.
Data Integrity Rules
Invariant yang seharusnya dipertahankan:
- Semua cart/product/order query terikat
store_id. - Cart checkout hanya memakai cart milik customer aktif.
- Quantity integer positif.
- Variant wajib berasal dari product yang dipilih.
order.total_pricesama dengan jumlah item snapshot, belum termasuk shipping bila code pemanggil menambah shipping terpisah.- Order dan order items berubah secara atomic.
- Payment status
paidhanya berasal dari sumber terverifikasi.
Langkah berikutnya
- Cara follow-up mengirim? Baca Follow-up Scheduler.
- Detail koleksi order? Baca Orders Schema.
- Detail instant payment contract? Baca Instant Payment.