Skip to main content
A delivery that does not return 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, except 410
  • 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. A 2xx 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.