Retry logic makes teams feel safe.
Something failed? Try again. Still failed? Try again later. Add exponential backoff, move it to a dead-letter queue, and call it resilient.
It feels responsible.
But your retry logic is lying to you.
Most webhook systems operate as a pure DeliveryEngine. They are dumb pipes. They push data, count attempts, and apply one global retry policy to every single failure.
But treating every error as a timeout is not reliability.
It is pretending the system knows what to do.
A 503 might be temporary downtime. Retrying later makes sense.
A 429 is not downtime. The receiver is telling you to slow down.
A 401 is telling you authentication is broken.
A 422 is a structural mismatch: the payload does not match the contract.
A broken payload does not become valid through persistence.
Retry is not recovery
Blind retry looks productive.
Attempts increase. Dashboards move. Logs fill up.
But motion is not progress.
When a DeliveryEngine treats all errors identically, the consequences are brutal.
Why retry a 422 twelve times before discarding it?
Retrying a missing field or a broken schema is not resilience. It is automation without judgment. It wastes compute, fills logs with noise, and creates head-of-line blocking for valid events.
Why send a 503 to a dead-letter queue, just so the next 100 events can meet the same fate?
When a receiver goes down, a dumb pipe hammers it until retries run out, sending perfectly valid data into a DLQ graveyard purely because of bad timing. You end up manually rescuing healthy events because your system could not pause.
At some point, aggressive retry logic becomes operational theatre.
Everyone can see that the system is trying. Nobody can see that it does not understand the failure.
And then there is the part nobody likes to say out loud.
The wrong incentive
In many usage-based webhook tools, a dumb DeliveryEngine is good for business.
More retries mean more billable volume. More attempts. More traffic. More money.
But the customer does not need more noise.
They need the flow restored.
If a payload is invalid, sending it again and again is expensive denial.
Reliable delivery is not about pushing harder.
It is about knowing what to do next.
The 422 test
A 422 is one of the clearest signals a receiver can give you.
The event arrived. The receiver understood the request. But the payload does not match the contract.
That is not downtime. That is not a network problem exponential backoff will fix.
It is a structural problem: a missing field, a renamed property, a type mismatch, or contract drift.
That is the idea behind our payload-422 scenario.
It shows the difference between retrying a failure and understanding it.
The receiver rejects customer.email as missing. Queuey finds the value at customer.contact.email and suggests the smallest safe JSON Patch — approved by a human.
From DeliveryEngine to DecisionEngine
Webhook infrastructure does not need another DeliveryEngine.
It needs a DecisionEngine — a layer that classifies the failure before deciding what to do next.
A 401, a 422, a 429, and a 503 are not cousins.
They are fundamentally different signals that demand entirely different decisions.
A 503 requires a circuit breaker to let the queue build up safely.
A 429 requires a rate limiter to ease the pressure.
A 422 requires an immediate halt and a structural fix.
Queuey is built around this exact principle: classify the failure, reduce unnecessary retries, preserve the evidence, and help the customer actually recover.
Not more attempts.
Better decisions.
Retry is a mechanism.
Recovery is the product.
Everything else is just traffic.