Why reconciliation breaks

Each channel has its own references, settlement timing, and failure modes. A callback arrives late, a customer pays twice, a settlement batch nets off fees. Without a common model, someone ends up matching spreadsheets at month-end.

One ledger, many channels

Normalise every incoming payment into a single internal transaction record with a stable reference, the raw provider payload, and a clear status. Channels become adapters; the ledger stays the source of truth.

  • Idempotent processing keyed on provider references
  • Raw payloads stored for audit
  • Explicit states: pending, confirmed, settled, failed

Match automatically, escalate the rest

Rules match the vast majority of transactions to invoices, orders, or accounts. The remainder goes to an exceptions queue with enough context for a person to resolve it in seconds rather than hours.

Close the loop with settlement

Confirmation is not the same as settlement. Import settlement reports, net off fees, and flag anything confirmed but never settled so the books always match the bank.