Cron syntax in GitHub Actions
A schedule trigger takes one or more 5-field cron expressions. Each field accepts a single value, a list (1,15), a range (1-5), a step (*/10 or 0-30/5) or * for every value.
| Field | Allowed values | Example |
|---|---|---|
| minute | 0–59 | */15 |
| hour | 0–23 | 9-17 |
| day of month | 1–31 | 1,15 |
| month | 1–12 or JAN–DEC | JAN-MAR |
| day of week | 0–6 or SUN–SAT (7 = Sunday) | MON-FRI |
Avoid the top of the hour
Huge numbers of workflows are scheduled at minute 0, so that is when queues are longest and runs are most likely to be delayed or skipped. Moving a job from 0 3 * * * to 23 3 * * * costs nothing and makes it noticeably more reliable.
Worked example: weekday mornings
30 6 * * 1-5 runs at 06:30 Monday to Friday. Without a time zone that means 06:30 UTC, which is 07:30 in Paris in winter and 08:30 in summer, so the local run time moves twice a year. Add a timezone key with an IANA name under the cron entry to keep it at 06:30 local time all year:
on:
schedule:
- cron: '30 6 * * 1-5'
timezone: 'Europe/Paris'
workflow_dispatch:Pick the same zone in the tool above to see the next run times both ways, including the weeks around a daylight saving change.
Pitfall: waiting for the schedule to test it
Scheduled workflows only run on the default branch, so a cron job added on a feature branch never fires there. Add workflow_dispatch next to schedule, as in the example. Once the file is on the default branch you can start it from the Actions tab with the Run workflow button instead of waiting for the next slot. When the first scheduled run does happen, expect it to start a little after the time in the expression, since scheduled runs are queued and can be delayed under load.
FAQ
What time zone does GitHub Actions cron use?
UTC by default. Since March 2026 you can add an optional timezone key with an IANA name, such as Europe/Paris or America/New_York, next to cron in a schedule entry, and GitHub evaluates the expression in that zone. This tool shows run times for both cases.
What is the shortest interval for a scheduled workflow?
Every 5 minutes. An expression like */1 * * * * is accepted but will not run more often than every 5 minutes.
Why did my scheduled workflow run late or not at all?
Scheduled runs can be delayed when GitHub is under heavy load, which is most common at the start of every hour, and some runs can be dropped. Schedules also only run from the workflow file on the default branch, and in public repositories they are disabled automatically after 60 days without repository activity.
Does GitHub Actions support seconds, L, W or # in cron?
No. GitHub uses standard 5-field POSIX cron: minute, hour, day of month, month and day of week. Quartz-style extensions like a seconds field, L (last), W (weekday) and # (nth weekday) are not supported. Names like MON-FRI and JAN are fine.
What happens when I set both day of month and day of week?
The job runs when either one matches, not both. 0 0 13 * 5 runs on every 13th AND on every Friday, not only on Friday the 13th. This is standard cron behaviour and a frequent source of surprise runs.
How do scheduled runs behave around daylight saving time?
When a schedule uses a time zone with daylight saving, a time that does not exist on the spring-forward day (for example 02:30 in Paris) is skipped, and a time that happens twice in autumn runs once. Pick a time outside 01:00 to 03:00 local to avoid both cases. UTC schedules are unaffected but shift by an hour in local time twice a year.