SAP ECC to Shopify Inventory Sync: How to Update Stock in Bulk Without Throttling Your Shopify API

AM
Anita M.
Distribution Center Manager
★★★★★★★★★★
4.5/5 · 9/21/2026

Time-Saving Integration with Excellent Support

"I like that APPSeCONNECT saves us a lot of time by automating the import of sales orders from Shopify into SAP Business One. It helps in updating business partner contact information, which is great because before we had to hand-type the orders, but now it's all imported smoothly."

Read more APPSeCONNECT Reviews
SAP ECC to Shopify inventory sync bulk stock update workflow in APPSeCONNECT
Author photo: Subhajit GoswamiSubhajit Goswami9 min read

To sync inventory from SAP ECC to Shopify at scale, stop updating one product at a time. Read a batch of products from Shopify with a single GraphQL query, fetch live stock for the whole batch from SAP ECC in one call, map each SAP quantity to the right Shopify variant and location, and write the results back together. This guide explains why that pattern works, what Shopify’s API limits say today, and how a live APPSeCONNECT workflow runs the pattern end to end.

Key Takeaway

  • Per-product sync multiplies calls. Each product needs several requests before one quantity changes, so catalog size, not stock movement, decides how long a sync takes.
  • Shopify meters GraphQL by query cost. A single query cannot exceed 1,000 points, and the refill rate depends on the store’s plan: 100 points per second on Standard up to 2,000 on Shopify for enterprise.
  • The batch pattern has four steps: read a batch from Shopify, read SAP stock for that batch, map by SKU and location, write back in bulk.
  • Shopify bulk operations sit outside the limits that apply to single queries. They accept JSONL files up to 100 MB and report results line by line.
  • API version 2026-04 changed stock writes. inventorySetQuantities now requires a changeFromQuantity value per quantity and an idempotency key. Build both into any sync that writes stock.

Why SAP ECC to Shopify inventory sync usually runs overnight

Picture 500 jackets arriving at your warehouse. Your team books the goods receipt in SAP ECC at 9 a.m. Shopify still shows the jackets as sold out, because the inventory sync runs at night. Every shopper who lands on that product page before then sees “sold out” and buys somewhere else. The stock existed. The store could not sell it.

The delay is rarely a business choice. It comes from how Shopify’s API meters access and from how most syncs are built.

How Shopify’s API budget works

Shopify does not give an app unlimited access. The GraphQL Admin API uses a leaky-bucket model: every query has a cost in points, and the bucket refills continuously. Shopify’s rate limits documentation says short bursts are fine “as long as your average cost stays under the restore rate.” The limit applies to each combination of app and store, and it scales with the store’s plan:

Shopify GraphQL Admin API limits by plan
Shopify plan and its published GraphQL Admin API rate limit in points per second.
Shopify plan
GraphQL Admin API limit (as published 5 Nov 2026)
Standard
100 points per second
Advanced Shopify
200 points per second
Shopify Plus
1,000 points per second
Shopify for enterprise (Commerce Components)
2,000 points per second

Cost is calculated per field. Scalars and enums cost 0, objects cost 1, mutations cost 10, and connections are sized by their first or last argument. A single query may not exceed 1,000 points on any plan, and Shopify enforces that cap before the query runs, using the requested cost. After execution the bucket is refunded the difference between requested and actual cost. Each response includes an extensions.cost block, and the Shopify-GraphQL-Cost-Debug header adds a per-field breakdown.

Why one-product-at-a-time sync stalls

A common implementation handles each product on its own. It finds the product in Shopify, finds its inventory item, finds the location where it is stocked, queries SAP ECC for the stock, then updates Shopify. That is five steps for one product, and most of them are separate API calls.

Take an illustrative catalog of 500 products at five calls each. That is 2,500 calls drawing on one bucket. Requests start to throttle, the sync slows down, and the team moves it to the night, where it competes with nothing. The overnight schedule is a workaround for the call pattern, not a business preference.

How Shopify and SAP ECC describe the same stock

