POST request with the event as a JSON body:
2xx answer within 10 seconds counts as delivered. Anything else is a failed attempt: a 3xx, 4xx or 5xx, a timeout, a refused connection or a TLS error. Redirects are not followed.
Retries
A failed delivery is retried on a fixed schedule, up to 8 attempts in all, until one succeeds.
The endpoint fails twice and answers 200 on the third attempt, so retries stop. After 8 failed attempts the delivery is marked failed.
All 8 attempts take about 45 hours. Each wait has up to 10% random jitter, so retries from many events don’t arrive at once.
Failed deliveries
When the last attempt fails, the delivery is markedfailed and shows up under Webhooks → Failed in the dashboard. Fix your endpoint, then replay one or all of them:
Order
Relay doesn’t guarantee order. A retriedinvoice.created can arrive after invoice.paid.

invoice.created fails its first attempt and is retried a minute later, after invoice.paid has already been delivered.
created time, or fetch the current state from your own database, rather than assuming the last event you received is the latest.
Answer fast
Answer200 as soon as you have stored the event, then do the work in a background job. A handler that takes longer than 10 seconds fails even if it finishes the work, and the event is delivered again. See Idempotency for handling those duplicates.