Notifications

Alert channels — email, webhook, Discord, Slack, and ntfy — plus how alerts fire and recover.

A notification channel is one destination for alerts. You link channels to individual monitors — see per-monitor routing — and a channel can be disabled without deleting it.

How alerts fire

Notifications are tied to incidents, not to individual failed checks:

  • Monitor goes down → an incident opens → every linked, enabled channel gets "<monitor> is DOWN" with the time it was first detected.
  • Monitor recovers → the incident resolves → the same channels get "<monitor> is UP" with the total downtime.

Retries happen before an incident opens, so flapping within one check cycle never pages you. degraded results (e.g. an SSL cert approaching its warning threshold) don't open incidents and don't alert. If PINGBOARD_BASE_URL is set, alerts include a link straight to the monitor in your dashboard.

A failing channel never blocks the others: deliveries go out in parallel, and a failure is logged (Notification via "<name>" failed: <reason>) without affecting the rest.

Every channel has a Send test button that pushes a real test message through the driver, so you can verify credentials before an actual outage depends on them.

Email (SMTP)

Sends a plain HTML/text email per incident transition.

FieldRequiredNotes
toyesRecipient address
smtpHostvia defaultsSMTP server
smtpPortvia defaultsPort; secure defaults to true on 465
smtpUsernoAuth username
smtpPassnoAuth password
smtpFromeffectivelySender address — sending fails without it
smtpSecurenoForce TLS on/off

Any SMTP field left empty on the channel falls back to the instance-wide SMTP defaults configured in Settings, so the common setup is: fill in the defaults once, then each email channel is just a recipient address. The test button performs an SMTP handshake verification.

Webhook

POSTs (or PUTs) a JSON body to any URL — the escape hatch for PagerDuty-style integrations, chat bots, or your own automation.

FieldRequiredNotes
urlyesEndpoint to call
methodnoPOST (default) or PUT
headersnoExtra headers, e.g. an authorization token

The payload:

{
  "status": "opened",
  "monitor": {
    "id": "…",
    "name": "API",
    "type": "http",
    "target": "https://api.example.com/health"
  },
  "incident": {
    "id": "…",
    "startedAt": "2026-07-25T02:14:03.000Z",
    "resolvedAt": null
  },
  "baseUrl": "https://status.example.com"
}

status is opened or resolved. The test button sends {"test": true, "source": "pingboard"} and requires a 2xx response to pass.

Discord

Posts to a Discord channel webhook as a rich embed — red for down, green for up, with a link back to the monitor.

FieldRequiredNotes
webhookUrlyesDiscord channel webhook URL

Slack

Posts to a Slack incoming webhook as a formatted message with a "View monitor" link.

FieldRequiredNotes
webhookUrlyesSlack incoming webhook URL

ntfy

Publishes to an ntfy topic — self-hostable push notifications to your phone or desktop.

FieldRequiredNotes
serverUrlyese.g. https://ntfy.sh or your own server
topicyesTopic to publish to
authTokennoBearer token for protected topics
priorityno1–5, default 3

Alerts arrive as ntfy notifications titled with the monitor state; tapping one opens the monitor in your dashboard when PINGBOARD_BASE_URL is set.

Edit on GitHub·Found an issue? Open a PR.