A sync is only as good as its mapping. The two systems model inventory differently, and the mapper has to bridge them.

  • Shopify: a product has variants. A variant carries the SKU and points to an inventory item. The inventory item has an inventory level at each location. The admin shows Unavailable, Committed, Available and On hand per location, and the API’s inventorySetQuantities mutation accepts available or on_hand as the quantity name.
  • SAP ECC: stock is held per material, plant and storage location, and it is split by stock category such as unrestricted-use, in transit, in quality inspection, restricted and blocked. The stock overview screens show each category in its own column, as in the recording.

Settle these mapping decisions before you build anything:

Mapping decisions to settle before you build
Each inventory mapping decision and why it matters for an SAP ECC to Shopify sync.
Decision
Why it matters
SAP material number to Shopify SKU
The SKU is the join key. Duplicates or formatting differences break the match silently.
SAP plant and storage location to Shopify location
Shopify stores quantity per location. A wrong location mapping puts stock in the wrong place.
Which SAP stock categories count as sellable
Blocked, in-inspection and in-transit stock should not appear as available unless you decide they should.
Quantity, not value
SAP stock screens show both quantity and stock value. The mapper must read the quantity field.
Safety buffer for fast movers
A buffer absorbs the lag between a sale and the next sync.

Which system should be the source of truth?

Shopify’s own inventorySetQuantities documentation is specific: use it only when calling on behalf of a system that acts as the source of truth for inventory quantities, and otherwise use inventoryAdjustQuantities. Some Shopify automation vendors take the opposite position and argue that Shopify should be the source of truth for most stores, with write-back from outside tools avoided unless there is a deliberate reason.

If goods receipts, transfers and warehouse stock are booked in SAP ECC, you have that deliberate reason. A practical rule:

Choosing the source of truth
Situation, the system that should be the source of truth, and the resulting sync direction.
Situation
Source of truth
Sync direction
Stock is booked and counted in SAP ECC
SAP ECC
SAP to Shopify, set quantity
Stock is held by a 3PL with its own system
The 3PL system
3PL to Shopify, ERP receives the result
Store-only inventory with no ERP stock control
Shopify
Shopify to ERP for reporting

The bulk inventory sync pattern in four steps

The fix is to change the call pattern, not to ask Shopify for more room. Instead of asking about each product separately, the flow asks once for a batch, once for SAP stock, and writes once.

Step 1: Read a batch from Shopify in one query

One GraphQL query returns a page of products with every variant, each variant’s inventory item, and every location where that item is stocked. Everything needed for the update arrives in one response. The demo query uses first: 80 products filtered by a creation date, with variants, inventoryItem and inventoryLevels nested inside.

Size the nested connections so the requested cost stays under the 1,000-point cap. Page through large catalogs with cursors, and check the real cost with the Shopify-GraphQL-Cost-Debug header before you pick a page size. For full catalog pulls, Shopify also offers bulk queries, which can read any connection field, allow up to five connections and two levels of nesting, and must complete within 10 days.

Step 2: Read SAP stock for the whole batch in one request

Send the SKU list to SAP ECC once and get live stock for all of it back. Use whichever interface your SAP landscape exposes: IDoc, RFC or BAPI calls, or REST web services. One request replaces what would have been dozens or hundreds of single-material lookups.

Step 3: Map SAP quantities to Shopify items and locations

The mapper matches each SAP material to a Shopify variant by SKU, then builds one record per inventory item and location with the quantity to set. This is where the decisions in the mapping table above are applied.

Step 4: Write everything back to Shopify in bulk

Shopify’s bulk operations for imports are built for this. The documented sequence is:

  1. Write a JSONL file where each line is one input to the mutation.
  2. Call stagedUploadsCreate to get an upload target, then upload the file.
  3. Call bulkOperationRunMutation with the mutation and the staged upload path.
  4. Wait for completion by subscribing to the bulk_operations/finish webhook and polling bulkOperation(id:) as a fallback, because webhook delivery is not guaranteed.
  5. Download the result file and read the per-line results.

Shopify states that bulk operations do not have the max-cost and rate limits that single queries have. The input file cannot exceed 100 MB, an operation must finish within 24 hours, and from API version 2026-01 each app can run up to five bulk mutation operations per shop at once (earlier versions allow one per type). You can supply any Admin API mutation except the two bulk-run mutations, with a limit of one connection field. The documentation does not name every supported mutation, so test your inventory mutation on a development store first.

