Wire CronCanary into whatever runs your jobs. Pick your stack:
Get notified when a scheduled crontab job fails silently — the daemon never fired, the box was down, or the script hung.
Wrap any script so success, failure, and run duration are all reported — including the exact exit code.
Ping from any Python scheduler — a plain script, APScheduler, or Celery beat.
Native fetch (Node 18+) — works with node-cron, Agenda, BullMQ, or a bare interval.
GitHub silently disables scheduled workflows on inactive repos and skips runs under load. A dead-man's-switch catches it.
Suspended jobs, missed schedules, and concurrency skips create no Job object at all — no in-cluster metric fires. A ping from outside does.
One crontab entry runs every scheduled task. If it breaks, every job in the app goes quiet at once — use the built-in pingOnSuccess/pingOnFailure hooks.
Beat is a single scheduler process. If it dies, every periodic task stops with no worker-side error — a beat heartbeat ping catches it.
Schedules run inside the Sidekiq process itself. If Sidekiq is down, jobs never enqueue and nothing reports it.
No MAILTO equivalent — failures go to the journal and nowhere else unless you wire up OnFailure=.
Task history is disabled by default and nothing alerts on a failed or silently-disabled task out of the box.
SLAs and callbacks are evaluated by the scheduler process — if the scheduler itself is down, none of that machinery runs.
Every check has a unique ping URL. Your job calls it on each successful run. Append /start to mark a run beginning (duration + hung-job detection), /fail for an explicit failure (immediate alert), or /<exit-code> to report a shell exit status. Miss a ping past the grace period and CronCanary alerts every channel attached to the check.
Ready to wire this up? Create a free check — 20 checks, all alert channels, no card.