Skip to content
SyncMyShop

Shopify and your ERP

Shopify ERP integration

Shopify meters its API in cost points per second, every ERP meters its own in a different unit, and the integration has to stay within both. This page gives the numbers for Shopify and for six ERPs. We build the integration to your ERP and your rules, then host and run it.

What moves between Shopify and an ERP

Whichever ERP sits behind the store, the same records move, and each has one owner.

Data System of record Direction Sync behavior
Products, SKUs, variants ERP ERP to Shopify changed records only
Descriptions, images, SEO Shopify stays in Shopify the ERP never overwrites them
Prices and price lists ERP ERP to Shopify scheduled; 250 fixed prices per request
Stock per location ERP or WMS to Shopify changed quantities, 250 per call
Orders Shopify at capture, ERP after import Shopify to ERP webhook plus reconciliation
Customers and companies ERP for accounts, Shopify for web buyers both ways matched on a fixed key
Fulfillment and tracking ERP, WMS or 3PL to Shopify per shipment, partial shipments included
Refunds and returns where the refund starts both ways refund, return and restock as separate events

A Shopify product holds up to 2,048 variants over three options. Stock is kept per location: 10 locations on the Basic, Grow and Advanced plans, 200 on Plus.

What Shopify's API allows

The budget

Shopify GraphQL Admin API restore rate per plan The GraphQL Admin API restores 100 cost points per second on standard plans, 200 on Advanced, 1,000 on Shopify Plus and 2,000 on Shopify for enterprise. A single query may cost at most 1,000 points on every plan. Standard plans 100 points per second 100 Advanced 200 points per second 200 Shopify Plus 1,000 points per second 1,000 Shopify for enterprise (Commerce Components) 2,000 points per second 2,000 Largest single query on every plan 1,000 points
Shopify's GraphQL budget per plan. Plus raises the rate tenfold; the cap of 1,000 points per query stays.

The GraphQL Admin API charges every query a cost in points and refills the budget at a fixed rate per second. A query that asks for more than 1,000 points is refused before it runs. A throttled call comes back as HTTP 200 with THROTTLED in the error body, so an integration that only looks at status codes misses it. The cost of each call is in the response:

{
  "extensions": {
    "cost": {
      "requestedQueryCost": 502,
      "actualQueryCost": 386,
      "throttleStatus": { "currentlyAvailable": 614, "restoreRate": 100 }
    }
  }
}

The REST Admin API has been a legacy API since October 1, 2024, and since April 1, 2025 new public apps have to use GraphQL. REST is still metered the old way: 2 requests per second with a bucket of 40, or 20 per second with a bucket of 400 on Plus. Products with more than 100 variants are only reachable through GraphQL. An integration still on REST has a migration ahead of it.

Shopify releases an API version every quarter and supports each for at least 12 months. When a version is retired Shopify answers with the oldest version still available, so an integration that nobody touches for a year is served by an API it was not written for.

Four patterns

Four ways an ERP integration talks to Shopify A bulk operation reads a whole catalog in one request and returns a JSONL file. Webhooks report single changes and are retried 8 times in 4 hours. Targeted writes send only changed records, up to 250 per mutation. A reconciliation run compares both sides and finds what the webhooks missed. 1 request, JSONL file Bulk operation Full read of products, stock or orders 8 retries in 4 hours Webhook Shopify reports one change 250 per mutation Targeted write Only the records that changed finds missed webhooks Reconciliation Compares both sides on a schedule
The four ways an ERP integration talks to Shopify. An integration that works at volume uses all four.

Worked through for 50,000 variants. Reading them page by page takes 200 queries of 250 variants. At an assumed 500 points per page that is 100,000 points: 1,000 seconds on a standard plan, 100 seconds on Plus, with nothing left for orders in that time. A bulk operation reads the same 50,000 in one request, runs on Shopify's side, and returns a JSONL file whose link stays valid for a week. From API version 2026-01 an app can run five bulk operations of each type at once; before that, one.

