Apache Airflow Cron Expression Guide
Apache Airflow uses standard 5-field cron syntax in its DAG schedule_interval parameter, plus @daily, @weekly, @monthly, @hourly, and @once preset aliases. Data pipelines built on Airflow use these expressions to define when DAGs run.
Live Builder
Valid
MINMinute
0HRHour
9DOMDay of Month
*MONMonth
*DOWDay of Week
1-5In plain English
At 09:00 AM, Monday through Friday
English → Cron
Try: "every 5 minutes", "every weekday at 9am", "every Monday at 3pm", "every month on the 1st"
Next 10 Executions
UTC- 1Mon, May 18, 09:00 AM UTCin 3d
- 2Tue, May 19, 09:00 AM UTCin 4d
- 3Wed, May 20, 09:00 AM UTCin 5d
- 4Thu, May 21, 09:00 AM UTCin 6d
- 5Fri, May 22, 09:00 AM UTCin 7d
- 6Mon, May 25, 09:00 AM UTCin 10d
- 7Tue, May 26, 09:00 AM UTCin 11d
- 8Wed, May 27, 09:00 AM UTCin 12d
- 9Thu, May 28, 09:00 AM UTCin 13d
- 10Fri, May 29, 09:00 AM UTCin 14d
crontab entrybash
# Add to crontab with: crontab -e
0 9 * * 1-5 /path/to/your/script.shSyntax Overview
Field order
MIN
Minute
HR
Hour
DOM
Day of Month
MON
Month
DOW
Day of Week
0 9 * * 1-5Example: At 09:00 AM, Monday through Friday
Common Expressions
@daily—Once per day at midnight UTC0 6 * * *—Every day at 6am UTC for morning ETL runs*/15 * * * *—Every 15 minutes for near-real-time pipelines0 0 * * 1—Every Monday for weekly aggregations0 0 1 * *—1st of every month for monthly reporting@once—Run once immediately and never again (backfill use case)Frequently Asked Questions
Does Airflow cron use UTC? ▾
By default yes — Airflow schedules in UTC. You can set the default_timezone in airflow.cfg, and individual DAGs can set timezone by passing a timezone-aware datetime as start_date.
What is the difference between schedule_interval and timetable in Airflow? ▾
schedule_interval accepts cron strings or timedelta objects (legacy). timetable is the newer Airflow 2.2+ API that allows fully custom scheduling logic. For standard cron-based schedules, schedule_interval = "0 9 * * *" is still the most common pattern.
What does @once do in an Airflow DAG? ▾
@once schedules the DAG to run exactly one time — at the first available slot after the start_date. It's useful for one-time backfill DAGs or testing a pipeline's full run without setting up a recurring schedule.
Why does Airflow run my daily DAG a day late? ▾
Airflow's default behavior is to run a DAG at the end of the schedule interval. A DAG with start_date=2024-01-01 and schedule_interval=@daily runs its first execution on 2024-01-02 (covering the Jan 1 interval). Set catchup=False to disable backfill of past runs.
How do I pause an Airflow DAG without deleting it? ▾
Toggle the DAG to "paused" in the Airflow UI or run "airflow dags pause my_dag_id" via CLI. Paused DAGs don't schedule new runs but keep their history and configuration intact.