The verdict in three sentences
Mobile money reconciliation in Accra means matching three sources — webhook, operator statement and internal orders — every day. The real work is on the 3 to 7 % of ghost 'pending' transactions, duplicates and an average settlement gap of 0.3 to 1.2 %. With an idempotency key and a 24 h webhook retry window, a daily script removes 95 % of manual errors.
Discrepancy types and their causes
| Discrepancy type | Estimated frequency | Main cause | Action |
|---|---|---|---|
| Ghost pending | 3-7 % | Callback never received | Query status at D+1 |
| Duplicate | 0.5-2 % | Retry without idempotency | Dedupe by reference |
| Amount mismatch | 0.3-1.2 % | Fees deducted at settlement | Reconcile net vs gross |
| Orphan payment | 0.5-1.5 % | Order cancelled on site | Refund or credit |
| Settlement delay | 5-10 % | Operator T+2 payout | Wait for D+2 statement |
| Status conflict | 1-3 % | Webhook and query differ | Trust server query |
Golden rule: the operator statement is authoritative for money actually paid out. The webhook signals intent, the query confirms status, but only the settlement statement proves the net amount received after fees.
The 5-step reconciliation method
| Step | Operation | Frequency |
|---|---|---|
| 1 | Export received webhooks (24 h) | Daily |
| 2 | Download the Paystack/MoMo statement | Daily |
| 3 | Join by reference / AccountReference | Automated |
| 4 | Isolate pending, duplicates, orphans | Automated |
| 5 | Re-query pending > 24 h | Daily |
Automate steps 1 to 4 with a nightly script. Critical point: enforce an idempotency key at payment initiation — it makes deduplication reliable and blocks double charges on retries.
Mini case study
Kwame runs an appliance shop in Accra: 400 transactions/month via MTN MoMo and Paystack, GHS 240,000 collected. Without reconciliation, 5 % ghost pendings (20 transactions) stay unconfirmed — about GHS 12,000 in uncertain status. His daily script re-queries these at D+1 and confirms 17 (the other 3 being genuine failures). Result: GHS 10,200 correctly booked and a monthly close that balances on the first try.
FAQ
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
Why do some 'pending' transactions never resolve?
Usually because the webhook callback never arrived (endpoint down, network timeout). The fix: re-query each pending at D+1 directly with the operator or Paystack API.
What exactly is an idempotency key for?
It uniquely identifies each payment attempt. On retry, the provider recognises the same key and does not charge twice, eliminating duplicates at the source.
Why does the amount paid differ from the amount ordered?
Because merchant fees (around 1 to 2 %) are deducted at settlement. Always reconcile the net amount received against the gross amount ordered, not the reverse.
What is a webhook's retry window?
Most providers retry delivery for about 24 h. Expose an idempotent endpoint able to receive the same event multiple times without creating duplicates.
Can I reconcile manually at first?
Yes, below 100 transactions/month. Beyond that, an automated script becomes essential to keep pace and avoid data-entry errors.
Let's talk about your project. We set up your daily reconciliation scripts with idempotency and automatic re-query of pending transactions. 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.

