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.
Expression
Tip: press Ctrl+Enter to copy
Presets
Visual Builder
Description
At 09:00 AM, Monday through Friday
Airflow cron syntax
| Min | Hour | Day | Month | DOW |
|---|---|---|---|---|
| 0 | 9 | * | * | 1-5 |
- Five fields: Minute, Hour, Day-of-month, Month, Day-of-week — standard cron via croniter.
- Set as schedule="..." on the DAG (older versions used schedule_interval).
- Presets like @daily, @hourly, and @weekly are also accepted in place of an expression.
- Airflow 2 triggers a run at the end of the data interval; logical_date is the interval start, not the wall-clock run time.
- Airflow 3 changes this so cron schedules fire at the cron time without the off-by-one.
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.