Monitor your database backups

Get alerted the moment a nightly backup doesn't run — instead of discovering it during a restore.

The problem

Backups are the classic silent failure. The cron job runs, the dump fails — disk full, expired credentials, a network blip — and nothing tells you. You find out weeks later, mid-incident, when the restore you desperately need turns out to be empty or missing entirely.

How SteadyCron solves it

  1. 1 Create a heartbeat check matching your backup schedule (e.g. daily at 02:00) and set a grace period that absorbs normal variance.
  2. 2 At the end of your backup script, ping SteadyCron on success — and explicitly on failure if the dump command errors.
  3. 3 If the success ping doesn't arrive within the grace period, SteadyCron alerts you via email, Slack, Discord, Telegram, or webhook.
#!/usr/bin/env bash
TOKEN=<your-ping-token>
if pg_dump "$DATABASE_URL" | zstd | age -r "$KEY" > /backups/db.sql.zst.age; then
  curl -fsS https://ping.steadycron.com/$TOKEN
else
  curl -fsS https://ping.steadycron.com/$TOKEN/fail
fi
app.steadycron.com/jobs

Jobs

New job
Search jobs…
All HTTP Heartbeat
Status Group: env
env:prod 5 jobs 1 failing
weekly-digest-email HTTP 0 9 * * 1 in 2 days 3 days ago
nightly-db-backup Heartbeat 0 2 * * * in 19 h 5 h ago
stripe-reconciliation HTTP 0 */4 * * * in 38 min 3 h ago
cache-warmup HTTP */15 * * * * in 11 min now
search-index-sync Heartbeat */30 * * * * in 6 min 24 min ago
env:dev 3 jobs
seed-test-data HTTP 0 4 * * * in 14 h 10 h ago
preview-env-cleanup Heartbeat 0 */6 * * * in 2 h 4 h ago
trial-expiry-sweep HTTP 0 6 * * * yesterday

Every job's status, schedule, and last run — at a glance.

Why a heartbeat, not just an exit code

Your script’s exit code only matters if something is watching it — and on a lone VM, nothing is. A heartbeat moves the “did it run?” question off the box that might itself be down. If the server reboots, the disk fills, or cron is misconfigured, the ping simply never arrives, and SteadyCron tells you.

Catch backups that hang, too

Send a /start ping at the top of the script. If a backup begins but never sends its /success or /fail — because it hung on a lock or ran out of memory — SteadyCron flags the run as stuck, not just late.

Related documentation

Stop finding out the hard way

Start on the free tier — no credit card required.

Start free