Cron job & heartbeat monitoring
Know when your cron jobs don't run.
Backups, imports, reports, certificate renewals: Cuckoo expects a ping from every scheduled job and calls out by email, Slack, Discord or webhook when one is late, fails or runs too long.
Free for 20 checks. Already using Sentry Crons? Keep your SDK, change the DSN.
Three steps, five minutes
- 1
Create a check
Name it and say how often the job runs: every 10 minutes, daily, or a cron expression in your time zone. Add a grace period.
- 2
Ping it from the job
Append
curlto your crontab line, systemd unit or GitHub Action. Add/startand/failto measure run times and report errors. - 3
Get told when it matters
No ping in time, a failure, or a run that never finishes: you get one alert when the job goes down and one when it recovers. No noise.
Period or cron, in your time zone
"Every 6 hours" or 30 2 * * 1-5 in Europe/Zurich, DST-safe. Late and down states with a grace period you control.
Run duration and exit codes
Ping /start when a job begins and the success URL when it ends: Cuckoo records how long it took. Send $? as the exit code.
Logs with every ping
POST the last lines of output (up to 10 KB) and read them in the ping log when something breaks.
Sentry-compatible
Point sentry_sdk.crons, sentry-go or @sentry/node check-ins at your Cuckoo DSN. Monitors are created from monitor_config automatically.
Alerts where your team is
Email to every member, Slack, Discord and HMAC-signed webhooks. Retries with backoff, never two alerts for the same outage.
API and status badges
Create, pause and resume checks from scripts or CI with a token. Put a live SVG badge in your README if you like.
Using Sentry Crons?
Keep your code. Swap the DSN in Sentry.init for a job-only one from Cuckoo, and your existing capture_checkin and @monitor calls report here. Monitors on the Free plan: 20. On Team: 200 for CHF 12 a month.
sentry_sdk.init(dsn="https://key@cuckoo.metastic.ch/1234567")
@monitor(monitor_slug="nightly-backup")
def backup(): ...
Simple, flat pricing
No per-monitor fees, no seat fees. Every plan has every feature. Prices in CHF, VAT may apply.
Free
CHF 0
Forever, no card
- 20 checks
- 1 month of ping history, up to 100 entries per check
- 3 team members
- Email + 2 Slack, Discord or webhook integrations
- Sentry check-ins, REST API, status badges
Team
CHF 12/month
or CHF 120/year (2 months free)
- 200 checks
- 1 year of ping history, up to 1000 entries per check
- 10 team members
- Email + 20 Slack, Discord or webhook integrations
- Sentry check-ins, REST API, status badges
Business
CHF 39/month
or CHF 390/year (2 months free)
- 1000 checks
- 2 years of ping history, up to 5000 entries per check
- 50 team members
- Email + 100 Slack, Discord or webhook integrations
- Sentry check-ins, REST API, status badges
Need more than 1,000 checks? Write to us. Team includes a 14-day trial, no card needed.
Guides for your stack
- How to Monitor Cron JobsLearn how to monitor cron jobs with heartbeat pings: why cron fails silently, how a dead man's switch catches missed runs, and how to set up a first check.
- Crontab and curl: Add a Cuckoo Ping to Any JobAdd a heartbeat ping to crontab entries with curl: safe flags, && chaining, when to use || true, PATH and environment pitfalls, MAILTO and tested examples.
- Monitor systemd Timers with CuckooMonitor systemd timers with heartbeat pings: ExecStartPre and ExecStartPost signals, OnFailure= or ExecStopPost with SERVICE_RESULT, Persistent= and journalctl.
- Kubernetes CronJob Monitoring with CuckooMonitor Kubernetes CronJobs with start and exit pings: a batch/v1 manifest with timeZone, deadlines and a Secret, plus why metrics miss jobs that never ran.
- Monitor GitHub Actions Scheduled WorkflowsMonitor GitHub Actions on.schedule workflows: ping Cuckoo with if: success() and failure(), keep the URL in a secret and catch delayed or auto-disabled runs.
- Sentry Crons for Python: Send Check-ins to CuckooPoint the Sentry Python SDK's cron monitoring at Cuckoo: the @monitor decorator, capture_checkin, Celery beat auto-instrumentation and the DSN trade-offs.
All guides · Compare with Healthchecks.io, Cronitor, Sentry Crons and others
Questions
What happens when a job is late?
When no ping arrives at the expected time the check is late (shown on the dashboard, no alert). If the grace period passes too, it is down and everyone is alerted once. The next successful ping makes it up again and sends a recovery alert.
How is this different from uptime monitoring?
Uptime monitors call your website. Cuckoo waits for your jobs to call it. That is how you notice a backup that silently stopped, which no uptime check can see.
What do you store?
For every ping: the time, the type, the exit code, the client IP, the user agent and up to 10 KB of the request body (if you send one). Pings are deleted after the history period of your plan.
Where is it hosted?
On servers in Germany (Hetzner, Falkenstein), run by a Swiss company. Backups stay in the EU.
Can I import from Healthchecks.io or Cronitor?
Not with one click yet. Use the REST API to create checks from a script, then replace the ping URLs. Tell us via the feedback button if you need an importer.
Your next silent failure is already scheduled.
Set up your first check in under five minutes.
Start monitoring for free