# Event Delivery & Retries

Outpost tracks each event, its status, and all delivery attempts. Delivery operates on an at-least-once guarantee — events may occasionally be re-delivered. Consumers should use the unique event ID to deduplicate when needed.

## Automatic Retries

When a delivery attempt fails — because the destination is unavailable, misconfigured, or returns a non-2xx HTTP status — Outpost automatically retries the event.

By default, retries use an exponential backoff algorithm with a base of `2`, or you can define a custom retry schedule.

### Managed
You can configure retry behavior in the [Hookdeck General settings](https://dashboard.hookdeck.com/settings/project/general) or with the Config API using the `MAX_RETRY_LIMIT`, `RETRY_INTERVAL_SECONDS`, and `RETRY_SCHEDULE` variables.| Variable | Default | Description |
| --- | --- | --- |
| `MAX_RETRY_LIMIT` | `10` | Maximum number of retry attempts before giving up |
| `RETRY_INTERVAL_SECONDS` | `30` | Base interval in seconds for exponential backoff |
| `RETRY_SCHEDULE` | — | Comma-separated retry delays in seconds. Overrides `MAX_RETRY_LIMIT` and `RETRY_INTERVAL_SECONDS` when set |Example custom retry schedule:
```json
{
  "RETRY_SCHEDULE": [30, 60, 300, 900, 3600]
}

```

### Self-Hosted
Configure retry behavior with environment variables:| Variable | Default | Description |
| --- | --- | --- |
| `MAX_RETRY_LIMIT` | `10` | Maximum number of retry attempts before giving up |
| `RETRY_INTERVAL_SECONDS` | `30` | Base interval in seconds for exponential backoff |
| `RETRY_SCHEDULE` | — | Comma-separated retry delays in seconds. Overrides `MAX_RETRY_LIMIT` and `RETRY_INTERVAL_SECONDS` when set |Example custom retry schedule:
```
RETRY_SCHEDULE=30,60,300,900,3600

```

## Manual Retries

Any failed delivery attempt can be manually retried via the [Retry API](/docs/outpost/api#retry-event-delivery), the tenant portal or Admin UI. Manual retries are available for attempts that have exhausted automatic retries or were skipped due to the destination being disabled.

## Disabled Destinations

If a destination is disabled — through the API, tenant portal, or automatically due to a [failure threshold](/docs/outpost/features/operator-events) — events published to that tenant will not be delivered to it. Disabled destinations cannot be retried until re-enabled.

## Delivery Attempts

Each delivery attempt records:

* The destination it was sent to
* The HTTP status code and response body (for webhook destinations)
* The timestamp and attempt number
* Whether automatic retries are exhausted

Access delivery attempts via the [API Reference](/docs/outpost/api#attempts), the tenant portal, or Admin UI.