What counts as success
A delivery succeeds when your endpoint returns any2xx status within the request timeout (10 seconds). Anything else is a failure and is retried:
- Non-
2xxstatus codes (4xx,5xx). - Timeouts, DNS failures, and connection errors.
- Redirects — a
3xxis not followed and is treated as a failure (this prevents a redirect from re-targeting your signed payload).
Retry schedule
Failed deliveries are retried on an exponential backoff. The default schedule is:| After failed attempt | Wait before next attempt |
|---|---|
| 1st | +5 minutes |
| 2nd | +30 minutes |
| 3rd | +2 hours |
delivery_attempt field in the envelope tells you which attempt you’re receiving, and each attempt is recorded in the delivery history.
Because failures are retried, the same event may reach you more than once. Always deduplicate on the envelope
id. Delivery order is not guaranteed either — use event_ts if order matters.Auto-disable
If a delivery exhausts all retries, it is markedFAILED and the subscription is automatically disabled — no further events are delivered until you re-enable it.
To recover:
- Fix your endpoint.
- Re-enable the subscription.
- Optionally replay the deliveries that failed while it was down.
Replaying deliveries
Any individual delivery can be re-queued for another attempt — useful after fixing a bug in your handler or re-enabling a subscription. Replaying re-sends the same event envelope (with an incrementeddelivery_attempt) through the normal delivery path. The subscription must be enabled for the replay to be delivered.
Debugging failed deliveries
Use the delivery history to see, per attempt, the response code, a snippet of your endpoint’s response body, any error message, and the request duration. Filter bystatus: FAILED to find deliveries that need attention.