Skip to content
Merchant guide
HTTPS · Signed events

The delivery lifecycle and retries

What happens when a delivery fails: the classification, the exponential waits with real numbers, the attempt limit, and how to manually replay dead deliveries and old events.

Reviewed against implementation
YOUR INTEGRATION, AT A GLANCE
Webhook delivery · Headers
POST /your-webhook-endpoint
Content-Type: application/json
webhook-event-type: order.created
webhook-id: <endpoint_id>
webhook-event-id: <event_id>
webhook-delivery-id: <delivery_id>
webhook-timestamp: <unix_seconds>
webhook-signature: v1=<hmac_sha256_hex>
See the implementation
On this page

01Lifecycle and classification

Delivery lifecycle: PENDING (awaiting its attempt) then DELIVERED (succeeded — terminal) or DEAD (exhausted its attempts — terminal). Each attempt has a 10-second deadline, and any 2xx response settles it as successful. Anything else counts as a failed attempt and is retried automatically: a non-2xx response (3xx after the redirect chain counts too), a timeout, a connection error, a rejected URL or host, or an oversized response.

The wait between attempts is exponential: after the n-th failed attempt, the wait is 60 × 2^(n-1) seconds capped at 7200 seconds (2 hours), multiplied by a random factor between 0.85 and 1.15 (±15% jitter).

After failed attemptApproximate wait
First~60 seconds
Second~120 seconds
Third~240 seconds
Fourth~480 seconds
Fifth and beyond960 seconds then doubling up to the 7200-second cap — if the attempt limit is above 5

The maximum number of attempts is 5 by default (the storage model allows 1–10; deliveries are created with the default). After the final failure the delivery is marked DEAD — terminal and visible in the 30-day delivery history.

02Manual replay

  • Replaying an old event to an active endpoint (Replay) and retrying a DEAD delivery (Retry) — both follow the same rules.
  • A 14-day window from event creation — older is rejected.
  • A shared budget of 1000 replays per hour per store (covering both) — exceeding it returns 429.
  • A replay creates a brand-new REPLAY delivery with a new id and a copy of the payload — original rows are never touched.