Debugging

GitHub Actions cron not running?

GitHub Actions schedules are notoriously unreliable for first-time users. The five most common causes: under-5-minute interval, expecting local time instead of UTC, workflow not on the default branch, 60-day inactivity disable, and queue delays during peak load.

1. Under-5-minute interval

GitHub Actions enforces a 5-minute minimum for scheduled workflows. */3 * * * * is rejected silently.

# Won't run:
- cron: '*/3 * * * *'

# Will run:
- cron: '*/5 * * * *'

If you need more frequent execution, schedule for 5 min and have the workflow handle multiple sub-intervals internally.

2. Wrong timezone (UTC only)

GitHub Actions cron is UTC only. There is no timezone setting. So 0 9 * * 1-5 means 9 AM UTC, which is:

  • 1 AM Pacific (PST) / 2 AM (PDT)
  • 4 AM Eastern (EST) / 5 AM (EDT)
  • 10 AM London (BST) / 9 AM (GMT)
  • 5 PM Singapore

To run at "9 AM Eastern" you need to calculate the UTC equivalent and accept that it drifts during DST.

3. Workflow not on the default branch

Scheduled workflows only run from the default branch (usually main). If your .github/workflows/scheduled.yml is on a feature branch, it won't fire — even if you've merged a different version into main.

Verify: go to the workflow file on GitHub's UI, check the URL — does it have ?ref=main? If you see a different branch name, that's the problem.

4. 60 days of repo inactivity

GitHub disables scheduled workflows for repos with no activity for 60 days. This is a quiet failure — the workflow appears in the UI but doesn't fire.

"Activity" includes any commit, issue, or PR. To re-enable, push anything to the repo or visit the Actions tab and click "Enable workflow."

5. Queue delays during peak hours

GitHub Actions runs scheduled workflows on a best-effort basis. During peak load (midnight UTC is the most popular schedule), workflows can be delayed by 10 minutes to over an hour, and occasionally skipped entirely.

Schedule to off-peak times if precision matters:

# Risky — peak load
- cron: '0 0 * * *'

# Better — :15 past, less congested
- cron: '15 3 * * *'

Debugging steps

  1. Check the Actions tab. Does the workflow appear? Click into it and look for "Scheduled" runs.
  2. Verify the cron expression. Paste it into the GitHub Actions explainer to see the next 5 run times.
  3. Make a manual run. Add a workflow_dispatch trigger so you can test the workflow manually:
on:
  schedule:
    - cron: '0 9 * * 1-5'
  workflow_dispatch:

If workflow_dispatch works but the schedule doesn't fire, it's one of the five causes above.

Alternative: external scheduler + workflow_dispatch

For mission-critical schedules, drive GitHub Actions from an external scheduler (AWS EventBridge, GCP Cloud Scheduler) calling workflow_dispatch via the API. The external scheduler is reliable; GitHub just executes the workflow.

Related

Continue reading.