Per-product sync versus batch sync
How per-product and batch sync patterns compare across calls, API budget, schedule, failure handling and stock lag.
Per-product sync
Batch sync
Calls per product
Several, each separate
Shared across the batch
Effect on the API budget
Drains the bucket as the catalog grows
A handful of requests per batch
Typical schedule
Pushed to overnight
Short batches through the day
Failure handling
Per call, often hidden in logs
Per line in the bulk result file
Stock lag after a goods receipt
Until the next nightly run
Until the next batch
The four-step bulk sync in plain English

Walkthrough: SAP ECC to Shopify bulk inventory sync in APPSeCONNECT

The recording behind this section runs in an APPSeCONNECT demo environment with a Shopify store and an SAP system. It is a single demonstration with a small batch, not a benchmark.

Before the sync: Shopify shows zero stock

The Shopify admin lists products that also exist in SAP ECC. Every product shows 0 in stock, although SAP ECC holds stock for them.

Shopify admin products list with every listed product showing 0 in stock

Figure 1. Shopify product list before the sync: each product shows 0 in stock.

Opening one product shows the same picture at variant level. The Central Warehouse location has Unavailable, Committed, Available and On hand all at 0, and the variant carries SKU 1342. That SKU is what the workflow uses to find the matching material in SAP ECC.

Shopify product inventory panel showing Central Warehouse with Unavailable, Committed, Available and On hand all at 0 and SKU 1342

Figure 2. Product detail before the sync: the Central Warehouse location shows 0 for every quantity column.

The workflow

The flow is built in the APPSeCONNECT ProcessFlow designer. It runs Start, then a Shopify node, a Mapper, an SAP ECC node, a second Mapper, and a final Shopify node. The first Shopify node reads the batch, the SAP node fetches stock for it, and the last Shopify node writes the result back.

APPSeCONNECT workflow canvas: Start, Shopify, Mapper, SAP ECC and All In One, Mapper, Shopify

Figure 3. The Shopify Bulk Inventory ECC workflow in the APPSeCONNECT ProcessFlow designer.

Running it with a runtime filter

At execution time the user chooses a runtime filter for the first Shopify node. The demo reads 80 products created on or after a chosen date, and the selection includes each variant’s inventory item and the locations where it is stocked. That is the single read from Step 1.

Execute With Runtime Filter dialog showing a Shopify Get Products query with first 80 and a created_at filter and a selection of variants, inventoryItem and inventoryLevels locations

Figure 4. Execute With Runtime Filter: a Shopify products query with first: 80, a created_at filter, and nested variants, inventoryItem and inventoryLevels.

What the execution tracker shows

The tracker lists each node as it starts and finishes. After the SAP ECC node completes its Get inventory step, the flow passes through a Mapper and then runs two Shopify steps named Get staged Uploads URL and Get Bulk Upload Status. Those names line up with the stage-upload, run and status-check sequence in Shopify’s documented bulk import process described in Step 4.

APPSeCONNECT execution tracker listing started and finished events for SAP ECC Get inventory, Mapper, Shopify Get staged Uploads URL and Get Bulk Upload Status

Figure 5. The execution tracker: SAP ECC Get inventory, Mapper, Shopify staged upload, Mapper, Shopify bulk upload status.

After the sync: Shopify shows stock

Back in the Shopify admin, the same products now show quantities in the Inventory column, where the earlier screen showed 0 in stock for all of them. Compare the products in Figure 6 with Figure 1: the same items, now populated.

Shopify admin products list after the sync with quantities such as 550, 12,000 and 2,290 in stock

Figure 6. The same product group after the sync: quantities now appear in the Inventory column.

The demo shows the shape of the pattern: one read from Shopify, one read from SAP, a mapping step and a bulk write. It does not show timings, and it does not replace testing with your own SKUs, locations and stock categories.

Design choices that keep a batch sync reliable

Guard against stale writes

