Cuckoo

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. 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. 2

    Ping it from the job

    Append curl to your crontab line, systemd unit or GitHub Action. Add /start and /fail to measure run times and report errors.

  3. 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.

How the switch works
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

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

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
Send feedback

Ideas, bugs, questions: we read every message. Or write to hello@metastic.ch.