The first decision in any retry system is not how long to wait, it is whether to retry at all. A retry policy that treats every non-2xx response the same will waste hours hammering a receiver whose endpoint no longer exists, and it will bury the one signal that matters: a payload you sent was wrong.
Split outcomes into three buckets. Retriable failures are the ones that plausibly resolve themselves: 5xx responses, connection timeouts, connection resets, and DNS failures. Permanent failures do not get better with time: 400 (malformed payload), 401 (bad or revoked credentials), 403, 404, and 410. Rate limiting gets its own bucket because 429 needs to honor the Retry-After header rather than a fixed schedule. This three-way split is the standard guidance for outbound webhook senders, and it exists because retrying permanent failures costs resources and can look like an attack to the receiver (Hookdeck's outbound retry guide).
One rule deserves a promotion from detail to policy: only a 2xx counts as success. Every other status, including 3xx redirects and even a 202 that a receiver meant as "accepted," should be treated as a failed delivery. That stance is explicit in the retry guidance from Svix, and it is right, because a receiver that wants to say "accepted, working on it" should return 2xx and process asynchronously (Svix retry best practices). Document which status codes trigger retries, because receivers genuinely get this wrong and will file a bug when your system retries their redirect.
A related operational point: GitHub asks receivers to respond within 10 seconds and terminates the connection after that, counting the delivery as a failure (GitHub's webhook best practices). Your own acceptance timeout should be tight for the same reason. Accept, persist, respond, and do the work asynchronously.
The practical consequence for your sender: permanent failures skip the retry scheduler entirely and land in the dead-letter queue immediately, tagged with the reason. That keeps the retry queue small and the DLQ meaningful.



