Flatline
--:--:-- UTCSign in

The job that never ran, and the job that ran green and did nothing.

Both fail silently, and both cost you the same. Flatline expects every job to check in on schedule and to report the number it produced. If the check-in never arrives, or the number comes back empty, you get an email within a minute.

No password, no card. We email you a sign-in link. Twenty checks free, forever.

Arrivals--:--:-- UTC
nightly backup24h03:0241 GBOn time
crm sync1h23:05812 rowsOn time
shopify to sheets15m23:140 rowsEmpty run
invoice export6h17:00128 filesOn time
4 checks watchedSilence is one alarm. Zero is the other.

Three minutes to set up

Nothing to install, no agent on your server, no access to your systems. One outbound request from the job you already run.

  1. Create a check

    Say how often the job runs

    Name it, pick the interval, and add a grace window for the times it runs a little late.

  2. Check in

    Add one request to the end of the job

    Each check gets its own private URL. Hitting it records the arrival, and the number you pass along with it. No payload, no access, no agent.

  3. Say what good looks like

    Set the range you expect

    Expect at least 1 row, at most 10,000 files, whatever the job should produce. A check-in outside that range is an empty run, and it alerts.

  4. Alerts

    Silence or zero reaches you in about a minute

    One email when a job stops arriving, one when it comes back empty, one when it recovers. On Agency the same alerts reach Slack or Discord.

Send the number, not just the ping

A check-in that carries a number is the difference between "the workflow ran" and "the workflow did its job". Pass the row count, the file count, the euros invoiced — anything the job already knows at the end.

Shell, cron, anything with curl

# count what the job actually wrote, then check in with it
ROWS=$(psql -tAc "select count(*) from orders_today")
curl -fsS -m 10 "https://flatlineping.com/p/your-check-id?n=$ROWS"

Set Expect at least 1 on the check. The night the query returns 0, the job still exits 0, the workflow still goes green, and Flatline still emails you: [EMPTY] orders sync.

n8n, Make, Zapier

# final HTTP Request node, after the step that does the work
Method  GET
URL     https://flatlineping.com/p/your-check-id?n={{ $input.all().length }}

Any expression that resolves to a number works. {{ $input.all().length }} counts the items reaching the node; use a field such as {{ $json.rowsWritten }} when the count you care about is in the data. The workflow reporting "0 rows synced" is exactly the run nobody notices, and exactly the run you get told about.

If you run automations for clients

Written for the agency side of this: you have twenty workflows spread across eight clients, and the first person to notice a broken one should never be the client.

  1. Grouping

    One board, grouped by client

    Tag each check with the client it belongs to. The board groups itself, so you can see at a glance whether anything is red before your Monday call.

  2. Client link

    Send each client a live status link

    A read-only page showing only that client's checks: what ran, when it last arrived, the number it produced, and the percentage of check-ins that arrived on time. Below the board, a timeline of the last ten incidents, each with the time it started, the time it recovered and how long it was out. The page carries your agency's name rather than ours, so a client opening it sees you. No ping URLs, no other clients, no sign-in. See one for an example client.

  3. Answers

    "How long was it out?" has an answer

    Every time a check stops arriving or comes back empty, the moment is recorded, and so is the moment it recovers. Your board carries the same timeline the client sees, so you can answer the question in the thread rather than going digging.

  4. Proof

    A monthly report that says everything ran

    On the first of the month you get one email per client summarising arrivals, misses and the on-time percentage for the month just gone, with each incident and how long it lasted. Forward it, or paste it into your own report. It is the evidence that the retainer did something.

One line, wherever the job runs

Replace the example ID with the one shown next to your check. Add ?n= and a number when the job has one worth watching.

# run the backup, then check in
0 3 * * * /opt/backup.sh && curl -fsS -m 10 https://flatlineping.com/p/your-check-id

Pricing

Start free. Upgrade when you are running automations for other people and need to prove they ran. One flat price covers every client you take on: status pages are not billed per page here, which is how most status-page tools charge.

Free

$0
  • Checks20
  • Silence alertsIncluded
  • Empty-result alertsIncluded
  • EmailIncluded
  • Card requiredNo
Start free

Agency

$29 / month
  • Clients and client pagesUnlimited
  • Client status pagesSee one
  • Incident timeline and on-time %Included
  • Your agency's name on themIncluded
  • Monthly report per clientIncluded
  • Group checks by clientIncluded
  • Slack and DiscordIncluded
  • Checks500
Start free, upgrade later

Questions

What counts as late?
Every check has an interval and a grace window, and the clock runs from the last check-in rather than from a fixed schedule. If no check-in arrives within the two combined, the job is marked missed and you are alerted. A new check stays quiet until its first check-in, so setting one up never wakes you at 3am.
What grace window should I set?
Enough to cover the job's normal variation, and no more. A nightly job that finishes anywhere between 03:00 and 03:20 wants an interval of 1 day and about 30 minutes of grace. A job running every 5 minutes usually wants 5 minutes. Too little grace pages you for normal jitter; too much delays the alert you actually want. If you are unsure, start wide and tighten it once you have seen a week of real arrivals.
What happens if Flatline itself is down?
The honest answer: while we are unreachable, your check-ins are not recorded and no alerts go out, so you would get silence rather than a false alarm, and a late alert once we recover. Flatline runs on Cloudflare's network with the detection sweep on their scheduler, which is the same infrastructure the alerting depends on. We do not claim an uptime guarantee we cannot back, and we are not a substitute for a pager when the job itself is business critical.
What counts as an empty run?
You set an expected range: at least this many, at most that many. When a check-in arrives carrying a number outside that range, the check turns amber and you get one email saying what it reported and what you expected. If you set no range, Flatline only watches for silence.
What can it not catch?
It checks the number your job reports, and nothing else. A job that reports a plausible but wrong number still looks healthy: 812 rows of yesterday's data, the same file synced twice, a number your code computed incorrectly. Flatline catches silence and it catches results outside the range you set. It is not a data-quality tool, and it cannot tell you a number that looks right is wrong.
What does it see of my systems?
Only the request you add. The check-in URL accepts a single number and returns "OK". We record the time it arrived and that number, nothing else. There is no agent and no access to your servers.
Will it keep emailing me while a job is down?
No. One email when a job stops arriving, one when it comes back empty, one when it returns to normal.
What if the job fails instead of disappearing?
Add /fail to the end of the URL and call it from your error path. That alerts immediately, without waiting for the interval to pass.
What does a client see on the status link?
Only their own checks: the name you gave each one, whether it is on time, when it last arrived, the number it reported, the percentage of check-ins that arrived on time, and how many arrivals and misses it had this period. Underneath, a timeline of the last ten incidents with when each started, when it recovered and how long it was out. No ping URLs, no other clients, no account controls, nothing to sign into.
Can I put my own name on the client page?
Yes, on Agency. Set your agency name in the dashboard and it appears at the top of every client page instead of ours, and you can switch off the "Monitored with Flatline" line in the footer. The page still lives on a Flatline URL: we do not offer custom domains, and we would rather say so than let you find out after you have sent the link.
Can I cancel?
Any time, from the billing portal in your dashboard. You return to the free plan and keep your checks.