Why batch synchronisation fails here
Nightly batch reconciliation between a CRM and a core banking platform leaves a multi-hour window in which relationship managers act on stale balances and operations teams act on stale customer data. Both systems are internally consistent and jointly wrong.
Event-driven integration reduces that window to seconds, but it only works if the fundamental question is answered first: for each field, which system is the source of truth?
Establish ownership before wiring anything
Produce a field-level ownership matrix. Core banking typically owns balances, product holdings, transaction history, and regulatory identifiers. The CRM typically owns interaction history, opportunity state, preferences, and consent records. Contested fields — contact details are the classic case — need an explicit precedence rule.
Without this matrix, bidirectional synchronisation produces update loops in which each system overwrites the other, and the winner depends on message timing.
Idempotency, ordering, and replay
Every event carries a stable business key and a monotonic version. Consumers reject events whose version is not greater than the version already applied, which makes redelivery harmless. Partition by customer identifier so ordering is guaranteed for a given customer without serialising the whole stream.
Retain events long enough to rebuild downstream state from the log. When a projection is found to be wrong — and eventually one will be — replay is dramatically cheaper than a bespoke repair script, and it produces an auditable result.
Reconciliation and observability
Event-driven does not mean reconciliation-free. Run a continuous comparison over owned fields and alert on divergence beyond a defined tolerance. Regulated environments will require evidence that the two systems agree, and a passing reconciliation report is that evidence.
Instrument end-to-end lag from source commit to target visibility, not just broker lag. Business stakeholders care about when a relationship manager sees the balance, and that is the number the service-level objective should express.
