GitHub Actions: scheduled workflow not triggering [2026 fix]
Scheduled workflows fail silently when `on.schedule` uses incorrect cron syntax or workflow file has no recent commits. Add valid cron + push changes to default branch.
GitHub Actions: Scheduled Workflow Not Triggering – 2AM Fix Guide
TL;DR
Cause: Your cron syntax is invalid OR the workflow file hasn't been committed to your default branch. Fix: Validate cron with(crontab -e) locally, ensure the .github/workflows/ file is on main/master, and push changes.---
Real Console Error Messages
Error 1: Silent Failure (No Logs)
``` No workflow runs appear in Actions tab despite scheduled time passing. Workflow last updated: 3 weeks ago No recent push to default branch detected ```Error 2: Invalid Cron Syntax
``` Error: "0 0 * * * * *" is not a valid cron expression Expected: minute hour day month day-of-week Got: 6 fields instead of 5 ```Error 3: File Not Found in Default Branch
``` .github/workflows/schedule.yml not found on refs/heads/main Workflow removed or only exists on feature branch ```Error 4: Insufficient Permissions
``` Workflow disabled: You must have push access to this repository Scheduled triggers require write permissions to default branch ```Error 5: Runner Unavailable
``` No runners available for job (ubuntu-latest) Scheduled workflow queued but cannot execute Check organization runner availability ```---
Broken Code vs. Exact Fix
❌ Broken: Invalid Cron Expression
```yaml.github/workflows/daily-deploy.yml
name: Daily Deployon: schedule: - cron: '0 0 * * *' # Missing field - only 4 fields
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: ./deploy.sh ```
✅ Fixed: Valid Cron + File on Default Branch
```yaml.github/workflows/daily-deploy.yml (COMMITTED TO main)
name: Daily Deployon: schedule: - cron: '0 2 * * *' # 2 AM UTC daily (5 fields: minute hour day month day-of-week)
jobs: deploy: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: ./deploy.sh ```
What changed:
0 0 * * * → 0 2 * * * (now valid 5-field format)main branch, not sitting in a PR❌ Broken: Syntax Error in Multiple Schedules
```yaml on: schedule: - cron: '30 5,17 * * *' # Valid - cron: '0 */4 * * *' # Valid - cron: '@daily' # Invalid - GitHub doesn't support shortcuts ```✅ Fixed: All Valid Cron Expressions
```yaml on: schedule: - cron: '30 5,17 * * *' # 5:30 AM & 5:30 PM UTC - cron: '0 */4 * * *' # Every 4 hours - cron: '0 2 * * 1-5' # 2 AM UTC, Mon-Fri only ```---
Validation Checklist
1. Verify cron syntax locally: ```bash # macOS/Linux - test the cron expression echo '0 2 * * *' | awk '{if (NF != 5) print "Invalid"; else print "Valid"}' # Output: Valid ```
2. Confirm file is on default branch: ```bash git log --oneline main -- .github/workflows/schedule.yml # Should show recent commits ```
3. Check Actions permissions: - Settings → Actions → General → Workflow permissions - Ensure "Read and write permissions" is selected
4. Verify workflow file format: ```bash # No syntax errors yamllint .github/workflows/schedule.yml ```
---
Still Broken? Check These Too
1. Workflow file only exists on a feature branch – GitHub only triggers schedules from your default branch (main, master, etc.). Merge the PR first, then the workflow will start.
2. Repository is a fork – Scheduled workflows don't run on forks by default. Enable them in Settings → Actions, but note they run against the fork, not the upstream.
3. Cron timezone confusion – GitHub Actions interprets all cron times as UTC only. If you need 2 AM EST, use 0 7 * * * (accounting for UTC offset). See [GitHub Actions Timezone Guide](/?guide=github-actions-timezone) for conversion.
---
Version-Specific Notes
We're explicitly uncertain about:
ubuntu-20.04 or older runner versions, upgrade to ubuntu-latest to ensure compatibility.---
Quick Reference: Common Cron Patterns
| Pattern | Cron | English |
|---------|------|----------|
| Every hour | 0 * * * * | At minute 0 of every hour |
| Daily 2 AM | 0 2 * * * | 2:00 AM UTC every day |
| Weekdays 9 AM | 0 9 * * 1-5 | 9 AM UTC Mon–Fri |
| Every 30 min | */30 * * * * | Every 30 minutes |
| Monthly | 0 0 1 * * | 12 AM UTC on day 1 |
Cron syntax: minute hour day month day-of-week (all in UTC)
---
Official Documentation
[GitHub Actions: Scheduled Workflows](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule) – Complete reference for cron syntax, timezone handling, and limitations.
---
Related Guides
---
Found a different variation? Drop it in the comments — Include your exact cron expression, YAML file path, and error message so we can add it to this guide.