M-Pesa — Paybill, Till and settlement
Treat M-Pesa as its own bank account. The Safaricom statement, the settlement to your bank, and how to match customer payments to invoices.
M-Pesa is the most common payment rail in Kenya — and the most common source of reconciliation pain because it's NOT a bank. It's a holding float with its own statement, its own fees and its own settlement schedule. Model it correctly and reconciliation becomes routine.
Paybill vs Till vs Buy Goods
| Product | Use case | Customer pays to |
|---|---|---|
| Paybill (Lipa Na M-Pesa) | B2B / invoice payments | A Business Number, optionally with an account reference |
| Till (Buy Goods) | Retail / counter sales | A Till Number — no account reference |
| Send Money | Person-to-person | A phone number — high fees, B2B prohibited |
| M-Pesa for Business (API) | Programmatic payments + collections | A shortcode tied to an API user |
Modelling M-Pesa in Vendly
Create the Paybill / Till as a Bank Account in Vendly. Set its GL account to a dedicated 'M-Pesa Float' asset account separate from your KES bank current account — this matters because the float and the bank balance move on different schedules.
Add the M-Pesa Bank Account
Bank AccountsThe customer-payment flow
- Customer pays the Paybill with your account reference (typically the invoice number).
- Safaricom records the transaction in the daily M-Pesa statement: amount, customer phone, account reference, transaction ID.
- Money sits in your M-Pesa float (not in your bank yet).
- Once per day (or per a settlement schedule you've configured), Safaricom transfers the day's net (collections minus charges) to your nominated bank account.
Matching M-Pesa receipts to invoices
- Download the daily M-Pesa statement.
- Banking → Transactions → Import for the M-Pesa account.
- Vendly auto-matches each Paybill collection to the invoice with the same number — the account reference is the link.
- Lines without a clean match (customer entered a typo, or no reference) need manual matching. Click the line, pick the invoice.
- Once matched, Vendly creates a Payment Receipt for that invoice and clears AR.
Settlement reconciliation
Safaricom transfers your net M-Pesa float to your bank. That settlement appears as a CREDIT on your bank statement and a SETTLEMENT TRANSFER on the M-Pesa statement. Match the two — they should be equal (minus charges, which Safaricom records as separate fee lines).
| Day | M-Pesa float | Bank account |
|---|---|---|
| Day 0 — customer pays KES 10,000 | +10,000 | — |
| Day 0 — Safaricom charges KES 23 | −23 | — |
| Day 1 — settlement to bank | −9,977 | +9,977 |
If you never reconcile the M-Pesa float, you'll never know when Safaricom mis-charges you (it happens), when a customer payment didn't actually arrive (also happens) or when you've paid M-Pesa fees that should have been refunded. Treat M-Pesa with the same discipline as a bank.
Customer customer-not-found
If a customer paid with the wrong account reference (or none), the auto-match misses. Look up the phone number on the customer list — most established customers' phones are already on file. Match manually to the right invoice. If the customer is brand new, create the client first, then match.