Skip to content

Cron job & heartbeat monitoring that catches silent failures.

A dead cron job throws no error and writes no log — you find out when you need the backup. Give each job a ping URL and Uptimia opens an incident within a minute of the missed deadline.

30-day free trial · 50 heartbeat monitors No credit card GDPR-ready
Miss to incident
60s
Alert channels
12
Agents to install
0
Lines to integrate
1

The backup that didn't run

A nightly database backup, scheduled for 03:30. The script died before it could ping — nothing errored, nothing logged, and the only signal was the ping that never arrived.

03:30 db-backup's nightly ping never comesThe script died — nothing makes a sound last backup: stale
03:33 Grace exhausted — incident opensThe per-minute sweep catches it: Slack, SMS, PagerDuty last backup: stale
03:41 On-call acknowledges from the alertOne click on the signed link — no login at 4 a.m. · MTTA 8 min last backup: stale
09:12 The success ping itself closes itThe repaired job runs — proof of fix, not a promise backups: current
3 minsilence → alarm
Nobody went looking.09:12
A dead cron job can't send its own alarm — so the silence was the alarm. The incident found the team at 03:33, and the fix proved itself: the success ping closed it, nobody re-checked a thing.
silence caught in 3 minacknowledged via signed linkclosed by the success pingcron or interval schedules + grace
And without the heartbeat? A dead backup job is invisible — every night it doesn't run looks exactly like every night it did. You find out the day you need the restore that isn't there. no restore

Monitor scheduled jobs wherever they run

If it can send an HTTP request, Uptimia can watch it — pings are outbound-only, so firewalled and NAT jobs report in fine.

Linux crontab & systemdOne curl line at the end of the job
Windows Task SchedulerPowerShell snippet built in
Kubernetes & DockerCronJobs and containers alike
GitHub Actions & JenkinsCI snippets built in
1 ping url per job silence past grace = alarm
Sidekiq, Celery & serverlessQueue workers and functions too
wp-cron & HerokuManaged platforms ping too
Firewalled, NAT & IoTOutbound-only — no ports opened
The jobs on the other end are the ones you can't afford to lose: database backups, billing runs, ETL and data syncs, reports, certificate renewals, queue workers and email digests. one curl line

Schedules, signals and the ping log

Alerting

Alerted within a minute

Every monitor is checked every 60 seconds. A missed deadline past your grace opens one incident and alerts go out — no repeat storms, and it closes only when a real ping returns.

  • Escalation ladders and one-click acknowledgement links — no login needed
  • Recovery notice when the job comes back
  • Maintenance windows and pause — no false alerts during deploys
Page the next person until someone acknowledges
Missed ping03:32:00
db-backup · nightly — expected 03:30 + 2 min grace. The 60-second sweep caught the silence; one incident, no repeat storm.
SlackEmailSMS+ PagerDuty…
1
First on-call paged
03:32:00 · Slack, SMS and email
unacknowledged
2
Second on-call acknowledges
03:41 · signed link, no login
MTTA 9 m
Recovered — success ping
09:12:04 · recovery notice sent
closed
Deploying tonight? Maintenance windows and pause keep planned silence from paging anyone. no alert
Schedules

Your cron expression, your timezone

Paste the line already sitting in your crontab, or set a plain interval from 30 seconds to 90 days. Deadlines shift with DST, so a 03:30 job stays a 03:30 job through October.

  • Any five-field cron expression — ranges, steps, names, @daily-style macros
  • A grace period you set per job — one that sometimes runs long won't page anyone
  • Invalid or impossible schedules rejected at save
Keep planned work from paging anyone
CRONFive-field cron*/15 * * * 1-5next 09:45
INTPlain interval30 s up to 90 daysnext 09:30:30
@@daily macro@hourly · @weekly toonext 00:00
parsed in
your TZ
Deadline armed09:45:00
Uptimia now expects a ping by 09:45 + 2 min grace — deadlines follow your account timezone, DST shifts included.
grace 2 minDST safe60 s sweep
Impossible schedule? A cron like 0 0 31 2 * can never fire — rejected when you save, not silently ignored. rejected
Ping log

Every run in the ping log

Open a monitor and see when the job last ran, whether it has been drifting later week on week, and how long each run took — without shelling into the box.

  • 12-hour pulse strip and a pings-per-hour chart against the expected rate
  • Run duration on every ping when the job sends a start signal
  • Late pings flagged in the log — never paged
