GitHub Actions: scheduled workflow not triggering [2026 fix]
Scheduled workflows fail when cron syntax is invalid or workflow file isn't in default branch. Fix: validate cron with crontab.guru and ensure .yml is committed to main/master.
GitHub Actions: Scheduled Workflow Not Triggering
TL;DR
Cause: Your cron schedule has invalid syntax OR the workflow file isn't committed to your default branch (main/master). Fix: Validate cron at [crontab.guru](https://crontab.guru), commit workflow to default branch, and manually trigger once to activate the schedule.---
Real Console Error Messages
When scheduled workflows fail silently, check these exact error signatures:
``` 1. No workflow run appears in Actions tab "This scheduled workflow has not run yet"
2. From workflow logs (if manually triggered): Error: The workflow is not valid. .github/workflows/schedule.yml (Line 5): Cron expression is invalid: "0 0 * * * *" (extra space)
3. From repository settings audit log: "Workflow file schedule.yml does not exist on ref refs/heads/main"
4. If file exists but not triggering: "The workflow was disabled because the workflow file was removed from the repository on branch main"
5. Permission error (rare, but check Actions settings): "This repository has been disabled for GitHub Actions" ```
---
Broken Code vs. Exact Fix
❌ BROKEN: Invalid Cron Syntax
```yaml name: Broken Schedule on: schedule: - cron: '0 0 * * * *' # 6 fields = WRONG (cron uses 5) jobs: run: runs-on: ubuntu-latest steps: - run: echo "This never triggers" ```
✅ FIXED: Valid Cron with 5 Fields
```yaml name: Fixed Schedule on: schedule: - cron: '0 0 * * *' # Exactly 5 fields: minute hour day month weekday jobs: run: runs-on: ubuntu-latest steps: - run: echo "This triggers daily at midnight UTC" ```
---
❌ BROKEN: Workflow Not on Default Branch
```yaml
File: .github/workflows/deploy.yml
Location: develop branch ONLY
Problem: Scheduled workflows ignore non-default branches
```✅ FIXED: Push to Default Branch
```bash
Ensure workflow file is on main/master
git add .github/workflows/deploy.yml git commit -m "Add scheduled deployment" git push origin main # Must push to default branch ```---
❌ BROKEN: Whitespace in Cron Expression
```yaml on: schedule: - cron: '0 0 * * *' # Double space between fields - cron: ' 0 0 * * * ' # Leading/trailing spaces ```
✅ FIXED: Single Spaces Only
```yaml on: schedule: - cron: '0 0 * * *' # Exactly one space between fields ```
---
Verification Checklist
1. Validate cron syntax at [crontab.guru](https://crontab.guru)
- Paste 0 0 * * * (daily at midnight UTC)
- Must show "At 00:00" with no errors
2. Check file location: ``` your-repo/ └── .github/ └── workflows/ └── schedule.yml ← Must be here ```
3. Verify file is on default branch: ```bash git log --oneline -- .github/workflows/schedule.yml | head -5 ``` If no output, file isn't committed or not on default branch.
4. Check repository settings: - Settings → Actions → General - Ensure "Allow all actions and reusable workflows" is selected
5. Trigger manually once to activate schedule: - Go to Actions tab → Select workflow → "Run workflow" → Branch: main - This initializes the scheduler
---
Still Broken? Check These Too
1. [Workflow permissions too restrictive](/?guide=github-actions-permissions) — If workflow needs to write to repo, check Settings → Actions → Permissions → "Read and write permissions"
2. [Using variables in cron expression](/?guide=github-actions-env-vars) — Scheduled workflows don't support ${{ env.SCHEDULE }}; cron must be literal string
3. UTC timezone assumptions — All cron schedules run in UTC. If expecting 2am EST, use 0 7 * * * (not 0 2 * * *)
---
Version-Specific Notes
---
Quick Reference: Common Cron Patterns
```yaml cron: '0 0 * * *' # Daily at midnight UTC cron: '0 9 * * 1-5' # Weekdays at 9am UTC cron: '0 */6 * * *' # Every 6 hours cron: '0 0 1 * *' # First day of month cron: '0 12 * * 0' # Sunday at noon UTC ```
---
Official Documentation
[GitHub Actions: Scheduled workflows](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#scheduled-events)
---
Found a different variation? Drop it in the comments.