Alerts
Channels, rules, quiet hours, mute, on-call routing, and outage grouping.
Alerts
When a monitor's confirmed status changes (up → down, down → up, or transitions through degraded), the alert dispatcher walks the matching rules and delivers a message to each channel.
The model
textmonitor ──→ alert_rule ──→ alert_channel │ ├── on_down / on_recovery / on_degraded toggles ├── quiet_hours_start / quiet_hours_end ├── notify_oncall (optional) └── oncall_schedule_id (optional)
A channel is a destination (Slack channel, Discord webhook, email, Telegram chat…). A rule binds one monitor to one channel and decides which events fire it.
Channel types
| Type | What it sends |
|---|---|
slack_app | Block Kit message via OAuth bot — supports buttons (Acknowledge / Resolve / Mute / Escalate) |
slack | Plain webhook URL — no buttons |
discord | Discord webhook |
webhook | Arbitrary HTTPS endpoint with retry |
telegram | Bot API |
email | Resend |
Use slack_app whenever possible — it gets the @-mentions and the interactive buttons. Plain slack (incoming webhook URL) is older Slack tech and lacks bidirectional features.
Routing alerts to the on-call person
Set notify_oncall: true on a rule. When the alert fires, the dispatcher:
- Looks up the rule's
oncall_schedule_id(or falls back to the org's default schedule). - Resolves the schedule at the current moment to find the primary on-call user.
- Adds an @-mention block to the Slack message using that user's
slack_id. - If the schedule has a
slack_channel_id, overrides the rule's channel so the page lands in the right room.
Read Slack paging guide for full setup.
Quiet hours
Per-rule. Format: HH:MM UTC, both quiet_hours_start and quiet_hours_end. Supports overnight windows (e.g. 22:00–07:00). Alerts during quiet hours are suppressed but logged with status: "suppressed".
Mute
Mute a monitor for a duration via dashboard or Slack (/happyuptime mute <name> 1h). All alerts for that monitor get logged with status: "suppressed" and the mute reason. Mute keys live in KV with TTL so they auto-expire.
Outage grouping
If multiple monitors in the same org go down within 2 minutes of each other, the dispatcher annotates the alert with "Note: Other monitors also down recently: …". Helps you spot widespread issues vs. isolated failures.
Confirmation periods
Status transitions are gated by either:
- A count threshold (default: 2 consecutive checks must agree) — fast and configurable per monitor
- A time threshold (
confirmation_period_s/recovery_period_s) — wait this many seconds of consistent results before flipping state
Use time-based when your service has known flap windows (deploys, GC pauses).