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 Deploy

on: 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 Deploy

on: 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:

  • Cron: 0 0 * * * → 0 2 * * * (now valid 5-field format)
  • Critically: File must be pushed to 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:

  • GitHub Actions cron behavior changes post-2026: GitHub has historically updated schedule reliability. If your workflow references ubuntu-20.04 or older runner versions, upgrade to ubuntu-latest to ensure compatibility.
  • Self-hosted runner scheduling: Self-hosted runners may have different availability windows. Enterprise customers should verify runner group availability.
  • ---

    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

  • [GitHub Actions Runners Not Available](/?guide=github-actions-runner-queue)
  • [Debugging Workflow Logs in GitHub](/?guide=github-actions-logging)
  • ---

    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.

    🔥 0d
    LIVE
    ↓ PlanetScale rage spiking •⚠ Vercel pricing complaints •↑ Railway gaining fast •↑ Supabase happiness rising •↑ Resend loved by devs •↓ PlanetScale rage spiking •⚠ Vercel pricing complaints •↑ Railway gaining fast •↑ Supabase happiness rising
    DEVELOPER PAIN RADAR // Loading...

    Developers complain.
    Opportunities appear.

    We track what developers are struggling with today — and what opportunities that creates.

    —
    guides today
    —
    avg happiness
    🔥 Pain
    📖 Guides
    🔭 Explore
    👤 Mine
    🔥 Pain Radar — rage scores today
    ↗ share
    💡 Opportunity Feed — pain = market gap
    📈 Tool Momentum
    all scores →
    📖 Latest Guide
    all guides →
    📖 All Guides
    📊 Tool Scores
    + Submit
    📰 Hacker News
    ➕ Submit a Tool
    ← back