Skip to main content

Apache Airflow DAG Schedule Generator

Apache Airflow schedules a DAG with the schedule parameter, which accepts a standard five-field cron expression. The syntax is ordinary cron — the famous gotcha is timing: in Airflow 2 a run fires at the end of its data interval, so a daily DAG “for” one day actually starts after that day finishes.

Build a cron schedule below and copy it into your DAG definition.

Official Airflow documentation →

Expression

Airflow 2 runs a DAG at the end of its data interval; schedule accepts standard 5-field cron.
Min
Hour
Day
Month
DOW
0
9
*
*
1-5

Tip: press Ctrl+Enter to copy

Presets

Visual Builder

Description

At 09:00 AM, Monday through Friday

Timezone
June 2026
Fires on 22 days
Su
Mo
Tu
We
Th
Fr
Sa
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30

Airflow cron syntax

MinHourDayMonthDOW
09**1-5

Airflow cron examples

Click any example to load it into the generator above.

Monitor your Airflow cron jobs

A cron expression only controls when a job is scheduled — not whether it actually ran. These tools alert you when a scheduled job fails, runs late, or never starts.

The link above is an affiliate link — we may earn a commission at no extra cost to you.

Frequently asked questions

Why does my Airflow DAG run a day late?

In Airflow 2 a DAG run covers a data interval and is triggered at the end of it. A @daily DAG whose logical_date is June 1 actually starts just after midnight on June 2. It isn't late — it's running for the interval that just completed. Airflow 3 changes the default so runs fire at the cron time.

Should I use schedule or schedule_interval?

Use schedule on modern Airflow (2.4+); schedule_interval is the older parameter name and is deprecated. Both accept a cron expression, a preset like @daily, or a timedelta.

What is logical_date (execution_date) in Airflow?

It's the start of the data interval a run represents, not the moment the run executes. With a cron schedule that means logical_date is one interval behind the actual run time, which is why date-based logic in tasks should use the data interval, not the current clock.