My cron job shows as missed

Work out why Uptime marks a job as late or missed when you believe it ran, and get its check-ins counted.

Open the cron job's page and look at Ping History. If the run you expected isn't listed, its check-in never reached Uptime; start with the first three sections. If it is listed as Late, it arrived after its deadline; skip to the timing sections.

If the check-in is rejected

Run the job's curl command by hand and read the status code:

CodeCauseFix
401No API key, or the key is wrong, deleted or expiredCheck the Authorization: Bearer header and the variable that holds the key
403The key exists but lacks the cron-jobs:ping permissionAsk an owner or admin to create a key with it under API Keys
404The ID in the URL is wrong, or the key belongs to another teamCopy the command again from Ping this monitor on the cron job's page
409The cron job is disabledTurn Enabled back on with Edit

curl without -f exits successfully even when Uptime refuses the request, so a rejected check-in can go unnoticed in your job's logs. The crontab line Uptime suggests uses curl -fsS.

If the job fails before it checks in

The check-in is meant to be the job's last step, so a job that crashes or exits early never sends it. That is the monitor working as intended. Check the job's own logs for the failed run.

If the job never ran

Your scheduler may not have run the job at all: a stopped server, an expired container, a crontab that was overwritten. Confirm the scheduler's last run time on the machine itself.

If the schedule or time zone doesn't match

Uptime expects a run at the times Cron Expression produces in the job's Timezone, which is UTC unless you changed it. A job scheduled for 0 2 * * * on a server set to New York time runs five or four hours later than a monitor left on UTC expects.

Open the cron job with Edit and make Cron Expression and Timezone match the scheduler exactly.

If the job takes longer than the grace period

The deadline for each run is its scheduled time plus the Grace Period, 300 seconds by default. The check-in comes at the end of the job, so a 20-minute job is late every time on a 5-minute grace period. A run is marked missed once the next run's deadline has also passed.

Set Grace Period to longer than your slowest run with Edit. It goes up to 86,400 seconds (24 hours).

Why is a brand-new job missed before it ever went late?

A job stays New until its first check-in. A new job can't be late, so if the first runs never check in, it goes straight to Missed.

My job runs twice within a few seconds. Is the second check-in counted?

No. Check-ins for one cron job closer than 30 seconds apart are refused with 429.

Documentation