The situation
Each system was a sensible purchase on its own. Together they form a set of islands, and the ferry service between them is a person with a spreadsheet. Every transfer is a chance to introduce an error nobody catches until month end.
Our approach
Point-to-point connections between every pair of systems get unmanageable fast. We put a documented integration layer in the middle: one contract per capability, versioned, with validation at the boundary and a dead-letter path for what fails.
Where a system has no usable API, we work with whatever it does expose: scheduled extracts, database replication, file drops. That ugliness stays isolated behind the same contract.
What changes
Adding the next system costs you one integration, not six. When something fails, an alert tells you that day, and you stop discovering it as a discrepancy weeks later.