Skip to main content

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:

  • Pending: queued, waiting to be picked up for delivery
  • In progress: currently being delivered to the endpoint
  • Waiting: delivery failed, waiting for retry (backoff delay)
  • Successful: webhook delivered and endpoint returned 2xx
  • Failed: all retry attempts exhausted or permanently failed

Retry behavior

When a delivery fails, Hook0 schedules retries with increasing backoff delays:

RetryDelay
13 seconds
210 seconds
33 minutes
430 minutes
51 hour
63 hours
75 hours
8+10 hours

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.

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?