Shopify webhooks fail silently because Shopify retries failed deliveries 19 times over 48 hours without notifying you. If all retries fail, Shopify automatically deletes the webhook subscription — also without warning. The only way to catch the first failure early is to poll Shopify's webhook delivery logs via the Admin API every few minutes.
Why Shopify Webhooks Fail Silently — and How to Catch Them
Your orders/paid webhook stopped firing three days ago. Your fulfilment system hasn't received a new order since then. Shopify retried 19 times, gave up, and silently deleted the webhook subscription — and you're finding out now because a customer emailed asking where their order is.
This is one of the most common causes of silent breakdowns in Shopify-integrated apps. Here's the mechanics of why it happens and how to catch it before the damage compounds.
How does Shopify handle webhook delivery failures?
When your endpoint fails to respond with a 2xx HTTP status within 5 seconds, Shopify marks the delivery as failed and schedules a retry. Unlike Stripe's gradual backoff, Shopify retries aggressively:
- 19 retry attempts over approximately 48 hours
- Retry intervals start at seconds and extend to hours
- No notification is sent during any of the retries
- After all 19 retries fail, Shopify automatically deletes the webhook subscription
- No notification is sent after deletion either
The deletion is the part that surprises most developers. With Stripe, a failed webhook can be manually redelivered. With Shopify, once the subscription is deleted, you have to re-register it — and any events that happened during the failure window are gone.
Why does Shopify delete webhook subscriptions after failures?
Shopify's webhook delivery system is designed to protect its infrastructure from sending events to endpoints that are permanently offline. From Shopify's perspective, 19 failures over 48 hours is a strong signal that the endpoint doesn't exist anymore or isn't going to come back.
The problem is that this logic doesn't distinguish between a permanently dead endpoint and a temporarily broken one. A misconfigured deploy, an expired SSL certificate, a handler crash — any of these can cause 48+ hours of failures if not caught early.
Where are Shopify webhook delivery logs?
For admin-registered webhooks (added via Shopify admin → Settings → Notifications): go to Settings → Notifications → Webhooks → [webhook] → Recent Deliveries.
For app-registered webhooks (registered via Admin API), delivery history is available via the API:
# Get delivery events for a webhook subscription GET /admin/api/2024-01/webhooks/{webhook_id}/events.json Authorization: Bearer {access_token} # Response includes id · topic · status · created_at · response_code
Shopify retains delivery history for recent events. This is the same endpoint that monitoring tools poll to detect failures.
What causes a Shopify webhook to fail?
The most common root causes, in order of frequency:
- Endpoint timeout — your handler takes more than 5 seconds to respond. Move heavy processing to a background queue and respond immediately with 200.
- Non-2xx response — your handler returns a 4xx or 5xx. Shopify treats anything outside 2xx as a failure.
- SSL certificate error — expired or invalid certificate causes the connection to fail before your handler even receives the request.
- Deploy downtime — a rolling deploy or cold start window where your endpoint is temporarily unreachable.
- Signature verification failure — your handler rejects the HMAC signature and returns 401. Often caused by a changed secret or an incorrect verification implementation.
- Firewall or WAF blocking — new WAF rules blocking Shopify's IP range after an infrastructure change.
How can you detect a Shopify webhook failure within minutes?
The only way to detect Shopify webhook failures early is to actively poll the delivery log API. Shopify does not push failure notifications — it only records them.
Option 1: Poll the Shopify Admin API yourself
Using your app's access token, you can poll the webhook events endpoint every few minutes and check for failed deliveries. You'll need to:
- Track the last-seen event ID to avoid duplicate alerts
- Respect Shopify's API rate limits (leaky bucket, 40 req/app/store/sec on Standard)
- Handle token expiry and refresh for OAuth apps
- Build your own alerting pipeline (Slack, email, PagerDuty)
Option 2: Use a dedicated webhook monitor
Webhook Guardian connects to your Shopify store via read-only OAuth (read_orders + read_webhooks scopes) and polls delivery logs every 5 minutes. When a failure is detected, it fires a Slack or email alert with the topic, store, error code, retry count, and a link to the delivery log — long before Shopify reaches its 19-retry limit.
What events are most critical to monitor in Shopify?
A missed event in any of these topics causes downstream failures that compound over time:
orders/paid— fulfilment trigger, accounting sync, loyalty points. If this fails, orders don't ship.orders/fulfilled— shipping notification emails, 3PL status updates, customer comms.fulfillments/create— downstream inventory and warehouse sync.customers/create— CRM sync, post-signup email sequence, welcome flow.app/uninstalled— cleanup of customer data, billing cancellation, access revocation. If missed, you're storing data you no longer have consent to store.inventory_levels/update— stock-level sync with external systems. Missed events cause overselling.
FAQ: Shopify webhook failures
Why is my Shopify webhook not firing?
Does Shopify delete webhook subscriptions after failures?
How do I check Shopify webhook delivery logs?
Catch Shopify webhook failures before Shopify's retries run out. Connect Shopify to Webhook Guardian and get alerted within 5 minutes of the first failure — before Shopify has a chance to delete your subscription. Start free for 14 days →