← All posts

WatchLoop: Dead Man's Switch Monitoring for Cron Jobs, Backups & Pipelines

Your nightly backup silently failed three weeks ago. The ETL pipeline has been dead since the last deploy. A cron entry got overwritten during a server migration and nobody noticed. You only find out at the worst possible moment — when you try to restore the database and the last good snapshot is ancient.

This is the failure mode that traditional uptime monitoring can't see. Uptime checks ask one question: "is this service up?" They have no idea whether your backup job actually ran, whether the pipeline reached its end, or whether the scheduled build executed. Those jobs run, finish, and go quiet. When they stop running, there's nothing to detect — the alert only arrives when you need the backup.

That's the problem WatchLoop exists to solve.

What is WatchLoop?

WatchLoop is a dead man's switch for your scheduled jobs — cron jobs, database backups, ETL pipelines, CI jobs, and other background tasks. It watches for silence, not activity.

Your job calls WatchLoop after it runs. Each call is a ping — proof that the job actually executed and completed. If a ping doesn't arrive on time, WatchLoop counts down the grace period and alerts you instantly. It doesn't guess; it compares every incoming ping against the loop's expected schedule.

The key insight: because your job is what calls the URL, a single check verifies the whole chain. The scheduler ran, the script started, and the script reached the point of the ping. There's nothing to install on your server — just a URL and whatever HTTP client you already have.

It's also explicitly not a scheduler. WatchLoop doesn't run your jobs, execute scripts, manage crontab, or trigger workflows. Your existing scheduler stays in charge; WatchLoop is the safety net.

How heartbeat monitoring works

Every loop has a unique ping URL:

https://watchloop.live/p/7c11c09a-b8be-4a56-b5c2-32a97d90ddbd

Your job hits that URL on its schedule, and WatchLoop evaluates each ping:

  • A ping arrives on time → the loop is healthy, no action.
  • The expected ping doesn't arrive within the grace period → the loop enters incident state and alerts fire.
  • A ping arrives after the incident started → the loop recovers and a recovery notification is sent.

Every loop is a named monitoring unit with an interval, a grace period, and its own set of notification channels. The ping token is a secret — anyone with the URL can check your job in, so keep it private.

One-line integration

The entire integration is a single curl added to the end of your script:

#!/bin/bash

# your backup script
pg_dump mydb > backup.sql

# ping WatchLoop
curl -fsS https://watchloop.live/p/abc123

That's it. One line is the whole integration.

Installing WatchLoop on a cron job

The general pattern: add a ping to your existing crontab entry, exactly where you want the check to happen.

The basic pattern — send a success ping only if the job exits cleanly:

# m h  dom mon dow   command
30 2 * * * /home/you/backup.sh && curl --max-time 10 https://watchloop.live/p/{token}

The && means the ping only fires on success. If the backup script fails, no ping arrives and you get alerted.

Report start and success — for long jobs, ping when it starts and when it finishes. If the job hangs, the success ping never arrives and the loop goes down:

# m h  dom mon dow   command
0 3 * * * curl --max-time 10 https://watchloop.live/p/{token}/start && /home/you/etl.sh && curl --max-time 10 https://watchloop.live/p/{token}

Report failures explicitly — send a /fail ping so you're alerted right away instead of after the grace period:

# m h  dom mon dow   command
15 4 * * * /home/you/backup.sh || curl --max-time 10 --data "backup failed" https://watchloop.live/p/{token}/fail

A few practical tips from the docs: use absolute paths for curl (cron runs with a minimal environment), set --max-time so a hung curl never stalls your job, and redirect output to a log with >> /var/log/myjob.log 2>&1.

Cron mode for irregular schedules

For schedules that aren't uniform — a weekly job, or a workday-only job like 5 0 * * 1-5 — switch the loop to cron mode. WatchLoop then evaluates each ping against the cron expression itself, rather than a fixed interval. It understands a run may be skipped on some days, so you don't get false incidents for legitimate schedule gaps. There's also a cron expression checker in the docs.

Alerts that reach you where you work

Channels are created once per workspace and linked to individual loops, and you can test each one with a Send test alert button before you rely on it. WatchLoop supports:

  • Email — any address, with the loop name in the subject.
  • Slack — via an incoming webhook.
  • Discord — via a server webhook, available on Starter and above.
  • Telegram — via a bot token and chat ID.
  • Webhooks — point at any URL that accepts POST and get JSON:
{
  "subject": "[WatchLoop] 🔴 \"Nightly Backup\" is DOWN",
  "message": "...",
  "event": "down"
}

Four things trigger an alert: a loop goes down, a down loop recovers, an outage escalates (unresolved incidents re-alert on an escalation interval), and the manual test. Paused loops and loops inside a maintenance window never alert.

Beyond heartbeats

Two extra modes cover the cases a plain heartbeat can't:

  • HTTP endpoint checks — point a loop at a URL instead. WatchLoop probes it on your schedule and alerts you when it stops returning the expected status code. Available on Pro and above.
  • Maintenance windows — pause monitoring for planned downtime. Pings during a window are recorded but never open incidents or send alerts.

You also get public status pages — shareable pages showing the current and historical state of your loops. Status page embeds are a Pro feature.

Simple, honest pricing

Start free and upgrade when your loops do:

Plan Price What you get
Free $0 forever 5 loops, 7-day ping history, email alerts, public status pages
Starter $10/mo 20 loops, 30-day ping history, Slack & Discord alerts, webhooks, API access
Pro $25/mo 100 loops, 1-year ping history, status pages with embeds, team roles, bulk actions
Business $59/mo Unlimited loops, custom retention, SSO & audit log, escalation policies, priority support

Getting started in 30 seconds

Set up is genuinely fast: create an account, add a loop, drop one curl line into your script, and you're covered. No credit card required, and the free tier covers up to 5 loops.

Monitor your first job free → Start with WatchLoop

Frequently asked questions

What is a dead man's switch for cron jobs?

It's a monitoring pattern where your job "checks in" by pinging a URL after it runs. If the ping doesn't arrive on schedule, the system assumes the job died and alerts you. WatchLoop is a dead man's switch for cron jobs, backups, ETL pipelines, and CI jobs.

Does WatchLoop run my jobs?

No. WatchLoop is not a scheduler — it doesn't execute scripts, manage crontab, or trigger workflows. It simply notices when something that should have run didn't. Your existing scheduler stays in charge.

What can I monitor with heartbeat monitoring?

Anything that runs on a cadence: cron jobs, database backups, ETL pipelines, scheduled CI builds, health checks, and any other repeating task. You can verify a backup ran and succeeded by gating the ping with &&, reporting /start and /success, or sending an explicit /fail ping.

How do Slack and Discord alerts work?

You create a webhook in Slack or Discord once, paste it into WatchLoop as a notification channel, and link it to your loops. Alerts arrive as messages like 🔴 "Nightly Backup" is DOWN when a loop misses its ping, and 🟢 ... is UP when it recovers.

Is there a free plan?

Yes — the Free plan is $0 forever and includes 5 loops, 7-day ping history, email alerts, and public status pages, with no credit card required.