Connecting Shopify to an ERP or fulfilment system
Integration projects fail on ownership, not on protocol. Once two systems both believe they own the stock number, every subsequent bug is a symptom of that one unmade decision.
So the first deliverable is not code. It is a table.
The ownership table you write first#
| Field | Owner | Direction |
|---|---|---|
| Product master data | Usually ERP | ERP → Shopify |
| Price | Usually ERP | ERP → Shopify |
| Stock level | One system, never both | Warehouse → Shopify |
| Orders | Shopify | Shopify → ERP |
| Fulfilment status and tracking | Warehouse | Warehouse → Shopify |
| Customer record | Depends; decide explicitly | One direction only |
The rules that keep it sane#
- One owner per field, and the other system never writes it.
- Sync in one direction per field. Bidirectional sync is where the loops live.
- Use a stable external identifier — SKU, not internal database IDs.
- Make everything idempotent so a replay is harmless.
- Log every message with its identifier so a disputed order can be traced end to end.
Stock is the hard part#
Stock is the field everyone wants to write and nobody wants to own. Pick the system closest to the physical goods, usually the warehouse, and let it be authoritative. Shopify then reflects that number rather than negotiating with it.
Oversells are almost always a symptom of two writers, not of sync latency. Fix ownership before tuning frequency.
Plan for the boring failures#
The warehouse goes offline for an hour; the ERP rejects a malformed address; a product exists in one system and not the other. None of these are exotic, and all of them need a defined behaviour and a place where a human can see the queue.
Frequently asked questions
Real-time or batch sync?
Orders promptly, stock frequently, product data on a schedule. Real-time everything costs more and improves little.
Should we use a middleware platform?
For several systems, yes — it centralises retries, logs and mapping. For one integration it is often more moving parts than value.
Who fixes a stuck message at 2am?
Decide before launch. An integration without an owner and a visible queue becomes silent data loss.
shopify erp integrationshopify fulfilment integrationshopify inventory syncshopify warehouse integrationshopify middleware