Changes go the other way. A webhook reports a new order within seconds. Shopify waits five seconds for the answer, retries 8 times over 4 hours, and guarantees neither order nor a single delivery. So the webhook is treated as a notification, not as the record: the handler stores the ID, answers 200, and the queue does the work. A reconciliation run compares both sides and picks up what never arrived. Writes go out for changed records only: 300 changed stock levels are 2 calls of inventorySetQuantities. The cost model in full is in Shopify API rate limits.

Which ERP

Every ERP limits its API in its own unit. These are the numbers that decide how the other half of a Shopify ERP integration is built.

ERP API Limit Shopify's Global ERP Program
NetSuite REST, SuiteQL, RESTlets 5, 15 or 20 concurrent requests per account listed
Business Central API v2.0, OData v4 6,000 requests per 5 minutes and 5 concurrent, per user listed; Microsoft's own connector, online only
SAP Business One Service Layer, OData session of 30 minutes, 20 rows per page by default not listed
Acumatica contract-based REST sessions, concurrent requests and requests per minute, set by license listed; connector built into the Retail Edition
Sage Intacct XML gateway, newer REST API concurrency per company, 429 above the contracted level not listed
Odoo JSON-2 API from version 19 external API on the Custom plan only not listed

NetSuite. The account concurrency limit is shared by every integration on the account, and creating and saving a sales order in a script costs 30 governance units. The pair has its own page: Shopify NetSuite integration, with B2B on Shopify and NetSuite next to it.

Microsoft Dynamics 365 Business Central. Business Central online accepts only OAuth 2.0; access keys stopped working on October 1, 2022. Above 6,000 requests in five minutes a user gets a 429, and a request that runs longer than 8 minutes is cut off. Microsoft ships its own Shopify connector for Business Central online. Its documentation states its limits: it exports one price per product, only prices for quantity 1, and it cannot create variants for a product whose variant matrix combines two or more options. See Shopify Business Central integration.

SAP Business One. The Service Layer is an OData API with a login that returns a B1SESSION cookie, valid for 30 idle minutes. It returns 20 rows per page unless the request sets odata.maxpagesize. It runs on SAP HANA, and on Microsoft SQL Server since version 10.0 PL01. Older installations offer the DI API, a Windows COM library without multithreading, which means software running inside the customer's own network. Customers are BusinessPartners keyed by CardCode, items are Items keyed by ItemCode. See Shopify SAP integration.

Acumatica. Each license sets three API limits: sessions, concurrent requests and requests per minute, visible on the License Monitoring Console (SM604000). At half the per-minute limit Acumatica starts delaying requests. A request is declined when more than 20 are waiting or when it has waited 10 minutes. See Shopify Acumatica integration.

Sage Intacct. The XML API has one endpoint and needs a Web Services subscription with a sender ID. Sage recommends its REST API for new work and releases new objects only there. Concurrent requests are limited per company; above the contracted level the gateway answers 429. More on the Sage Intacct page.

Odoo. Odoo 19 introduced the JSON-2 API at /json/2/<model>/<method>. The XML-RPC and JSON-RPC endpoints are scheduled for removal in Odoo 22, in fall 2028. On Odoo's hosted plans the external API is available on the Custom plan only. More on the Odoo page.

What to sync and what to leave

Every field that is synced is a field somebody has to keep correct in its source. Three choices keep an integration small.

History stays where it is. An app reads the last 60 days of orders by default. Open orders, open returns and current stock go to the ERP at go-live; closed orders from past years stay queryable in Shopify.

Content stays in Shopify. ERP item descriptions are usually written for purchasing, in capitals and abbreviations. Titles, images and SEO fields are owned by the store and excluded from the sync, so that an item update in the ERP cannot undo a merchandiser's work.

ERP fields go to metafields only when the storefront shows them. An app can define 256 metafields per resource type, and metafieldsSet writes 25 per request. Material, country of origin and lead time belong in a metafield; the costing method does not. The note on what not to sync works this out per data type.

Do you need Shopify Plus?

The Admin API, bulk operations and webhooks are the same on every plan. Plus changes numbers, not capabilities.

Basic, Grow, Advanced Plus
GraphQL restore rate 100 points per second, 200 on Advanced 1,000 points per second
REST rate 2 requests per second, 4 on Advanced 20 requests per second
Locations 10 200
B2B catalogs 3 active across B2B markets no limit of 3; assigned per company location
Deposits and partial payments no yes

