GitHub Actions: scheduled workflow not triggering [2026 fix]
Scheduled workflows fail silently when cron syntax is invalid or workflow file has syntax errors. Fix: validate cron expression and ensure proper YAML indentation in .github/workflows/.
GitHub Actions: Scheduled Workflow Not Triggering – 2am Incident Fix
TL;DR
Cause: Invalid cron syntax or YAML parsing errors in your workflow file prevent the schedule from registering. Fix: Validate yourschedule: cron expression using [crontab.guru](https://crontab.guru) and confirm .github/workflows/ file has correct indentation.---
Real Console Error Messages
Here are the exact errors you'll see when debugging this issue:
``` 1. "Error: The workflow is not valid. .github/workflows/deploy.yml (Line: 5, Col: 3): mapping values are not allowed here"
2. "Warning: Your workflow file is not triggering. The schedule event is not recognized. Check workflow syntax."
3. "fatal: Could not read Username for 'https://github.com': No such device or address (Workflow exists but cron job never fires—symptom of disabled workflows)"
4. "Error on line 12: The workflow does not contain any jobs to execute (schedule: defined but no jobs: block below it)"
5. "ValidationError: schedule contains invalid cron expression '0 0 * * *' in UTC (Less common in 2026, but appears with custom runners)" ```
---
Broken vs. Fixed Code
Problem 1: Invalid Cron Syntax
BROKEN: ```yaml
.github/workflows/nightly-deploy.yml
name: Nightly Deploy on: schedule: - cron: '0 2 * * *' # Missing minute field – should be 5 fields! jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Deploying" ```FIXED: ```yaml
.github/workflows/nightly-deploy.yml
name: Nightly Deploy on: schedule: - cron: '0 2 * * *' # ✓ Correct: minute hour day-of-month month day-of-week (UTC) jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Deploying" ```Why it matters: GitHub Actions requires cron in minute hour day month day-of-week format (all 5 fields). Missing or extra fields cause silent failure—no error in the UI, just no triggers.
---
Problem 2: YAML Indentation Breaking Parser
BROKEN: ```yaml name: Scheduled Job on: schedule: # ❌ Not indented under 'on:' - cron: '30 2 * * 0' jobs: build: runs-on: ubuntu-latest # ❌ Inconsistent indentation steps: - run: npm test ```
FIXED: ```yaml name: Scheduled Job on: schedule: # ✓ Indented 2 spaces under 'on:' - cron: '30 2 * * 0' jobs: build: runs-on: ubuntu-latest # ✓ Consistent 4-space indent steps: - run: npm test ```
Critical detail: GitHub Actions workflow files are YAML-strict. Each level requires exactly 2-space indentation (or 4 for nested arrays). A single space difference causes the entire schedule: block to be ignored.
---
Problem 3: Missing jobs: Block
BROKEN: ```yaml name: Cache Cleanup on: schedule: - cron: '0 3 * * *'
Workflow ends here – no jobs defined!
```FIXED: ```yaml name: Cache Cleanup on: schedule: - cron: '0 3 * * *' jobs: cleanup: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo "Running scheduled cleanup" ```
---
Critical Validation Steps
1. Test cron syntax: Open [crontab.guru](https://crontab.guru), paste your expression (e.g., 0 2 * * *), and confirm it shows your intended time in UTC.
2. Verify file location: File must exist at .github/workflows/filename.yml (case-sensitive). Check it's committed and pushed to your default branch.
3. Check workflow is enabled: GitHub → Settings → Actions → General → verify "Allow all actions and reusable workflows" is selected (or your org's policy allows it).
4. Confirm cron uses UTC: Times in schedule: are always UTC. If you want 2am EST, use cron: '0 7 * * *' (7am UTC = 2am EST winter time).
5. Validate YAML: Use an online YAML validator (e.g., [yamllint.com](https://www.yamllint.com)) to catch indentation before pushing.
---
Still Broken? Check These Too
1. Workflow disabled: GitHub auto-disables workflows that don't run for 60 days. Go to Actions tab → select workflow → "Enable workflow" button (top-right).
2. Default branch mismatch: Schedule only triggers on your repository's default branch (usually main). If you pushed to develop, the workflow won't run. Push to main and wait 5 minutes.
3. GitHub outage or API lag: On rare occasions, GitHub's workflow scheduler has delays. Check [GitHub Status](https://www.githubstatus.com). If your Actions are recent (last 10 minutes), wait 15 minutes before declaring it broken.
---
Related Guides
---
Official Reference
📖 [GitHub Docs: Scheduled Workflows](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#scheduled-events)
---
Version Note
As of 2026, GitHub Actions scheduling behavior is stable. However, if you're using GitHub Enterprise Server, check your server's Actions documentation—self-hosted instances may have different cron handling. This guide assumes cloud GitHub.com or recent GH Enterprise.
---
Found a different variation? Drop it in the comments — include your cron expression, error message, and solution so we can expand this guide.