Shopify
Shopify ERP integration: what to sync, in which direction, and what breaks
Agree which system owns each kind of data, send only what the other system needs, and assume messages will arrive late, out of order or not at all. Most Shopify ERP problems are design problems that show up as sync errors.
By itmarkerz Technologies. Updated 30 October 2026.
Who owns what
Start with this table and change it with your operations and finance leads. An integration can’t resolve an argument about ownership, so settle it before anyone starts on the mapping.
| Data | Usual master | Direction | How it travels | Watch out for |
|---|---|---|---|---|
| Product master and SKUs | ERP or PIM | ERP to Shopify | API, with bulk for large catalogues | Marketing edits in Shopify being overwritten |
| Descriptions and images | Shopify, often | Stays in Shopify | Not synced | An ERP with no place for web content |
| Prices | ERP | ERP to Shopify | API, in batches, with a schedule | Sale prices and market-specific prices |
| Stock levels | ERP or warehouse | ERP to Shopify | API on change, with a periodic full check | Overselling in the gap |
| Locations | ERP | Mapped once, then kept | Mapping table | A new warehouse with no mapping stops stock updates |
| Orders | Shopify at creation | Shopify to ERP | Webhook, plus reconciliation | Edits and cancellations after export |
| Customers | Depends on B2B or B2C | Often both ways for B2B | API | Duplicates; guest checkouts; privacy duties |
| Fulfilment and tracking | ERP or warehouse | ERP to Shopify | API | Part shipments and the customer emails they trigger |
| Refunds and returns | Agree this one explicitly | Usually Shopify to ERP | Webhook, plus reconciliation | Refund in one system, and stock in the other |
| Payouts and fees | Payment provider | To accounting | Report or API | A payout covering many orders |
The limits, from Shopify’s documentation
| Item | Figure or rule |
|---|---|
| GraphQL Admin restore rate, Standard | 100 points per second |
| Advanced Shopify | 200 points per second |
| Shopify Plus | 1,000 points per second |
| Shopify for enterprise | 2,000 points per second |
| Maximum cost of one query | 1,000 points, on any plan |
| Input arrays | 250 items, on every Shopify API |
| Bulk query operations at once | 5 per app per shop, from API version 2026-01 |
| Bulk result download link | Expires after one week |
| Orders readable by default | Last 60 days, unless you add read_all_orders |
Sources: GraphQL rate limits, API limits, bulk operations and access scopes. Limits are per app and store, and the page linked first explains how costs are calculated. Use the GraphQL Admin API for new work. Shopify has treated REST as legacy since October 2024, and new public apps have had to use GraphQL since April 2025.
The 60-day rule often catches people on a first sync. If you need older orders, request read_all_orders in addition to your order scope, and request it early.
Webhooks aren’t a delivery guarantee
Orders usually arrive through webhooks such as orders/create. Shopify’s webhook documentation gives you four rules to design around:
- Ordering isn’t guaranteed, within a topic or across topics. An update can arrive before its create, so compare timestamps and fetch the latest record when in doubt.
- Ignore repeats using the
X-Shopify-Webhook-Idheader, and store the order ID so processing twice does nothing. - Verify the signature in
X-Shopify-Hmac-Sha256before you trust the body. - Run reconciliation jobs, as Shopify recommends, to fetch data periodically. This job isn’t optional: it’s how you find what webhooks missed.
Accept the webhook quickly, put it on a queue and do the real work there. An ERP that is slow or down for maintenance shouldn’t cause Shopify deliveries to fail, and a queue lets you hold orders until it is back.
Bulk work: catalogues and first loads
A bulk query lets you export a large data set without hitting rate limits on the query itself, although your calls to start and poll it still count. The result is a JSON Lines file, so you can process it one line at a time without loading everything into memory. Subscribe to bulk_operations/finish and keep polling as a fallback, because Shopify says that delivery isn’t guaranteed. Download results promptly since the link expires after a week. For a nightly price or stock run, compare against what you last sent and push only the changes. A full push every night wastes your allowance and hides real problems among the noise.
Connect directly, or put something in the middle?
The first architectural choice is whether Shopify and the ERP talk to each other through a small service of your own, or through whatever connector the ERP offers. For anything beyond a simple setup, we lean towards a thin service in the middle. It doesn’t need to be large. Its value is in holding the things neither system wants to hold.
| Approach | Works well when | Struggles when |
|---|---|---|
| Shopify app or connector from the App Store | A common ERP and ordinary rules | Your mapping is unusual or you need to see why something failed |
| ERP vendor’s own connector | Your ERP vendor supports it actively | It lags behind Shopify’s API changes or hides its errors |
| iPaaS tool | You have someone who can own its workflows | Logic spreads into many small flows nobody can test |
| Thin custom service | Rules are yours, and you want failures on one screen | Nobody will own it after launch |
A service in the middle holds the ID mapping between Shopify and the ERP, the queue, the failure list and the daily comparison. It also shields each side from the other’s changes. When you replace your ERP in five years, the storefront doesn’t have to know. If you go this way, keep it boring: no business rules that belong in the ERP, and no copy of data it doesn’t need.
Stock: decide what “available” means
Stock looks like a single number until you try to sync it. The ERP may hold on-hand, allocated and in-transit quantities per warehouse. Shopify shows what can be sold at each location. Someone has to define the formula. A common one is on-hand minus allocated minus a safety buffer, and the buffer is a business decision rather than a technical one.
The gap between a sale on Shopify and the ERP knowing about it can oversell your last unit, and the gap gets worse in a busy sale. Your options are to hold a buffer on fast-moving lines, to shorten the sync on those lines, or to accept some overselling and have a clear customer process for it. Also decide who wins if the two systems disagree. We would normally treat the ERP as the truth and run a periodic check that corrects Shopify and reports how far it had drifted, because the size of the drift tells you whether something is broken.
An order needs a state of its own
Don’t treat an order as “sent” or “not sent”. Give each one a small state in your service, so that staff can answer “where is this order?” without calling a developer.
| State | Meaning | Who acts |
|---|---|---|
| Received | Webhook accepted and verified | Nobody; the queue takes it |
| Held | Unknown SKU, failed fraud check or address issue | Operations |
| Sent | ERP accepted it, and its order number is stored | Nobody |
| Changed after send | Edit or cancellation arrived after export | Operations, if already picked |
| Shipped | Tracking sent back to Shopify | Nobody |
| Failed | Retries are used up | A named person |
Hold orders on purpose where risk checks matter. Sending every order to the warehouse the moment it arrives means staff can pick something you then cancel. A short delay for payment and fraud review costs little, and the ERP gets fewer corrections.
B2B, markets and multiple stores
Three things can multiply the work, so raise them early. B2B: customer-specific prices, payment terms and company accounts have to be mapped, and the ERP usually holds them. Check what your Shopify plan supports before designing this. Markets: several currencies and price lists mean one SKU has several prices, so find out which system decides them, and how rounding works. Multiple stores: each store has its own API limits, webhooks and IDs. Keep a store column on every mapping from day one, even if you have only one store today.
Eight cases to test before go-live
| Case | What should happen |
|---|---|
| An order arrives for a SKU the ERP doesn’t know | It goes on a visible hold, with a clear message. It isn’t dropped |
| The ERP is down for a night | Orders queue up, and process in order when it returns |
| An order is edited or cancelled after export | The ERP receives the change. If it has already shipped, a person is told |
| Stock reaches zero during a sale | Your overselling rule applies; check the product’s “continue selling” setting |
| A part shipment | Tracking for the shipped lines only, without confusing the customer |
| A partial refund, including shipping and tax | Amounts post correctly, and returned stock is handled as agreed |
| A discount code on a mixed-tax order | The ERP’s total equals Shopify’s to the penny, or the difference is flagged |
| A new warehouse or market opens | Unmapped values stop safely and alert someone |
Rounding, tax and totals
The last of those deserves extra attention. Shopify and your ERP may not calculate tax or spread discounts across order lines in the same way, so totals can differ by small amounts. If the ERP recalculates, you will find differences you have to explain. A safer default is to send Shopify’s line-level amounts and tax as the record of what the customer paid, and to have the ERP accept them, with a small agreed tolerance and a report of exceptions. Ask your accountant, because this affects how the books are kept.
Keeping it healthy
- A daily comparison. Orders in Shopify against orders in the ERP, for yesterday, with totals. Anything missing goes to a person.
- A screen for failures. The operations team should see what is stuck and press retry without opening a developer ticket.
- A named owner. Someone reads that screen every day.
- API version upgrades. Shopify’s Admin API is versioned, so put version updates on your calendar. An integration nobody updates eventually breaks on a date you didn’t choose.
- An owner for the app itself. Custom apps are now created in the Dev Dashboard. Make sure the store’s owner, not one contractor, controls that access.
Rolling it out without stopping orders
Don’t switch everything on at once. Begin in one direction, with the lowest risk: send stock and prices to a development store and compare the results. Next, send orders from a development store into an ERP test company. When you go live, run old and new side by side for a short period and compare them every day, with someone from operations reading the comparison. Move fulfilment last, since it triggers emails to real customers. Agree a way back as well: if the sync misbehaves during a busy day, who stops it, and how do orders get processed in the meantime? Write that down before you need it.
Questions to answer before you get a quote
- Which ERP and version, and does it have a documented API? This is often the harder half of the project.
- How many orders a day at peak, how many SKUs, and how many locations?
- Are you B2C, B2B or both? Company accounts and customer-specific prices change the design.
- How many Shopify stores or markets feed the one ERP?
- Does the ERP need each order in real time, or would batches every few minutes do?
- Who currently fixes mistakes, and how many do they fix a week? That number helps justify the budget.
If you are also planning a move onto Shopify, do the mapping at the same time. See our migration checklist. Custom discount or delivery rules are covered in Shopify Functions now that Scripts have gone, and our wider approach is on the integration services page.
Not Shopify, but the same problem: store and website data flowing into Microsoft Dynamics
Three years keeping a high-volume Belgian WooCommerce store up, fast and in sync with Microsoft Dynamics: PHP 7.4 to current, two-hourly backups to S3-compatible storage, monitoring, and every change request handled.
- Sector
- E-commerce & retail
- Region
- Belgium
- Stack
- WordPress, WooCommerce, Microsoft Dynamics
- Engagement
- Maintenance, three years and ongoing
WordPress website plus an integration that sends enquiries and customer data straight into Microsoft Dynamics for a Belgian supplier of water-treatment systems to businesses. Fixed-scope project.
- Sector
- Industrial & B2B
- Region
- Belgium
- Stack
- WordPress, Microsoft Dynamics
- Engagement
- Fixed-scope project
Questions
Should we use a connector or a custom Shopify ERP integration?
Try a maintained connector first if your ERP is common and your rules are ordinary. It is usually cheaper and someone else keeps it current. Custom work makes sense when your pricing, stock allocation or order flow doesn't fit, or when a connector's fixed mapping means staff correct records by hand.
Have you built a Shopify ERP integration?
Most of our work is delivered under NDA, so many projects cannot be named. Our published integration work is on WooCommerce and WordPress with Microsoft Dynamics, and on billing with accounting systems. It isn't a Shopify case study, so we show it as evidence of how we handle this kind of problem, and we took the Shopify facts on this page from Shopify's own documentation.
What does a Shopify ERP integration cost?
We quote after seeing your systems and rules. Our developers start from $20/h, invoiced in USD, GBP, EUR or INR. Volumes, the ERP's own API and how many edge cases you have will drive the figure far more than Shopify does.
Which Shopify plan do we need?
An integration can use the Admin API on any plan, and higher plans get a higher API restore rate: 100 points a second on Standard, 200 on Advanced, and 1,000 on Plus. Custom apps that use Function APIs need Plus. Check the rate your own volumes require.
More on Shopify
- Moving to Shopify: a migration checklist that protects your URLsThe import order, redirect rules and traps from Shopify's own documentation.
- Shopify Functions now that Scripts have goneWhich Function API replaces what, the limits, and who can run custom ones.
- Theme, app or Function? Where a Shopify change should liveA table for deciding, before anyone quotes you for the wrong kind of work.
Connecting Shopify to your ERP?
Tell us your ERP, your order volumes and where people re-key data today. We will tell you whether a connector should do the job.
We reply within one business day (IST).