GitHub Actions: scheduled workflow not triggering [2026 fix]
Scheduled workflows fail silently when cron syntax is invalid or workflow file isn't in default branch. Fix: validate cron with cronitor.io and ensure .github/workflows/ is committed to main.
GitHub Actions: Scheduled Workflow Not Triggering — 2am Emergency Fix
TL;DR
Cause: Your cron expression is malformed OR the workflow file exists only in a feature branch, notmain/master.
Fix: Validate cron syntax at [cronitor.io](https://cronitor.io/crons) and confirm .github/workflows/your-job.yml is committed and pushed to your default branch.---
Real Console Error Messages
GitHub Actions silently fails—you won't see errors in logs. Instead, check Settings > Actions > All workflows:
``` 1. "This scheduled workflow will not run" (Grey warning badge next to workflow name)
2. "Workflow does not have a default branch" (In workflow details page under "Triggers")
3. "Cron schedule is invalid or does not have valid timezone" (On rare occasions in commit status checks)
4. "Scheduled workflow disabled for inactivity" (After 60 days with no repository commits)
5. "No scheduled runs found" (under workflow run history) (Visible in Actions tab when filtering by trigger type) ```
Why these don't always appear: GitHub doesn't email you about scheduled workflow failures. You only discover the problem when a job you expected to run... didn't.
---
Broken vs. Fixed Code
Problem 1: Invalid Cron Syntax
❌ BROKEN: ```yaml
.github/workflows/nightly-deploy.yml
name: Deploy Nightlyon: schedule: - cron: '0 2 * * *' # Looks right, but missing minute?
jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Deploying..." ```
✅ FIXED: ```yaml
.github/workflows/nightly-deploy.yml
name: Deploy Nightlyon: schedule: - cron: '0 2 * * *' # Correct: minute(0) hour(2) day(*) month(*) dow(*) # Runs daily at 2:00 AM UTC
jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Deploying..." ```
Cron Format (5 fields): ``` Minute(0-59) Hour(0-23) Day(1-31) Month(1-12) DayOfWeek(0-6) 0 2 * * * ```
Problem 2: Workflow in Wrong Branch
❌ BROKEN: ```bash
You created the workflow on feature branch 'feature/automation'
git checkout -b feature/automation echo "...workflow content..." > .github/workflows/daily-check.yml git push origin feature/automationSet feature branch as default in GitHub? DON'T. Scheduled jobs won't run.
```✅ FIXED: ```bash
Commit workflow to default branch (main/master)
git checkout main echo "...workflow content..." > .github/workflows/daily-check.yml git add .github/workflows/daily-check.yml git commit -m "Add scheduled daily check" git push origin main # Push to DEFAULT branch onlyVerify in GitHub:
Settings > Branches > Default branch = 'main' ✓
```Problem 3: UTC Timezone Confusion (v1.8.0+)
❌ BROKEN (assumed wrong timezone): ```yaml on: schedule: - cron: '30 14 * * *' # User thinks this is 2:30 PM EST # But GitHub Actions ALWAYS uses UTC # So this runs 14:30 UTC = 9:30 AM EST (wrong!) ```
✅ FIXED: ```yaml on: schedule: # For 2:30 PM EST, convert: 14:30 EST = 19:30 UTC (EST is UTC-5) - cron: '30 19 * * *' # Correct: 7:30 PM UTC = 2:30 PM EST ```
Always calculate: GitHub Actions only supports UTC. No timezone field exists (though there have been requests).
---
Why This Happens
1. Silent failure: Unlike manual triggers, scheduled workflows don't send you notification emails when cron is invalid. 2. Branch isolation: GitHub's YAML parser only checks workflows in your *default branch*. A typo in a PR branch goes unnoticed. 3. UTC gotcha: Developers assume their local timezone; GitHub always runs on UTC. 4. 60-day inactivity: If your repo has zero commits for 60 days, GitHub disables scheduled workflows as a safety measure.
---
Immediate Validation Steps
1. Check workflow YAML syntax: Copy your cron to [cronitor.io/crons](https://cronitor.io/crons) or use crontab -e locally.
2. Verify branch: git branch -vv → confirm workflow file is on main, not a feature branch.
3. Inspect GitHub UI: Repository → Actions tab → Click your workflow name → "This workflow has a schedule" label should appear green, not grey.
4. Force re-parse: Push a dummy commit to main to trigger GitHub's workflow parser.
---
Still Broken? Check These Too
.github/workflows/ but with .txt extension instead of .yml.---
Official Resources
📖 [GitHub Actions: Scheduled workflows documentation](https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#schedule)
---
Found a different variation? Drop it in the comments.
If your 2am crisis involved a different root cause (webhook-triggered workflows, env var issues, etc.), please share below so we can update this guide.