The verdict in three sentences
M-Pesa Express (STK push) on Daraja works by pushing a prompt to the customer's phone: your server initiates the request, the customer confirms on their handset, and a callback confirms the status. Fees sit around 1.5 %, the per-transaction cap is 250,000 KES, and you must handle a ~12 % abandonment rate when the prompt is ignored. In Node.js, keep initiation, validation and confirmation as separate handlers.
M-Pesa Express (Kenya) vs Moov Money (Togo): 2026 figures
| Criterion | M-Pesa Express (Kenya) | Moov Money Togo |
|---|---|---|
| Fee | ~1.5 % | ~1.7 % |
| Minimum amount | 0 (no strict min) | Low |
| Per-transaction cap | 250,000 KES | ~1,000,000 FCFA |
| Flow type | STK push (Lipa na M-Pesa) | Push + callback |
| Prompt window | ~15 s | ~20 s |
| Abandonment rate | ~12 % | ~12 % |
| Currency | KES (shilling) | XOF (FCFA) |
Both push a notification to the customer's phone: no browser redirect, but a strong dependence on how quickly the user responds.
Node.js integration: three distinct handlers
| Handler | Role | Resulting status |
|---|---|---|
| initiateSTK | POST STK push, sends the prompt | pending |
| validationCallback | Receives the first notification | accepted / rejected |
| confirmationCallback | Receives the final confirmation | SUCCESS / FAILED |
In Daraja, mark the order paid only on the confirmation callback, never on the initial acknowledgement. Respond 200 quickly, then run business logic in the background.
Handling the 12 % abandonment
A 15-second prompt that is ignored means the transaction never completes. Good practices:
- Application timeout at 60-90 s server-side, then status
expired. - A clear message: "Check the M-Pesa prompt on your phone".
- A "Resend request" button that fires a fresh STK push.
- A cleanup job for expired
pendingtransactions so the dashboard stays clean.
Mini case study
Fatou, who runs a fashion store in Mombasa, fires 300 STK push requests a month for an average basket of 1,500 KES. At a 12 % abandonment rate, only 264 transactions complete, or 396,000 KES collected. At 1.5 % fees she pays about 5,940 KES monthly. Adding a "Resend request" button recovers roughly a third of abandons, about 12 transactions and 18,000 KES extra per month.
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
FAQ
Does M-Pesa Express need a browser redirect?
No. It is a push flow: the customer approves directly in an STK prompt on their phone, without leaving your page.
Which callback should confirm the order?
Only the final confirmation callback (SUCCESS), not the initial acknowledgement. That is the only reliable proof of payment.
What is the per-transaction cap?
The 2026 order of magnitude is 250,000 KES for M-Pesa Express, versus around 1,000,000 FCFA for Moov Togo.
How do I reduce the 12 % abandonment?
A clear waiting message, a 60-90 s timeout and a "Resend request" button recover much of the ignored prompts.
Do M-Pesa and Moov code the same way?
The principle is identical (push plus confirmation callback); only endpoints, currency and caps differ. One Node.js skeleton adapts to both.
Let's talk about your project. We integrate M-Pesa Express in Node.js with abandonment handling and retries for your Mombasa store. WhatsApp +221 77 596 93 33.
Mohamed Bah
Fondateur, Kolonell
Passionate about digital and entrepreneurship in Africa, Mohamed has been helping Sénégalese businesses with their digital transformation since 2020. Founder of Kolonell, he believes every SME deserves a professional and accessible online présence.

