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

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:

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.