As of API version 2026-04, each quantity in an inventorySetQuantities call must include a changeFromQuantity value. The mutation updates the quantity only if the stored quantity matches that value, and otherwise returns a CHANGE_FROM_QUANTITY_STALE error. You can opt out per quantity by passing null, and omitting the field returns an error. For a sync, this protects a sale that lands between your read and your write. Decide per workflow whether a stale line should be retried with fresh data or skipped.

Make retries safe with idempotency keys

From API version 2026-04 the idempotency key is required on inventorySetQuantities and is supplied with the @idempotent directive. Shopify recommends a UUID. Generate one key per logical write so a retry cannot apply the same change twice. See Shopify’s idempotent requests guide.

Expect partial failure

Bulk results come back one line per input, each with a line number, and lines are not processed in order. A bulk operation fails as a whole only on critical errors, so a file can complete with a few bad lines. Read the result file, retry the failed lines, and note that result URLs expire after one week.

Choose the trigger: scheduled batches or events

Batching does not force an overnight run. A short-interval batch, or a batch started by a goods-receipt event, closes the gap that caused the sold-out problem in the first place. Keep a full reconciliation pass as a safety net, and compare SAP and Shopify totals after it.

Watch the sync, not only the result

Track success and error rates, retry transient failures automatically, and re-sync missed records. The APPSeCONNECT SAP ECC integration page describes a Sync Info dashboard and auto-retry for this purpose.

How to evaluate an SAP ECC Shopify integration platform

Whether you build or buy, these questions separate a sync that works in a demo from one that works on a Black Friday morning.

Questions to ask an SAP ECC Shopify integration platform
Each evaluation question and what a strong answer should include.
Question to ask
What a good answer includes
How does it handle Shopify’s cost-based limits?
Batched reads, cost-aware page sizes, bulk operations for large writes, and backoff on throttling.
How does it connect to SAP ECC?
The interface types it supports, such as IDoc, RFC or BAPI and REST, and how custom ABAP is avoided or limited.
How are SAP plants and storage locations mapped to Shopify locations?
A visible, editable mapping, not a hard-coded rule.
Which SAP stock categories can feed available stock?
Configurable categories and a safety buffer.
How does it prevent stale or duplicate writes?
changeFromQuantity handling and idempotency keys on every stock write.
What can an operator see when a line fails?
Per-record status, error text, retry and re-sync controls.
Where can it run?
Cloud, on-premise or hybrid, to match where SAP ECC sits.
What happens when you move to SAP S/4HANA?
Whether the integration layer and mappings carry over.

Where APPSeCONNECT fits

APPSeCONNECT connects ERP, eCommerce and CRM systems, and its pages describe Shopify connectivity through the Shopify Admin REST and GraphQL APIs and SAP ECC connectivity over IDoc, RFC or BAPI, and REST web services. The workflow in this article is one example of the same ProcessFlow approach applied to inventory. If you want the platform detail behind it, start with the SAP ECC integration and Shopify integration pages, and see inventory management automation for the wider picture.

Teams that want agent-based automation on top of the same connections can look at appse ai, the AI and automation orchestration layer built on APPSeCONNECT.

See the SAP ECC to Shopify workflow on your own data

If your Shopify store still waits for a nightly job to learn about stock that SAP ECC already has, explore the SAP ECC integration or talk to the APPSeCONNECT team about your SKU volume, locations and SAP landscape.

Frequently Asked Questions

Use a batch pattern. Read a page of products with their variants, inventory items and locations from Shopify in one query, read SAP ECC stock for the same SKUs in one request, map quantities by SKU and location, and write them back with a bulk operation. This keeps request volume low and avoids the per-product call chain that forces overnight syncs.

SAP ECCShopifyInventory SyncERP IntegrationBulk Operations
AM
Anita M.
Distribution Center Manager
★★★★★★★★★★
4.5/5 · 9/21/2026

Time-Saving Integration with Excellent Support

"I like that APPSeCONNECT saves us a lot of time by automating the import of sales orders from Shopify into SAP Business One. It helps in updating business partner contact information, which is great because before we had to hand-type the orders, but now it's all imported smoothly."

Read more APPSeCONNECT Reviews

Request for a personalized demo

Related Resources