# Schedule trigger

The Schedule trigger fires a workflow on a timer — either a **fixed interval** (every N minutes) or a **cron expression** (every weekday at 9 AM, the 1st of each month, etc.).

## Add it to a workflow

1. Drop a **Schedule** node from the palette onto the canvas.
2. Pick a **Mode**:
   - **Interval** — pick a preset (1m, 5m, 15m, 30m, 1h, 6h, 1d) or set a custom minute value.
   - **Cron expression** — paste a standard 5-field cron string.
   - **Visual builder** — assemble the cron without writing it: `every minute`, `every N minutes`, `hourly`, `daily`, `weekly`, `monthly`. The generated cron is shown live below the picker.
3. Set a **Timezone** (default `UTC`). Accepts any IANA name — `Europe/Paris`, `America/New_York`, etc.
4. Pick a **Catch-up policy** for missed fires (e.g. after a deploy or downtime):
   - `skip` — ignore the accumulated backlog and wait for the next scheduled time.
   - `fire_once` — run once after recovery to cover the whole gap (default and recommended in most cases).
   - `fire_all` — replay every missed slot, up to 50 catch-up runs. Use it only when every occurrence must be processed.

The catch-up policy only applies when several runs accumulated while the scheduler was unavailable. A normal due run still executes with every policy. In the node configuration, hover the **ⓘ icon** or any policy button to see this explanation.
5. Toggle the trigger **Enabled** and save.

Cron format is the standard 5 fields: `minute hour day-of-month month day-of-week`. Day-of-week `0` and `7` are both Sunday.

## Common cron patterns

| Cron              | Meaning                          |
| ----------------- | -------------------------------- |
| `*/15 * * * *`   | every 15 minutes                 |
| `0 * * * *`      | top of every hour                |
| `0 9 * * *`      | every day at 09:00               |
| `0 9 * * 1-5`    | every weekday at 09:00           |
| `0 9 1 * *`      | first of the month at 09:00      |
| `30 14 * * 0`    | every Sunday at 14:30            |

## What the workflow receives

Schedule fires carry no request body. Downstream nodes see only the trigger metadata:

```json
{
  "trigger_kind": "schedule",
  "fired_at": "2026-06-04T09:00:00Z"
}
```

Template `{fired_at}` into prompts or use it as a timestamp in HTTP requests. There is no `event.body` — if a node needs data, it must fetch it (HTTP Request, RAG, etc.).

## Limits

- **Minimum interval**: 1 minute. Anything shorter is rejected.
- **Minimum cron granularity**: `* * * * *` (every minute) is the tightest your cron can fire.
- **Dispatcher tick**: the server checks for due triggers every **15 seconds**, so a fire can land up to ~15 s after its scheduled time.
- Per-tenant scheduling quotas may apply on hosted plans — contact your admin if your fires are being throttled.

## Troubleshooting

- **Trigger never fires** — confirm the workflow is **saved**, the agent is **active** (Live toggle in the Production space), and the trigger toggle is **Enabled**. The cron / interval is only registered when the workflow is saved.
- **Fires at the wrong time** — check the **Timezone** field. The default is UTC, not your local timezone.
- **"Invalid cron expression"** — must be 5 (or 6) space-separated fields. Use the **Visual builder** mode to generate a valid one.
- **A bunch of fires after a deploy** — that's the `fire_all` catch-up policy replaying missed slots. Switch to `fire_once` or `skip` if undesired.

---

*Source: https://agentbuilder.systalink.sn/docs/trigger-schedule — human documentation.*
*Other language: [/docs-md/fr/trigger-schedule.md](/docs-md/fr/trigger-schedule.md).*
*Machine-readable index: [/llms.txt](/llms.txt).*
