Webhook delivery diagram with retry queue and dead letter handling

Shopify Webhooks Will Fail Silently — Build for That From Day One

Shopify webhooks are "at least once" delivery, not guaranteed, and not ordered. Most custom integrations we see built for the first time assume the opposite, and it's invisible until a webhook silently never arrives.
❌ The Assumption That Breaks Things

Treating a webhook as a reliable, ordered event stream — assuming inventory-updated always arrives before order-created for the same product, or that every webhook sent is a webhook received — causes bugs that only show up under real production load, not in testing.

🔁 The Fix: Reconciliation, Not Just Listening

Pair webhook listeners with a periodic reconciliation job that pulls current state via the API and corrects drift. Webhooks become the fast path; reconciliation becomes the safety net that catches what webhooks missed.

🔒 Idempotency Is Not Optional

Because delivery can duplicate, every webhook handler needs to be safe to run twice on the same event — check a processed-event log before acting, not after. This single habit prevents most of the double-charge and double-fulfillment bugs we've debugged for clients.