---
title: Notifiers overview
description: Who gets pinged when an agent needs you. Seven notifiers ship; pick one or stack several.
---

Notifiers deliver AO events — session stuck, PR opened, review requested, CI failed — to wherever you actually pay attention.

<PluginGrid>
	<PluginCard
		name="Dashboard"
		logo="web"
		href="/docs/plugins/notifiers/dashboard"
		description="Retained notifications inside the AO dashboard."
	/>
	<PluginCard
		name="Desktop"
		logo="apple"
		href="/docs/plugins/notifiers/desktop"
		description="Native macOS/Linux notifications. No-op on Windows."
	/>
	<PluginCard
		name="Discord"
		logo="discord"
		href="/docs/plugins/notifiers/discord"
		description="Discord webhook with rich embeds."
	/>
	<PluginCard name="Slack" logo="slack" href="/docs/plugins/notifiers/slack" description="Slack incoming webhook." />
	<PluginCard
		name="Webhook"
		logo="webhook"
		href="/docs/plugins/notifiers/webhook"
		description="Generic HTTP POST. Retries + exponential backoff."
	/>
	<PluginCard
		name="Composio"
		logo="composio"
		href="/docs/plugins/notifiers/composio"
		description="Route through Composio — Slack, Discord, or Gmail."
	/>
	<PluginCard
		name="OpenClaw"
		logo="openclaw"
		href="/docs/plugins/notifiers/openclaw"
		description="Local OpenClaw gateway for personal alerts."
	/>
</PluginGrid>

## Stacking notifiers

Notifier config is a map. Add as many named notifiers as you want, then route
priorities with `notificationRouting`:

```yaml
notifiers:
  desktop:
    plugin: desktop
  discord:
    plugin: discord
    webhookUrl: ${DISCORD_URL}
  slack:
    plugin: slack
    webhookUrl: ${SLACK_URL}

notificationRouting:
  urgent: [desktop, discord, slack]
  action: [discord, slack]
  warning: [slack]
  info: []
```

Setup commands can write this routing for you with `--routing-preset
urgent-only`, `urgent-action`, or `all`. AO does not dedupe across channels, so
route only the priorities each destination should receive.

## Testing

```bash
ao notify test --to slack --template basic
ao notify test --route urgent
ao notify test --all --dry-run
```

Use `--to` for one target, `--route` for a priority route, or `--all` for every
configured/default/routed notifier. Without `--dry-run`, real providers receive
a real test message.

## What gets notified

| Event               | When                                   |
| ------------------- | -------------------------------------- |
| `session.spawned`   | `ao spawn` succeeds                    |
| `session.working`   | Agent is actively editing code         |
| `pr.opened`         | Agent pushed a branch and opened a PR  |
| `ci.failed`         | Required check fails                   |
| `review.requested`  | Reviewer asks for changes              |
| `session.mergeable` | CI green, no blockers                  |
| `session.merged`    | PR merged                              |
| `session.blocked`   | Agent is stuck — you need to intervene |

You can tune which events fire via [`reactions` config](/docs/configuration).
