Heartbeat & cron monitoring

A heartbeat is the inverse of an uptime check: instead of tinymon polling you, your job checks in with tinymon. If a check-in doesn't arrive on time, the job didn't run — and you want to know.

Create a heartbeat

In the dashboard, open a project and go to Monitors → Heartbeat. Give it a name and set two numbers:

SettingWhat it does
PeriodHow often you expect a ping, in seconds. A job that runs every hour has a period of 3600.
GraceSlack for a late run, in seconds. The job is only "missing" once period + grace has elapsed with no ping — so a job that occasionally runs a little long doesn't false-alarm.

tinymon generates a unique ping URL for the heartbeat. Copy it from the dashboard.

The ping URL

Hit the ping URL with a GET or POST when your job finishes successfully. The token in the URL is the only authentication, so treat it like a secret.

$ curl -fsS https://console.tinymon.dev/ping/YOUR_TOKEN
ok

Each ping records the time and sets the heartbeat back to ok. That's the whole contract.

Wire it into a cron job

Append the ping to the end of the command so it only fires when the job itself succeeds:

# /etc/crontab — nightly DB backup at 02:00, period 86400 + grace 3600
0 2 * * * /opt/backup.sh && curl -fsS https://console.tinymon.dev/ping/YOUR_TOKEN

The && matters: if backup.sh exits non-zero, the ping never sends, the window lapses, and you get alerted — exactly what you want. The same pattern works in a GitHub Action, a Kubernetes CronJob, or anywhere you can run one HTTP request.

Missed-run & recovery alerts

The first ping sets the baseline. A heartbeat that has never been pinged is treated as not-yet-started, so creating one doesn't immediately alert. The clock starts at its first ping. Alerts route through the same channels as everything else — see Alerts.