{
  "id": 12336064,
  "title": "Your webhook handler was slow, so Shopify sent it again",
  "url": "https://urgent.news/2026/10/06/your-webhook-handler-was-slow-so-shopify-sent-it-again",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-10-06T08:27:39.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/adab/your-webhook-handler-was-slow-so-shopify-sent-it-again-3hgc"
  },
  "original_language": "en",
  "account": "Shopify can resend webhooks if an app sends a response after the five-second limit for handling them. This leads to duplicate order records if the server takes too long to acknowledge the webhook, causing issues during fundraising weekends when orders keep coming in. To recover from these missed webhooks, apps need to reconcile against Shopify's order data after a set period, comparing what they've recorded with what Shopify has. Self-hosted apps are at risk due to potential downtime and lack of built-in resilience, as Shopify counts a slow response as a failure and retries the webhook. By acknowledging webhooks immediately and performing the necessary work later, apps can ensure they don't miss any sales. Managed hosting may reduce downtime but does not eliminate it entirely; self-hosted apps still need to handle server maintenance, firewalls, TLS renewal, and data obligations.",
  "summary": "The server reboots at two on a Saturday morning for a security update, which is what it's supposed to do. The app doesn't come back, because nobody told the process manager to start it on boot. It's a fundraising weekend. Orders keep arriving, Shopify keeps sending webhooks into nothing, and after four hours of retries it stops. On Monday the app is running again and looks perfectly healthy. It's…",
  "key_points": [
    "Shopify resends webhooks if app response exceeds five-second limit",
    "Duplicate records occur when server takes too long to acknowledge",
    "Self-hosted apps at risk due to downtime and lack of resilience"
  ],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}