ADR-008: Reconciliation and exception management¶
| Status | Accepted |
| Date | 2026-04-10 |
| Deciders | CTO, CFO, Head of Payments, Head of Platform |
| Affects repos | bank-core, bank-payments, bank-risk-platform |
Status¶
Accepted — 2026-04-10
Context¶
A bank's reconciliation process is the mechanism by which it verifies that its internal records match external reality — nostro accounts, payment scheme settlement files, card network files, and correspondent bank statements. Breaks are inevitable. The question is how quickly they are detected, how they are investigated, and how they are resolved.
Exception management is the broader discipline: what happens when something goes wrong in a financial process — a failed payment, a suspense account entry, a duplicate transaction, an unmatched settlement — and how is it tracked, owned, and resolved within SLA.
This is a compliance obligation (REP-004, CAP-002) as well as an operational one. Unresolved breaks are a regulatory concern.
Requirements¶
- Automated reconciliation runs for all payment rails (NPP, Payments NZ, FX nostros, card schemes) on settlement cycle
- Breaks detected and classified automatically — not discovered by manual review
- Exceptions routed to the correct owner with priority, SLA, and audit trail
- Suspense account management — entries must not age beyond defined thresholds without escalation
- Management reporting on break volumes, ageing, and resolution time
- Regulatory evidence trail for all resolution actions
Options evaluated¶
Option A — Build in Snowflake (recommended)¶
Reconciliation logic as Snowflake dynamic tables and views. Settlement files ingested to Snowflake via S3 on each settlement cycle. Internal position from Postgres CDC. Matching logic in SQL. Breaks surfaced as a Snowflake table. Exceptions managed via a back office queue in the app (SD08).
Strengths: All data already in Snowflake; no additional platform; SQL matching logic is transparent and auditable; easy to adjust rules without deployment; Snowflake can handle the volume easily; breaks feed directly into operational dashboards; no additional licensing cost.
Weaknesses: Reconciliation logic in SQL requires discipline to maintain; complex multi-leg FX reconciliations need careful modelling; operational queue for exceptions needs to be built in the back office app.
Option B — Purpose-built reconciliation platform (AutoRek, SmartStream, Duco)¶
Specialist reconciliation platforms with pre-built connectivity, matching algorithms, and exception workflows.
Strengths: Pre-built connectors for common payment schemes; sophisticated matching algorithms; built-in exception workflow and SLA tracking; regulatory reporting built in.
Weaknesses: Significant licensing cost (six figures annually for enterprise platforms); heavy implementation; adds a new platform to operate and maintain; data must be moved to the platform; overkill for a startup bank's initial volume; KISS violation.
Option C — Hybrid — Snowflake for reconciliation, dedicated workflow tool for exceptions¶
Use Snowflake for the matching and break detection. Use a lightweight workflow tool (Linear, Jira, or a custom back office queue) for exception tracking and resolution. Integration between them via the write-back API.
Perspective evaluation¶
| Perspective | Snowflake-native | Purpose-built platform | Hybrid |
|---|---|---|---|
| Performance & Scalability | ✓ | ✓ | ✓ |
| Evolution | ✓ SQL rules easy to change | ~ Platform-dependent | ✓ |
| Strategy | ✓ Consistent with data platform | ~ New vendor dependency | ✓ |
| Integration | ✓ Data already in Snowflake | ~ New integrations required | ✓ |
| Support & Maintenance | ✓ No new platform | ~ Additional platform to maintain | ~ |
| Cost | ✓ No additional licensing | ✗ Six figures annually | ✓ |
| Regulatory | ✓ Auditability via Snowflake | ✓ Purpose-built | ✓ |
| Capability | ~ Must build exception queue | ✓ Pre-built | ✓ |
| Resource | ✓ Snowflake skills reused | ~ New platform skills | ✓ |
See perspectives.md for how to use these evaluation lenses.
Principles alignment¶
| Principle | Assessment |
|---|---|
| AP-001 KISS | Snowflake-native is the simplest approach that meets requirements |
| AP-002 Data governance | Reconciliation data owned and lineage-tracked in Snowflake |
| AP-003 Compliance | Automated detection + immutable exception trail satisfies REP-004 |
| AP-008 Real time | Reconciliation is end-of-day cycle; real-time not required here |
| AP-009 Robust and serviceable | Breaks must alert automatically; no manual polling |
Recommendation (pending decision)¶
Snowflake-native reconciliation with back office exception queue (Option A / C hybrid):
- Matching logic in Snowflake dynamic tables — transparent, auditable, adjustable
- Settlement files land in S3 → ingested to Snowflake on each settlement cycle (same pattern as ADR-003)
- Internal position from Postgres CDC → Snowflake (already flowing)
- Breaks written to a
reconciliation_breakstable in Snowflake - Write-back API pushes open breaks to the back office exception queue (SD08)
- Exception queue in back office app — owner assignment, priority, SLA countdown, resolution notes, audit trail
- Management reporting from Snowflake — break volumes, ageing, resolution time by category
This approach adds no new platform, reuses existing data flows, and keeps the exception workflow visible to operations staff in the same app they use for everything else.
A purpose-built platform should be reconsidered if break volumes and complexity grow beyond what Snowflake SQL can handle cleanly — evaluate at 12 months.
Exception categories and SLA targets¶
| Category | Description | Target resolution |
|---|---|---|
| Payment break | Internal record doesn't match scheme settlement | Same business day |
| Nostro break | Internal FX position doesn't match correspondent | 2 business days |
| Card scheme break | Card network settlement file mismatch | 5 business days |
| Suspense entry | Unallocated amount in suspense account | 5 business days |
| Duplicate transaction | Suspected duplicate posting | 2 business hours |
| Regulatory report break | Reported amount differs from source | Before next submission |
Relevant viewpoints¶
- Functional viewpoint — Reconciliation cycle flow; exception queue in back office
- System viewpoint — Settlement file ingest; Snowflake matching; write-back to exception queue
- Information viewpoint — reconciliation_breaks table structure; data lineage from settlement file to resolution
- Operational viewpoint — Break alerting; SLA countdown; escalation path for aged breaks
See viewpoints.md for guidance on producing these viewpoints.
Signoff record¶
| Date | Name | Role | Status |
|---|---|---|---|
| 2026-04-10 | Ross Millen | CTO | Approved |
| 2026-04-10 | Ross Millen | Head of Architecture | Approved |
| 2026-04-10 | Ross Millen | Head of Data | Approved |
Capabilities¶
| Capability | Description | Relationship |
|---|---|---|
| CAP-025 | Automated regulatory reporting pipeline | governed — reconciliation breaks feed regulatory evidence trail via Snowflake |
| CAP-026 | Exception-only case routing | enabled — exception queue routes only unmatched breaks to agents |
| CAP-029 | Immutable audit log | governed — resolution actions written to immutable audit trail |
| CAP-094 | Work queue management | enabled — exception queue is a work queue with owner, priority, and SLA countdown |
| CAP-127 | Automated payment reconciliation | enabled — settlement-cycle reconciliation across all payment rails |
Related decisions¶
| ADR | Title | Relationship |
|---|---|---|
| ADR-002 | Snowflake as the analytics and risk compute platform | reconciliation matching logic lives in Snowflake Dynamic Tables |
| ADR-003 | CDC pipeline — Neon Postgres to Snowflake via Firehose and Apache Iceberg | internal position flows to Snowflake via CDC for matching |
All ADRs
Compiled 2026-05-22 from source/entities/adrs/ADR-008.yaml