> ## Documentation Index
> Fetch the complete documentation index at: https://www.integrate.io/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# ETL: Scheduling Package Execution

> Schedule Integrate.io ETL package execution with one-time runs, recurring intervals, cron expressions, and time-zone settings to automate pipelines.

<Frame>
  <iframe className="w-full aspect-video rounded-xl" src="https://fast.wistia.net/embed/iframe/8ciue1j5wv" title="Scheduling Package Execution" allow="autoplay; fullscreen" allowFullScreen />
</Frame>

You spoke, we listened! One of Integrate.io ETL's most requested features, Cron Expressions, is now available on all Integrate.io ETL accounts. This allow much more flexibility in your job scheduling by supporting irregular intervals. Here are some examples:

`0 8 * * *     everyday at 8am UTC` `0 8 * * MON   every Monday at 8am UTC` `0 8 1 * *     every 1st of the month at 8am UTC`

Use the scheduler to execute packages periodically starting at a specified date and time. The packages will be executed as scheduled, using an existing cluster that fits the scheduled cluster size or if one doesn't exist, a cluster will be provisioned automatically with the number of specified nodes. By default, the cluster is taken down as soon as package execution is completed. Your schedule list can be viewed in the schedules list. Any schedule can be disabled or enabled from within the list.

## How to create a new schedule

<Steps>
  <Step>
    Click **Schedules** on the side menu.
  </Step>

  <Step>
    Click **New schedule** to open the new schedule dialog.

    <Frame>
      <img src="https://mintcdn.com/integrateio/fpWCvrjvoCDC-WOb/images/running-and-monitoring-jobs/image-1.webp?fit=max&auto=format&n=fpWCvrjvoCDC-WOb&q=85&s=5d564584a952a33c1f9c2393bfff924c" alt="Schedules page with New schedule button" width="1200" height="848" data-path="images/running-and-monitoring-jobs/image-1.webp" />
    </Frame>
  </Step>
</Steps>

### Configure Schedule

