Know when a cron job didn’t run.
Your job pings cronmiss when it finishes. If the ping is late or never comes, you get an email. Built for Vercel, Cloudflare Workers, GitHub Actions, Supabase and plain cron.
Free for 20 jobs at launch.
If the Sun 02:00 run hasn’t pinged by Sun 03:00, cronmiss emails you. Grace here is 60 min.
A job that never runs leaves nothing behind.
A failing job throws an error somewhere. A job that never starts leaves no log line, no exception and a status page full of green. Most people find out from a customer, days later.
- 3Cron Trigger incidents on Cloudflare’s status page in October 2026: runs delayed, skipped and run twice.Cloudflare status history (opens in a new tab)
- 3 of 220runs fired by our own GitHub Actions canary in its first 18 hours. It is scheduled every 5 minutes.Measured Nov 4 to 5, 2026 (opens in a new tab)
- 0automatic retries when a Vercel cron invocation fails. The docs point you to the logs.Vercel docs (opens in a new tab)
How it works
Status: the monitoring engine runs today on our own jobs. Sign-up and the dashboard open to the pre-signup list first, platform by platform, starting with Vercel.
Sign up with your email
No password. A sign-in link arrives in your inbox and you are in.
- From
- cronmiss <hello@notify.cronmiss.com>
- Subject
- Your cronmiss sign-in link
Click the link below to sign in. It works once and expires in 15 minutes.
https://cronmiss.com/in/…
Pick where the job runs
Paste the crons block from vercel.json, the triggers from wrangler.toml or the schedule from your workflow. cronmiss reads the schedule and timezone, and sets a grace period that suits the platform.
{ "crons": [ { "path": "/api/cron/sync", "schedule": "0 2 * * *" } ] }- Monitor
- /api/cron/sync
- Schedule
- Every day at 02:00
- Timezone
- UTC (Vercel runs crons in UTC)
- Grace
- 60 min on Hobby, 5 min on Pro
Add one line to the job
One request when the job finishes. The clients for Node and Python are already published; anything else can use curl.
30 2 * * * ./sync.sh && curl -fsS --retry 5 https://ping.cronmiss.com/p/<your-id>import { ping } from "cronmiss"; await syncInvoices(); await ping("<your-id>");from cronmiss import monitor @monitor("<your-id>") def sync_invoices(): ...- name: Tell cronmiss it ran if: success() run: curl -fsS --retry 5 ${{ secrets.CRONMISS_PING_URL }}The first ping turns it up
When the job next runs, the monitor turns up and you get the next deadline by email. A test ping checks it straight away.
- From
- cronmiss <alerts@notify.cronmiss.com>
- Subject
- [cronmiss] Watching: nightly sync
The first ping arrived at 02:00:41 UTC. The next run is due Thursday at 02:00 UTC, and you will hear from us only if it doesn’t ping by 03:00.
A miss or a failure emails you
No ping by the deadline, or a ping to /fail with the error output, and an alert goes out within seconds. When the job runs again, you hear that too.
- From
- cronmiss <alerts@notify.cronmiss.com>
- Subject
- [cronmiss] DOWN: nightly sync did not run
Your scheduled job "nightly sync" missed its check-in: no ping by Thu 12 Nov 2026, 03:00 UTC, its deadline including grace; the last ping was Wed 11 Nov 2026, 02:00:41 UTC.
We'll email again when it pings.
It tells you when it’s the platform
cronmiss runs its own canary jobs on each platform. When your job misses and ours missed in the same window, the alert says so. In development.
nightly sync: no ping by Thu 03:00 UTCVercel cron, missed Thu 02:00 in the same windowThis looks like Vercel, not your code.
Where jobs go missing
Each platform fails in its own way, so each gets its own setup and a grace period that fits how its scheduler behaves.
| Platform | How runs go missing | Default grace (bar: one hour) |
|---|---|---|
| Vercel | Failed invocations are not retried. On Hobby, a daily job can fire any time within its hour. | 60 min on Hobby, 5 on Pro |
| Cloudflare Workers | Three Cron Trigger incidents in October 2026 delayed, skipped or doubled runs. | 2 min |
| GitHub Actions | Scheduled runs are delayed under load and can be dropped. Inactive public repos lose their schedules after 60 days. | 45 min |
| Supabase | pg_cron stops when a free project pauses, and the run history just has a gap. | 10 min |
| Railway, Render, Fly | A cron service that fails to start never logs a run. | 10 min |
| Anything else | Linux cron, systemd timers, Windows Task Scheduler, Kubernetes CronJobs: one request at the end of the job. | You choose |
Built not to cry wolf.
If cronmiss can’t receive pings, it holds alerts instead of telling you every job died. The evaluator only marks a run missed up to the last moment it knows every ping arrived.
- Your job’s output stays on your server unless you send it to /fail or /log, and then only the last 10 KB.
- The ping endpoint and the alerting run as separate services, so a busy dashboard can’t drop a ping.
- Every false alert is treated as a bug and written up in public.
- Ping endpoint stops recording after a credential change.
- Evaluator sees the endpoint unhealthy and stops moving its watermark.
- Fixed. Pings flow again and the backlog is processed.
- Evaluation resumes from the watermark. False alerts sent: 0.
Planned pricing
Prices are planned, not final. The pre-signup list hears first, and annual plans come with two months free.
| Plan | Free$0 | Solo$12 | Team$29 |
|---|---|---|---|
| Monitors | 20 | 100 | 500 |
| Alerts | Email, Slack, Discord, webhooks | Email, Slack, Discord, webhooks | |
| Run history | 7 days | 90 days | 1 year |
| Platform setup from your config | Yes | Yes | Yes |
| “Likely the platform” signal on alerts | No | Yes | Yes |
| Seats | 1 | 1 | 5 |
Questions
Can I use cronmiss today?
Not on your own yet. The engine already runs on our own jobs: pings, deadlines and email alerts, including the nightly backup of the cronmiss database. Sign-up opens to the pre-signup list first.
What does cronmiss store about my jobs?
The time of each ping, each monitor’s name and schedule, and where to send alerts. Nothing your job prints, unless you post it to /fail or /log, and then only the last 10 KB.
Does it work outside serverless platforms?
Yes. Anything that can make an HTTPS request can ping: Linux cron, systemd timers, Windows Task Scheduler, Kubernetes CronJobs or a script on a laptop.
What happens if cronmiss itself goes down?
Alerts hold rather than fire. The ping endpoint and alerting are separate services, and a run is only marked missed up to the last moment cronmiss knows every ping arrived.
How is this different from Healthchecks.io or Cronitor?
Both are good general tools. cronmiss sets each serverless platform up from your own config, with the right grace period, and tells you when a miss looks like the platform rather than your code.
Who runs cronmiss?
One developer, publishing as cronmiss. Mail to support@cronmiss.com goes straight to them.
What will the pre-signup list get?
One email when your platform opens, and nothing else. Every email has a one-click unsubscribe.