Mobile money is the default way to pay in much of Africa, and any app that sells something needs to support it. We have integrated several providers across multiple countries, and the same handful of issues come up every time.
Payments are asynchronous
Unlike a card payment, a mobile money transaction is confirmed by the customer on their own phone, sometimes a minute later, sometimes never. Your app has to show a clear waiting state, poll or receive callbacks reliably, and handle timeouts without charging twice or losing an order.
Every provider is different
Each operator has its own API, sandbox, error codes and settlement schedule, and they change. Put a payment orchestration layer between your app and the providers so adding a new one or handling an outage does not mean rewriting the checkout.
Reconciliation is the real product
Customers forgive a slow payment. They do not forgive money that disappears. Every transaction must be matched against the provider's statement automatically, with a clear process for the small percentage that will not match. Build the reconciliation report before you build the fancy dashboard.
Design the failure states
Insufficient balance, wrong PIN, network timeout, duplicate request: each needs a specific, honest message and a way to retry. Most abandoned payments we see are caused by a generic error, not by the failure itself.
Test on real networks
Sandboxes are clean. Real networks are not. Before launch, run payments on the actual operators, on prepaid SIMs, in the areas your customers live. The first week of production will teach you more than a month of staging, so plan to watch it closely.



