Miomir Labs ← All notes
Field note · 2026-10

Where reconciliation fails

Most of the work in a settlement system is not the matching. The processor gives you a report, the bank gives you a statement, your ledger knows what it posted, and most lines line up on transaction reference alone. A reconciliation system earns its keep on the residue.

The residue has a small number of recurring shapes, and every one of them will show up in your data eventually:

  • Duplicates. A retried transfer posts twice at the processor and once in your ledger. The second posting is real money until someone notices it is not.
  • Partial settlement. A processor settles in two batches and the bank sees one credit. Which ledger entries does it cover? The answer changes the balance.
  • Timing skew. A transaction at 23:58 posts to your ledger today and lands on the bank statement tomorrow. Every day-end boundary invents a discrepancy that resolves itself if you wait, which is why an unmatched item needs an age, not just a flag.
  • Reversals. A transaction that failed after settlement comes back as a debit days later, long after your reports said the books were clean.
  • Rounding. FX conversions accumulate kobo-level differences that no single line explains and every aggregate report inherits.

The discipline is simple to state and easy to skip: match on evidence, escalate on doubt. A line that cannot be matched belongs in a queue that ages and that a named person owns. Auto-resolving an unmatched line is how a small discrepancy becomes the write-off nobody can explain at the end of the quarter.

The edge cases are the product. Anyone can build the part where the references match.