Skip to content
SyncMyShop

Platforms

Shopify integration with your ERP, warehouse and suppliers

Shopify meters its GraphQL Admin API in cost points: 100 per second on the standard plans, 1,000 on Plus. We build the integration to your ERP around that budget, Shopify's eight inventory states and the B2B features of your plan, then host and run it.

What Shopify is and who runs it

Shopify is a hosted commerce platform: Shopify runs the store, the checkout and the admin, and the merchant chooses a plan. The plans that matter for an integration are Basic, Grow, Advanced and Plus. They differ in API budget, number of locations and B2B features, not in which API exists. Every store runs the current version of the platform; what an integration controls is which API version it calls.

Shopify releases a new API version every three months and supports each one for at least 12 months. A call to a retired version falls forward to the oldest version still supported, so an integration that is not maintained keeps running on changed behavior without an error. Shopify also changes things that break a stock sync, such as the compare check on inventory writes that became mandatory in API version 2026-04. We follow those releases and move the integration before its version is retired.

What connects to Shopify

Shopify owns the order, the checkout payment and the storefront. The ERP is the system of record for items, prices and stock. These are the flows we build as part of an e-commerce ERP integration:

Flow Direction Shopify object
Orders, including POS Shopify to ERP Order
Customers and B2B companies both ways Customer, Company, CompanyLocation
Products and variants ERP or PIM to Shopify Product, ProductVariant
Stock per location ERP or WMS to Shopify InventoryLevel
Prices per B2B catalog ERP to Shopify PriceList
Fulfillment and tracking ERP or WMS to Shopify Fulfillment
Refunds and returns both ways Refund, Return

A product has at most three options and 2,048 variants. Each variant points to an inventory item that carries the SKU, and that item has stock at each location: 10 locations on Basic, Grow and Advanced, 200 on Plus. Fields the ERP has and Shopify does not, such as a delivery date or a unit of measure, go into metafields: 256 definitions per resource type per app, written 25 at a time with metafieldsSet.

How Shopify exposes data

GraphQL, cost points and bulk operations

The integration calls the GraphQL Admin API with an access token from a custom app. Every query has a cost: 1 point per object, a connection sized by its first argument, 10 points for a mutation. A query may cost at most 1,000 points. Each combination of app and store has a bucket that refills at a rate set by the plan:

Plan, as Shopify names it Restore rate
Standard (we read this as Basic and Grow) 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

Worked through for a full read of 50,000 variants in pages of 250: each page requests about 250 points, so the read costs 200 × 250 = 50,000 points. At 100 points per second that is 500 seconds, 8 minutes 20 seconds. On Plus it is 50 seconds. A bulk operation has no cost limit: Shopify runs the query in the background and returns one JSONL file, with a download link that stays valid for a week. We use paged queries for changes since the last run and bulk operations for full reads. Shopify's GraphQL Admin API rate limits page has the exact rules.

Input arrays hold at most 250 items on every Shopify API, which sets the batch size of a stock or price write. A store with 500,000 variants or more can create at most 10,000 new variants a day outside Plus; above that the mutations return 429.

Webhooks as a signal, not a record

Shopify sends a webhook for an order, a product or an inventory level change. The receiver has five seconds to answer. A failed delivery is retried 8 times over 4 hours, after which a subscription created through the Admin API is deleted. Shopify gives no ordering guarantee and can deliver the same event twice. Changes to committed, reserved, damaged, safety_stock and quality_control stock send no webhook at all. The integration therefore treats a webhook as a reason to read, and runs a check on updatedAt next to it. See webhooks are not a guarantee.

B2B features by plan

Feature Basic, Grow, Advanced Plus
Companies and company locations yes yes
Active B2B catalogs 3, across all B2B markets up to 10,000 per store
Catalog assigned directly to a company location no yes, up to 25 per location
Quantity rules and price breaks yes yes
Net payment terms and PO numbers yes yes
Deposits and partial payments no yes

The 3-catalog limit is where most B2B integrations below Plus have to choose. An ERP with 40 customer price groups cannot become 40 catalogs. The integration maps the groups that matter to the 3 catalogs, or keeps contract prices in the ERP and applies them on the order. Customer catalogs covers this limit in detail.

Where a Shopify integration gets stuck

Eight inventory states and one number from the ERP

Shopify keeps stock per location in states: incoming, available, committed, reserved, damaged, safety_stock, quality_control, and on_hand, which is the sum of the six physical ones. An unfulfilled order moves units from available to committed. An ERP reports one free-stock number, which does not yet include orders that are still on their way to it.

