Skip to main content
Relay delivers each webhook at least once and keeps its request body and event_id unchanged across retries.

Delivery policy

The nominal retry delays are 2s, 4s, 8s, 16s, 32s, 64s, 128s, 256s, 512s, and 600s.

Retry classes

Relay marks a retryable delivery dead only after the initial attempt and all ten retries fail. A terminal response stops earlier. Relay resolves the destination for each attempt. It rejects localhost, private, link-local, and cloud metadata addresses before sending.

Receiver pattern

If the backend commits but the response is lost, Relay retries with the same event_id. Store that ID under a uniqueness rule and return success for a duplicate without repeating model work, tools, or replies.

Delivered meaning

For message.received, Relay marks the agent recipient Delivered only after the receiver returns 2xx. The receiver contract requires a durable commit before that response.

Terminal state and redrive

Relay stores every attempt and terminal result in PostgreSQL. Succeeded, dead, and path-transferred rows remain for 30 days, then Relay prunes them. PostHog receives derived analytics only. It is never the delivery system of record. An operator can redrive a dead webhook from Relay Console for 72 hours after the event was created. Redrive restarts the delivery attempts with the same frozen body and event_id. After 72 hours, recover current Chat and Message state through ordinary REST reads.

Review with an agent

Audit a webhook receiver for retries and durable deduplication. Copy this prompt into your coding agent.