When CRM, ERP and warehouse systems do not share data, people become the integration layer and copy between screens. Getting the connections right starts with deciding which system owns which data.
Decide who owns what
| Data | Owner | Others hold |
|---|---|---|
| Prospects, contacts, pipeline | CRM | A reference in the ERP |
| Customers as billed entities, credit terms | ERP | A copy in the CRM and WMS |
| Prices and price lists | ERP | Read-only copies in the CRM and portals |
| Sales orders and their status | ERP | Status shown in the CRM and portal |
| Physical stock by location | WMS | Summarized quantities in the ERP |
| Picks, packs and shipments | WMS | Confirmations posted to the ERP |
| Invoices, payments, ledger | ERP | Links from the CRM and portal |
Every fact has one owner. Other systems hold copies that update from the owner, and never the reverse.
The core flows
- A won deal in the CRM creates the customer and the sales order in the ERP.
- The ERP checks credit and releases the order to the WMS.
- The WMS returns pick, pack and ship confirmations with tracking numbers.
- The ERP invoices from confirmed shipments and updates stock valuation.
- Available stock flows from the WMS through the ERP to sales channels. The CRM usually needs it only at quote time.
Edge cases that break integrations
- Split shipments and back-orders: one order becomes several shipments and several invoices.
- Partial shipments: some customers are invoiced on ship, others on complete.
- Returns and RMAs: stock, credit and reason must be posted together.
- Case versus each: quantities in different units on each side.
- Reserved versus available stock: a sales channel that reads on-hand oversells.
- The last unit: two channels sell it within seconds unless one reserves first.
- Credit holds: an order released, then held, must stop the warehouse.
Where integrations usually fail
- Two systems may edit the same field, so changes overwrite each other.
- No shared identifier, so records cannot be matched reliably.
- Failures are silent: a sync stops and the gap goes unnoticed for days.
- Retries create duplicates because messages are not unique.
- Unit-of-measure and currency differences are handled inconsistently.
Build reliability in from day one
- Every integration logs what it sent and what it received.
- Messages carry a unique ID so a retry cannot create a duplicate.
- Failures retry automatically, and after several attempts they go to a dead-letter queue and alert a named person.
- A dashboard shows sync health, so a problem is visible before a customer notices.