GitHub Actions Schedule Cron Expression Guide
Table of Contents
GitHub Actions workflows can run on a schedule using cron syntax in the schedule trigger. The syntax follows standard 5-field cron — but there's a catch: GitHub Actions runs all scheduled workflows in UTC, and there's no official way to set a different timezone.
Use our free cron expression generator to build your schedule and verify the next run times before pushing to your repo.
GitHub Actions Schedule Trigger Syntax
Add a scheduled trigger to any GitHub Actions workflow by adding a schedule event with a cron value:
name: Daily Build
on:
schedule:
- cron: '0 2 * * *' # 2:00 AM UTC every day
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Run build
run: npm run build
The cron field follows standard POSIX cron syntax with 5 fields. You can have multiple cron schedules for a single workflow by adding multiple items under schedule:
on:
schedule:
- cron: '0 9 * * 1-5' # Weekdays at 9 AM UTC
- cron: '0 0 1 * *' # First of every month midnight UTC
Common GitHub Actions Cron Schedules
| Use Case | Cron Expression | When It Runs |
|---|---|---|
| Nightly build | 0 2 * * * | 2:00 AM UTC daily |
| Weekly release check | 0 9 * * 1 | Monday 9:00 AM UTC |
| Dependency audit | 0 0 * * 0 | Sunday midnight UTC |
| Hourly health check | 0 * * * * | Every hour on the hour |
| Bi-weekly | 0 9 1,15 * * | 1st and 15th at 9 AM UTC |
| Monthly cleanup | 0 0 1 * * | First of month midnight UTC |
| Workday mornings | 0 6 * * 1-5 | Weekdays 6:00 AM UTC |
| Every 30 minutes | */30 * * * * | :00 and :30 of every hour |
Handling Timezones in GitHub Actions Scheduled Workflows
GitHub Actions only supports UTC for scheduled workflows. If you need to run a workflow at 9 AM Eastern time (UTC-5), you need to schedule it at 14:00 UTC in winter and 13:00 UTC in summer (due to daylight saving).
This is genuinely annoying for teams that think in local time. The common workaround is to schedule slightly offset from the "exact" time — for instance, if you want morning runs in Eastern time, use 0 13 * * 1-5 (8 AM EST / 9 AM EDT, splitting the difference). The hour-level imprecision rarely matters for most CI/CD tasks.
Some teams work around the timezone issue by running the workflow on a schedule but checking the current time inside the workflow and exiting early if it's outside business hours in their target timezone. It's a hack, but it works.
For precise timezone-aware scheduling, AWS EventBridge or a dedicated cron service like GitHub-compatible cloud functions is a better fit.
Important Caveats for GitHub Actions Scheduled Workflows
Minimum interval is 5 minutes. GitHub explicitly documents that scheduled workflows are not guaranteed to run more frequently than every 5 minutes. The * * * * * expression (every minute) is technically valid syntax but won't work as expected.
Workflows may be delayed. GitHub runs scheduled workflows based on system load. High-traffic times may delay your workflow by minutes or hours. Don't use GitHub Actions scheduling for time-critical tasks.
Inactive repositories disable scheduling. GitHub automatically disables scheduled workflows in repositories that have had no activity for 60 days. You'll get an email warning before this happens, but it's caught many developers off guard.
The default branch runs the schedule. GitHub Actions runs scheduled workflows from the default branch (usually main or master). Changing the cron expression on a feature branch has no effect until it's merged.
Troubleshooting GitHub Actions Scheduled Workflows
If your scheduled workflow isn't running, check these common issues:
1. Validate the cron expression first. Use our cron generator to confirm the expression is valid and check when it fires. A typo in the YAML can silently break the schedule.
2. Check the Actions tab. Go to your repo's Actions tab and look for the workflow. If it's listed with a "scheduled" trigger, GitHub has registered it. If runs are missing, the delay caveat above may apply.
3. Verify you're on the default branch. Workflow files on non-default branches don't drive schedules, even if the file is valid.
4. Use workflow_dispatch for testing. Add a workflow_dispatch trigger so you can manually run the workflow to test it without waiting for the schedule:
on:
schedule:
- cron: '0 2 * * *'
workflow_dispatch: # Adds a "Run workflow" button in the UI
Try It Free — No Signup Required
Runs 100% in your browser. No account, no install, no limits.
Open Free Cron GeneratorFrequently Asked Questions
What timezone does GitHub Actions use for scheduled workflows?
GitHub Actions uses UTC for all scheduled workflows. There is no official way to set a different timezone. To schedule a workflow at 9 AM Eastern time (UTC-5 in winter), use the expression "0 14 * * *".
What is the minimum schedule interval for GitHub Actions?
GitHub Actions does not guarantee scheduled workflows run more frequently than every 5 minutes. While "* * * * *" is valid cron syntax, GitHub will not run it every minute. Use 5-minute intervals ("*/5 * * * *") as your practical minimum.
Why did my GitHub Actions scheduled workflow stop running?
GitHub automatically disables scheduled workflows in repositories with no activity for 60 days. You should receive an email warning before this happens. Re-enable the workflow from the Actions tab in your repository.
Can I have multiple cron schedules for one GitHub Actions workflow?
Yes. Add multiple items under the schedule trigger in your workflow YAML. Each cron entry is independent, so the workflow will run at each scheduled time.

