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
0
HRHour
9
DOMDay of Month
*
MONMonth
*
DOWDay of Week
1-5

In 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
  1. 1Mon, May 18, 09:00 AM UTCin 3d
  2. 2Tue, May 19, 09:00 AM UTCin 4d
  3. 3Wed, May 20, 09:00 AM UTCin 5d
  4. 4Thu, May 21, 09:00 AM UTCin 6d
  5. 5Fri, May 22, 09:00 AM UTCin 7d
  6. 6Mon, May 25, 09:00 AM UTCin 10d
  7. 7Tue, May 26, 09:00 AM UTCin 11d
  8. 8Wed, May 27, 09:00 AM UTCin 12d
  9. 9Thu, May 28, 09:00 AM UTCin 13d
  10. 10Fri, May 29, 09:00 AM UTCin 14d
crontab entrybash
# Add to crontab with: crontab -e
0 9 * * 1-5    /path/to/your/script.sh

Syntax Overview

Field order

MIN

Minute

HR

Hour

DOM

Day of Month

MON

Month

DOW

Day of Week

0 9 * * 1-5

Example: At 09:00 AM, Monday through Friday

Common Expressions

@dailyOnce per day at midnight UTC
0 6 * * *Every day at 6am UTC for morning ETL runs
*/15 * * * *Every 15 minutes for near-real-time pipelines
0 0 * * 1Every Monday for weekly aggregations
0 0 1 * *1st of every month for monthly reporting
@onceRun 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.