Run a task on a cron expression or a fixed interval with `flyte.Cron`, `flyte.FixedRate`, or a predefined schedule.

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:

triggers.py
flyte.FixedRate(
    interval_minutes,
    start_time=None
)

Examples

triggers.py
# 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:

triggers.py
flyte.Cron(
    cron_expression,
    timezone=None
)

Examples

triggers.py
# 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

triggers.py
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

By default, predefined triggers will pass the execution time to the parameter trigger_time of type datetime,if that parameter exists on the task. If no such parameter exists, the task will still be executed without error.

Optionally, you can customize the parameter name that receives the trigger execution timestamp by setting the trigger_time_input_key parameter (in this case the absence of this custom parameter on the task will raise an error at trigger deployment time):

triggers.py
@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:

triggers.py
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:

triggers.py
@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.