Watch the machine the job runs on
LOGweb-cron · every 15 min
one row per ping · latest first
09:45:03 · +3 s · 212.47.163.9run 2.1 s
09:30:14 · +14 s · curl/8.5.0late · logged
09:15 slot — silence past gracemissed
09:00:02 · +2 s · 212.47.163.9run 2.0 s
Missed slots are synthesized where the silence sat — the log shows the gap itself, not just the pings around it.
12-hour pulse strip
Pings per hour vs expected
expected 4 / hour — 09:00 got 3
Run duration — start → success
start 09:45:01 · success 09:45:03 → run 2.1 s
Late but alive? A ping past your late threshold is flagged in the log — flagged, never paged. logged only
Signals

Catches hangs and crashes, not just silence

Three signals cover every way a job can fail. Success resets the countdown; start enables a runtime cap, so a hung job alerts even if it never exits; fail alerts immediately.

  • /start — run duration in the log, plus maximum-runtime detection
  • /fail — immediate incident, grace skipped
  • GET, POST or HEAD — curl, wget, or any HTTP client
Check the API the job calls, step by step
/startRun began03:30:01 · runtime cap armedcatches hangs
successClean exitbare ping URL · GET or POSTcountdown reset
/failNon-zero exitgrace skippedalerts now
3failure
modes
Hung job caught03:50:01
/start arrived at 03:30 — no success within the 20-minute cap. The job never exited, and you're paged anyway.
hang → capcrash → /failsilence → missed
One line of curl — GET, POST or HEAD against the ping URL from curl, wget or any HTTP client. No agent, no library. curl -fsS

How heartbeat monitoring works

One URL per job — no agent, no library.

Step 120 seconds

Create a monitor

Name the job and set its schedule — interval or cron. Saving generates a private ping URL.

Monitor name
db-backup · nightly
Schedule
IntervalCron expression
30 3 * * *
Every day at 03:30 · account timezone
Grace period
2 min
CancelCreate monitor →
Step 210 seconds

Add one line to the job

Append a curl, or copy a ready-made snippet — Crontab, Bash, PowerShell, GitHub Actions or PHP. The monitor arms itself on the first ping.

crontab -e
30 3 * * * /usr/local/bin/db-backup.sh \
  && curl -fsS -m 10 --retry 3 \
     https://uptimia.com/p/hb_9f2…c41 >/dev/null
# first real ping arms the monitor:
 ping received — db-backup · nightly is armed
Step 3automatic

Get alerted when it goes quiet

Missed deadline plus grace = one incident. Your team is alerted within a minute, on the channels you already use.

#ops-alerts
Uptimia 03:33
⚠ Missed ping — db-backup · nightly
expected 03:30grace 2 minlast ping 24 h ago
Also sent to EmailSMSPagerDuty

Add one line to the job.Hear about it the night it stops.

Every job, every ping, every alert channel — free for 30 days, and none of it is a paid add-on.

Start your free 30-day trial
30 days free no credit card cancel anytime

Also included

Full REST API

Create, edit, pause and delete heartbeats from your pipeline — plus a cron-preview endpoint that validates expressions before they ship.

POST /api/v2/heartbeat 201 · ping_url: https://uptimia.com/p/hb_3d7…b52

Snippets with your token filled in

Crontab, Bash, PowerShell, GitHub Actions and PHP.

CrontabBashPowerShellActionsPHP

One-click token reset

The old URL dies the moment you regenerate.

hb_9f2…c41hb_e81…a07

NAT-friendly rate limits

Counted per monitor, not per IP — worker fleets welcome.

300 pings / 10 min
per monitor

Test pings

Fire one from the panel to see it land in the log.

manual · logged · never arms

Every monitor type in one account

The same groups, the same contact list and the same roles as every other monitor type.

db-backup · nightlyHEARTBEAT www.caldmont.comUPTIME api.caldmont.comSSL

Where your alerts land

A missed backup reaches the same people, on the same channels, as a site that went down.

On-call & escalation
Direct

12 channels, one contact list — set it once, every monitor type uses it.

