Quick summary
Shopify webhooks send real-time event notifications (order created, product updated, customer data requested) to external systems without the need for polling. They are the standard integration mechanism for connecting Shopify to ERPs, 3PLs, CRMs, and custom apps. Off-the-shelf Shopify apps handle webhooks transparently for most merchants; you only need to interact with webhooks directly when building a custom integration.
Your order lands in Shopify. Within seconds, it should be in your 3PL system, your CRM should have the customer flagged as a buyer, and your inventory should be updated across every sales channel. In reality, for many Shopify merchants, this is a patchwork of manual exports, scheduled syncs, and apps that check for updates every few minutes and still manage to miss things.
This is the problem webhooks solve. If your business depends on real-time data flowing between Shopify and external systems, understanding webhooks is not optional. It is foundational infrastructure.
What is a webhook?
A webhook is an automated HTTP notification that Shopify sends to a URL you specify when a specific event occurs in your store. Instead of your system asking Shopify "has anything changed?" on a schedule (polling), Shopify proactively tells your system "this just happened" the moment it happens.
The analogy: polling is like refreshing your email inbox every 30 seconds. A webhook is like getting a notification the moment a new email arrives. Same outcome, vastly different efficiency.
When a webhook fires, Shopify sends a POST request to your specified endpoint URL containing a JSON payload with the full data for that event. Your system receives it and does whatever it needs to do with the data.
What events can trigger a Shopify webhook?
Shopify organises webhook triggers into "topics." There are over 60 webhook topics available, covering most significant events across orders, products, customers, inventory, payments, and more. The most commonly used ones in ecommerce operations are:
| Topic | When it fires |
|---|---|
orders/create |
A new order is placed |
orders/updated |
An order is modified (status change, fulfilment update) |
orders/paid |
An order is fully paid |
orders/fulfilled |
An order is marked as fulfilled |
orders/cancelled |
An order is cancelled |
inventory_levels/update |
Inventory quantity changes at a location |
products/create |
A new product is created |
products/update |
A product is modified |
customers/create |
A new customer account is created |
customers/update |
A customer record is modified |
checkouts/create |
A checkout is created (abandoned cart tracking) |
refunds/create |
A refund is created |
fulfillments/create |
A fulfilment record is created |
Each webhook topic sends a different JSON structure. Your receiving endpoint needs to be written to handle the specific payload format for the topics it subscribes to.
What are the most valuable webhook use cases?
Order to 3PL. The orders/create and orders/paid webhooks trigger the moment an order is placed or payment clears. Your 3PL system (or middleware connecting to it) receives the order data and creates the pick and pack job immediately. Waiting for a scheduled sync means your warehouse does not start processing until the next polling cycle, which can be 15 to 60 minutes later. For same-day dispatch operations, this delay has real consequences.
Inventory sync to ERP. If your inventory is managed in an ERP like Sage, NetSuite, or Microsoft Dynamics, inventory_levels/update webhooks keep stock levels aligned in near real-time. Without webhooks, you risk selling stock your ERP has already committed elsewhere, or showing as out of stock on Shopify while your ERP shows available inventory.
Customer to CRM. customers/create fires every time a new customer account is created. Passing this data immediately to your CRM (Klaviyo, HubSpot, Salesforce) means welcome flows, sales team alerts, or lead scoring processes trigger within seconds rather than on the next scheduled import.
Abandoned checkout recovery. The checkouts/create topic fires when a checkout is created, even before purchase. If you are building custom abandoned cart flows outside of Shopify's native system, this is the trigger you need.
Finance and accounting sync. orders/paid and refunds/create webhooks feed real-time financial data into accounting systems like Xero or QuickBooks, keeping your books current without manual imports.
Why are webhooks more efficient than polling?
Polling creates unnecessary API load. Every request your system makes to Shopify's API counts against your API rate limit (Shopify enforces limits of 2 requests per second on standard plans, 4 on Advanced and Plus). A system checking for order updates every minute makes 1,440 requests per day for that single check, whether or not anything has changed.
A webhook makes zero requests until an event actually occurs. For a store processing 50 orders per day, that is 50 webhook calls versus 1,440+ polling calls for the same data. The efficiency gap grows with order volume. Stores processing 500 or more orders per day can hit API rate limits with aggressive polling, causing delays across all integrations. Webhooks eliminate that pressure entirely.
There is a small trade-off: webhook delivery is not guaranteed. Shopify retries failed deliveries up to 19 times over 48 hours if your endpoint returns a non-2xx response, but this is not the same as guaranteed delivery. For mission-critical integrations, your system should have a reconciliation process that occasionally checks Shopify data to catch anything missed. In practice, Shopify's webhook delivery reliability is high, and most enterprise integrations accept the retry mechanism as sufficient.
How do you set up webhooks in Shopify admin?
For simple webhook needs, Shopify admin provides a basic interface. Go to Settings, then Notifications, and scroll to the bottom of the page to find the Webhooks section. Click "Create webhook."
Select the event topic from the dropdown, enter your endpoint URL, choose the API version, and save. Shopify will immediately send a test payload to the URL so you can verify it is receiving correctly.
This admin approach is fine for one or two simple webhooks. For more complex setups, multiple topics, or programmatic management, the Admin API is the right approach.
How do you set up webhooks via the API?
Use Shopify's REST or GraphQL Admin API to create, update, and delete webhooks programmatically. The REST endpoint:
POST /admin/api/2026-01/webhooks.json
With a body like:
{
"webhook": {
"topic": "orders/create",
"address": "https://your-endpoint.com/webhooks/orders",
"format": "json"
}
}
This approach is used when you are building a custom app, middleware, or integration where webhook configuration is part of the deployment process rather than something managed manually.
How should you handle webhook errors and retries?
Your webhook endpoint must respond with a 200 HTTP status code within five seconds of receiving the payload. If it takes longer, Shopify times out and treats it as a failure. Shopify retries failed webhooks on an increasing schedule: immediately after failure, then 5 minutes later, then increasingly over 48 hours.
Best practices for production webhook endpoints:
- Acknowledge immediately (return 200) and process asynchronously. Put the job in a queue and return 200 right away rather than processing inline and risking a timeout.
- Log every incoming webhook with its ID (Shopify sends an
X-Shopify-Webhook-Idheader). This helps you identify and handle duplicates if a webhook is retried after your system already processed it. - Verify the HMAC signature (Shopify sends an
X-Shopify-Hmac-SHA256header). This ensures the request genuinely came from Shopify and protects your endpoint from spoofed payloads. - Make your processing idempotent. If the same webhook fires twice (which can happen), processing it a second time should not create a duplicate order or double-decrement inventory.
When do you need webhooks versus when are apps enough?
Apps are enough when:
- You use a popular app that already has a native Shopify integration (Klaviyo, Gorgias, Linnworks, ShipStation, ReCharge)
- Your integration needs are standard and well-served by the app marketplace
- You do not have developer resource to build and maintain custom webhook infrastructure
Webhooks are the right choice when:
- You have a custom or proprietary system that no app integrates with
- You need real-time data flow rather than sync intervals
- Your order volume is high enough that sync delays create operational problems
- You want to reduce app dependency and consolidate integrations into a single middleware layer
- You are building a custom fulfilment, ERP, or data pipeline
A useful rule of thumb: if an integration exists as a well-maintained Shopify app, start there. Build a custom webhook integration only when an app cannot meet the requirement or when the operational cost of imprecise timing is measurable. For stores processing under 100 orders per day with standard operational requirements, apps handle the majority of integration needs without any webhook work.
Key actions to take now
- Map out every system that currently receives data from Shopify — your 3PL, CRM, ERP, accounting software, marketing platform. For each one, identify whether the data arrives in real-time or via a scheduled sync.
- For any integration where sync delay is causing operational problems (late order processing, inventory discrepancies, delayed welcome emails), explore whether the connected app supports near-real-time updates or whether a webhook-based integration would solve it.
- If you decide to build a webhook endpoint, start with
orders/createas your first topic. It is the most impactful webhook for most merchants and a good test case before expanding to more complex topics. - Always implement HMAC signature verification on any webhook endpoint you build. It takes 20 lines of code and prevents spoofed requests.
- Use a webhook testing tool like webhook.site or ngrok during development to inspect payloads before wiring up your actual endpoint.
- Review your Shopify API rate limit usage if you use multiple polling-based integrations. If you are frequently hitting limits, replacing polling with webhooks will free up capacity immediately.
Frequently Asked Questions
Do I need to be on Shopify Plus to use webhooks?
No. Webhooks are available on all Shopify plans. The differences between plans relate to API rate limits (Plus gets higher limits) rather than webhook availability. Any Shopify merchant can register webhooks via admin or API.
How do I test a webhook without placing a real order?
Shopify provides a "Send test notification" button when you create a webhook in the admin, which sends a sample payload. For more controlled testing, you can use the Shopify admin to trigger events (create a test order, then cancel it) or use the Admin API directly to fire test events. Tools like webhook.site let you inspect the incoming payload structure before you build your handler.
What happens if my webhook endpoint is down?
Shopify will retry delivery up to 19 times over a 48-hour window. After 48 hours of failure, Shopify will automatically disable the webhook. You can re-enable it in admin or via the API. For critical integrations, set up monitoring on your endpoint URL and alerts for unusual failure rates. Shopify also provides a webhook activity log in the Partners dashboard for app-registered webhooks.
Can one webhook topic send to multiple endpoints?
Not natively. Each webhook subscription has one destination URL. If you need the same event sent to multiple systems, you need either a fan-out middleware (a single endpoint that receives the payload and forwards it to multiple destinations) or separate webhook subscriptions for each destination. Make (from £9 per month) and Zapier (from £19 per month) can serve as fan-out middleware for simpler setups.
