docs/v3/how-to-guides/deployments/create-schedules.mdx
There are several ways to create a schedule for a deployment:
cron, interval, or rrule parameters if building your deployment with the
serve method of the Flow object or
the serve utility for managing multiple flows simultaneouslyflow.serve or flow.deployprefect deploy commanddeployments -> schedules section of the prefect.yaml fileYou can add schedules in the Schedules section of a Deployment page in the UI. To add a schedule select the + Schedule button. Choose Interval or Cron to create a schedule.
<Note> **What about RRule?** The UI does not support creating RRule schedules. However, the UI will display RRule schedules that you've created through the command line. </Note>The new schedule appears on the Deployment page where you created it. New scheduled flow runs are visible in the Upcoming tab of the Deployment page.
To edit an existing schedule, select Edit from the three-dot menu next to a schedule on a Deployment page.
Specify the schedule when you create a deployment in a Python file with flow.serve(), serve, flow.deploy(), or deploy.
Just add the keyword argument cron, interval, or rrule.
| Argument | Description |
|---|---|
interval | An interval on which to execute the deployment. Accepts a number or a timedelta object to create a single schedule. If a number is given, it is interpreted as seconds. Also accepts an iterable of numbers or timedelta to create multiple schedules. |
cron | A cron schedule string of when to execute runs of this deployment. Also accepts an iterable of cron schedule strings to create multiple schedules. |
rrule | An rrule schedule string of when to execute runs of this deployment. Also accepts an iterable of rrule schedule strings to create multiple schedules. |
schedules | A list of schedule objects defining when to execute runs of this deployment. Used to define multiple schedules or additional scheduling options such as timezone. |
schedule | A schedule object defining when to execute runs of this deployment. Used to define additional scheduling options such as timezone. |
slug | An optional unique identifier for the schedule containing only lowercase letters, numbers, and hyphens. If not provided for a given schedule, the schedule will be unnamed. |
The serve method below will create a deployment of my_flow with a cron schedule that creates runs every minute of every day:
from prefect import flow
from myproject.flows import my_flow
my_flow.serve(name="flowing", cron="* * * * *")
If using deployments with dynamic infrastructure, the deploy method has the same schedule-based parameters.
When my_flow is served with this interval schedule, it will run every 10 minutes beginning at midnight on January, 1, 2026 in the America/Chicago timezone:
from myproject.flows import my_flow
my_flow.serve( name="flowing", schedule=Interval( timedelta(minutes=10), anchor_date=datetime(2026, 1, 1, 0, 0), timezone="America/Chicago" ) )
```python prefect < 3.1.16
from datetime import timedelta, datetime
from prefect.client.schemas.schedules import IntervalSchedule
from myproject.flows import my_flow
my_flow.serve(
name="flowing",
schedules=[
IntervalSchedule(
interval=timedelta(minutes=10),
anchor_date=datetime(2026, 1, 1, 0, 0),
timezone="America/Chicago"
)
]
)
You can create a schedule through the interactive prefect deploy command. You will be prompted to choose which type of schedule to create.
You can also create schedules for existing deployments using the prefect deployment schedule create command. This command allows you to specify schedule details directly without going through the interactive flow.
Examples:
Create a cron schedule that runs every day at 9 AM:
prefect deployment schedule create my-deployment --cron "0 9 * * *"
Create an interval schedule that runs every 30 minutes:
prefect deployment schedule create my-deployment --interval 1800
Create a schedule with a specific timezone:
prefect deployment schedule create my-deployment --cron "0 9 * * *" --timezone "America/New_York"
Replace all existing schedules with a new one:
prefect deployment schedule create my-deployment --cron "0 9 * * *" --replace
If you save the prefect.yaml file from the prefect deploy command, you will see it has a schedules section for your deployment.
Alternatively, you can create a prefect.yaml file from a recipe or from scratch and add a schedules section to it.
deployments:
...
schedules:
- cron: "0 0 * * *"
slug: "chicago-schedule"
timezone: "America/Chicago"
active: false
- cron: "0 12 * * *"
slug: "new-york-schedule"
timezone: "America/New_York"
active: true
- cron: "0 18 * * *"
slug: "london-schedule"
timezone: "Europe/London"
active: true
If you need to rename a schedule's slug, use the replaces field to indicate which existing schedule should be updated:
deployments:
- name: send-emails
entrypoint: flows.py:send_email
schedules:
- cron: "0 8 * * *"
slug: "daily-team-digest" # The new slug
replaces: "morning-emails" # The old slug being replaced
parameters:
to: "[email protected]"
When you run prefect deploy:
After a successful deploy, you can remove the replaces field from your YAML - it becomes a no-op once the old slug no longer exists.
import { TF } from "/snippets/resource-management/terraform.mdx" import { deployments } from "/snippets/resource-management/vars.mdx"
<TF name="schedules" href={deployments.tf} />Using any of the above methods to create a schedule, you can bind parameters to your schedules.
For example, say you have a flow that sends an email. Every day at 8:00 AM you want to send a message to one recipient, and at 8:05 AM you want to send a different message to another recipient.
Instead of creating independent deployments with different default parameters and schedules, you can bind parameters to the schedules themselves:
Whether using .serve or .deploy, you can pass parameters to your deployment schedules:
from prefect import flow
from prefect.schedules import Cron
@flow
def send_email(to: str, message: str = "Stop goofing off!"):
print(f"Sending email to {to} with message: {message}")
send_email.serve(
name="my-flow",
schedules=[
Cron(
"0 8 * * *",
slug="jim-email",
parameters={"to": "[email protected]"}
),
Cron(
"5 8 * * *",
slug="dwight-email",
parameters={
"to": "[email protected]",
"message": "Stop goofing off! You're assistant _to_ the regional manager!"
}
)
]
)
Note that our flow has a default message parameter, but we've overridden it for the second schedule.
This deployment will schedule runs that:
prefect.yamlYou can also provide parameters to schedules in your prefect.yaml file.
deployments:
name: send-email
entrypoint: send_email_flow.py:send_email
schedules:
- cron: "0 8 * * *"
slug: "jim-email"
parameters:
to: "[email protected]"
- cron: "5 8 * * *"
slug: "dwight-email"
parameters:
to: "[email protected]"
message: "Stop goofing off! You're assistant _to_ the regional manager!"