Almost every established commerce business runs an ERP, and almost every one of them has an integration story that includes the words “it mostly works”. ERP integrations fail quietly, in ways that surface as wrong stock, missing orders and finance teams reconciling by hand. The patterns below are what we see working in production.
Why ERP integrations go wrong
The root cause is almost always the same: two systems with different data models, different update rhythms and different notions of truth, connected by an integration that pretends they are the same system. Point-to-point field mapping without ownership rules produces conflicts the integration cannot resolve — so it resolves them arbitrarily.
Patterns that hold up
Define the system of record — per data type
The ERP owns stock and prices; the shop owns carts and customer sessions; orders originate in the shop and become ERP-owned after transfer. Write these ownership rules down. Every integration bug we debug eventually traces back to an ownership ambiguity.
Exchange events, not database states
Synchronizing by comparing full data dumps is fragile and slow. Exchanging explicit events — “order placed”, “stock changed”, “price updated” — is precise, auditable and replayable. Event-based flows also queue naturally, which means outages become delays instead of data loss.
Make every transfer observable
An integration without logging, correlation IDs and transfer status is a black box that fails silently. The minimum bar: for any order, a support engineer can answer “did it reach the ERP, when, and if not, why” in under a minute.
Plan for the ERP being down
ERPs have maintenance windows, upgrades and outages. The shop must keep selling through all of them. That means queued transfers with retries — and business rules for what happens to stock display when fresh data is not available.
Takeaway
A good ERP integration is boring: orders flow, stock is right, nobody talks about it. Getting there is an architecture problem — ownership rules, event-driven flows, observability — not a plugin installation.