<Steps>
  <Step>
    Enter a **Name** for the schedule and optionally a **Description**.
  </Step>

  <Step>
    Configure schedule details:

    * **Repeat every** - Used for fixed amount of intervals between schedules (minutes / hours / days / weeks / months).
    * **Timezone** - Schedules execute in the selected timezone (default: UTC). The timezone can only be set during initial creation and cannot be changed afterward.
          <Frame>
            <img src="https://mintcdn.com/integrateio/fpWCvrjvoCDC-WOb/images/running-and-monitoring-jobs/image-2.webp?fit=max&auto=format&n=fpWCvrjvoCDC-WOb&q=85&s=c7d60dec6f57553b00de33a94cc64f6a" alt="Schedule configuration with repeat interval and timezone settings" width="1200" height="794" data-path="images/running-and-monitoring-jobs/image-2.webp" />
          </Frame>
    * **[Cron expression](https://en.wikipedia.org/wiki/Cron "Link: https://en.wikipedia.org/wiki/Cron")** - Used for setting up irregular intervals between schedules (i.e: every weekday at 8 AM).

      You can click the **time** icon for presets. If any of the presets doesn't suit your use case, you can generate your own cron expression [here](https://crontab-generator.org/).

      If the schedule repeats every hour, subsequent executions will start at the specified minute after the hour. Note that the time is in UTC.

          <Note>
            **Note:**

            only standard expressions are supported, special characters like # and ? ,are not supported.
          </Note>

      * **Auto-retry** - Used to automatically retry failed job(s) within a schedule. Only the failed job(s) are retried, never the entire schedule. Retries stop when all attempts are used, the job succeeds, you manually stop it, or when the next scheduled run is within 5 minutes.
      * **Note:** Retries are triggered as soon as the job fails.

        **How to enable:**

        1. In the **Configure Schedule** step, turn on **Auto-retry** and set the number of attempts.

               <Frame>
                 <img src="https://mintcdn.com/integrateio/fpWCvrjvoCDC-WOb/images/running-and-monitoring-jobs/image-3.webp?fit=max&auto=format&n=fpWCvrjvoCDC-WOb&q=85&s=a470006c9213d38341e3ebc8a99d33a0" alt="Auto-retry toggle with retry attempts field in schedule settings" width="816" height="170" data-path="images/running-and-monitoring-jobs/image-3.webp" />
               </Frame>

           **Example:**

           The total job runs for a failed job would be **4** for **3** attempts:

           * `1` – initial/default job run by the scheduler
           * `3` – retry attempts
        2. Fill in the remaining fields as usual and click **Save**.

    #### **FAQs**

    <AccordionGroup>
      <Accordion title="Does this re-run the entire schedule?">
        * No, only the failed job(s)
      </Accordion>

      <Accordion title="Will disabled schedules retry?">
        * Yes, if Auto‑retry is on. Turn Auto‑retry off to prevent retries.
        * Scenario for this: A schedule can be run one-off even if it’s disabled
      </Accordion>

      <Accordion title="How do I avoid clashes with the next scheduled run?">
        * Built-in skip if next run is within 5 minutes and schedule is enabled.
      </Accordion>

      <Accordion title="Where do I see retry attempts?">
        * On the Jobs page for that schedule
                  <Frame>
                    <img src="https://mintcdn.com/integrateio/fpWCvrjvoCDC-WOb/images/running-and-monitoring-jobs/image-4.webp?fit=max&auto=format&n=fpWCvrjvoCDC-WOb&q=85&s=651c1f9329ce051d24a4952974dccd3c" alt="Jobs page showing retry attempt entries for a failed schedule" width="649" height="127" data-path="images/running-and-monitoring-jobs/image-4.webp" />
                  </Frame>
      </Accordion>

      <Accordion title="Any limits?">
        * Retry Attempts capped at 5.
      </Accordion>
    </AccordionGroup>
  </Step>

  <Step>
    By default, schedules will not execute a job if previous jobs executed by the same schedules are running. Check Allow concurrent schedule executions if you want the schedule to execute jobs regardless of previous jobs status.
  </Step>
</Steps>

### Configure Schedule Cluster

The schedule can create a new cluster to run jobs or use existing clusters.

<Steps>
  <Step>
    Move the **Cluster Size** slider to the number of cluster nodes to use for package execution.
  </Step>

  <Step>
    By default, the cluster will **terminate after** 1 minute of inactivity. If the package execution and schedule recurrence is lower than 1 hour, we recommend to turn automatic cluster termination off so the cluster can be reused.
  </Step>

  <Step>
    Set **Re-use** strategy:

    * Any cluster created by this schedule - use a cluster created by this schedule if one is available. Otherwise, create a cluster.
    * Any similar cluster (default) - use any existing cluster so long as it's at least as big as you set in the schedule's cluster size. Otherwise, create a cluster.
    * Any similar cluster with the same node count - use any existing cluster with the same node count as you set in the schedule's cluster size. Otherwise, create a cluster.
    * Cluster with the least number of jobs running - use a cluster with the least number of jobs running and node size at least as big as the schedule's cluster size.

          <Note>
            **Note:**

            when scheduling a few schedules at the same time, please set them a few minutes apart so that the job count per cluster will be more accurate to avoid race condition
          </Note>
    * Never - create a new cluster every time the schedule is running.
  </Step>
</Steps>

### Select packages to run

<Steps>
  <Step>
    Click **add package** to add at least one package to execute.
  </Step>

  <Step>
    Choose a package from the list and click **set variables.**
  </Step>

  <Step>
    Set the value for any **user variables** or **system variables** and click **Save**. The variable values for a package in the schedule override the package defaults.

    <Note>
      **Note**:

      Variable values are expressions that are useful to calculate relative datetime values which can be very useful in your scheduled jobs.
    </Note>

    For example:

    `ToDate(ToString(SubtractDuration(CurrentTime(),'P1D'),'yyyy-MM-dd'))` - returns a datetime value of Yesterday midnight

    `ToString(SubtractDuration(CurrentTime(),'P1D'),'yyyy/MM/dd')` - returns a string in the form of yyyy/mm/dd to use in a path for yesterday's data.

    `AddDuration(ToDate('2000-01-01'),REPLACE(' PnM','n',(chararray)MonthsBetween(CurrentTime(),ToDate('2000-01-01'))))` - returns a datetime value of the first day of the month
  </Step>

  <Step>
    Optionally add additional packages.
  </Step>

  <Step>
    Change **Status** to **on** to enable the schedule.
  </Step>

  <Step>
    Click **Create schedule**.
  </Step>
</Steps>

### **To view and maintain schedules**

In the schedules list, you can see all of your schedules with execution information. You can enable, disable, edit, duplicate, and delete each of your schedules. You can also run a schedule one-off from the schedules list.

## Auto-Retry on Failure

Schedules support automatic retry for failed jobs. When enabled, only the failed job is retried, not the entire schedule.

* **Attempts**: Configure between 0 and 5 retry attempts. The total number of job runs for a failure equals 1 (initial run) plus the retry attempt count.
* **Trigger timing**: Retries fire as soon as the job fails.
* **Stop conditions**: Retries stop when all attempts are exhausted, the job succeeds, you manually stop the job, or the next scheduled run is within 5 minutes.

To enable auto-retry, toggle **Auto-retry** on in the Configure Schedule step and set the number of attempts. Retry attempts are visible on the Jobs page for that schedule.
