--- 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. ## 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).