---
title: Schedule Triggers
slug: schedule-triggers
docTags: 
createdAt: 2025-08-11T11:13:48.000Z
---

Schedule triggers initiate a playbook at a configured time using cron expressions. They are ideal for automating repetitive tasks, improving productivity, and reducing human errors. For example, you can use a schedule trigger to automatically generate reports, eliminate the need to manually retrieve data, or perform periodic maintenance tasks.

## Key Benefits

- **Automated Execution:** Run playbooks automatically at specified intervals without manual intervention
- **Flexible Scheduling:** Support for various schedule frequencies (minutely, hourly, daily, weekly, monthly, yearly, or custom cron expressions)
- **UTC execution with local or UTC input:** Schedules run in UTC. Starting in Turbine 26.3.0, you can enter the schedule in UTC or your local time zone in the trigger panel
- **Reliable:** Uses Hangfire job scheduler for reliable execution of scheduled tasks

## Creating a Schedule Trigger

To set a cron job for your playbook, follow these steps:

1. In a playbook, from the Add panel, click and drag **Schedule** to the canvas.
2. Hover over the plus icon to add it to the canvas. The Trigger panel will display on the right side of the canvas, where you can configure your schedule trigger.

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/gAQRTeW31XtAi4ZcZkUz4_canvas-scheduled-trigger.png" size="32" width="415" height="554" darkWidth="415" darkHeight="554" position="center" alt="Schedule Trigger" indent="2" showCaption="false"}

3. Configure the schedule trigger:

### Time Zone

Use the **Time zone** section to choose how you enter the schedule:

| Option | Label (UI)               | Behavior                                                                                           |
| ------ | ------------------------ | -------------------------------------------------------------------------------------------------- |
| UTC    | **Set using UTC**        | Enter the schedule in UTC. The current UTC clock is shown under the frequency control.             |
| Local  | **Set using local time** | Enter the schedule in your local time zone. Turbine stores the equivalent UTC value for execution. |

When **Set using local time** is selected:

- The UI shows **Local time zone** with your offset and zone (for example `America/New_York`). To change that zone, go to **Profile & User settings** → **General**.
- A hint states: **Local times are stored as UTC equivalents. Future daylight savings time (DST) changes are not automatically applied.**

Under **Frequency**, the cron builder uses the selected zone. The panel also shows **Current UTC time** and **Current local time** for reference.

Starting in **Turbine 26.3.0**, your choice of **Set using UTC** or **Set using local time** is remembered in the browser (local storage) so you do not have to reselect it every time you open a schedule trigger.

:::hint{type="info"}
Execution remains UTC-based on the platform. Local input is a convenience for authors; DST shifts after you save are not recalculated automatically.
:::

### Monthly Schedules and UTC Conversion

Monthly schedules can shift the day of the month when local time is converted to UTC. Not every month has days **29**, **30**, or **31**, so Turbine cannot always resolve those corner cases automatically.

When a monthly schedule (every month) converts to UTC on day **29**, **30**, or **31**, the trigger panel shows a warning that states the converted day and time — for example:

:::BlockQuote
UTC conversion shifts this to 6:30 PM on day 30 of every month. Since month lengths vary, please review the schedule before saving.
:::

Review the converted day and time, and adjust the schedule if needed, before you save.

This warning applies to **monthly** schedules only. Other frequencies do not show this month-length validation.

### Schedule Type

The **Schedule Type** is set to **cron** (this is the only supported schedule type).

### Schedule Frequency

Select the desired time schedule from the following options:

- **Minutely**: Runs every minute
- **Hourly**: Runs every hour at a specified minute (for example, every hour at :15 minutes)
- **Daily**: Runs once per day at a specified time (for example, every day at 8:00 AM UTC)
- **Weekly**: Runs once per week on a specified day and time (for example, every Monday at 8:00 AM UTC)
- **Monthly**: Runs once per month on a specified day and time (for example, 1st of every month at 12:00 AM UTC)
- **Yearly**: Runs once per year on a specified date and time (for example, January 1st at 12:00 AM UTC)
- **Custom**: Allows you to define a custom cron expression

