Cron job monitoring that alerts you when jobs don't run
Cron job monitoring (heartbeat monitoring) works by inversion: your job pings a unique FourSight URL every time it completes. If the ping doesn't arrive within the expected interval plus a grace period, FourSight opens an incident and alerts you — catching silent failures that uptime checks can't see.
Uptime monitoring answers "is my site up?" Heartbeat monitoring answers a harder question: "did my backup actually run last night?" Cron jobs, scheduled tasks, ETL pipelines, and queue workers fail silently — the server stays up, the site keeps responding, and nothing anywhere reports that the 3 AM database backup hasn't completed in eleven days.
That failure mode is invisible to conventional monitoring because there is nothing to probe. A dead cron job doesn't return a 500; it simply produces no output at all. The only reliable way to catch it is a dead man's switch: the job must actively prove it ran, and silence becomes the alert.
FourSight's heartbeat monitors do exactly that, alongside the seven other check types on the same dashboard, the same escalation policies, and the same status pages — so your scheduled jobs are monitored with the same rigor as your public endpoints.
How does heartbeat monitoring work?
When you create a heartbeat monitor, FourSight generates a unique, unguessable ping URL for that job. You add one line to the end of the job — a curl call, an Invoke-RestMethod, a fetch — so the job reports in every time it finishes successfully. FourSight records each ping with its timestamp, source IP, and user agent, giving you a verifiable log of every run.
Three settings define what counts as a failure. The expected interval is how often the job should run — every 5 minutes, hourly, nightly. The grace period is slack added on top, so a job that finishes 40 seconds late on a nightly schedule doesn't page anyone (the default is 60 seconds; tune it to your job's worst-case runtime). The miss threshold is how many consecutive expected pings can be missed before an incident opens — 1 for critical jobs, 2 or more for jobs with naturally variable runtimes.
For jobs that don't run on a fixed interval, FourSight supports cron expression scheduling: give the monitor the same cron expression as the job itself (for example 0 3 * * *) and it computes exactly when each ping is due, applying the grace period around each expected run rather than a rolling interval.
| Setting | What it controls | Default |
|---|---|---|
| Expected interval | How often the job should ping (interval mode) | 5 minutes |
| Cron expression | Exact schedule for cron-mode monitors (e.g. 0 3 * * *) | — |
| Grace period | Extra time allowed after a ping is due before it counts as missed | 60 seconds |
| Miss threshold | Consecutive missed pings before an incident opens | 1 |
How do I add a heartbeat ping to my cron job?
One line, appended to the job. The && in the crontab example matters: the ping only fires when the job exits successfully, so a crashing script is treated exactly like a script that never ran — which is what you want.
crontab (Linux/macOS)
# Ping only fires if the backup script exits 0
0 3 * * * /opt/scripts/backup-db.sh && curl -fsS --retry 3 --max-time 10 https://ping.foursight.cloud/hb/<YOUR_TOKEN>
PowerShell (Windows Task Scheduler)
# At the end of your scheduled task script
try {
Invoke-RestMethod -Uri "https://ping.foursight.cloud/hb/<YOUR_TOKEN>" -Method Get -TimeoutSec 10
} catch {
Write-Warning "FourSight heartbeat ping failed: $_"
}
GitHub Actions (scheduled workflow)
name: nightly-backup
on:
schedule:
- cron: "0 3 * * *"
jobs:
backup:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run backup
run: ./scripts/backup.sh
- name: Report success to FourSight
if: success()
run: curl -fsS --retry 3 https://ping.foursight.cloud/hb/${{ secrets.FOURSIGHT_HEARTBEAT_TOKEN }}
What should I monitor with heartbeats?
Anything that's supposed to happen on a schedule and would hurt if it quietly stopped. The common thread: none of these have a URL you could point an uptime check at.
- Database backups and snapshot rotation — the classic silent failure, discovered only during a restore
- ETL and data-pipeline runs — warehouse refreshes, nightly aggregations, report generation
- Certificate and secret rotation scripts
- Queue workers and consumers — have the worker ping on each processing loop
- Billing and invoicing jobs — a skipped dunning run is directly lost revenue
- Scheduled CI workflows, cleanup tasks, log rotation, and sitemap regeneration
- IoT devices and on-prem agents that should check in on a known cadence
How does FourSight compare to Cronitor and Healthchecks.io?
Honestly: Cronitor and Healthchecks.io are both excellent, purpose-built cron monitors. Cronitor adds job telemetry and performance metrics; Healthchecks.io is open source, self-hostable, and has one of the most generous free tiers in the category. If heartbeats are the only thing you need, either is a fine choice.
The case for FourSight is consolidation. Cron monitoring is rarely the whole job — the same team also needs uptime checks, SSL expiry, DNS drift, port checks, and a public status page, and running a dedicated cron monitor alongside a separate uptime monitor means two dashboards, two alert configurations, two invoices, and two places incidents can hide. FourSight's Growth plan puts heartbeats next to the other seven check types under one escalation policy for a flat $40/mo.
| Capability | FourSight | Cronitor | Healthchecks.io |
|---|---|---|---|
| Heartbeat / cron monitoring | Yes (Growth plan and above) | Yes — core product | Yes — core product |
| Cron expression schedules | Yes | Yes | Yes |
| Full uptime monitoring (HTTP, SSL, DNS, domain, port, keyword, ping) | Yes — 8 check types included | Uptime checks available; narrower type coverage | No — heartbeats only |
| Multi-region confirmation before alerting | 4-region quorum | No equivalent | No equivalent |
| Public status pages | Included on every plan | Available on paid plans | Not included |
| Self-host option | No | No | Yes — open source |
| Job telemetry / runtime metrics | Ping log with timestamp, source IP & payload | Yes — richer job metrics | Basic ping log |
Why consolidate cron and uptime monitoring in one tool?
Because incidents don't respect tool boundaries. When a database server degrades, the symptom often shows up in three places at once: the API slows down (HTTP check), the backup job overruns its window (heartbeat), and the replica port stops accepting connections (port check). If those three signals live in three tools, you triage three alert streams and correlate by hand at 3 AM. In one tool, they're one incident timeline.
Consolidation also fixes the quieter problem of coverage decay. Standalone cron monitors are set up by one engineer and forgotten; when they leave, the account lapses and nobody notices — the monitoring equivalent of the silent cron failure it was meant to catch. Keeping heartbeats inside the platform your team already uses for uptime keeps them visible, reviewed, and owned.
Included in Growth — $40/mo flat
Monitor your first cron job in five minutes
Heartbeat monitors are included in the Growth plan alongside all eight check types, 100 monitors, 30-second intervals, escalation policies, and five status pages — one flat price, no per-monitor fees.
- Unique ping URL per job — one line of shell to integrate
- Interval or cron-expression schedules with a configurable grace period
- Ping log with timestamp, source IP, and payload as run evidence
- Same escalation policies and status pages as your uptime checks
FAQ
Common questions
What happens if my job runs but fails?
Chain the ping so it only fires on success (the && pattern in cron, or an if: success() step in GitHub Actions). A job that crashes then looks identical to a job that never ran: no ping arrives, the grace period expires, and FourSight opens an incident.
What's the difference between heartbeat monitoring and uptime monitoring?
Direction. Uptime monitoring is outside-in — FourSight probes your endpoint from four regions. Heartbeat monitoring is inside-out — your job calls FourSight, and the absence of that call is the failure signal. You need both: uptime checks for anything with a URL, heartbeats for anything on a schedule.
How do I handle jobs with variable runtimes?
Set the grace period to cover the worst-case runtime — a nightly warehouse refresh that takes 12 minutes normally but 45 at month-end gets a 45-minute grace period. For extra noise resistance, raise the miss threshold to 2 so one slow run never pages anyone but two consecutive misses do.
Is the ping URL secure?
Each monitor gets its own long random token, the URL accepts simple GET/POST pings, and tokens can be revoked and regenerated at any time — if a token leaks into a public repo, rotate it without recreating the monitor.
Which FourSight plan includes heartbeat monitoring?
Heartbeat is one of the six check types that unlock on the Growth plan at $40/mo flat, alongside SSL, DNS, domain expiry, keyword, and port monitoring. Free and Starter cover HTTP and ping checks.
Can I monitor Windows Scheduled Tasks and PowerShell scripts?
Yes — add an Invoke-RestMethod call at the end of the script (snippet above). It works the same for anything that can make an HTTP request: systemd timers, Kubernetes CronJobs, Airflow DAGs, Laravel scheduler, Sidekiq, or a Raspberry Pi in a closet.
Keep reading
Related guides, terms & comparisons
- FourSight pricing — heartbeats unlock in Growth ($40/mo)
- Guide: Heartbeat monitoring for cron jobs
- Guide: Monitoring PowerShell scripts and scheduled tasks
- Guide: Heartbeat monitoring for webhooks & ETL
- Glossary: Heartbeat monitor
- Glossary: Cron job
- Glossary: Grace period
- Compare: FourSight vs Uptime Kuma
More check types
Explore FourSight's other monitors
Start monitoring in under 60 seconds
No credit card required. 10 free monitors with 4-region consensus — commercial use allowed.