The three pieces
- Alert group — the routing target. A check’s
alert_group_idpoints at one. Create them per team, per severity, per project — however you want to fan out. - Recipient (channel) — a delivery destination attached to a group: a
webhook (
{ url }), a Slack channel, or an email group. - Email group — a reusable list of email recipients (external addresses or organization members). Attach the same list to multiple alert groups.
The default group
Every organization starts with a Default Alert Group and an All Organization Members email group (which auto-includes everyone in the org). Checks that don’t specify a group fall back to the default, so alerts reach your team out of the box.When notifications are sent
For each incident, Alertee sends notifications at three points in its lifecycle:- First alert — when the check first fails (after any grace period you’ve configured).
- Reminders — while the check keeps failing, a reminder goes out on an interval (default every 60 minutes, capped at 24 per incident). Reminders are labelled with how long the check has been failing.
- Recovery — when the check passes again, a single Resolved notification closes the loop on the same channels, and the incident is auto-resolved in the inbox.
The reminder interval and per-incident cap are configurable alongside the mode
in your organization’s issue settings.
Set it up from the CLI
alert-groups and
email-groups reference, or drive the same actions from an AI assistant with the
MCP tools (create_alert_group, add_alert_recipient,
create_email_group, …).
Slack recipients are set up in the web UI — they need a connected Slack
workspace (OAuth). Webhooks and email groups work entirely from the CLI/MCP.
The webhook payload
A webhook recipient receives a JSONPOST when a check fails. Use it to wire
alerts into anything — a chat bot, an incident tool, or an AI coding agent
(POST the payload straight to Devin’s /v1/sessions, a GitHub Action, or a
Zapier hook to open an investigation automatically).
Every payload carries this metadata:
"status": "success" and
"alert_level": "resolved" — match on those to auto-close incidents in your
tooling.
Some fields are best-effort and only appear when available:
advisory_summary once the AI diagnosis lands, and current_value /
threshold_value when the triggering path computed them. Two more are gated
per check (below): sql_query and result_rows.
What each check reveals (payload config)
Thesql_query and result_rows fields are gated per check, because they
can leak schema or actual data:
sql_query— the check’s query. Included by default (an agent needs the source to act on).result_rows— the raw failing rows, capped atmax_rows(default 20). Off by default — rows may contain sensitive or PII data, so this is opt-in.
include_query only affects SQL checks (http, heartbeat, and push checks
have no SQL query to send).
Set it per check in the Alerts step of the check form, or from the CLI / MCP:
create_check / update_check take include_query,
include_result_rows, and max_rows; get_check echoes the effective
webhook_payload_config.