{"@context":"https://schema.org","@graph":[{"@type":"Organization","@id":"https://inquir.org/#organization","name":"Inquir","url":"https://inquir.org","logo":{"@type":"ImageObject","url":"https://inquir.org/favicon.png","width":256,"height":256}},{"@type":"WebSite","@id":"https://inquir.org/#website","name":"Inquir Compute","url":"https://inquir.org","publisher":{"@id":"https://inquir.org/#organization"}},{"@type":"WebPage","@id":"https://inquir.org/webhook-retry-platform#webpage","url":"https://inquir.org/webhook-retry-platform","name":"Webhook retry platform: survive provider redeliveries","headline":"Webhook retry platform: survive provider redeliveries","description":"Webhook retry platform: idempotent ingress for provider redeliveries, fast ACKs, pipeline retries for downstream failures, and per-delivery traces.","inLanguage":"en-US","isPartOf":{"@id":"https://inquir.org/#website"},"breadcrumb":{"@id":"https://inquir.org/webhook-retry-platform#breadcrumb"},"author":{"@id":"https://inquir.org/#organization"},"datePublished":"2025-11-01T00:00:00.000Z","dateModified":"2026-06-23T00:00:00.000Z","citation":{"@type":"CreativeWork","url":"https://inquir.org/docs"}},{"@type":"BreadcrumbList","@id":"https://inquir.org/webhook-retry-platform#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https://inquir.org/"},{"@type":"ListItem","position":2,"name":"Webhook retry platform","item":"https://inquir.org/webhook-retry-platform"}]},{"@type":"HowTo","@id":"https://inquir.org/webhook-retry-platform#howto","name":"Webhook retry platform: survive provider redeliveries","description":"Webhook retry platform: idempotent ingress for provider redeliveries, fast ACKs, pipeline retries for downstream failures, and per-delivery traces.","inLanguage":"en-US","author":{"@id":"https://inquir.org/#organization"},"step":[{"@type":"HowToStep","position":1,"name":"Verify and record event ID","text":"Check HMAC on raw body, upsert provider event ID to durable storage, return 200—even on duplicate delivery."},{"@type":"HowToStep","position":2,"name":"Enqueue durable work","text":"Call global.durable.startNew() with the parsed event payload. The HTTP response completes before downstream work begins."},{"@type":"HowToStep","position":3,"name":"Retry failed steps, not the webhook","text":"Configure pipeline step retry policy for downstream failures. Completed steps are not re-run when a later step fails."}],"isPartOf":{"@id":"https://inquir.org/webhook-retry-platform#webpage"}},{"@type":"FAQPage","@id":"https://inquir.org/webhook-retry-platform#faq","url":"https://inquir.org/webhook-retry-platform","isPartOf":{"@id":"https://inquir.org/webhook-retry-platform#webpage"},"mainEntity":[{"@type":"Question","name":"How long do providers retry?","acceptedAnswer":{"@type":"Answer","text":"Stripe: up to 72 hours with exponential backoff. GitHub: up to 3 days. Slack expects a response within 3 seconds or marks your app slow. Design for both fast ACK and duplicate delivery."}},{"@type":"Question","name":"What if the pipeline step exhausts retries?","acceptedAnswer":{"@type":"Answer","text":"The pipeline run is marked failed with full step logs. Alert on failure rates; replay manually from the execution history using the stored event payload."}},{"@type":"Question","name":"Do I need a separate dead-letter queue?","acceptedAnswer":{"@type":"Answer","text":"Failed pipeline runs serve as dead letters with searchable execution history. No separate DLQ infrastructure to provision."}}]}]}