A stock write to Shopify with a compare check The integration reads 20 available for item KB-2210. A store order then takes 2 units, so Shopify holds 18. The ERP reports 25 free after a goods receipt. The write of 25 with changeFromQuantity 20 is rejected because the quantity is now 18. The integration subtracts the 2 units of the order that has not reached the ERP yet and writes 23 with changeFromQuantity 18. ERP free stock Integration queue Shopify one location query available, KB-2210 available 20 order #100482 takes 2 free stock 25 after receipt set 25, changeFromQuantity 20 error: current quantity 18 25 - 2 not yet in ERP = 23 set 23, changeFromQuantity 18 available 23 Without the compare check Shopify would show 25 and sell the 2 units of order #100482 a second time.
A stock write with a compare check. Shopify refuses a write based on a quantity that changed in the meantime, so an order placed during the sync is not sold twice.

inventorySetQuantities therefore carries the quantity the integration expects to replace (changeFromQuantity from API version 2026-04). When an order has changed the number in the meantime, Shopify refuses the write and the integration recalculates. Which ERP number to send in the first place, physical, free or minus a buffer, is a choice per store; see which stock counts and multi-location inventory.

SKUs, variants and duplicate customers

Shopify's help center says it plainly: SKUs aren't required. The SKU is also case-sensitive, while an ERP item number is mandatory and often stored in capitals. The integration matches on SKU without regard to case and reports a variant without a SKU, or with a SKU that another variant already uses, before it writes stock to the wrong item. An ERP that models color and size as separate items needs a table from each item to a variant; see variant mapping.

A B2B order names the company location that placed it in purchasingEntity; a consumer order has a customer and nothing more. The integration takes the ERP debtor from the company location, and matches a consumer on email only after that, so a buyer who also shops privately does not end up as one debtor for both. Duplicate customers and orders covers the matching order.

Systems we integrate with Shopify

Each ERP stores items, stock and customers in its own way, so each pair has its own page:

For an ERP not listed, Shopify ERP integration covers the general case, and Shopify EDI integration covers orders from retail trading partners. The system side is on NetSuite, Business Central and SAP Business One.

We build the integration for a fixed price, then host it, monitor it and move it to new API versions, for a monthly fee. Before go-live it runs as a dry run that writes nothing to Shopify: you see per product which stock and price it would set. Every integration comes with a dashboard, logs and a per-run diff. Tell us which plan you are on and which ERP you run.

Frequently asked questions

Do I need Shopify Plus for an ERP integration?

No. The GraphQL Admin API, webhooks, locations and B2B companies are on every plan that has B2B: Basic, Grow, Advanced and Plus. Plus gives a restore rate of 1,000 points per second instead of 100, 200 locations instead of 10, and catalogs assigned directly to a company. Below Plus a store has 3 active B2B catalogs.

Does the integration still use the REST Admin API?

No. Shopify classed the REST Admin API as legacy on October 1, 2024, and public apps created from April 1, 2025 must use GraphQL. We build on the GraphQL Admin API and bulk operations, which also have the higher limits for large reads.

What happens when the integration hits Shopify's rate limit?

A GraphQL query that does not fit in the bucket comes back as HTTP 200 with a THROTTLED error in the body. The response always carries throttleStatus with the points currently available, so the integration waits until the bucket holds the cost of the next query. Shopify recommends a pause of one second before a retry. See Shopify API rate limits.

Can orders older than 60 days be read?

Only with the read_all_orders scope. Without it the order scopes cover the last 60 days. We request it when an integration has to import order history or reconcile older orders against the ERP.

Who in our company has to install the integration?

The store owner, or a staff member with the App development permission set to Develop. Custom apps are created in Shopify's Dev Dashboard; collaborator accounts have no access to it. The app gets only the access scopes its flows need, such as read_inventory and write_inventory for stock.

Does it work with Shopify POS?

Yes. A POS order is an ordinary order with sourceName set to "pos" and a retailLocation. The integration sends it to the ERP like a web order, with the store location as the place where the stock left, so the ERP can book it against the right warehouse.

Tell us what you need

Tell us which systems you use and what needs to work better. We reply personally within one working day. We help you define the work, then agree the price and timing before you commit.

  • You know the price and the timeline before you commit to anything
  • We work out the connection that takes the work off your hands
  • We handle the build, hosting, monitoring and maintenance
  • Your team has less information to retype and fewer discrepancies to chase

Suppliers, products, orders per day, a rough estimate is fine.

Or email directly: carsten@syncmyshop.com