Tell Me When Down
How it worksWhat we checkPricing
BlogFree toolsCompareDocs
Log inGet started
All posts
When cron fails silently

What a dead man's switch is (and when your app needs one)

July 18, 2026·4 min read
A single lever in low light — a switch held open by a signal, ready to fire the moment it goes quiet.

Most monitoring watches for something bad happening — a request that errors, a page that goes down. A dead man's switch does the opposite. It watches for something good not happening, and raises the alarm when the expected signal goes quiet.

It's the right tool for a whole class of failures that ordinary uptime checks miss entirely — and once you see the shape of it, you notice how many of your background jobs need one.

Where the name comes from

The term comes from the train driver's pedal that had to be held down to keep the train moving. Let go — because the driver was incapacitated — and the train brakes automatically. The safe state is triggered by the absence of a signal, not its presence.

In software, the switch is a timer you keep resetting. Your job checks in on every successful run; each check-in pushes the deadline forward. If a check-in ever fails to arrive before the deadline, the switch fires and alerts you.

Why absence is the signal that matters

A normal monitor asks "is this endpoint responding?" That works for a website, because a website is supposed to answer at all times. It doesn't work for a nightly backup, a weekly digest email, or an hourly sync — there's no endpoint to poll, and the failure you care about is silence, not an error.

A backup job that stops running produces no error, no alert, and no difference you can see — right up until the day you need the backup and discover the last good one is three weeks old. Absence is the only signal that failure ever gives you.

When you want one

Reach for a dead man's switch any time the failure mode is a job that silently stops rather than one that loudly breaks:

Scheduled backups, cron jobs, queue workers, data syncs, batch imports, recurring emails, certificate renewals, cleanup tasks — anything that's supposed to happen on a rhythm and would otherwise fail without a sound. If nobody would notice for hours or days that it stopped, it needs one.

How to wire one up

The mechanism is simple: give the job a URL to ping at the end of a successful run, and set an expected interval. The monitor resets its timer on each ping. Miss the window — the job crashed, hung, got disabled, or the whole box went down — and you get alerted that the check-in never came.

That's exactly the heartbeat pattern we lay out, with the practical setup, in how to know if your cron job actually ran. It's the same fix behind a GitHub Action that gets disabled and a Supabase pg_cron job that quietly stops — a dead man's switch is what turns any of those silences into an email.

Point a dead man's switch at your quietest job.

Join Tell Me When Down free, give your job a heartbeat URL, and set the interval. If a check-in ever fails to arrive — crashed, hung, disabled, or gone — you get an email in minutes instead of finding out when you needed it.

Set up a heartbeatfree · no card required
more on when cron fails silently
How do I know if my cron job actually ran?"It ran" hides four different outcomes and only one is good. Why logs and error emails miss the worst case, and how a success heartbeat catches a job that never fired at all.Why your Vercel cron job is not runningOn Vercel it's rarely a mystery: the Hobby once-a-day cap, jobs that fire within the hour not on the minute, a CRON_SECRET that 401s your own cron, or a schedule that only runs in production.Why your GitHub Actions scheduled workflow stopped runningGitHub auto-disables a scheduled workflow after 60 days of no repo activity — and the cron's own runs don't count as activity, so a quiet side project always trips it. Here's the rule, the fork gotcha, and the fix.Why your Supabase pg_cron job isn't runningA pg_cron job that never runs is usually a missing pg_net extension, a UTC-not-local schedule, or a run that fired and failed. Here's how to read the run log Postgres keeps and find which is yours.

spot something wrong or out of date? [email protected] — we'll fix it

Tell Me When Down

Uptime and security monitoring for people who'd rather ship than babysit servers. We watch so you can sleep.

product
How it worksWhat we checkPricingDocsBlogFAQ
free toolsWebsite security scanSupabase pause checkRender sleep checkMixed content checkerSecurity headers checkCookie security checkSSL expiry check
comparevs UptimeRobotvs Better Stackvs PingdomFor indie hackers
company
StatusAbout our botSupportPrivacyTerms
© 2026 TellMeWhenDown · tellmewhendown.com