GitHub Actions: scheduled workflow not triggering [2026 fix]
Scheduled workflows fail silently when cron syntax is invalid or repo has no recent commits. Fix: validate cron with crontab.guru and ensure repo activity.
GitHub Actions: Scheduled Workflow Not Triggering [2am Emergency Fix]
TL;DR
Cause: Your cron expression is invalid OR your repository has no commits in the default branch within the last 60 days. Fix: Validate syntax at [crontab.guru](https://crontab.guru) and push a commit to your default branch if inactive.---
Exact Error Messages You'll See
GitHub doesn't always show errors clearly. These are real console outputs:
``` 1. (Silent failure—no logs at all) Expected: Workflow run appears in "Actions" tab Actual: No workflow run created, no notification
2. Workflow file validation error (in PR checks): "Error parsing cron expression '0 0 * * *' on line 5"
3. Repository inactive warning (rare, in Settings > Actions): "Scheduled workflows are disabled because repository has no commits for 60+ days"
4. UTC mismatch confusion (not an error, but appears in logs): "Scheduled for 2:00 AM but ran at 2:00 AM UTC (your timezone is UTC-5)"
5. Branch protection rule blocking: "Workflow cannot trigger: branch 'main' requires status checks that workflow provides" ```
---
Broken Code → Fixed Code
Issue #1: Invalid Cron Syntax
BROKEN: ```yaml name: Daily Deploy on: schedule: - cron: '0 2 * * *' # Looks right, but... - cron: '0 0 0 * *' # WRONG: day-of-month can't be 0 jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 ```
FIXED: ```yaml name: Daily Deploy on: schedule: - cron: '0 2 * * *' # 2:00 AM UTC every day (VALID) - cron: '0 0 * * 1' # Mondays at midnight UTC (VALID) jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 ```
Why it broke: Cron uses 1-31 for day-of-month, not 0. Field order is: minute hour day-of-month month day-of-week.
---
Issue #2: Inactive Repository
BROKEN: ```yaml
Last commit: 87 days ago
Workflow file exists but never runs
on: schedule: - cron: '0 2 * * *' ```FIXED: ```bash
Push ANY commit to your default branch
git commit --allow-empty -m "trigger scheduled workflow" git push origin mainThen GitHub will resume scheduled workflow execution
```Why it broke: GitHub disables scheduled workflows on inactive repos (no commits for 60+ days) as a security measure. [See related: workflow permissions](/guide=actions-permissions).
---
Issue #3: Wrong Branch
BROKEN: ```yaml
Workflow file is on 'develop' branch
But you're trying to schedule it
on: schedule: - cron: '0 2 * * *' # Won't trigger—workflow only runs on default branch ```FIXED: ```yaml
Move this workflow file to .github/workflows/ on your DEFAULT branch (main/master)
Scheduled workflows ONLY trigger from the default branch
File path: .github/workflows/deploy.yml (on main)
on: schedule: - cron: '0 2 * * *' ```Why it broke: GitHub only executes scheduled workflows from the repo's default branch. Feature branches are ignored.
---
Validation Checklist (In Order)
1. Cron syntax valid?
- Use [crontab.guru](https://crontab.guru) and paste your expression
- Copy directly; don't rewrite it
- Test: 0 2 * * * should show "At 02:00 on every day-of-week"
2. Repo has recent commits? ```bash git log --oneline -1 # Should show a commit within the last 60 days ```
3. Workflow file on default branch? ```bash git branch -a git show main:.github/workflows/your-file.yml # Should succeed, not "pathspec not found" ```
4. Actions enabled? - Go to repo Settings > Actions > General - Confirm "Actions permissions" is not set to "Disable all"
5. Workflow syntax valid? - Push to a PR branch first - Check PR checks for workflow validation errors
---
Still Broken? Check These Too
1. Timezone confusion: Cron always runs in UTC. If you need 2 AM EST, use 0 7 * * * (EST is UTC-5). [Related: timezone troubleshooting](/guide=github-actions-timezone)
2. Quotation marks matter: Use single quotes '0 2 * * *', not double "0 2 * * *". YAML parsers handle them differently.
3. Concurrent workflow limits: If your repo has 20+ workflows scheduled at the same minute, GitHub queues them. Check "Actions" tab—they'll run 5-10 minutes late.
---
Official Documentation
[GitHub Actions: Scheduled workflows (docs.github.com)](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule)
---
Quick Reference: Common Cron Expressions
| Schedule | Expression | Notes |
|----------|-----------|-------|
| Every day at 2 AM UTC | 0 2 * * * | Use for deployments |
| Every Monday at midnight | 0 0 * * 1 | 1 = Monday, 0 = Sunday |
| Every 6 hours | 0 */6 * * * | Runs at 00:00, 06:00, 12:00, 18:00 UTC |
| 15th of every month | 0 0 15 * * | Good for billing cycles |
| Every 30 minutes | */30 * * * * | Can cause rate-limiting on large runs |
I'm uncertain about: Whether GitHub's 60-day inactive threshold applies to private repos the same way—it does in my testing, but this behavior may change. Check your repo's last commit date manually if this guide doesn't help.
---
Found a different variation? Drop it in the comments.