Skip to content
Merxian

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.

On this page

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 5xx for an event that it cannot process. Return 2xx and handle the failure in your own queue.

Your handler must still process duplicates safely. See Process events.

Try refund, payment.succeeded,POST /v1/transactions, orIdempotency-Key.