Delivery and retries

What counts as a successful delivery, how failed deliveries are retried, and when an endpoint is switched off.

Successful delivery#

A delivery succeeds when your endpoint answers with any 2xx status within 10 seconds. The response body is ignored.

Your endpointResult
2xx within 10 secondsDelivered.
5xx, 408, 425 or 429Failed — retried.
Timeout, connection refused, DNS or TLS errorFailed — retried.
Any other 4xxFailed — not retried.
A redirect (3xx)Failed — not retried. Redirects are never followed.

Retries#

A failed delivery is retried up to 6 attempts in total, waiting longer each time:

AttemptSent after the previous one
1—
210 seconds
320 seconds
440 seconds
580 seconds
6160 seconds
A delivery that recovers on the third attempt
A delivery that recovers on the third attemptLocaloyYour endpoint1. Attempt 12. 503 Service UnavailableWait 10 seconds3. Attempt 2 — new t and v1, same event IDNo answer in 10 s — timeoutWait 20 seconds4. Attempt 35. 200 OK — delivered
  1. Localoy → Your endpoint: Attempt 1
  2. Your endpoint → Localoy: 503 Service Unavailable
  3. Note: Wait 10 seconds
  4. Localoy → Your endpoint: Attempt 2 — new t and v1, same event ID
  5. Note: No answer in 10 s — timeout
  6. Note: Wait 20 seconds
  7. Localoy → Your endpoint: Attempt 3
  8. Your endpoint → Localoy: 200 OK — delivered

All six attempts fall within about five minutes. Each retry carries a fresh timestamp and signature, the same X-Localoy-Event-Id, and an incremented X-Localoy-Delivery-Attempt.

After the last attempt fails, the delivery is marked failed. It stays in the portal's delivery log, where you can replay it once your endpoint is fixed.

Delivery guarantees#

  • At least once. An event may arrive more than once — for example when your endpoint processed it but the response was lost. De-duplicate on X-Localoy-Event-Id.
  • No ordering guarantee. Retries mean a later event can arrive before an earlier one. Use occurredAt, or read the current state, rather than relying on arrival order.

Automatic disabling#

Localoy counts consecutive failed attempts — retries included — for each endpoint. When the count reaches 10, the endpoint is switched to disabled and stops receiving new events. Any successful delivery resets the count to zero.

Because retries count, an endpoint that is down while about two events are delivered can be disabled.

To recover:

  1. Fix your endpoint.
  2. Press Test in the portal to confirm it answers — Test works on a disabled endpoint.
  3. Enable the endpoint again. This resets its failure count.
  4. Replay the deliveries that failed while it was down.

Delivery log#

The Partner Portal lists every delivery with its status, the number of attempts, the payload, and — for the latest attempt — your endpoint's HTTP status, the start of its response, the error if there was one, and how long it took. A pending delivery also shows when it will next be tried.