Cron jobs, workers, and backups fail in silence while the website stays up. Give each one a URL to call when it finishes. A ping after the grace period is marked late. If none arrives, you get a missed alert.
No agent to install. Anything that can make an HTTP request can send a heartbeat.
Nothing to install on the server. The monitor stays healthy for as long as the job keeps checking in.
Name it after the job. You get a unique URL straight away, and a successful ping returns 200.
GET, POST, or HEAD, from cron, a worker, or any script. Put the call after the work, so a crash halfway through never sends it.
Set one grace period from the last ping, and choose who hears about a miss.
The pulse URL is ready as soon as you save.
The same URL works from a crontab, the Laravel scheduler, a Node worker, or a shell script.
The && means the ping only goes out if the backup succeeded.
A good ping answers 200. The request body is not stored, so a duration or a row count is not available later.
Laravel, Node.js, Python, Ruby, shell, or anything else that speaks HTTP. No SDK and no open ports.
One grace period runs from the last ping. A ping that arrives after it is marked late. If no ping arrives, a missed alert goes out.
The job ran. The next ping is already expected, and nobody is notified.
It is marked late in the history. There is no separate late alert.
No ping arrived, so a missed alert goes out. Repeat alerts are held for about an hour.
Every check-in is logged. The request body is not stored, so a duration or a row count is not there later.
No ping inside the grace period. Missed alert sent to #ops.
Expected at 09:30. Nothing received.
POST · 09:15:41
POST · 09:08:12, marked late in the history
POST · 08:45:38
Heartbeats use the same alert channels as the rest of your monitors.
No check-in inside the grace period.
An uptime check never sees these. A heartbeat does, because the job has to say it finished.
The nightly script that exits halfway and leaves last night's file in place.
A process that froze on a memory leak or an expired token, while the site still loads.
Database backups, imports, and search indexing that the rest of the product depends on.
Invoices, renewals, and payouts that have to happen on a schedule.
Heartbeats have their own allowance: 10 on Free, 100 on Solo, 150 on Essentials, 200 on Pro, and 250 on Pro Plus. No credit card to start.
Running a production app? Essentials at $39.99 a month comes with a 14-day trial.
See every plan →A heartbeat sits in the same project as your uptime checks and user journeys.
You set the interval, from multiple regions. Free runs every 10 minutes, and paid plans can run every minute.
Uptime monitoring →Free website testing tools, monitoring products, and practical engineering guides.
Create complete synthetic journeys from a simple prompt.
Explore builder →A unique URL your job calls when it finishes. If the call does not arrive in time, the monitor is marked failed and you are alerted.
No. There is no agent or SDK. The job makes one HTTP request.
GET, POST, and HEAD. You can send headers, a query string, or a JSON body, and a successful ping returns 200.
The time you set for the next check-in. It runs from the last ping. If no ping arrives in that time, a missed alert goes out. There is no second grace period on top.
A ping that arrives after the grace period is marked late in the history. There is no separate late alert. If no ping arrives, a missed alert goes out.
You can send a body, but it is not stored. A duration or a row count is not available later.
Heartbeats have their own allowance: 10 on Free, 100 on Solo for $5 a month, 150 on Essentials, 200 on Pro, and 250 on Pro Plus.
One URL, one request at the end of the job, and an alert when the check-in does not arrive inside the grace period.