SMS, Telegram or Bale? Choosing Alert Channels Without Alert Fatigue
Which downtime alerts should go by SMS and which to Telegram or Bale, how to route by urgency, and how to keep the important alerts from drowning in noise.
Most monitoring asks a service "are you there?". Heartbeat monitoring flips that around: the job tells the monitor "I'm done", and silence is the alarm. It's the only reliable way to catch the most common cron failure of all - the job that simply stopped running.
&&) so failed runs and missing runs both alert.noc724 checks your websites, servers and APIs around the clock and alerts you by SMS, Telegram or Bale the moment something breaks.
An uptime check needs something to connect to. A nightly backup has no port and no URL - it runs for a few minutes and exits. If its crontab line was removed during a deploy, the server was rebuilt, or the job hangs forever, no error is ever produced. Weeks later someone needs the backup and finds the last one is from August.
This pattern is also called a dead man's switch: the alarm fires unless someone keeps pressing the button.
0 2 * * * /opt/app/backup.sh && curl -fsS -m 10 --retry 3 https://YOUR-HEARTBEAT-URL > /dev/null&& sends the ping only when the backup exits with code 0.-f makes curl fail on HTTP errors, -m 10 caps the wait, --retry 3 survives a brief network blip.#!/bin/bash
set -euo pipefail
pg_dump mydb | gzip > "/backup/mydb-$(date +%F).sql.gz"
find /backup -name 'mydb-*.sql.gz' -mtime +14 -delete
curl -fsS -m 10 --retry 3 https://YOUR-HEARTBEAT-URL > /dev/nullWith set -e, any failing step stops the script before the ping.
Long-running workers can ping from their main loop - for example once a minute after processing a batch - so a worker that freezes without crashing is caught too.
| Job | Interval | Grace period |
|---|---|---|
| Every 5 minutes, runs in seconds | 5 minutes | 2-5 minutes |
| Hourly report, runs 2-10 minutes | 1 hour | 15 minutes |
| Nightly backup, runs 20-60 minutes | 24 hours | 1-2 hours |
| Weekly cleanup | 7 days | a few hours |
Too short a grace period alerts on every slow run; too long delays real alerts. Base it on the slowest normal run you have seen.
It does not check that the output is correct - a backup that writes an empty file still exits 0. Add a sanity check (file size, row count) before the ping for important jobs.
Create a cron job monitor, set the expected interval and grace period, and copy the URL into the job. If a ping is late you are alerted by SMS, Telegram or Bale, and the monitor shows each check-in in its history, so you can see run-to-run timing at a glance.
Use --retry in curl so short network problems don't cause false alarms. If the ping really fails, the monitor alerts - which is correct, because you can't confirm the job ran.
Yes - many setups ping a separate URL or include the exit code when the job fails, so you hear about failures immediately instead of after the grace period.
No. It's one small HTTP request at the end of the run, typically under a second.
Written by
The noc724 team
Uptime monitoring engineers
We build and run noc724, an uptime monitoring service that checks websites, servers and APIs from several cities in Iran. These guides come from the problems we and our users run into while keeping services online.
Contact the teamExpert on:Cron Monitoring
Which downtime alerts should go by SMS and which to Telegram or Bale, how to route by urgency, and how to keep the important alerts from drowning in noise.
Why uptime monitors raise false alarms - network blips, timeouts, rate limits, content changes - and the settings that remove them while keeping real alerts fast.
How to set up a simple on-call rotation and escalation policy so every critical alert is answered, without burning out a small team.