Since April 2026 B2B companies, catalogs and net payment terms are available on Basic, Grow and Advanced as well. A company holds up to 10,000 locations, and a price list takes 250 fixed prices per request. An ERP with more than three price levels for B2B customers needs Plus, or a mapping that combines price levels into three catalogs. See customer catalogs.

Where Shopify ERP connectors and apps stop

A Shopify ERP app from the App Store, an iPaaS template and the connector an ERP vendor ships share one design: fixed flows with settings. Their documentation states the limits.

  • One price. Microsoft's connector exports one price per product and ignores quantity breaks. A common NetSuite template takes one price level for the price and one for the compare-at price.
  • Locations mapped, not allocated. Locations map one to one or many to one. Which warehouse serves which order, and how much each sales channel may see, is not a setting.
  • Schedules instead of events. Order flows commonly run on a schedule with a lag of 10 to 15 minutes, and stock every 15 to 30 minutes.
  • Flows tied to objects by ID. One template installs 30 saved searches in NetSuite and breaks when one of them is renamed.

Integration services from Shopify ERP partners configure those products. We build the integration itself, to your price model, your locations and your ERP's limits, and we run it. The technical comparison is in custom integration vs iPaaS.

When it goes wrong

What fails What the integration does What you see
Shopify answers THROTTLED waits for the budget to refill, sends again nothing
ERP answers 429 or queues the request keeps the record in the queue, retries with a growing pause nothing, unless it lasts
Webhook subscription deleted after 8 failures reconciliation finds the orders; subscription is recreated an alert with the time
Order line with a SKU the ERP does not know holds that order, continues with the rest the order and the SKU
Shopify API version retired handled before the date, each quarter a note in the changelog
ERP offline for maintenance queue fills and drains afterwards queue length on the dashboard

A record that still fails after its retries is kept with its original payload and can be sent again once the cause is fixed. Before go-live the integration runs as a dry run that writes nothing and shows what it would change, and after that every run leaves a diff per record. That is the same for every e-commerce ERP integration we build; the Shopify side is described on the Shopify page, and EDI with retailers on Shopify EDI integration. Tell us which ERP you run.

Frequently asked questions

Does Shopify have a built-in ERP?

No. Shopify says so itself: it is a commerce platform, and finance, purchasing and supply chain belong in an ERP that is integrated with it. Shopify runs a Global ERP Program with five ERP apps in its App Store, for NetSuite, Dynamics 365 Business Central, Acumatica, Infor and Brightpearl.

Do Shopify's rate limits affect which integration we can use?

Yes. A standard plan restores 100 GraphQL cost points per second, Plus 1,000, and one query may cost 1,000 points at most. A Shopify ERP connector that polls every product on a schedule runs out of budget on a large catalog. One that uses bulk operations for full reads, webhooks for changes and writes of 250 records at a time stays inside it.

What is the most common reason a Shopify ERP integration fails?

Two systems writing the same field with no rule for which one wins. The second is an integration that trusts webhooks alone: Shopify retries a failed webhook 8 times over 4 hours and then deletes the subscription. We fix the first with an owner per field and the second with a reconciliation run.

What does an ERP app from the Shopify App Store cover?

The standard flows: products and stock out, orders in. The limits are in each vendor's documentation. Microsoft's Shopify connector for Business Central, for example, exports one price per product and only prices for quantity 1. Customer-specific prices, quantity breaks and allocation rules per location are where a built integration takes over.

Do we need Shopify Plus for an ERP integration?

No. The Admin API is the same on every plan. Plus changes three numbers: 1,000 cost points per second, 200 locations, and no limit of 3 on active B2B catalogs. Companies, catalogs and payment terms have been on all plans since April 2026.

Can order history be synced to the ERP?

Yes, with one extra permission. By default an app reads the last 60 days of orders; older orders need the read_all_orders scope, which Shopify has to approve. A full history is read once with a bulk operation. Open orders, open returns and balances go to the ERP at go-live; closed orders stay queryable in Shopify.

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