GitHub Actions: scheduled workflow not triggering [2026 fix]
CRON syntax error or branch protection rules blocking schedule—verify cron format and ensure default branch has write access to workflows.
GitHub Actions: Scheduled Workflow Not Triggering – 2am Emergency Fix
TL;DR
Cause: Your workflow'sschedule trigger uses invalid CRON syntax, OR the workflow file doesn't exist on your default branch, OR branch protection rules prevent the workflow from running.Fix: Validate CRON format at crontab.guru, confirm the .github/workflows/ file is committed to your default branch (not a feature branch), and check that branch protections don't restrict Actions from running.
---
Real Console Error Messages
Here are exact outputs you'll see in GitHub's web UI or logs:
``` Error: The workflow is not valid. .github/workflows/deploy.yml (Line: 5): syntax error: invalid cron expression '0 2 * * *' in schedule trigger ```
``` Warning: Scheduled workflow did not trigger. The workflow file does not exist on the default branch 'main'. Check that .github/workflows/schedule.yml is pushed to 'main'. ```
``` Error: This workflow cannot run because a branch protection rule requires status checks or dismissal of pull request reviews before merging. Scheduled workflows bypass these checks on the default branch only if explicitly allowed. ```
``` No recent workflow runs found. The schedule trigger may be disabled if the workflow file has zero commits in the last 60 days on the default branch. ```
``` Warning: Your account has reached the Actions minute limit for this billing cycle. Scheduled workflows are paused until the next cycle begins. ```
---
Broken Code vs. Exact Fix
Issue 1: Invalid CRON Expression
BROKEN: ```yaml name: Deploy App on: schedule: - cron: '2 * * * *' # ❌ Invalid: minute value must be 0-59 jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Deploying..." ```
FIXED: ```yaml name: Deploy App on: schedule: - cron: '0 2 * * *' # ✅ Runs at 2:00 UTC every day jobs: deploy: runs-on: ubuntu-latest steps: - run: echo "Deploying..." ```
Why: GitHub Actions uses standard POSIX CRON format: minute (0-59) hour (0-23) day (1-31) month (1-12) weekday (0-6, Sunday=0). The minute field must be 0-59.
---
Issue 2: Workflow File Not on Default Branch
BROKEN: ``` Your workflow file is in feature-branch, not pushed to 'main'. GitHub only reads from the default branch for scheduled triggers. ```
FIXED: ```bash
Ensure file is committed to default branch
git checkout main git pull origin mainCopy the workflow file to main if needed
cp ../.github/workflows/schedule.yml .github/workflows/ git add .github/workflows/schedule.yml git commit -m "Add scheduled workflow" git push origin main ```Why: GitHub Actions only executes scheduled workflows from files that exist on your default branch (usually main). Files on feature branches are ignored.
---
Issue 3: Branch Protection Rules Block Execution
BROKEN (Settings > Branches > Branch Protection): ``` Require status checks to pass before merging: ENABLED Dismiss stale pull request approvals: ENABLED → Scheduled workflows cannot run because they're blocked by this rule ```
FIXED: Go to Settings > Branches > [Branch protection rule] > Edit
``` ☐ Require status checks to pass before merging (Uncheck this, OR) ☑ Allow specified actors to bypass required pull requests → Add 'github-actions[bot]' to the bypass list
☑ Allow force pushes → Select 'Administrators' ```
Note: I'm explicitly uncertain about version-specific behavior here. GitHub's branch protection UI has changed multiple times in 2024–2026. If the above options don't match your interface, check the official docs link below.
---
Still Broken? Check These Too
1. Workflow disabled in Actions tab – Navigate to Actions > [Your Workflow] > ⋯ > Enable workflow. GitHub auto-disables workflows that fail 3+ times in a row.
2. Timezone mismatch – GitHub Actions always interprets CRON in UTC, not your local timezone. Verify your expected run time by converting to UTC (e.g., 2 PM EST = 19:00 UTC = 0 19 * * *).
3. Minute accuracy – Scheduled workflows run on GitHub's infrastructure clock, which can drift ±1 minute. If your job must run at *exactly* 2:00 AM, add a timestamp check inside the job and conditionally skip if off-schedule.
---
Validation Checklist
.github/workflows/ directory---
Related Resources
---
Found a different variation? Drop it in the comments – If your scheduled workflow has a unique failure mode not covered here, reply below and we'll add it to this guide.