Most shops, restaurants and pharmacies in Kenya accept M-Pesa. But there are two very different versions of "accepting M-Pesa." One involves a cashier telling a customer to send money to a till number, then checking a confirmation SMS or the Mpesa app to verify payment, then writing it in a book. The other version involves the POS sending a payment request directly to the customer's phone, receiving confirmation automatically, and posting the transaction to accounts without anyone touching a pen.
The second version is what proper M-Pesa integration looks like. If you are doing the first one, you have a reconciliation problem you may not even know about yet.
What is the actual problem with manual M-Pesa?
When M-Pesa is handled manually, you rely on a cashier to correctly match every mobile payment to a sale. On a quiet Tuesday, that is manageable. On a Saturday afternoon with 40 customers in the queue, things go wrong:
- A payment comes in but the cashier does not match it to the right sale
- A customer claims to have paid but there is no record in the book
- A payment is received for one amount but the sale was a different amount and no one notices
- End of day, the till is Ksh 3,400 short and no one knows why
These are not edge cases. If you have more than 20 M-Pesa transactions a day, at least one of these things happens at some point every week.
How STK push changes this
STK push is the mechanism that sends a payment request directly to the customer's phone. When a cashier completes a sale on the POS and the customer chooses to pay by M-Pesa, the system sends a request to the customer's phone number. The customer sees a prompt, enters their PIN, and the payment goes through. The POS receives a confirmation from Safaricom within seconds and marks the sale as paid automatically.
Nothing is written manually. Nothing needs to be reconciled at the end of the day. The payment and the sale are already connected in the system.
With STK push, a customer paying Ksh 4,750 for their order gets a prompt on their phone for exactly Ksh 4,750. There is no chance of them sending the wrong amount, and no chance of the cashier writing down a different number.
What does automatic reconciliation mean in practice?
When M-Pesa is integrated with your accounting system, every M-Pesa payment posts to your accounts the moment it is confirmed. At the end of the day, your accounts already reflect the day's M-Pesa revenue. You do not need to export an M-Pesa statement, match it against your sales records, and manually enter the total.
For businesses running on Vendra, M-Pesa payments go directly from the POS into the accounting ledger. The daily reconciliation for M-Pesa takes zero minutes — because there is nothing to reconcile.
What about pay bill vs till number vs STK push?
Pay bill
A pay bill number (like Safaricom's 400200) requires the customer to navigate to M-Pesa, choose Pay Bill, enter the business number and account number, then enter the amount. It is slow for the customer and produces a payment that the business needs to match manually against a sale. Fine for occasional B2B payments, not ideal for retail.
Till number
A till number (Buy Goods and Services) is simpler for the customer — they enter the till number and amount. Still manual from the business side — you need to check your app or SMS to confirm payment and then match it to the sale.
STK push
The system sends the request to the customer. The customer just enters their PIN. Confirmation happens automatically. No manual steps on either side. This is what you want for retail point of sale.
How do you set this up for your business?
To use STK push for your business, you need a Daraja API integration with Safaricom — either set up yourself (which requires technical work) or through a platform like Vendra that already has it built in. When you sign up with Vendra, the M-Pesa integration is part of the platform from day one. You connect your Safaricom pay bill number, and the POS handles the rest.
If you are not yet on a system with M-Pesa integration, the first step is picking a POS that supports it natively — not one that requires a separate plugin, a separate reconciliation tool, or a manual step somewhere in the middle.