If you are working out how to sync Shopify inventory with ERP, the short answer is this: the ERP pushes sellable stock to Shopify, so the store only sells what you actually have. Shopify's own guidance says the two connect, and the ERP remains the system of record for finance and inventory. Shopify is not an ERP. A working sync stops the store selling units you do not have. It does not turn Shopify into your accounting system. Whether you use a certified app, middleware or a custom build, the goal is the same: one trusted stock number, pushed to the storefront fast enough that orders do not outrun stock. This guide explains how to choose a route and keep the sync accurate. If you want help building one, our Shopify app development team works on these integrations.
1Is Shopify an ERP, and does it connect to one?
No. Shopify is an ecommerce platform. It takes the sale, while the ERP holds your finance records and counts stock across your warehouses. The two are built to connect, not to merge.
There is no single built-in link that works with every ERP. Connections run through certified apps, vendor connectors, middleware or custom code. The sections below cover each route and what to check before you commit.
2What does a Shopify inventory sync actually do?
A Shopify inventory sync moves stock counts from one system to another. In most businesses, the ERP pushes sellable stock to Shopify, and Shopify sends orders back for fulfilment and billing.
The ERP is where you count, receive, transfer and adjust stock. That is the core of ERP inventory management. Shopify only knows what it is told. If the ERP shows 40 units and Shopify shows 65, the store will sell 25 units that may not exist.
A good Shopify ERP integration gives you three things: stock levels close enough to the shelf to trust, orders that reach the ERP without retyping, and a clear rule for what happens when the two disagree.
3What data should sync between Shopify and an ERP?
Debutify's logic is that the ERP should own stock, because it is the only system that sees every channel and warehouse at once. That is a sensible default for businesses selling on several channels or from several locations. It is still your decision. If you run one store and one shelf, Shopify may hold the count, with the ERP receiving a copy.
Write the split down before you connect anything:
| Data | Usually owned by | Why |
|---|---|---|
| SKUs and product master data (cost, units, codes) | ERP | One definition used by every channel and warehouse |
| Storefront content (titles, descriptions, photos) | Shopify | The storefront needs it, and marketing edits it there |
| Stock on hand | ERP | It sees every warehouse, transfer and receipt |
| Orders | Shopify captures the sale; ERP fulfils and bills | Checkout happens in Shopify; fulfilment happens in the warehouse |
| Prices | Split: ERP for trade or B2B lists, Shopify for storefront prices | Avoids two sources for one price |
| Refunds and credit notes | ERP for accounts, Shopify for the payment | Money and books must agree |
| Customers | Whichever system holds your receivables | One master record per customer |
Most sync failures start when two people change the same number in two places. Name one owner for each field.
What do on hand, available and committed mean?
Shopify tracks several inventory states. Knowing them stops you pushing the wrong number.
- On hand is the number of units physically counted at a location.
- Committed is units tied to orders that have not yet been fulfilled.
- Available is what the storefront can sell.
- Safety stock is units you hold back on purpose.
- Damaged and quality control hold units that must not be sold.
Here is a simple worked example. It is illustrative, not taken from a live store:
- On hand: 120 units
- Committed to unfulfilled orders: 18 units
- Safety stock held back: 10 units
- Shown on the store: 92 units (120 minus 18, minus 10)
If your ERP pushes on-hand stock as the storefront figure, the store will oversell by the committed amount plus any buffer you meant to keep. Push the number the store should sell, not the number on the shelf. Check Shopify's inventory documentation for the exact definitions before you build a formula on them.
Where do damaged units and quality holds go?
Damaged stock and units on quality hold should never be sellable. The problem is that moving them may not tell your sync anything. Shopify's inventory management documentation says changes to the damaged and quality control states do not trigger the usual inventory webhook. A unit moved into quarantine can pass without your ERP hearing about it.
Decide four things:
- Who moves units out of sellable stock and into damaged or hold. Usually the warehouse lead.
- Who releases them back. Usually a quality or operations manager.
- How the ERP reports held units, for example a daily count per SKU.
- Whether your scheduled full check reads these states, not just the sellable figure.
4Which ERPs have certified Shopify connectors?
A certified Shopify ERP connector is the simplest route, if your ERP has one. Shopify's Global ERP Program certifies integrations with a small set of enterprise systems. At the time of writing, Shopify's guide to ERP software names NetSuite, Dynamics 365 Business Central, Brightpearl by Sage, Acumatica and Infor M3. That list changes, so check it before you buy.
That list is a starting point, not a full map. Many ERPs need a different route, which the next sections cover.
5Which connection method should you choose?
The table below compares the four routes most owners consider.
| Route | Best for | Where it fails | Who maintains it | Who owns the code and accounts |
|---|---|---|---|---|
| Certified ERP app | One warehouse, standard SKUs, an ERP with a certified app | Field gaps and limited custom stock rules | App publisher, with your ERP partner | Usually the vendor; confirm in the contract. Your Shopify and ERP accounts stay yours |
| ERP vendor's own connector | Teams running the vendor's standard setup | Only as flexible as the vendor's roadmap | ERP vendor | Usually the vendor; confirm in the contract |
| Third-party middleware or embedded app | ERPs with no certified app but an existing connector | Mapping limits, another system that can fail, per-connection fees | Middleware vendor | The vendor's platform; confirm your data export rights |
| Custom build | Several warehouses, bundles, lot or expiry rules, unusual stock logic | Upfront cost, ongoing upkeep, reliance on the people who built it | Your development partner or in-house team | You own the code and accounts |
At Treevoxa, the owner keeps the code and accounts on custom work. That matters if you change partners later.
When is a certified connector enough?
A certified connector is usually enough when your setup is plain. That means one warehouse, standard SKUs, no bundles, and an ERP with a certified app or vendor connector.
Two problems come up most often:
- Field mapping gaps. A field your ERP uses for stock, such as a custom attribute or a warehouse code, does not map cleanly to Shopify.
- Limited stock rules. The connector cannot model rules such as holding back units for one channel or reserving stock for a wholesale customer.
AppSeConnect, an integration vendor, suggests native connectors may be enough for smaller stores at up to about 500 orders a day. That is the vendor's opinion, not a threshold. Test against your own order pattern rather than relying on any figure.
What if your ERP is not on the certified list?
This is the gap many guides skip. Plenty of ERPs are not on Shopify's certified list. Odoo is one example. Many Odoo setups connect through third-party connector apps, so check the listing for your Odoo version before you assume a route works. For these businesses, the real choice is between middleware and a custom build.
Middleware works when your stock rules are standard and an existing app already maps your ERP to Shopify. Check that it handles your locations, variants and returns, not just the basic stock count.
A custom build pays off when:
- You have several warehouses with separate stock rules.
- You sell bundles or kits.
- You track lots or expiry dates and need to sell the oldest batch first.
- You allocate stock between channels or customers.
Custom integrations carry more risk and ongoing upkeep than a supported connector. That is the trade-off. Ask whether a middleware app can handle your rules without workarounds. If you are already building workarounds on top of workarounds, compare their cost with the cost of a proper build. Our custom ERP vs off-the-shelf ERP for small business guide sets out the wider trade-offs.
Owners in Toronto, Thornhill and New York face the same test: does a standard connector fit your stock rules? Our guides cover the build-or-buy trade-off for ERPs in more depth. For the ERP side of an integration, see our ERP software development and Odoo development services.
6How often should Shopify and the ERP sync?
Use both methods: push an update on every stock change, and run a scheduled full check.
Batch-only syncs leave gaps. If stock updates only once an hour, the store can sell units that have already left the shelf. Those gaps are where stock-outs, overselling and late fulfilment begin.
Set the check window from two numbers: your order volume, and the cost of one oversold order. An oversold order usually costs more than the item. It can mean a refund, a cancellation, a support call and a customer who does not come back.
Do not copy someone else's interval. Work it out from your own volume, then test it for a month.
7What do Shopify API rate limits mean for stock?
Shopify's GraphQL Admin API uses cost-based limits. Each query has a point cost, and your plan sets how many points you can use per second. According to Shopify's GraphQL Admin API rate limits documentation, the rate is 100 points per second on Standard, 200 on Advanced Shopify and 1,000 on Shopify Plus. A single query may not exceed a cost of 1,000 points.
These figures can change. Some third-party guides quote different numbers, so use Shopify's page and check it again on the day you build.
Here is what the limit means in practice. This example is illustrative. The 10-point cost per update is an assumption to test, not a Shopify figure:
- On a Standard plan at 100 points per second, and at 10 points per update, you can send about 10 updates per second, or 600 per minute.
- Pushing 6,000 SKUs one at a time takes about 10 minutes at that rate, before retries.
- During a sale, that queue becomes your bottleneck.
So design for it. Queue updates, prioritise fast-selling SKUs, and back off when you receive a rate-limit response. For large jobs such as full catalogue loads or a nightly reconciliation, use bulk operations rather than thousands of single calls. Our API development service covers this kind of queueing and retry logic.
8Why do stock webhooks miss changes or arrive late?
The inventory_levels/update topic tells your system when an inventory level changes. Its limits matter for stock design.
Shopify's inventory management documentation says changes to committed, reserved, damaged, safety_stock and quality_control states do not trigger it. If your ERP relies on the webhook alone, it will miss changes in those states. This matters most for stores that hold stock back for orders or channels. Check that page before you build, since it can change.
A developer thread also reports that the topic fires only when the available figure changes. That is a community report, not a Shopify guarantee. Test it on your own store before you design around it.
Delivery is the other problem. Webhooks can arrive late, more than once, or out of order. Build for that as normal:
- Store each event with its timestamp.
- Never overwrite a newer stock figure with an older event.
- Treat the scheduled full check as the safety net that catches what the webhook missed.
9What should I do when Shopify and the ERP show different counts?
A sound reconciliation plan is simple enough for a team of three or four:
- Deduplicate deliveries. Ignore repeat events for the same change.
- Order events by timestamp. Apply them in the order they happened.
- Read stock levels through the Admin API on your scheduled check, not from events alone.
- Compare with the ERP, SKU by SKU and location by location.
- Correct the difference in the system that owns the number, then push the result.
- Log every change with the old figure, the new figure, the reason and the person responsible.
When a difference appears, use a fixed response. The thresholds below are examples. Set your own from how often your counts are wrong today:
| Difference | Action | Owner | Sign-off |
|---|---|---|---|
| None | Log the check and move on | Systems lead | Weekly summary |
| Small difference on a standard SKU, within your limit | Correct Shopify to the ERP figure and log it | Operations coordinator | Operations manager, weekly |
| Above your limit, or any bundle or lot-tracked SKU | Pause the listing, count the shelf, correct the source system | Warehouse lead | Operations manager, same day |
| Repeat mismatch on one SKU within a week | Check the mapping and connector logs, then fix the cause | Systems lead | COO or operations director |
| Store shows stock the warehouse cannot find | Record as shrinkage, adjust the ERP, note the reason | Warehouse lead | Finance |
In a small team, one person can hold more than one role. What matters is that every mismatch has an owner and a log entry.
10How do I manage stock across Shopify stores and locations?
Most stubborn sync problems are mapping problems, not technical ones. Start with SKUs.
SKUs. Xorosoft's checklist warns that if Shopify SKUs do not match ERP items, inventory and order sync will fail. Choose the ERP item code as the master key. Control how SKUs are created in Shopify, and check each month for duplicates, stray spaces and case differences.
Locations. Map each Shopify location to one ERP warehouse. Then decide which locations ship online orders. A shop counter location may hold stock that should not be sold online. Debutify recommends making this choice explicitly.
Multi-store stock. Owners running several storefronts, such as a store serving New York and another serving Austin, Raleigh or Denver, need to decide whether the stores share one stock pool or each receive an allocated share. Do not let each store keep its own count of the same physical units. That is how one unit gets sold twice. US businesses can see our software development for US companies page.
11Can you sync inventory for bundles and kits?
Yes, but only after you decide how the ERP treats a kit. When a bundle sells, does the ERP break it into components and reduce each one, or does it treat the kit as its own SKU? Each approach has trade-offs.
Ask this test question: if one component is out, should the bundle still be sellable? Write the answer down, because it defines the rule your sync must follow.
If you track lots or expiry dates, check the stock rules before you build. Our guide to manufacturing ERP with batch tracking covers what to look for, and our ERP software development team can scope those rules with you.
12How do I stop duplicate orders when both systems record a sale?
A retry must never create a second sales order in the ERP. AppSeConnect makes this point clearly. When a request times out and is sent again, the system should first check whether the Shopify order already exists in the ERP, using the Shopify order ID as the match.
Test this before go-live. Force a timeout on purpose and confirm that the retry updates the existing order rather than creating a new one.
13What happens to stock on returns and refunds?
Refunds are where books and stock drift apart. A refund does not automatically mean stock came back. Separate the events:
| Event | What it means | Where it is recorded |
|---|---|---|
| Merchandise return | Customer sends goods back | Return logged in the ERP |
| Inventory receipt | Returned goods go back on the shelf, only if sellable | ERP stock, then Shopify updated |
| Financial refund | Money goes back to the customer | Payment side, and accounts in the ERP |
| Restocking fee | Charge kept for handling the return | Accounts in the ERP |
| Credit memo | Accounting document for the refund | ERP accounts |
Elogic recommends keeping these events separate. A refunded item that is damaged should not return to sellable stock, and a restocking fee should not appear as a stock movement.
14How do you test the sync before go-live?
Test the cases that break first. Ringly recommends testing refunds and partial fulfilments, and testing edited orders after they reach the ERP. Edited orders are a common gap: a changed quantity can be recorded in Shopify and never reach the warehouse.
Then run a parallel period:
- Set up a development store and connect it to a test copy of the ERP.
- Run real order types through it, including returns, partial shipments and edits.
- Compare Shopify and ERP counts every day.
- Let the sync write live stock only once mismatches stay within your agreed limits for a period you set.
Treevoxa starts every project with a written scope, a fixed price and a launch date agreed before work begins. That gives you a clear test plan, and you know what is in and out before the first line of code.
15How much does an ERP integration with Shopify cost?
There is no fixed price for every business. The main cost drivers are:
- Number of Shopify stores and ERP warehouses
- Number of SKUs, variants and bundles
- Returns and refund logic
- Quality of the ERP's API
- Testing time, including the parallel run
- Ongoing support and changes when Shopify or the ERP updates
Connector fees add to this, and they vary by app and plan. Third-party comparisons such as Prim.io's guide to ERPs for Shopify brands list connector pricing, but those figures move. Check each app listing on the day you buy.
For an estimate based on your own setup, use our software development cost calculator. For wider ERP budgeting, see our guides.
16How to sync Shopify inventory with ERP: next steps
Learning how to sync Shopify inventory with ERP comes down to two choices. Name the owner of each stock number, then pick the simplest route that fits your stock rules. Test returns, bundles and edited orders before the sync writes live stock.