1. Under-5-minute interval
GitHub Actions enforces a 5-minute minimum for scheduled workflows. */3 * * * * is rejected silently.
# Won't run: - cron: '*/3 * * * *' # Will run: - cron: '*/5 * * * *'
If you need more frequent execution, schedule for 5 min and have the workflow handle multiple sub-intervals internally.
2. Wrong timezone (UTC only)
GitHub Actions cron is UTC only. There is no timezone setting. So 0 9 * * 1-5 means 9 AM UTC, which is:
- 1 AM Pacific (PST) / 2 AM (PDT)
- 4 AM Eastern (EST) / 5 AM (EDT)
- 10 AM London (BST) / 9 AM (GMT)
- 5 PM Singapore
To run at "9 AM Eastern" you need to calculate the UTC equivalent and accept that it drifts during DST.
3. Workflow not on the default branch
Scheduled workflows only run from the default branch (usually main). If your .github/workflows/scheduled.yml is on a feature branch, it won't fire — even if you've merged a different version into main.
Verify: go to the workflow file on GitHub's UI, check the URL — does it have ?ref=main? If you see a different branch name, that's the problem.
4. 60 days of repo inactivity
GitHub disables scheduled workflows for repos with no activity for 60 days. This is a quiet failure — the workflow appears in the UI but doesn't fire.
"Activity" includes any commit, issue, or PR. To re-enable, push anything to the repo or visit the Actions tab and click "Enable workflow."
5. Queue delays during peak hours
GitHub Actions runs scheduled workflows on a best-effort basis. During peak load (midnight UTC is the most popular schedule), workflows can be delayed by 10 minutes to over an hour, and occasionally skipped entirely.
Schedule to off-peak times if precision matters:
# Risky — peak load - cron: '0 0 * * *' # Better — :15 past, less congested - cron: '15 3 * * *'
Debugging steps
- Check the Actions tab. Does the workflow appear? Click into it and look for "Scheduled" runs.
- Verify the cron expression. Paste it into the GitHub Actions explainer to see the next 5 run times.
- Make a manual run. Add a
workflow_dispatchtrigger so you can test the workflow manually:
on:
schedule:
- cron: '0 9 * * 1-5'
workflow_dispatch:
If workflow_dispatch works but the schedule doesn't fire, it's one of the five causes above.
Alternative: external scheduler + workflow_dispatch
For mission-critical schedules, drive GitHub Actions from an external scheduler (AWS EventBridge, GCP Cloud Scheduler) calling workflow_dispatch via the API. The external scheduler is reliable; GitHub just executes the workflow.