# Monitor deliveries

See every message, delivery and attempt, find a customer's failed webhooks, and answer "did you send it?".

"I never got your webhook" is the support ticket every webhook sender gets. Dispatch records every message, every delivery and every attempt, with the response your customer's server gave, so you can answer in one lookup.

## Messages and deliveries

| Record | What it is |
|---|---|
| **Message** | One event you sent: type, version, customer, data and idempotency key. |
| **Delivery** | The message going to one endpoint. Same statuses as Gateway events: `queued`, `retrying`, `delivered`, `failed`, `cancelled`. |
| **Attempt** | One try: the endpoint URL, response status, latency and when. |

## Find a message

In the dashboard open **Events** and set the product filter to **Dispatch**. Filter by customer, event type, status or time.

Over the API:

```bash
curl "https://api.getensue.com/v1/dispatch/events?customer=acme&type=order.shipped" \
  -H "authorization: Bearer ens_<key>"
```

| Query | Finds |
|---|---|
| `customer` | One customer's messages. |
| `type` | One event type. |
| `before` | Messages older than a message ID, for paging. |

`GET /v1/dispatch/events/:id` returns the message with a delivery for each endpoint and its attempts.

## Read a delivery

Open a delivery to see its [timeline](/gateway/events-and-timeline/): when it was queued, each attempt with the status your customer returned, and the next retry if one is scheduled.

```text
09:30:00  message accepted · fan-out to 2 endpoints
09:30:00  attempt 1 · 503 in 204ms
09:30:05  attempt 2 · 200 in 118ms · delivered
```

Events are also reachable through the shared events API with `kind=dispatch`, so any tooling you build for Gateway works for Dispatch.

## Answer "did you send it?"

1. Find the customer's message by type and time.
2. Check each delivery's status. `delivered` means their server returned `2xx`, and the attempt shows when.
3. If it is `failed`, the last attempt's response says why (a timeout, a `500`, a `404` for a wrong URL).
4. Once they've fixed it, [retry it or recover the endpoint](/dispatch/retries-and-recovery/).

## Metrics and usage

Dispatch traffic appears in the same metrics and usage views as Gateway. Each delivery counts as an event against your [monthly quota](/gateway/usage-and-retention/), so a message that fans out to three endpoints counts as three.

## Get told when something breaks

Set a workspace [notification URL](/gateway/notifications/) to receive `destination.breaker_opened` when a customer's endpoint stops responding, and `destination.breaker_closed` when it recovers.

> [!NOTE]
> Messages and deliveries are kept for your plan's [retention window](/gateway/usage-and-retention/#retention). Deliveries still queued or retrying are never deleted.