Cron jobs, workers, and backups fail in silence while the website stays up. Give each one a URL to call when it finishes. If the call is late or never comes, Acumen Logs tells you which.
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.
Say how often a ping should arrive, how much grace to allow, and 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.
Send a body, headers, or query string when the job has something useful to say. A good ping answers 200.
Laravel, Node.js, Python, Ruby, shell, or anything else that speaks HTTP. No SDK and no open ports.
You set the expected frequency and a grace period per heartbeat. The two states page different people for different reasons.
The job ran. The next ping is already expected, and nobody is notified.
The ping is late but the grace period has not run out. A queue delay, not an outage.
The job never checked in. The alert includes the last successful ping.
Every check-in is logged. Metadata you sent with the ping, a duration or a row count, is there when you open the incident.
No ping within 15 min + 15 min grace. Alert sent to #ops.
Expected at 09:30. Nothing received.
POST · 09:15:41 · 1,204 rows · 42s
POST · 09:08:12, inside the grace period
POST · 08:45:38 · 1,188 rows · 39s
Heartbeats use the same alert channels as the rest of your monitors.
No check-in since 09:15. Expected every 15 minutes, with 15 minutes of grace.
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 are priced like uptime checks. They share one allowance with uptime, SSL, WHOIS, and RUM, so mix them however you need. 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.
Free results in seconds. No account, and no credit card.
Instant results. No account needed.
Continuous monitoring for your stack.
Create complete synthetic journeys from a simple prompt.
Explore the builder →Guides, documentation, and latest insights.
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.
Extra time after the expected check-in before the job counts as missed. Set it per heartbeat, for jobs that sometimes run long.
Late means the ping is overdue but still inside the grace period. Missed means the grace period has passed with no ping. They alert separately.
Yes. Put a duration, a row count, or anything else useful in the query string or JSON body. It is stored with that check-in.
They share the uptime allowance. Free includes 10 checks across heartbeats, uptime, SSL, WHOIS, and RUM. Solo raises that to 100 for $5 a month.
One URL, one request at the end of the job, and an alert the first time it goes quiet.