Crontap Heartbeats
The alert for the cron job that never ran.
Heartbeats turn monitoring around: your job pings Crontap after it runs. If the ping does not arrive inside the window you set, the silence becomes an alert.
- Detection after grace expires
- ~1 min
- Longest period
- 31 days
- To add to an existing job
- 1 line

What it is
A dead man's switch for anything that runs on a schedule
Uptime monitoring asks whether your URL responds. That question means nothing for work with no URL: a nightly backup, a data import, a cleanup task inside someone else's scheduler. If that job stops running, nothing goes down. Nothing happens at all.
A heartbeat turns the check around. Crontap gives you a secret URL. Your job calls it when it finishes. Crontap starts the clock. Every heartbeat has a period (how often you expect a ping) and a grace window on top for normal delays. Grace defaults to twenty percent of the period, with a five minute minimum.
Miss the deadline and the heartbeat goes from up to late to down, and you get an email. Your job can also report its own failure by calling the same URL with /fail appended. That alerts at once instead of waiting for the deadline. When the next good ping lands, you get a recovery notice.
Adding a heartbeat is one extra line at the end of a job, so it works with schedulers you do not control. Anything that can make an HTTP request can report in: crontab, a CI workflow, a container entrypoint, a Lambda.
Why it is built this way
The ideas behind it
- 01
Silence becomes signal
The failure nobody catches is the job that never started. A heartbeat turns a missing ping into an alert.
- 02
Period plus grace
Say how often you expect a ping and how much lateness is normal. Late is visible but quiet. Past grace is an alert.
- 03
Two kinds of bad news
A missing ping means the job never ran. A ping to /fail means it ran and failed. Crontap reports both, and tells them apart.
- 04
One line to adopt
Add a curl to the end of an existing job. No agent. No SDK. No change to where or how the job runs.
Flow
How it works
- 01
Create a heartbeat
Set how often you expect a ping. Tune the grace window and alert cool-down if you want to.
- 02
Ping from your job
Call the secret URL when the job succeeds, or the same URL with /fail appended when it does not.
- 03
Crontap watches the clock
A check runs every minute. Past the period, the heartbeat is late. Past the grace window, it is down and alerts go out.
- 04
Recovery and history
The next good ping restores the heartbeat and sends a recovery notice. Ninety days of events feed a reliability percentage.
Specifics
What you get
- A secret ping URL per heartbeat: call it on success, append /fail to report failure
- Accepts GET, HEAD and POST, so curl, a browser or any language works
- Attach a short message to any ping in the query string or request body
- Period plus grace: grace defaults to 20% of the period, with a five minute minimum
- Four visible states: pending, up, late and down. Late is a warning, not a page.
- Alerts for a missed ping, an explicit failure and a recovery, by email and an optional JSON webhook
- Rotate the secret URL without losing the heartbeat's history
- 90 days of raw events, permanent daily rollups, and a reliability percentage
- Copy-paste setup snippets for crontab, GitHub Actions, Node, Python, Docker and more
Scope
Version one tracks completion, not duration. There is no /start endpoint and no run-time measurement. You set expectations as period plus grace, not as cron expressions.
Captured from the live site
What it looks like
Captured from crontap.com/heartbeats by this site's asset pipeline, with navigation and overlays removed.


Straight from the source
“The alert for the cron job that never ran.”
Give every cron job a secret ping URL. Crontap detects misses within one minute after grace, then queues email and webhook notifications. /fail and 90-day history.
Read from crontap.com/heartbeats on 2026-09-08
Go deeper