# How notifications work

> The path from an event to a notice in your pocket, and why one might not arrive.

Web page: https://infrainbox.app/docs/notifications/

An alert reaching you is the last step of a longer chain. Knowing the chain is the fastest way to answer "why didn't I get told about that?" — the answer is almost always one specific link in it, and the **Deliveries** (dashboard screen `/history/notices`) page shows exactly which one.

## The path

1. **A [source](https://infrainbox.app/docs/sources.md) sends an event.** Proxmox, Uptime Kuma, a script, a heartbeat — whatever it is, it lands as one event with a severity.
2. **[Routing rules](https://infrainbox.app/docs/notifications/routing.md) decide what happens to it.** Rules run in order; the first match decides the route: dropped, kept in the inbox only, or opened as an incident. An [integration preset](https://infrainbox.app/docs/notifications/presets.md) runs underneath your own rules, for sources of that integration.
3. **An incident, if one opens, has a notification policy.** Who gets told, whether it repeats, whether it escalates if nobody acknowledges — all set on the rule or the [default route](https://infrainbox.app/docs/notifications/routing.md#the-default-route).
4. **[Quiet hours](https://infrainbox.app/docs/notifications/quiet-hours.md) and [silences](https://infrainbox.app/docs/notifications/silences.md) can hold a notice back** without touching the incident itself — it still opens, still shows in the inbox, only the alert waits or never goes out.
5. **A destination sends it.** [Telegram](https://infrainbox.app/docs/notifications/telegram.md), [Slack](https://infrainbox.app/docs/notifications/slack.md), [Discord](https://infrainbox.app/docs/notifications/discord.md), a [signed webhook](https://infrainbox.app/docs/notifications/webhook.md), or the phones paired through [InfraInbox Push](https://infrainbox.app/docs/notifications/mobile-app.md).
6. **The delivery is recorded either way**, sent or not, with why.

## The Destinations page

**Destinations** (dashboard screen `/destinations`) shows each destination as a card: its state (**Working**, **Waiting**, **Failing**), **Used by** — the Default profile, each routing profile and how many rules send there — its last message and whether it got through, and what [quiet hours](https://infrainbox.app/docs/notifications/quiet-hours.md) let through. A failing destination leads with the button that fixes it. The InfraInbox app card shows how many phones are registered for push and which are yours. **Add destination** opens a picker of the channels; a destination anything still sends to can't be deleted until that rule or profile points elsewhere.

[Test an event](https://infrainbox.app/docs/notifications/test-an-event.md) runs this whole chain against a sample or a past event, live, with nothing sent and nothing stored — the fastest way to check a change before it matters.

## Deliveries: sent, or why not

Every attempt to tell a destination something — not just the first alert, but every follow-up — is one row in **History › Notices sent** (dashboard screen `/history/notices`), including the ones that were held back. Nothing is silently dropped from this list, so it can always answer "who was told, when, and why not."

**Status:**

| Status | Meaning |
|---|---|
| Pending | Queued; shown as "Retrying (n)" once it has already failed once |
| Processing | Being sent right now |
| Sent | The destination's provider accepted it |
| Failed | Every retry was used up |
| Cancelled | No longer relevant (the incident moved on before it went out) |
| Skipped | Deliberately held back — see below |

**Why a notice is skipped:**

| Reason | What happened |
|---|---|
| `silenced` | An active silence or source mute matched the incident |
| `quiet_hours` | It arrived inside quiet hours, below that destination's threshold |
| `flapping` | The incident is unstable; open/resolve notices pause until it settles |
| `cooldown` | This destination was already told about the incident more recently than its cooldown |
| `destination_broken` | The destination needs attention (a bad token, a revoked webhook) before anything more is sent |
| `no_edit` | The channel can't edit an earlier message, so an acknowledgement or a manual resolve made elsewhere has nothing to update there (see [what "edited in place" means](https://infrainbox.app/docs/notifications/telegram.md#what-alerts-look-like)) |
| `recovery_off` | That destination, or that route, has recovery notices turned off |
| `state` | The notice no longer matches the incident's current state by the time it was due |
| `unverified` | On infrainbox.app only: nothing is sent for a workspace until an owner has confirmed their email address |
| `quota` | On infrainbox.app only: the workspace, or that one destination, has sent as much as it may today — see [Usage and limits](https://infrainbox.app/docs/reference/usage-and-limits.md) |

A **test** send — the Send test button on a source or destination — bypasses every one of these gates on purpose: it always goes out, so it always tells you whether the destination itself works.

## Next

- [Routing rules and the default route](https://infrainbox.app/docs/notifications/routing.md)
- [Presets](https://infrainbox.app/docs/notifications/presets.md)
- [Quiet hours](https://infrainbox.app/docs/notifications/quiet-hours.md)
- [Silences and mutes](https://infrainbox.app/docs/notifications/silences.md)
- [Test an event](https://infrainbox.app/docs/notifications/test-an-event.md)
