The verdict in three sentences
The worst payment failure is the one where the customer is debited but the order never appears: a USSD timeout cut the session before confirmation. A naive retry that fires without checking causes a double debit in 2 to 4 % of cases and destroys trust; an idempotent retry that first queries status recovers 50 to 65 % of stuck payments without ever charging twice. In Kampala, this difference in logic is worth hundreds of thousands of FCFA per month and zero disputes.
Anatomy of an MTN MoMo / Airtel timeout
When a customer validates a payment, the USSD push gives them 90 to 120 seconds to enter their PIN. If the network or the customer exceeds that delay, the session expires on the operator side, but the debit has sometimes already happened. Your server, meanwhile, received nothing: it thinks the payment failed. Without reconciliation, this transaction stays in "pending" status for 5 to 15 % of attempts.
| Step | Typical delay 2026 | Risk |
|---|---|---|
| USSD push sent | 1-3 s | Low |
| Waiting for PIN | 90-120 s | Timeout if exceeded |
| Operator confirmation | 2-10 s | Loss if network drops |
| Callback to merchant | 2-30 s | Missed event |
| Final "pending" status | up to 24 h | Debit without order |
The prolonged "pending" status is the trap: the customer may have paid, may not have. Only a server-side status check settles it.
Naive retry vs idempotent retry
How you retry makes all the difference between recovering money and diverting it. 2026 comparison.
| Metric | Naive retry | Idempotent retry (status check) |
|---|---|---|
| Checks status before retry | No | Yes |
| Double-debit rate | 2-4 % | ~0 % |
| Payments recovered | 20-30 % | 50-65 % |
| Number of attempts | Unlimited / random | 3 with backoff |
| Reconciliation window | None | 24 h |
| Customer disputes generated | High | Near zero |
| Customer trust | Eroded | Preserved |
The idempotent retry wins everywhere: it recovers twice as many payments while eliminating double debits. The rule: always query status before retrying, never retry blindly.
The right recovery sequence
In 2026, the robust sequence is: detect the timeout, wait a few seconds, query the status API with the original reference. If "paid", validate the order without retrying. If definitively "failed", offer the customer a new attempt. If still "pending", reschedule a check (backoff: 30 s, 2 min, 10 min) up to 3 times, then move to 24 h reconciliation. This logic avoids double debits and catches most ghost transactions.
Mini case study
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
Okello, a restaurateur in Kampala with an online ordering service, handles 600 payments/month, average basket 9,000 FCFA. Around 10 % end up "pending" after a timeout, i.e. 60 transactions (540,000 FCFA in limbo). His old system retried blindly: it recovered 25 % (135,000 FCFA) but double-charged 3 % of customers, generating 18 disputes/month and refunds. With an idempotent retry checking status, he recovers 60 % (324,000 FCFA) and double debits drop to zero. Net gain: +189,000 FCFA/month recovered and 18 disputes eliminated, which also protects his reputation.
FAQ
How can a customer be debited without the order going through?
The debit happens on the operator side, but the confirmation callback to your server gets lost (network, timeout). Your system assumes failure while the money left. A status check over 24 h detects and repairs these cases.
How do you avoid double debits on retry?
By always querying the transaction status before retrying, with the same reference. If it's already "paid", you don't retry. That single rule takes double debits from 2-4 % to nearly zero.
How many retries with what delay?
Three attempts with exponential backoff (for example 30 s, 2 min, 10 min) cover most timeouts. Beyond that, the transaction moves to a manual reconciliation queue over 24 h.
What is the 24 h reconciliation window?
It's the period during which a "pending" status can still resolve on the operator side. You replay the check during this span before concluding a definitive failure or issuing a refund.
Is a double debit commercially serious?
Very: beyond the refund, it destroys trust and generates negative word of mouth. A customer double-charged once hesitates to pay again. That's why idempotent retry takes priority over any conversion optimization.
Let's talk about your project. We install idempotent retry logic that recovers your stuck MTN MoMo and Airtel payments without ever double-charging. 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.
