A GitHub Actions cron schedule goes under on.schedule in a workflow file, with standard five-field cron syntax in quotes. Times are UTC unless you add a timezone, the shortest interval is every 5 minutes, and runs can start late when Actions is busy.
name: Nightly report
on:
schedule:
- cron: '17 3 * * *' # 03:17 UTC every day
workflow_dispatch: # adds a Run workflow button
jobs:
report:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: ./scripts/report.shThe cron syntax
The five fields are minute (0 to 59), hour (0 to 23), day of month (1 to 31), month (1 to 12 or JAN to DEC) and day of week (0 to 6 or SUN to SAT). You can use *, lists (1,15), ranges (9-17) and steps (*/15). Quote the expression, since YAML treats a leading * as special.
| Schedule | cron: value |
|---|---|
| Every 15 minutes | '*/15 * * * *' |
| Every hour at :23 | '23 * * * *' |
| Weekdays at 08:30 UTC | '30 8 * * 1-5' |
| Mondays at 09:00 UTC | '0 9 * * 1' |
| 1st of the month at 06:00 UTC | '0 6 1 * *' |
To schedule in local time, add a time zone to the entry (as of October 2026):
on:
schedule:
- cron: '30 8 * * 1-5'
timezone: 'Europe/Berlin'One workflow can have several cron entries; github.event.schedule tells a step which one fired.
Why a GitHub Actions cron job is not running
- The file isn't on the default branch. Scheduled workflows only run from the default branch, on its latest commit.
- The repository has been quiet for 60 days. In public repositories, GitHub disables scheduled workflows after 60 days without activity, and they stay off until you re-enable them on the Actions tab or commit a change to the
cronline. - It is a fork. Scheduled workflows are disabled by default in forks of public repositories.
- It is late, not missing. Runs can be delayed under load, worst at the start of every hour, and some queued jobs may be dropped. Move to an odd minute like
:17. - The interval is under 5 minutes, or the expression uses
@dailyor similar, which GitHub doesn't support. - You expected local time. Without
timezone,0 9 * * *is 09:00 UTC. - Someone disabled the workflow. Select it in the Actions tab sidebar and click Enable workflow, or run
gh workflow enable <file>.
Platform notes
GitHub Actions cron is less precise than a Linux crontab or a Kubernetes CronJob. If a job must start at an exact minute, run it from a server's crontab or another scheduler and trigger the workflow through workflow_dispatch with gh workflow run. For other intervals, see cron every 5 minutes and cron every hour.
Running an AI agent on a GitHub Actions schedule
A scheduled workflow can install Claude Code or Codex and run a skill headless, with API keys stored as repository secrets. The scheduled skills page has a workflow you can copy, and GitHub Actions failed runs reports each weekday morning which runs broke on the default branch.
Questions
What time zone does GitHub Actions cron use?
UTC by default. As of October 2026, GitHub's docs also let you add a timezone key with an IANA name, such as America/New_York, next to each cron entry.
What is the shortest GitHub Actions schedule?
Once every 5 minutes. A */1 or * * * * * schedule won't run every minute.
Can a scheduled workflow run on a branch other than the default?
No. Scheduled workflows run on the latest commit of the default branch, and the workflow file has to exist there.
How do I test a scheduled workflow without waiting?
Add workflow_dispatch: under on:. A Run workflow button then appears on the Actions tab, and gh workflow run <file> starts it from the terminal.
Does @daily work in GitHub Actions?
No. GitHub Actions doesn't support @yearly, @monthly, @weekly, @daily, @hourly or @reboot. Write five fields, such as 0 0 * * *.