Reconciling your collections with your accounts
Why the amount collected is never the amount that lands in the bank, and how to make the numbers tie out every day.
A merchant who reads their first bank statement always asks the same question: why do 47,320 dirhams collected this week become 46,691.52 in my account?
The answer lies in three gaps, all explainable, and a daily reconciliation that takes five minutes once it is in place.
Gap 1: fees
The amount a customer pays is not the amount you receive. The commission is taken on each transaction, and the payout that reaches the bank is a net figure.
That is why the portal systematically shows three numbers on every operation: the amount paid, the fees, and the net. Your accounting needs all three — the gross for revenue, the fees for expenses, the net for cash.
Gap 2: the payout lag
Monday's payments credit your ChariPay account on Monday, the instant they succeed — the money is available there without waiting. What reaches the bank, however, is the payout: the distinct operation — by transfer on demand, or automatic every night once a settlement account is configured — that groups several collections. It is that payout which appears on the statement, with its own reference.
So a payout can contain payments from several days, and one day of payments can end up split across two payouts. Reconciling payment by payment against the bank statement is a lost cause: it is the payout you reconcile, together with the list of operations that make it up.
Every payout carries a reference that appears on your bank statement. That is your reconciliation key.
Gap 3: refunds
A refund issued on Wednesday may be deducted from a Friday payout. On the statement it does not appear as a separate line: it simply reduced the amount paid out.
Hence the rule: never reconcile a payout without looking at the period's refunds. An abnormally low payout almost always has that explanation.
Daily reconciliation, in practice
- 1Export the day. The CSV export of transactions covers the period you choose and opens straight in a spreadsheet. Past a few hundred rows it is faster and safer than pagination.
- 2Total by type. Payments, refunds, fees. Three totals, not one.
- 3Reconcile the payouts. For each line of your bank statement, find the matching payout by its reference, and check that its composition explains the net.
- 4Isolate what does not tie out. A persistent gap is almost always a forgotten refund, a payout still on its way to the bank, or an operation from the next day.
The timezone question
This is the quiet trap. A day boundary computed in UTC places payments collected between midnight and 1 a.m. on the previous day, since Morocco is at UTC+1.
In practice: every other day your total does not tie out, for no visible reason. Make sure your reconciliation tool cuts days in Moroccan time, not universal time. Export timestamps are in UTC (ISO format): it is up to your tool to convert them before totalling.
Building the export that adds up
Reconciliation is won when the export is designed, not when the boxes get ticked. Three construction choices make the difference.
Export by value date, not creation date. A sale created on the 31st at 11:50 pm and paid on the 1st at 0:10 am belongs to the next month. If your export mixes the two dates, every month-end will produce phantom differences that cancel out — the most painful kind to explain.
Keep the reference end to end. The ChariPay transaction identifier must live in your system — on the order, on the invoice, on the ledger entry. A reconciliation where matches are found by amount and date is an investigation; with the reference, it is a join.
One line per movement, never net amounts. A 500 MAD sale refunded 100 MAD is two movements, not a 400 MAD sale. Net amounts make totals right... until the day the refund lands in another month, and nothing can be explained any more.
Automating without rewriting everything
Useful automation starts long before full accounting integration.
First rung: the portal export, as is, imported into your spreadsheet with references. Manual matching drops from an afternoon to half an hour.
Second rung: a daily script calling the API, comparing per-day totals with your database, alerting only on differences. Zero differences, zero work — reconciliation becomes a silence you keep an eye on.
Third rung only then: automatic entries in the accounting tool. It is the longest to make reliable, which is why it comes last — the first two rungs will already have taught you every subtlety of your own flows.
What to remember
Do not reconcile payments against a bank statement. Reconcile payouts, keeping the three amounts of each operation and the period's refunds at hand. Reconciliation then becomes a check, not an investigation.
Written by ChariPay team.