Features
What DukaBot actually does.
8 capabilities — M-Pesa STK Push, Safaricom Daraja, WhatsApp Business Platform Cloud API, catalog sync, reconciliation, webhooks, sandbox testing. Stated plainly.
WhatsApp Business Platform integration
One shared Cloud API number, inbound + outbound, catalog buttons.
DukaBot runs on the WhatsApp Business Platform Cloud API, the official Meta-hosted endpoint. A single shared platform number can host many DukaBot merchants, so a small shop does not need to onboard its own number on Meta Business Manager before going live. The bot routes every inbound message to the correct shop via a /s/<shopCode> link, replies inside the 24-hour customer service window, and falls back to pre-approved templates after that.
M-Pesa STK Push checkout
Pay inside the chat. Till or Paybill via Safaricom Daraja.
Customers pay by tapping a button in WhatsApp that triggers an M-Pesa STK Push prompt on their phone via Safaricom Daraja. DukaBot supports both Till numbers (Buy Goods) and Paybill numbers, and works against the 2 Daraja environments — sandbox or production — per business. Every charge is reconciled against the M-Pesa receipt ID returned by Daraja, so the merchant sees one consistent KES total across WhatsApp orders and the Safaricom statement.
Catalog & inventory sync
Products live in DukaBot, mirrored to the WhatsApp catalog.
Merchants manage products inside the DukaBot dashboard — name, price in KES, image, stock status — and the same items appear inside the WhatsApp catalog that customers browse from the chat. The /s/<shopCode> public storefront only indexes shops with at least 3 available products and a non-empty description, which keeps thin merchant pages off Google but still reachable via direct WhatsApp share. Inventory edits propagate in seconds without needing a separate WhatsApp Business Platform tool.
Order pipeline + reconciliation
Every M-Pesa receipt matched to its WhatsApp order.
DukaBot reconciles each order on three signals: the Daraja CheckoutRequestID returned at STK Push initiation, the M-Pesa receipt code on the success callback, and the account reference (Paybill flow) or Till metadata. When all 3 line up the order is marked paid; mismatches sit in a review queue so the merchant can intervene rather than silently lose KES revenue. The dashboard shows the full WhatsApp -> Daraja -> M-Pesa trail per order for audit purposes.
Merchant dashboard with analytics
Orders, KES revenue, churn — in a Next.js dashboard.
The DukaBot merchant dashboard surfaces today's WhatsApp orders, the running KES total reconciled against M-Pesa receipts, and per-product analytics such as conversion to STK Push completion. Free tier covers 50 orders per month, Starter 500, Growth 2,000 — the dashboard shows usage against the active plan limit so a merchant never has to guess when an upgrade is due. Daraja sandbox traffic is separated from production totals.
Idempotent webhooks for M-Pesa + WhatsApp
Two webhook lanes, both idempotent and signed.
DukaBot exposes 2 webhook endpoints: one for the WhatsApp Business Platform (inbound messages, delivery status) and one for Safaricom Daraja (STK Push callbacks, reversal callbacks). Each endpoint is authenticated — WhatsApp via a verify token, Daraja via a shared secret — and every payload is deduplicated by webhook ID, so a retry from Meta or Safaricom never double-charges the customer or double-creates an order in the DukaBot database.
Daraja sandbox + WhatsApp test mode
Dry-run STK Push and WhatsApp flows before going live.
Safaricom Daraja exposes 2 environments — sandbox and production — and DukaBot keeps them separated behind a per-business flag, so a merchant can dry-run an M-Pesa STK Push checkout end-to-end with test phone numbers before flipping to live Till or Paybill traffic. The WhatsApp Business Platform side runs against a Meta test number until the merchant's own Cloud API number is verified, so the full WhatsApp + M-Pesa loop can be rehearsed without spending any KES.