> ## Documentation Index
> Fetch the complete documentation index at: https://doc.quippy-lab.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Retries and delivery

> How long Quippy keeps trying, and how to replay a dead-lettered delivery.

A delivery succeeds when your endpoint returns any `2xx` status within 10
seconds. Anything else — `4xx`, `5xx`, connection refused, DNS failure,
timeout — triggers the retry schedule.

## Retry schedule

Each delivery gets **one initial attempt plus five retries** — six attempts
total — spaced so a receiver outage of up to \~15 hours can recover without
dropping events.

| Attempt     | Delay from previous |
| ----------- | ------------------- |
| 1 (initial) | —                   |
| 2           | 1 minute            |
| 3           | 5 minutes           |
| 4           | 30 minutes          |
| 5           | 2 hours             |
| 6           | 12 hours            |

After the 6th attempt fails, the delivery is **dead-lettered**: Quippy
stops retrying and marks it in the admin portal for manual attention.

<Note>
  Retries reuse the same `delivery_id`. Persist that ID on your side and
  short-circuit on duplicates — the same event landing in your receiver
  twice should be a no-op, not a double-count.
</Note>

## What's in the delivery log

Every attempt — successful or failed — is recorded and visible on the
endpoint's detail page:

* HTTP status code (or `null` if the request never got a response)
* Request body (truncated if large)
* Response body (truncated)
* Duration in milliseconds
* Attempt number
* Whether this row was dead-lettered
* Network error string when the request didn't complete (e.g.
  `ETIMEDOUT`, `ECONNREFUSED`)

## Manual replay

A dead-lettered delivery can be replayed from the admin portal once you've
fixed the receiver. Replay resets the attempt counter and schedules a fresh
attempt immediately.

Under the hood it calls:

```http theme={null}
POST /api/v2/webhooks/:id/deliveries/:deliveryId/replay
```

The replayed delivery will re-run the full retry schedule if it fails again
— a second dead-letter means the receiver is still broken.

## What NOT to rely on

<Warning>
  **Order is not guaranteed.** Two events that fire close together may
  arrive at your receiver out of order — either because the dispatcher
  parallelizes, or because the first delivery retries while the second
  lands on the first try. Use `created` timestamps and your own ordering
  logic if order matters.
</Warning>

<Warning>
  **Exactly-once is not guaranteed.** If your endpoint returns `2xx` but
  the response never reaches Quippy (network partition, your load balancer
  cutting the connection), the delivery will be retried. Dedupe on
  `X-Quippy-Delivery-Id`.
</Warning>

## Test deliveries don't retry

The **Send test** button fires a one-shot `webhook.test` delivery. It
**doesn't** participate in the retry schedule — a failed test delivery is
dead-lettered on the first failed attempt so the UI can surface the error
immediately.
