Failed webhook deliveries retry with exponential backoff — 8 attempts over ~24 hours — then park in the dead-letter queue for manual replay. Design your endpoint idempotent: retries mean occasional duplicates.
The schedule
Retries at roughly 1m, 5m, 15m, 1h, 3h, 6h, 12h, 24h after the first failure. Any 2xx stops the sequence. Sustained failure pauses the subscription and alerts you.
Dead-letter queue
Events that exhaust retries land in the DLQ (webhook detail page): inspect payloads, fix your endpoint, replay individually or in bulk. DLQ retention: 14 days.
Idempotency
Every event carries a unique event_id. Dedupe on it — a retry after a timeout you actually processed will arrive as a duplicate. Idempotent handlers make retries free instead of dangerous.
Ordering caveat
Retries mean events can arrive out of order (a contact.updated retry may land after a newer one delivered fine). Use the payload's occurred_at, not arrival time, for any state you keep.