Shopify Integrations That Don't Break: A Practical Checklist
Missed webhooks, duplicate orders, rate limits and expiring API versions: why syncs with accounting, warehouses and sheets fail, and the patterns that keep them right.
Orders live in Shopify. Stock counts, books, customer records and pick lists often live somewhere else: an accounting package, a warehouse system, a marketplace, or a spreadsheet the team opens every morning. An integration keeps them in step. When it fails, it usually fails quietly: an order missing from the warehouse, a stock count that drifted until something oversold.
Most failures come from a short list of causes that Shopify documents. Here is what to check, whether you use a ready-made connector or have one built.
1. Decide which system owns each number
A Shopify Community thread from a coffee roaster shows the classic problem: their accounting sync only went one way, products added after setup never synced, and one sale had to deduct green coffee, roasted coffee and packaging.
Before syncing anything, write down which system owns each field: stock, price, cost, customer details. Every connection then follows that rule, in one direction per field. When your rules are unusual, such as one sale using several stock items, that is a sign the integration needs to be built around your business rather than configured from a generic one.
2. Plan for webhooks that never arrive
Most integrations listen for webhooks such as “order created” or “order updated”. Shopify’s webhook best practices are direct about it: webhook delivery isn’t always guaranteed, and your own downtime or handler errors also cause missed events.
The HTTPS delivery docs add the details that matter: Shopify allows one second to connect and five seconds in total, then retries a failed delivery 8 times over the next 4 hours. After 8 consecutive failures, a subscription created through the Admin API is deleted.
The standard pattern is webhooks for speed, reconciliation for correctness: a scheduled job that asks Shopify for everything changed since the last run, using updated_at filters, and fixes whatever the webhooks missed.
3. Expect the same event twice
Because Shopify retries deliveries it is not sure were received, the same event can arrive more than once. That is how one order ends up picked twice in a warehouse. Shopify’s guidance is to use the X-Shopify-Webhook-Id header to recognise and ignore duplicates.
The same idea applies to actions your integration sends back. With idempotent requests, repeated requests with the same key run only once. Without that protection, a retry can duplicate an inventory operation or charge a customer twice.
4. Do not trust arrival order
Your integration may receive “order updated” before “order created”. Shopify does not guarantee ordering within a topic, or across topics for the same resource. Sequence events by when they happened, using the X-Shopify-Triggered-At header or the payload’s updated_at, not by when they arrived. If an event is older than the data you already have, skip it. If its parent record is missing, fetch the current state from Shopify.
5. Respect rate limits on big syncs
Every app gets a budget of API calls. Shopify uses a leaky bucket: short bursts are fine as long as the average stays under the restore rate, and a full bucket returns a throttle error. On the GraphQL Admin API, the rate depends on the plan: 100 points per second on standard plans, 200 on Advanced and 1,000 on Plus, with a single query capped at 1,000 points.
For large reads, such as a full catalog or a year of orders, bulk operations are the usual answer: Shopify runs the query in the background and returns a file, without the per-query cost limits.
6. Keep the API version current
Shopify releases a new API version every three months and supports each stable version for at least 12 months. When an integration keeps requesting a version that is no longer supported, Shopify answers with the oldest supported version instead. Behaviour can change without anyone deploying anything; the X-Shopify-API-Version response header shows which version was really used. Know which version each integration uses and who updates it before support ends.
7. Watch platform changes that touch your data
Some changes move where data lives. With market-driven shipping, shipping settings move from delivery profiles into Markets. The rollout to merchants started October 1, 2026, and all merchants move by July 1, 2027. On those stores, merchant-owned delivery profile APIs are deprecated: reads may return a stale snapshot and writes can appear to succeed without changing the live settings. If a custom shipping integration reads or writes those profiles, check it now.
A year-end exercise
List every job where someone moved data between Shopify and another tool by hand this year. For a plain daily export, a ready-made sheet or automation tool is often enough. When the sheet is the team’s real workflow, with custom columns, several stores or changes written back to Shopify, a small integration built for it fits better.
Each line on that list is a gap between Shopify and a tool you already use. Closing those gaps is what integrations and back-office tools are for, and our custom solutions page describes how we approach them.
Bring the list. Talk to us about which tools should connect, and we will reply with how we would approach it.