Skip to content

Retries

A delivery succeeds when your endpoint answers with a 2xx status within 15 seconds. Anything else (a non-2xx status, a redirect, a timeout, a connection error, a TLS error) is a failure and is retried.

SpacePost makes up to 8 attempts: the first immediately, then retries with increasing delays after each failure.

Attempt Delay after the previous failure Roughly after the event
1 immediate 0
2 5 seconds 5 s
3 5 minutes 5 min
4 30 minutes 35 min
5 2 hours 2 h 35 min
6 5 hours 7 h 35 min
7 10 hours 17 h 35 min
8 10 hours 27 h 35 min

After the 8th failed attempt the delivery is marked failed and no further automatic attempts are made. You can replay it manually.

  • The webhook-id is the same on every attempt, and the body is identical. The webhook-timestamp and signature are regenerated for each attempt.
  • Delivery is at least once. A slow 2xx that arrives after the timeout is treated as a failure, so your endpoint may see the same event twice. Deduplicate on webhook-id.
  • Ordering is not guaranteed. A retried email.delivered can arrive after a later email.opened. Use created_at in the payload and never move an email’s state backwards.
  • Disabled or deleted webhooks stop receiving deliveries; pending deliveries for them are marked failed.
  • Response bodies (first 1 KB) and status codes of recent attempts are visible in the dashboard delivery log, which keeps 30 days of history.