Alert channels
Get told by email, Slack, PagerDuty, WhatsApp, phone call or webhook when a check goes down and when it recovers.
This page explains when FlatLyne sends an alert, and how to set up each channel: email, Slack, PagerDuty, WhatsApp, phone calls and webhooks.
How alerts work
FlatLyne sends an alert for two kinds of state change:
| Change | When it happens |
|---|---|
| Down | A ping is later than the check's schedule plus its grace time, or your job sends a /fail ping (or a non-zero exit code). |
| Recovered | A check that's down receives a success ping and goes back to up. |
Every other change is silent. A check going late (into grace), a check being paused, and a new check getting its first ping don't send anything. A late check that pings before its grace time runs out goes straight back to up without an alert.
Each state change becomes one event, and FlatLyne sends that event once to every enabled channel in the check's project. The channels are independent: if Slack is unreachable, your email and PagerDuty alerts still go out.
You get one alert per outage. A down check doesn't alert again while it keeps missing pings or sending /fail pings, so a job that fails three runs in a row sends one alert, then a recovery alert when a run succeeds. Every failed run still shows up in the check's ping history.
Integrations are per project. Open your project in the dashboard and choose Integrations in the sidebar. The page has two parts: a table of the channels this project already has, and Available integrations below it, where each channel has a Configure › link. More channels are planned; the ones you can't set up yet show a greyed-out link.
To stop a channel for a while without losing its settings, open the Actions menu (the three dots) on its row and choose Pause. Choose Resume to turn it back on. The Last triggered column shows when the channel last delivered an alert.
Plan limits
The Free plan allows 2 integrations, counted across every project you own, and the email integration each project starts with counts toward that. Pro has no integration limit. When you're at the limit, adding an integration fails with "plan limit reached; upgrade to Pro or free up capacity".
Send a test alert
There's no test button. To see a real down alert and a real recovery on every connected channel, fail a check and then ping it:
curl -fsS \
https://api.flatlyne.com/CSps9LOZGccsl2o7ieL0_YrQyZJtkGK_0H1u30FJ-NI/fail
curl -fsS \
https://api.flatlyne.com/CSps9LOZGccsl2o7ieL0_YrQyZJtkGK_0H1u30FJ-NIUse the ping URL of a check you don't mind alerting on. See Failures, exit codes and start pings for more on /fail.
Email is set up for you. Every new project starts with an email integration that sends to the project owner's address.
Choose who gets emailed
On the Integrations page, find Email Notification under Available integrations and click Configure › (or click its name in the table).
In Target, list the addresses that should get alerts. Separate them with commas, semicolons, spaces or new lines.
Click Save changes.
Every address in Target must belong to a member of the project. FlatLyne rejects anyone else with "email alerts can only go to project members; not a member: …". To email a teammate, invite them to the project first. If someone leaves the project, they stop getting alerts, even if their address is still listed.
If you delete the email integration, FlatLyne emails every member of the project instead. If you pause it, nobody gets email alerts.
Example alerts
The subject is the check name and its new status:
[FlatLyne] backup-db-nightly is DOWNThe body is an HTML card with the check name and a red DOWN badge, then these fields and a View check on FlatLyne button:
| Field | Example |
|---|---|
| Schedule | 0 2 * * * |
| Time Zone | UTC |
| Total Pings | 412 (since Mar 4, 2026) |
| Last Ping | Fri, 02 Oct 2026 02:00:41 UTC, from 203.0.113.7:51234 |
| Last Ping Type | Success |
| Status Changed to DOWN at | Sat, 03 Oct 2026 02:30:10 UTC |
For a check on an interval schedule, Schedule reads like "every 1 day" and Time Zone shows "—".
When the check recovers, the email has the subject [FlatLyne] backup-db-nightly is UP, a green UP badge, and a line saying how long the check was down, such as "Downtime lasted 2 hours, 14 minutes." The rest of the fields are the same. All alerts about one check thread together in your mail client.
Slack
Slack alerts post to one channel in your workspace. You pick the channel on Slack's side; there's nothing to fill in on FlatLyne.
On the Integrations page, find Slack and click Configure ›.
Click Connect Slack. A popup opens on Slack and asks you to authorize FlatLyne. Sign in to your workspace first if you need to.
Pick the channel FlatLyne should post to, for example #ops, and allow access. FlatLyne only posts alert messages; it never reads channel history.
The popup closes and the panel shows the connection, for example "Connected to #ops in Acme Corp." Alerts start right away.
To move alerts to a different channel, open the Slack panel and click Reconnect Slack. To stop Slack alerts, click Disconnect. A project has one Slack channel at a time.
Example alerts
🔴 backup-db-nightly is DOWN
Schedule Time Zone
0 2 * * * UTC
Total Pings Last Ping Type
412 (since Mar 4, 2026) 🟢 Success
Last Ping Status changed to DOWN at
Fri, 02 Oct 2026 02:00:41 Sat, 03 Oct 2026 02:30:10 UTC
UTC, from 203.0.113.7:51234The check name links to the check in your dashboard. The notification preview on phones reads "🔴 backup-db-nightly is DOWN".
When the check recovers:
🟢 backup-db-nightly recovered
Downtime lasted 2 hours, 14 minutesThe same fields follow, with Status changed to UP at.
FlatLyne tries each Slack message up to 3 times. An attempt fails if Slack doesn't answer within 30 seconds or doesn't return 200.
PagerDuty
PagerDuty alerts open an incident when a check goes down and resolve it when the check recovers. You can route a project's alerts to more than one PagerDuty service.
On the Integrations page, find PagerDuty and click Configure ›.
Click Connect PagerDuty. A popup opens on PagerDuty. Sign in if you need to.
Choose the service or services FlatLyne should trigger and resolve incidents on.
The popup closes and the panel shows your PagerDuty account and the services it routes to, for example "Connected to Acme Corp — routing to Database backups." Alerts start right away.
To change services, click Reconnect PagerDuty. To stop PagerDuty alerts, click Disconnect.
Example incident
When backup-db-nightly goes down, each connected service gets a trigger event:
| Field | Value |
|---|---|
| Description | backup-db-nightly is down |
| Client | FlatLyne, linking to the check in your dashboard |
| Incident key | The check's ID |
The incident's custom details carry Check, Status, Schedule, Time Zone, Total Pings, Last Ping Type, Last Ping and Status changed to down at, with the same values as the email. Urgency and escalation come from your PagerDuty service's own settings.
When the check recovers, FlatLyne sends a resolve event with the same incident key, so PagerDuty closes the open incident on its own. The resolve event adds a Downtime detail, such as "2 hours, 14 minutes". Because the incident key is the check's ID, a second down alert for a check that's still down (for example, another /fail ping) updates the open incident rather than opening a new one.
FlatLyne tries each service up to 3 times. An attempt fails if PagerDuty doesn't answer within 30 seconds or doesn't return 200. Each service is tried on its own, so one failing service doesn't block the others.
FlatLyne sends a WhatsApp message to a number you choose when a check goes down and when it recovers. WhatsApp alerts are Pro only.
On the Integrations page, find WhatsApp and click Configure ›.
Enter a name and the phone number in international format with the country code, like +14155550123. We don't send a verification code yet, so enter your own number.
Click Connect.
In the channel settings, tick Alert when a check goes down and/or Alert when a check recovers (up); at least one must stay on.
Pro includes 50 WhatsApp alerts a month per account. Once the cap is used, further alerts are skipped, not sent by email, and the count resets the next month. A send is not retried if it fails. On the Free plan, an existing WhatsApp channel is paused. Only the project owner can connect or edit it.
Phone call
FlatLyne calls a number you choose and speaks a short message when a check goes down and when it recovers. Phone calls are Pro only.
On the Integrations page, find Phone call and click Configure ›.
Enter a name and the phone number in international format with the country code, like +14155550123. We don't send a verification code yet, so enter your own number.
Click Connect.
In the channel settings, tick Alert when a check goes down and/or Alert when a check recovers (up); at least one must stay on.
Pro includes 20 calls a month per account. Once the cap is used, further alerts are skipped, not sent by email, and the count resets the next month. A failed call is not retried. On the Free plan, an existing phone-call channel is paused. Only the project owner can connect or edit it.
Webhook
A webhook sends an HTTP request that you design to a URL you control. You set the request separately for when a check goes down and when it comes back up, and you can fill it with details of the check using placeholders.
On the Integrations page, find Webhook / HTTP POST and click Configure ›.
Enter a Name, such as "Production alerts webhook".
Under Execute when a check goes down, pick the method (GET, POST or PUT; the default is POST) and enter the URL. Optionally add headers, one Header-Name: value per line, and a request body.
Fill in Execute when a check goes up the same way. You can leave either side empty, and FlatLyne won't send anything for that direction, but you need at least one URL.
Click Add integration. The panel stays open and shows the Signing secret. Copy it now with the copy button; you'll use it to verify requests. Click Done when you have it.
The URL has to be a public http:// or https:// address. FlatLyne refuses localhost, hostnames ending in .local or .internal, and private, loopback or link-local IP addresses, both when you save and when it sends.
Placeholders
FlatLyne replaces these placeholders in the URL, the header values and the body before it sends the request:
| Placeholder | Replaced with |
|---|---|
$CODE | The check's ID |
$NAME | The check's name |
$NAME_JSON | The check's name as a JSON string, quotes included |
$SLUG | The check's slug, or nothing if it has none |
$STATUS | The new status: down or up |
$OLD_STATUS | The status before the change |
$NOW | The time of sending, in UTC (RFC 3339) |
$EXITSTATUS | The exit code of the most recent ping, or -1 if it didn't report one |
$BODY | The body of the most recent ping |
$BODY_JSON | The body of the most recent ping as a JSON string, quotes included |
$JSON | The whole check as a JSON object (see below) |
$CHECK_URL | A link to the check in your dashboard |
$PROJECT_ID | The project's ID |
Put $NAME_JSON, $BODY_JSON and $JSON into a JSON body without surrounding quotes, since they bring their own. This body template, for example:
{
"check": $NAME_JSON,
"status": "$STATUS",
"was": "$OLD_STATUS",
"at": "$NOW",
"exit_code": $EXITSTATUS,
"url": "$CHECK_URL",
"details": $JSON
}sends this when backup-db-nightly goes down:
{
"check": "backup-db-nightly",
"status": "down",
"was": "up",
"at": "2026-10-03T02:30:10Z",
"exit_code": 0,
"url": "https://app.flatlyne.com/dashboard/projects/5b1e7c2a-3f4d-4e8a-9c61-2d7f0a8b9e13/checks/c0a3f6d2-8e14-4b7a-a5d9-61f2e8c4b370",
"details": {
"id": "c0a3f6d2-8e14-4b7a-a5d9-61f2e8c4b370",
"name": "backup-db-nightly",
"slug": "backup-db-nightly",
"status": "down",
"schedule_type": "cron",
"period_seconds": null,
"cron_expression": "0 2 * * *",
"timezone": "UTC",
"grace_seconds": 1800,
"last_ping_at": "2026-10-02T02:00:41Z",
"next_expected_at": "2026-10-03T02:00:00Z",
"created_at": "2026-03-04T09:12:55Z"
}
}$JSON goes in as compact JSON on one line; it's expanded here for reading.
Headers
FlatLyne sends the headers you list, plus a signature:
X-FlatLyne-Signature: sha256=<hex><hex> is the HMAC-SHA256 of the exact request body, keyed with your signing secret and written in lowercase hex. When the body is empty, it's the HMAC of an empty string. Your header lines can't override this header.
FlatLyne doesn't add a Content-Type for you. If your receiver needs one, add it as a header line, for example Content-Type: application/json. If you leave the body empty, FlatLyne sends no body at all, even for POST and PUT.
To verify a request, compute the HMAC over the raw body you received and compare it with the header:
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody: the exact bytes you received. header: X-FlatLyne-Signature.
export function isFromFlatLyne(rawBody, header, secret) {
const hex = createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
const a = Buffer.from("sha256=" + hex);
const b = Buffer.from(header ?? "");
return a.length === b.length && timingSafeEqual(a, b);
}To see the signing secret again later, open the webhook from the integrations table and use the reveal or copy button next to Signing secret.
Delivery and retries
| Setting | Behaviour |
|---|---|
| Timeout | 30 seconds per attempt |
| Success | A response status of 200, 201, 202 or 204. Any other status, including other 2xx codes, counts as a failure. |
| Retries | Up to 2 more attempts after a failure (3 in total), sent back to back with no delay |
Return a success code quickly
If your endpoint takes longer than 30 seconds or returns a status outside 200, 201, 202 and 204, FlatLyne sends the same request again, up to 3 times in total. Make your receiver safe to call more than once for the same event.