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

> ## Agent Instructions
> Internal links on these pages omit the .md extension. Append .md to a docs page URL, or send an Accept: text/markdown header, to get that page as markdown.

# Delivery and retries

> How Base44 delivers outbound webhooks: at least once, retried 8 times over about 27.5 hours, with a 15 second timeout, and when an endpoint is paused for you.

Base44 keeps trying until your receiver accepts an event or the retries run out. Design your receiver for the 3 things that follow from that: an event can arrive more than once, events can arrive out of order, and a slow answer counts as a failure.

***

## What counts as delivered

Base44 treats a delivery as successful when your receiver answers with any 2xx status within 15 seconds. Everything else is retried:

* Any other status, including 3xx, 4xx and 5xx.
* A timeout or a network error.

Base44 never follows redirects. If your receiver answers with a 3xx, register the URL it redirects to instead.

<Tip>
  Answer quickly and do the work afterwards. Accept the event, return a 2xx, then process it in the background. A receiver that takes longer than 15 seconds fails every delivery, even when it finishes the work.
</Tip>

***

## Retry schedule

Base44 makes up to 8 attempts per event, over about 27.5 hours. Each delay counts from the previous attempt.

| Attempt | Delay |
| - | - |
| 1 | Immediately |
| 2 | 5 seconds |
| 3 | 5 minutes |
| 4 | 30 minutes |
| 5 | 2 hours |
| 6 | 5 hours |
| 7 | 10 hours |
| 8 | 10 hours |

After the 8th failed attempt, Base44 stops trying that event. Base44 keeps an event's content for 7 days, so an event that's been retried for longer than that can't be sent again.

***

## Handling duplicates

Delivery is at least once. If your receiver processes an event but its answer doesn't reach Base44, for example because of a timeout, the event is sent again.

Use the event's `id`, also sent as the `webhook-id` header, to ignore an event you've already processed. It stays the same across every retry of that event. Store each `id` you've handled, and skip one you've seen before.

***

## Order of events

Events can arrive out of order. A retry of an earlier event can arrive after a later one, so an `app.published.v1` can reach you after an `app.unpublished.v1` for the same app.

To keep an accurate copy of each app, compare the timestamp in `data` with the last one you stored for that app, and ignore an older event.

***

## Endpoint health and auto-pause

Each endpoint shows how its recent deliveries went. An event counts as a failed delivery only after all 8 attempts fail.

| Status | When |
| - | - |
| **Failing** | 3 events in a row have failed delivery. |
| **Auto-paused** | 10 events in a row have failed delivery, and the endpoint has been failing for at least 5 days. Base44 stops sending to it. |

A successful delivery resets both counts.

To start an auto-paused endpoint again, fix your receiver and resume the endpoint. Resuming runs the activation test first, so your receiver has to echo the challenge again. See [Setting up endpoints](/developers/references/outbound-webhooks/get-started/setting-up-endpoints#managing-endpoints).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.