### Configuration Fields

Depending on the selected schedule frequency, you'll configure:

- **Minute**: The minute of the hour (0-59)
- **Hour**: The hour of the day (0-23), in the time zone mode you selected (UTC or local)
- **Day of Week**: For weekly schedules, select the day (Sunday = 0, Monday = 1, and so on)
- **Day of Month**: For monthly/yearly schedules, select the day (1-31)
- **Month**: For yearly schedules, select the month (1-12)

**Note:** The UI displays current UTC and local times to help you configure schedules correctly.

### Custom Cron Expression

For **Custom** schedule type, you can enter a standard cron expression in the format:

**Cron Expression Format:**

- **Minute**: 0-59
- **Hour**: 0-23 (UTC)
- **Day of Month**: 1-31
- **Month**: 1-12
- **Day of Week**: 0-6 (0 = Sunday, 1 = Monday, and so on)

**Examples:**

- `0 0 * * *` - Every day at midnight UTC
- `0 8 * * 1` - Every Monday at 8:00 AM UTC
- `0 0 1 * *` - First day of every month at midnight UTC
- `*/15 * * * *` - Every 15 minutes
- `0 9-17 * * 1-5` - Every hour from 9 AM to 5 PM UTC, Monday through Friday

4. When finished, click **Save** to complete your schedule configuration.

The schedule trigger is now configured and will execute your playbook according to the specified cron expression.

::Image[]{src="https://app.archbee.com/api/optimize/511c8QBH-VHiwWnyzIwUb/6_ywlJp5DUn7VoYuZaD14_canvas-schedule-yearly-trigger.png" size="28" width="402" height="442" darkWidth="402" darkHeight="442" position="center" alt="Yearly Schedule Trigger" indent="2" showCaption="false"}

## Detailed Example with Native Actions: Automating Weekly Data Collection and Processing

This example demonstrates how to use a schedule trigger combined with native actions (HTTP, Condition, Loop, Transform, and Create Variables) to automate data collection, processing, and reporting.

### Scenario

You want to collect data from an external API every Monday at 8:00 AM, process it, and generate a report. The report will either be stored or emailed. The playbook ensures that only valid data is processed, and any errors will be logged for review.

### Steps:

1. **Step 1:** Configure the schedule trigger to run every Monday at 8:00 AM UTC.
   - In the **Schedule Trigger** panel, select **Weekly**.
   - Select **Monday** as the day of week.
   - Set the time to **8**:0&#x30;**&#x20;AM** in the time zone mode you selected (**Set using UTC** or **Set using local time**).
   - Use the Current UTC and Current local time displays to verify your configuration.
