Heartbeat monitoring

Know when a background job stops checking in

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.

Heartbeats
1 late · 1 missed
Nightly database backup
Every day at 02:00
On time
6h ago
Invoice run
Every hour
Late
+6 min
Order export
Every 15 minutes
Missed
32 min
Queue worker
Every 5 minutes
On time
1m ago
Each job pings its own URL when it finishes.
Setup

A URL, a ping, and a window

Nothing to install on the server. The monitor stays healthy for as long as the job keeps checking in.

01
Create the heartbeat

Name it after the job. You get a unique URL straight away, and a successful ping returns 200.

02
Call it when the work finishes

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.

03
Set the window

Set one grace period from the last ping, and choose who hears about a miss.

Name
Nightly database backup
Expect a ping every
5 min
1 hour
1 day
Custom
Grace period
5 min
15 min
1 hour
Alert
Slack
Email
Teams
Create heartbeat

The pulse URL is ready as soon as you save.

The ping

One request, from whatever runs the job

The same URL works from a crontab, the Laravel scheduler, a Node worker, or a shell script.

Crontab
Request body
# Back up at 02:00, then check in
0 2 * * * /opt/backup.sh && \
curl -fsS -X POST https://app.acumenlogs.com/heartbeat/7f3c-91ad-4e20/pulse

The && means the ping only goes out if the backup succeeded.

The request body is not stored
curl -fsS -X POST \
-H 'Content-Type: application/json' \
-d '{"finished":true}' \
https://app.acumenlogs.com/heartbeat/7f3c-91ad-4e20/pulse

GET, POST, or HEAD

A good ping answers 200. The request body is not stored, so a duration or a row count is not available later.

Any language

Laravel, Node.js, Python, Ruby, shell, or anything else that speaks HTTP. No SDK and no open ports.

Guides for your stack

Step-by-step for the Laravel scheduler, AdonisJS, and Node.js.

Laravel guide →
On time, late, or missed

Late is a mark in the history, not its own alert

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.

On time

Checked in inside the window

The job ran. The next ping is already expected, and nobody is notified.

Late

Arrived after the grace period

It is marked late in the history. There is no separate late alert.

Missed

Grace ran out with no ping

No ping arrived, so a missed alert goes out. Repeat alerts are held for about an hour.

Failure insights

The miss comes with the pings before it

Every check-in is logged. The request body is not stored, so a duration or a row count is not there later.

Order export
Check-ins
09:45
Missed

No ping inside the grace period. Missed alert sent to #ops.

09:30
Missed

Expected at 09:30. Nothing received.

09:15
On time

POST · 09:15:41

09:00
Late

POST · 09:08:12, marked late in the history

08:45
On time

POST · 08:45:38

This heartbeat
Missed
Expected every
15 minutes
Grace period
15 minutes
Last check-in
09:15:41
Request body
Not stored
Method
POST
Alerts
Slack #ops, email
Alerts

A missed check-in is the alert

Heartbeats use the same alert channels as the rest of your monitors.

Email
Slack
Microsoft Teams
Desktop
Webhooks
  • A ping after the grace period is marked late. There is no separate late alert.
  • If no ping arrives, a missed alert goes out. Repeat alerts are held for about an hour.
  • A webhook can notify another tool.
Acumen Logs · #ops
Heartbeat missed: Order export

No check-in inside the grace period.

Last ping: 09:15:41
What to watch

The work that fails without an error page

An uptime check never sees these. A heartbeat does, because the job has to say it finished.

Cron jobs

The nightly script that exits halfway and leaves last night's file in place.

Workers and daemons

A process that froze on a memory leak or an expired token, while the site still loads.

Backups and syncs

Database backups, imports, and search indexing that the rest of the product depends on.

Billing runs

Invoices, renewals, and payouts that have to happen on a schedule.

Pricing

10 heartbeats free. 100 for $5

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.

Free

$0
forever
  • 10 heartbeats
  • Uptime checks from every 10 minutes
  • Email alerts
  • 1 status page
  • 3 days of synthetic history
Start free

Running a production app? Essentials at $39.99 a month comes with a 14-day trial.

See every plan →
Same dashboard

Jobs are one layer. Watch the rest from here too

A heartbeat sits in the same project as your uptime checks and user journeys.

Uptime monitoring

You set the interval, from multiple regions. Free runs every 10 minutes, and paid plans can run every minute.

Uptime monitoring →

API monitoring

Chain the requests behind the job and check the data they return.

API monitoring →

Synthetic monitoring

Run login and checkout in a real browser, on a schedule.

Synthetic monitoring →

Status pages

Tell customers what is happening, updated from your monitors.

Status pages →
FAQ

Frequently Asked Questions

What is a heartbeat?

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.

Do I need to install anything?

No. There is no agent or SDK. The job makes one HTTP request.

Which requests count?

GET, POST, and HEAD. You can send headers, a query string, or a JSON body, and a successful ping returns 200.

What is a grace period?

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.

Show all questions Show fewer questions

How is a late job different from a missing one?

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.

Can I send details with the ping?

You can send a body, but it is not stored. A duration or a row count is not available later.

How many heartbeats do I get?

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.

Heartbeat monitoring

Give the quiet jobs a way to say they finished

One URL, one request at the end of the job, and an alert when the check-in does not arrive inside the grace period.