2xx is retried on a fixed schedule.
After the last attempt the delivery is marked
exhausted and is not tried
again. That covers roughly three hours of downtime.
What counts as a failure
- any status outside
2xx, except410 - a connection error, DNS failure or TLS failure
- no response within 10 seconds
- a redirect, which is never followed
410 Gone is treated as a deliberate retirement. Delivery stops immediately
with no further attempts.
Delivery log
GET /api/webhooks/deliveries returns recent attempts, newest first. Filter
to one endpoint with ?endpoint_id=.
When an attempt fails,
response_code and error record what came back. The
response body is captured up to 2 KB, which is usually enough to see why an
endpoint rejected a payload.
The same view is on the Webhooks page of the
dashboard.
Designing for retries
Acknowledge before you do the work. A2xx means received, not processed, and
anything you do before responding eats into the 10 second budget. Queue the
payload and return.
Deduplicate on the event id. A retry reuses it, and an endpoint that timed
out after succeeding will see the same event twice.
Deliveries are kept for 30 days.