2. **Step 2:** Add an **HTTP Action** to make a GET request to an external API that provides data for the report.
   - Drag the **HTTP** action into the playbook.
   - Configure the HTTP action to send a GET request to the API endpoint (for example, [https://api.example.com/data](https://api.example.com/data)).
   - Include any required headers (for example, Authorization tokens).
3. **Step 3:** Use the **Condition Action** to verify if the API returns valid data.
   - Drag a **Condition** action into the flow.
   - Set the condition to check if the API response contains valid data (for example, `response["data"]` is not null).
4. **Step 4:** If valid data is present, use a **Loop Action** to iterate through each record in the API response.
   - Drag a **Loop** action into the playbook.
   - Configure the loop to iterate over the records in the API response (for example, `response["data"]`).
5. **Step 5:** Within the loop, apply a **Transform Action** to format the data.
   - Drag a **Transform** action into the loop.
   - Configure it to extract and format necessary fields such as `date`, `amount`, and `category` from each record.
6. **Step 6:** Use the **Create Variables Action** to store the transformed data.
   - Drag a **Create Variables** action into the flow after the transformation.
   - Create variables for **date**, **amount**, **category**, and so on
7. **Step 7:** Depending on the requirement, send the report via email or store it in a database.
   - For email, add an **Email Action** and configure it to send the report.
   - For storage, use an **HTTP Action** or connector to store the report in a database.
8. **Step 8:** If the condition in step 3 is not met, log the error and notify the team.
   - Use the **Else** branch of the **Condition** action to log the error and send a notification.

### Example Flow

- **Schedule Trigger:** Executes every Monday at 8:00 AM UTC.
- **HTTP Action:** Makes a GET request to collect report data from an external API.
- **Condition Action:** Checks if the response contains valid data; if not, logs an error.
- **Loop Action:** Iterates over data records returned by the API.
- **Transform Action:** Formats data fields (for example, "date," "amount," "category").
- **Create Variables Action:** Stores the transformed data as variables for further processing.
- **Final Step:** Store the report in a database or send it via email to stakeholders.

## Schedule Trigger Outputs

When a schedule trigger executes, it provides the following event data that can be accessed in your playbook:

### Event Data

- `$event.data.cron`: The cron expression that triggered this execution (string)

### Event Metadata

- **Event Type**: `schedule`
- **Event Action**: `cron`
- **Event FQN**: `turbine.schedule.cron`
- **Event Source**: `turbine`

### Accessing Schedule Data in Playbooks

You can access schedule trigger data in your playbook actions:

**Examples:**

**Note:** Schedule triggers do not provide additional data beyond the cron expression. The primary use case is to trigger playbooks at specific times rather than passing data.

## Best Practices

- **Choose UTC or local input:** Use **Set using UTC** or **Set using local time** in the Time zone section. The platform still executes schedules in UTC.
- **Test Your Schedule:** Before deploying to production, verify that your schedule triggers at the expected times by checking playbook run history.
- **Account for DST:** When you use local time input, saved schedules are stored as UTC equivalents. Future daylight saving changes are not applied automatically.
- **Use Descriptive Names:** Give your playbooks descriptive names that indicate when they run (for example, "Daily Report Generator - 8 AM UTC").
- **Avoid Overlapping Schedules:** Be mindful of playbook execution time to avoid overlapping executions if a previous run has not completed.
- **Monitor Execution:** Regularly monitor scheduled playbook executions to ensure they are running as expected and completing successfully.
- **Use Appropriate Frequencies:** Choose the minimum frequency needed for your use case. Running playbooks too frequently can impact system performance.
- **Handle Errors Gracefully:** Ensure your scheduled playbooks handle errors appropriately, as they run unattended.

## Troubleshooting

- **Playbook Not Executing:**
  - Verify the playbook is published and enabled
  - Check that the cron expression is valid
  - Verify the schedule time has passed (schedules are evaluated in UTC)
  - Check playbook run history for any execution errors
- **Wrong Execution Time:**
  - Schedules are evaluated in UTC on the platform
  - If you used **Set using local time**, confirm the local zone under **Profile & User settings** → **General** and review the Current UTC / local clocks in the trigger panel
  - If you used **Set using UTC**, verify the UTC values you entered against the Current UTC time display
  - For **Monthly** schedules, if the UTC conversion lands on day 29, 30, or 31, review the warning in the trigger panel and confirm the schedule before saving
- **Invalid Cron Expression:**
  - Verify the cron expression follows the standard 5-field format: `minute hour day-of-month month day-of-week`
  - Ensure numeric values are within valid ranges (minute: 0-59, hour: 0-23, and so on)
  - Check that special characters (`,`, `-`, `*`, `/`) are used correctly
- **Schedule Not Saving:**
  - Ensure all required fields are filled in
  - Verify the cron expression is valid
  - Check for any validation errors displayed in the UI
- **Multiple Executions:**
  - Verify you do not have duplicate schedule triggers configured
  - Check that the cron expression does not match multiple times unintentionally
  - Review playbook run history to identify execution patterns
