Request attempts
A request attempt is a single delivery try for a webhook. When an event matches a subscription, Hook0 creates a request attempt and tracks it until delivery succeeds or all retries are exhausted.
Key points
- Each event/subscription pair generates one or more request attempts
- Hook0 retries failed deliveries automatically with increasing backoff
- Request attempts move through distinct statuses
- Full delivery history is kept for debugging
Delivery lifecycle
Status states
Request attempts go through these states (the API value of status.type is given in parentheses):
- Pending (
pending): queued, waiting to be picked up for delivery - Paused (
paused): held back because most recent deliveries to the subscription's endpoint failed; released gradually (see Subscription health) - In progress (
in_progress): currently being delivered to the endpoint - Waiting (
waiting): delivery failed, waiting for retry (backoff delay) - Successful (
successful): webhook delivered and endpoint returned 2xx - Failed (
failed): all retry attempts exhausted or permanently failed
Retry behavior
When a delivery fails, Hook0 schedules retries with increasing backoff delays:
| Retry | Base delay |
|---|---|
| 1 | 3 seconds |
| 2 | 10 seconds |
| 3 | 3 minutes |
| 4 | 30 minutes |
| 5 | 1 hour |
| 6 | 3 hours |
| 7 | 5 hours |
| 8+ | 10 hours |
A small random amount is added on top of each delay -- never subtracted, so a retry never fires earlier than its base delay -- so that deliveries that failed together do not retry together. See Why delays are not exact.
Retries are bounded by both MAX_RETRIES and MAX_RETRY_WINDOW (whichever limit is reached first) at the Output Worker level. After all retries are exhausted, the attempt is marked as permanently failed.
While a subscription is degraded or recovering, each retry waits at least 1 hour (see Subscription health).
Transient failures won't cause data loss, and struggling endpoints won't get hammered.
Failure scenarios
Request attempts fail when:
- Endpoint returns 4xx or 5xx status codes
- Connection times out
- DNS resolution fails
- SSL/TLS handshake fails
- Application is deleted (all pending attempts cancelled)
Debugging failed webhooks
When webhooks fail, request attempts give you:
- Timestamps for when each phase occurred
- Retry count (how many attempts were made)
- Response reference (link to the endpoint's response)
This helps you figure out whether the problem is endpoint availability, authentication, or payload processing.
What's next?
- Debug Failed Webhooks - Troubleshooting guide
- Monitor Webhook Performance - Tracking metrics
- Subscriptions - Configuring webhook endpoints
- Events - Understanding event structure