Webhooks
Delivery and retries
When your endpoint does not answer with a 2xx status, Merxian tries again on a fixed schedule. After the last attempt, the delivery fails.
What counts as success#
A delivery succeeds when your endpoint returns any 2xx status within 10 seconds. Merxian ignores the response body.
| Result of an attempt | Merxian retries |
|---|---|
2xx within 10 seconds |
No. The delivery succeeded. |
408 Request Timeout |
Yes |
429 Too Many Requests |
Yes |
5xx |
Yes |
| No response within 10 seconds | Yes |
| Connection error, such as a refused connection or a TLS error | Yes |
3xx redirect |
No. Merxian does not follow redirects. The delivery fails. |
Other 4xx |
No. The delivery fails. |
| A live URL with a private, loopback, or local address | No. The delivery fails at once. |
Retry schedule#
Merxian makes up to 8 attempts for each delivery: the first attempt and 7 retries. Each retry comes after this interval from the previous attempt:
| Retry | Interval |
|---|---|
| 1 | about 1 minute |
| 2 | about 5 minutes |
| 3 | about 30 minutes |
| 4 | about 2 hours |
| 5 | about 6 hours |
| 6 | about 12 hours |
| 7 | about 24 hours |
In total, Merxian tries for about 45 hours. Each attempt has a new signature timestamp. The Merxian-Delivery-Id, the event id, and the body stay the same.
These values describe the current behaviour. They can change. Do not build logic that depends on the exact intervals.
After the last attempt#
After the eighth attempt fails, the delivery is failed. Merxian does not send it again.
Merxian does not disable an endpoint after failed deliveries. New events still go to the endpoint.
The dashboard does not yet show failed deliveries, and it cannot send a delivery again.
Avoid repeated deliveries#
A repeated delivery of the same event is normal, but these causes make it more frequent:
- The endpoint answers after 10 seconds. Answer first, then do the work.
- The endpoint returns a redirect. Use the final URL in the endpoint configuration.
- The endpoint returns
5xxfor an event that it cannot process. Return2xxand handle the failure in your own queue.
Your handler must still process duplicates safely. See Process events.