Browse the full integrations directory
03:33 · incident opened — missed ping · db-backup · nightly
#ops-alertsSlack
⚠ Missed ping — db-backup · nightly
expected 03:30grace 2 minAcknowledge ↩
+371 ··· 4082SMS
Uptimia: MISSED PING db-backup · nightly. Expected 03:30 +2m grace. Last ping 24h ago.
InboxEmail
⚠ Missed ping — db-backup · nightly
Expected 03:30 (+2 min grace) · last ping yesterday 03:30:07 · acknowledge with one click…
ProductionPagerDuty
TRIGGEREDMissed ping — db-backup · nightly
assigned to on-call · via Uptimia integration

What is cron job & heartbeat monitoring?

Cron job monitoring — also called heartbeat monitoring — checks that scheduled tasks actually run. Instead of Uptimia probing your server, each job sends a short HTTP request ("ping") to its own unique URL when it runs. If the ping doesn't arrive on schedule plus grace, Uptimia opens an incident and alerts you.

Outside-in

Uptime monitoring

Uptimia
171+ checkpoints
HTTP check · every 30 s
Your website
answers requests

Works when there's something to ask. Websites and APIs answer; a cron job doesn't.

Inside-out

Heartbeat monitoring

Your cron job
even behind a firewall
ping · on every run
Uptimia
expects it on schedule

no ping by 03:32 → incident opens · a /fail ping alerts instantly

Also known as

A dead man's switch for cron

Every Uptimia heartbeat monitor is one — cron-aware schedules, a grace period, and alerts wherever your team works.

Pings keep arriving — the switch stays closed. All quiet.
Pings stop — the switch releases. Incident opens, alerts go out.

Heartbeat monitoring FAQ

01What does my job actually have to do?+
Request its ping URL once per run — curl -fsS -m 10 --retry 3 https://uptimia.com/p/hb_… at the end of the crontab line is enough. GET, POST and HEAD all work. The monitor stays dormant until its first real ping, so it can't alert while you're wiring it up.
02When exactly does an alert fire?+
When the expected time plus grace passes without a ping. Monitors are checked every minute, so detection adds at most 60 seconds. A /fail ping alerts immediately, and nothing re-alerts while an incident is open.
03My job hangs instead of crashing — will you catch that?+
Yes — ping /start when the run begins and set a maximum runtime. If no success follows within the cap, an incident opens. You also get each run's duration in the log.
04Why didn't my cron job run?+
The usual suspects: the cron daemon isn't running, the job's PATH or environment differs from your shell, permissions changed, or the schedule is wrong. Monitoring won't fix the cause — it makes sure you find out within a minute, and the ping log shows exactly when the runs stopped.
05Can I monitor Kubernetes CronJobs, GitHub Actions, or Windows tasks?+
Yes. Anything that can send an HTTP request can ping — add a curl step to a CronJob or workflow, or use the built-in PowerShell snippet for Windows Task Scheduler. Firewalled and NAT environments work too, because pings are outbound-only.
06What do you store about each ping?+
Signal, timestamp, deviation from schedule, source IP, user agent, and run duration. Request bodies are not stored — don't send secrets or logs.
07We ping from hundreds of workers behind one NAT — is that a problem?+
No. Rate limits count per monitor — 300 pings per 10 minutes — not per source IP, so shared egress addresses and worker fleets don't collide.
08Which timezone do cron schedules run in?+
Your account's timezone, DST-aware. There is no per-monitor timezone today; interval schedules sidestep the question.
09Can I manage heartbeats without the UI?+
Yes — the REST API creates, edits, pauses and deletes monitors, regenerates tokens, sends test pings, and previews cron expressions (validity plus the next three runs).
10Can a link preview accidentally keep a dead job looking alive?+
No. Slack and Teams unfurls, Outlook SafeLinks, Mimecast and Proofpoint rescans and other preview bots are recognised by their user agent: the touch is written to the ping log so you can see it, but it never arms a monitor and never pushes the deadline forward. Only a real client — curl, wget, PowerShell, your own code — counts as a run.
11Is heartbeat monitoring a paid add-on?+
No. Every paid plan includes heartbeat monitoring alongside uptime, SSL, transaction, DNS and server monitoring — never as a paid add-on. Plans differ only in how many heartbeat monitors are included. The free plan doesn't include heartbeats; the 30-day free trial does (up to 50 monitors), no credit card needed.

Start monitoring your cron jobs today.

One line at the end of a job puts it under watch — beside your uptime, SSL and server monitoring.

30-day free trial 50 heartbeat monitors included No credit card EU-hosted, GDPR-ready
Heartbeat monitoring is included in every paid plan, next to every other monitor type.