The verdict in three sentences
Collecting across three payment rails in Lagos means managing three settlement calendars that never land on the same day. Without daily reconciliation, the gap between what the customer paid, what the webhook announced, and what actually hits the settlement account becomes invisible and expensive. The fix is a three-column ledger reconciled every evening: store order, gateway notification, real bank settlement.
Three rails, three settlement clocks
The Lagos trap is believing a confirmed payment equals a settled payment. In reality each rail has its own delay before money truly reaches the merchant settlement account, and its own fee taken at source.
| Rail | Settlement delay | Merchant fee (at source) | Webhook confirmation | Net payout on NGN 10,000 |
|---|---|---|---|---|
| Paystack | T+1 | ~1.5 % (capped NGN 2,000) | Instant | NGN 9,850 |
| Flutterwave | T+1 | ~1.4 % | 5-60 s | NGN 9,860 |
| Bank transfer (direct) | T+0 to T+1 | ~0.5 % + fixed | Manual/virtual acct | NGN 9,950 |
| Card (fallback) | T+2 to T+3 | ~2.5 % + fixed | Redirect | NGN 9,750 |
The issue is not only the rate: it is the timing gap. A card order validated Monday may not land until Wednesday. If you reconcile only bank inflows, Monday evening your till looks short even though everything is normal.
The three-column ledger
Robust reconciliation cross-checks three sources per transaction, using a common matching key (order reference + truncated phone/email).
| Column | Source | What it proves | Pull frequency |
|---|---|---|---|
| A — Order | Store database | Customer placed an order | Real time |
| B — Notification | Gateway webhook | Gateway confirmed the charge | Real time |
| C — Settlement | API statement / merchant account | Money arrived | 1x/day (evening) |
| Gap A-B | Computed | Order with no confirmation (failure/timeout) | Evening |
| Gap B-C | Computed | Confirmed but not yet settled (normal if < delay) | Evening |
The golden rule: a B-C gap inside the settlement window (T+0 to T+2) is normal and self-resolves. An A-B gap beyond 30 minutes flags a lost payment to retry. A B-C gap beyond the rail's delay flags a real problem (dispute, chargeback, gateway bug) to escalate.
Mini case study
Chidinma runs a cosmetics store in Lekki, Lagos. She processes 1,200 transactions/month split 55 % Paystack, 30 % Flutterwave, 15 % direct transfer, average basket NGN 9,000, i.e. NGN 10,800,000 in volume.
Before automated reconciliation she matched by hand once a week. Result: 0.7 % unmatched gaps (about 8 transactions, ~NGN 72,000) that turned into dead losses for lack of proof, and an average payout lag of 48 hours because she waited to understand everything before withdrawing.
Need a professional website?
Kolonell builds websites that attract clients, optimized for the Sénégalese market. Free quote in 2 minutes.
With a three-column ledger reconciled every evening: the 8 suspect transactions are caught same day and 6 are recovered (customer chased or settlement located), i.e. ~NGN 54,000 saved/month. She also avoids NGN 15,000/month in bank fees (messy multiple withdrawals replaced by one clean daily payout). Net gain: ~NGN 69,000/month, i.e. NGN 828,000/year, on a flow she previously watched blind.
FAQ
Why does my webhook say "paid" but the money is not in my account?
Because webhook confirmation and bank settlement are two separate events. Paystack and Flutterwave confirm in seconds but settle at T+1; cards settle at T+2. As long as the gap stays inside the rail window, it is normal.
How often should I reconcile?
Columns A (order) and B (webhook) match in real time. Settlement (column C) is pulled once a day, in the evening, once gateways have pushed their statements. Daily reconciliation is enough below ~3,000 transactions/month.
How do I handle an unmatched gap after 48 hours?
If it is an A-B gap (order with no confirmation), it is a failed payment: chase the customer. If it is a B-C gap beyond the delay, open a gateway ticket with the transaction reference. Above 0.7 % unmatched, audit your matching-key mapping.
Would a single aggregator solve everything?
An aggregator simplifies integration but adds its own margin (often +0.5 to 1 point) and its own settlement delay. Collecting direct costs less but is exactly why you need this three-column ledger to keep track.
Can reconciliation be fully automated?
Yes: a daily job pulls API statements, applies the matching key, classifies gaps by type and emails a report. Humans only touch flagged exceptions, a handful of transactions a day instead of checking everything.
Let's talk about your project. We can wire your Paystack/Flutterwave store into a ledger reconciled every night, with automatic gap reports. 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.

