Cron is the workhorse of automation — backups, cert renewals, data syncs, report generation. It runs your scripts on a schedule and, when a job fails, it sends the output to root@localhost via sendmail. If you're like most sysadmins, that mailbox is never checked. The failure sits unnoticed until a customer complains, a backup is needed and found empty, or a certificate expires and takes the site down.
The core issue is that cron has no built-in "I didn't run" signal. A job that fails to start, exits non-zero, or simply never gets scheduled produces no alert. You find out hours or days later, from the downstream damage.
Heartbeat monitoring flips the model. Instead of waiting for an error (which may never arrive), your job pings a monitoring service each time it runs. If the ping stops arriving, the monitor alerts you. The monitor knows the job is supposed to run every hour, and if it doesn't hear from it within the grace period, something is wrong.
This is exactly what CronWatch does. You register a job, get a ping URL, and add a single curl call to your crontab. If the ping stops, CronWatch alerts you. No agent to install, no logs to ship, no sidecar process — just one HTTP request at the end of your script.
CronWatch is privacy-first: no email, no password, no personal data. A single curl call registers you and returns an API key.
curl -X POST https://cronwatch.steveco-ai.com/api/v1/auth/register \
-H "Content-Type: application/json" \
-d '{"email": "you@example.com"}'
The email is optional — you can register with an empty body and get a fully functional account. The response contains your api_key. Save it; you'll use it for every subsequent call.
Tell CronWatch about the job you want to monitor. Give it a name, the expected interval (how often it runs, in seconds), and a grace period (how long to wait after the interval before alerting).
curl -X POST https://cronwatch.steveco-ai.com/api/v1/jobs \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "nightly-database-backup",
"expected_interval": 86400,
"grace_seconds": 300
}'
The response includes a ping_url field with a unique slug — something like https://cronwatch.steveco-ai.com/ping/a8f3b2e1c9d4. This is the URL your cron job will call each time it runs.
Open your crontab with crontab -e and add the ping call at the end of your job. The && ensures the ping only fires if the job succeeds — so CronWatch knows not just that the job ran, but that it ran successfully.
# Nightly database backup — ping CronWatch on success
0 3 * * * /opt/scripts/backup.sh && curl -s https://cronwatch.steveco-ai.com/ping/a8f3b2e1c9d4
That's it. If the backup stops running — cron disabled, script deleted, server down — CronWatch notices the missing pings and alerts you after the grace period expires.
The pattern above only pings on success. If you want to know when the job fails (not just when it stops running), use the /fail endpoint:
0 3 * * * /opt/scripts/backup.sh && curl -s https://cronwatch.steveco-ai.com/ping/a8f3b2e1c9d4 \
|| curl -s https://cronwatch.steveco-ai.com/ping/a8f3b2e1c9d4/fail
Now CronWatch gets a success ping when the job works, a failure ping when it doesn't, and alerts you if it stops running entirely.
If you'd rather not write the && / || logic yourself, CronWatch ships a wrapper script that handles it automatically. cw-wrap.sh takes a ping slug and a command, runs the command, and pings the appropriate endpoint based on the exit code:
# In your crontab:
0 3 * * * /opt/cronwatch/cw-wrap.sh a8f3b2e1c9d4 /opt/scripts/backup.sh
The wrapper pings /ping/{slug} on success (exit 0) and /ping/{slug}/fail on any non-zero exit. It also captures stderr and includes it in the ping, so you can see the error message in the CronWatch dashboard.
Most monitoring services want your email, your name, a credit card, and a phone number — before you've even added a single check. CronWatch takes a different approach: register with a single curl call, get an API key, and start monitoring. No email required (though you can add one for alerts if you want). No personal data stored. We don't log your IP address. We store only what we need to function: your hashed API key, job names, and ping timestamps.
Payments are crypto-native — USDC, BSV, BTC, or BCH. No fiat, no Stripe, no KYC. The free tier (10 checks) is enough for most personal projects. Pro is $5/month for 50 checks.
Key takeaway: Heartbeat monitoring with a single curl call is the simplest way to stop finding out about failed cron jobs from your users. Five minutes of setup, and you'll know within minutes when something breaks — not days.
Free tier, 10 checks, no email required. Get your API key in 60 seconds.
Get started →