Schedule triggers
A sales report should land every day at 9 AM Pacific, and the task needs to know which day it is reporting on. A cron schedule fires the run, and flyte.TriggerTime passes the fire time into the task:
from datetime import datetime
import flyte
env = flyte.TaskEnvironment(name="reports")
daily_report = flyte.Trigger(
"daily-report",
flyte.Cron("0 9 * * *", timezone="America/Los_Angeles"),
inputs={"run_at": flyte.TriggerTime},
)
@env.task(triggers=daily_report)
async def sales_report(run_at: datetime) -> str:
# run_at is in UTC
...Three kinds of schedule are available: a cron expression (flyte.Cron), a fixed interval (flyte.FixedRate), and predefined shortcuts such as flyte.Trigger.daily(). For when the first run happens after you deploy, see When scheduled runs start.
Fixed-rate schedules with flyte.FixedRate
You can define a fixed-rate schedule trigger by setting the automation parameter of the flyte.Trigger to an instance of flyte.FixedRate.
The flyte.FixedRate has the following signature:
Examples
# Every 90 minutes, starting when deployed
every_90_min = flyte.Trigger(
"data_processing",
flyte.FixedRate(interval_minutes=90)
)
# Every 6 hours (360 minutes), starting at a specific time
specific_start = flyte.Trigger(
"batch_job",
flyte.FixedRate(
interval_minutes=360, # 6 hours
start_time=datetime(2025, 12, 1, 9, 0, 0) # Start Dec 1st at 9 AM
)
)
Cron schedules with flyte.Cron
You can define a Cron-based schedule trigger by setting the automation parameter to an instance of flyte.Cron.
The flyte.Cron has the following signature:
Examples
# Every day at 6 AM UTC
daily_trigger = flyte.Trigger(
"daily_report",
flyte.Cron("0 6 * * *")
)
# Every weekday at 9:30 AM Eastern Time
weekday_trigger = flyte.Trigger(
"business_hours_task",
flyte.Cron("30 9 * * 1-5", timezone="America/New_York")
)
Cron expressions
Here are some common cron expressions you can use:
| Expression | Description |
|---|---|
0 0 * * * |
Every day at midnight |
0 9 * * 1-5 |
Every weekday at 9 AM |
30 14 * * 6 |
Every Saturday at 2:30 PM |
0 0 1 * * |
First day of every month at midnight |
0 0 25 * * |
25th day of every month at midnight |
0 0 * * 0 |
Every Sunday at midnight |
*/10 * * * * |
Every 10 minutes |
0 */2 * * * |
Every 2 hours |
For a full guide on Cron syntax, refer to Crontab Guru.
Predefined schedule triggers
For common scheduling needs, Flyte provides predefined trigger methods that create Cron-based schedules without requiring you to specify cron expressions manually. These are convenient shortcuts for frequently used scheduling patterns.
Available predefined triggers
minutely_trigger = flyte.Trigger.minutely() # Every minute
hourly_trigger = flyte.Trigger.hourly() # Every hour
daily_trigger = flyte.Trigger.daily() # Every day at midnight
weekly_trigger = flyte.Trigger.weekly() # Every week (Sundays at midnight)
monthly_trigger = flyte.Trigger.monthly() # Every month (1st day at midnight)
For reference, here’s what each predefined trigger is equivalent to:
# These are functionally identical:
flyte.Trigger.minutely() == flyte.Trigger("minutely", flyte.Cron("* * * * *"))
flyte.Trigger.hourly() == flyte.Trigger("hourly", flyte.Cron("0 * * * *"))
flyte.Trigger.daily() == flyte.Trigger("daily", flyte.Cron("0 0 * * *"))
flyte.Trigger.weekly() == flyte.Trigger("weekly", flyte.Cron("0 0 * * 0"))
flyte.Trigger.monthly() == flyte.Trigger("monthly", flyte.Cron("0 0 1 * *"))All predefined trigger methods accept the same parameters as flyte.Trigger, plus a trigger_time_input_key. For the full parameter list, see the Trigger API reference.
Trigger time in predefined triggers
A predefined trigger passes its fire time to a task input only when you name that input with trigger_time_input_key. With no key, the trigger passes the fire time to no input.
Set trigger_time_input_key to the name of a datetime input. If the task has no input with that name, deployment fails with an error:
@env.task(triggers=flyte.Trigger.daily(trigger_time_input_key="scheduled_at"))
def task_with_custom_trigger_time_input(scheduled_at: datetime) -> str:
return f"Executed at {scheduled_at}"
Schedule time zones
Setting time zone for a cron schedule
Cron expressions are by default in UTC, but it’s possible to specify custom time zones like so:
sf_trigger = flyte.Trigger(
"sf_tz",
flyte.Cron(
"0 9 * * *", timezone="America/Los_Angeles"
), # Every day at 9 AM PT
inputs={"start_time": flyte.TriggerTime, "x": 1},
)
nyc_trigger = flyte.Trigger(
"nyc_tz",
flyte.Cron(
"1 12 * * *", timezone="America/New_York"
), # Every day at 12:01 PM ET
inputs={"start_time": flyte.TriggerTime, "x": 1},
)
The above two schedules will fire 1 minute apart, at 9 AM PT and 12:01 PM ET respectively.
flyte.TriggerTime is always in UTC
The flyte.TriggerTime value is always in UTC. For timezone-aware logic, convert as needed:
@env.task(triggers=flyte.Trigger.minutely(trigger_time_input_key="utc_trigger_time", name="timezone_trigger"))
def timezone_task(utc_trigger_time: datetime) -> str:
local_time = utc_trigger_time.replace(tzinfo=timezone.utc).astimezone()
return f"Task fired at {utc_trigger_time} UTC ({local_time} local)"
Daylight savings time behavior
When Daylight Savings Time (DST) begins and ends, it can impact when the scheduled execution begins.
On the day DST begins, time jumps from 2:00AM to 3:00AM, which means the time of 2:30AM won’t exist. In this case, the trigger will not fire until the next 2:30AM, which is the next day.
On the day DST ends, the hour from 1:00AM to 2:00AM repeats, which means the time of 1:30AM will exist twice. If the schedule above was instead set for 1:30AM, it would only run once, on the first occurrence of 1:30AM.