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:
| Setting | What it does |
|---|---|
| Period | How often you expect a ping, in seconds. A job that runs every hour has a period of 3600. |
| Grace | Slack 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
- Missing — tinymon evaluates heartbeats every minute. When
now > last ping + period + grace, the heartbeat flips tomissingand sends aheartbeat_missingalert (once — it won't repeat every minute). - Recovered — the next ping after a miss flips it back to
okand sends aheartbeat_recoveredalert.