Schedule
Type key: schedule_node
Group: Triggers
Category: trigger
Tier: CORE
The Schedule node triggers a workflow automatically at configured time intervals. Voodflow registers php artisan voodflow:schedule-run on Laravel’s scheduler every minute (in VoodflowServiceProvider). You must run Laravel’s scheduler every minute — via OS cron + schedule:run, or a long-lived schedule:work process, or the bundled voodflow:work helper (see Server setup).
How evaluation works
- Active workflows only —
statusmust beactive. Draft/disabled workflows are skipped. - Timezone —
daily/weeklyuse the timezone from Voodflow → Settings → Timezone (e.g.Europe/Rome), notAPP_TIMEZONEalone. - Exact minute — those modes fire when the clock in that timezone matches the configured hour:minute for that run. Not “any time after” that time.
- At most once per minute per node — a cache lock prevents a second trigger for the same workflow + schedule node in the same clock minute (e.g. duplicate cron lines or manual + automatic in the same minute).
Handles
| Handle | Direction | Description |
|---|---|---|
| (none) | Input | Trigger nodes have no input |
output | Output | Emits a timestamp payload when triggered |
Configuration
| Field | Type | Default | Description |
|---|---|---|---|
type | enum | interval | Schedule type: interval, daily, weekly, cron |
interval | integer | 5 | Interval value (used with interval type) |
unit | enum | minutes | Unit for interval: minutes, hours, days |
time | string | 12:00 | Time of day in HH:MM (or HH:MM:SS) — used with daily and weekly |
days | array | ["monday"] | Days of the week (used with weekly type) |
cron | string | */5 * * * * | Full cron expression (used with cron type) |
Schedule Types
interval
Runs the workflow every N units of time.
| Setting | Example | Meaning |
|---|---|---|
interval: 5, unit: minutes | */5 * * * * | Every 5 minutes |
interval: 2, unit: hours | 0 */2 * * * | Every 2 hours |
interval: 1, unit: days | 0 0 * * * | Once per day |
daily
Runs once per day at a specific time.
type: daily
time: 08:00weekly
Runs on specific days of the week at a specific time.
type: weekly
days: ["monday", "wednesday", "friday"]
time: 09:00cron
Full control using a standard cron expression.
type: cron
cron: "0 8 * * 1-5" # 8 AM, Monday through FridayOutput Payload
{
"timestamp": "2025-03-16 08:00:00",
"schedule_type": "daily",
"execution_mode": "scheduled",
"triggered_at": "2025-03-16T08:00:00+00:00"
}Validation Rules
| Condition | Error |
|---|---|
type is empty | Schedule type is required |
type = interval and interval is empty | Interval is required |
type = cron and cron is empty | Cron expression is required |
Server setup
Laravel must invoke scheduled tasks once per minute. Voodflow’s job is already on the schedule list:
php artisan schedule:list | grep voodflow
# * * * * * php artisan voodflow:schedule-runOption A — Cron + schedule:run (typical production)
* * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1With Laravel Sail:
* * * * * cd /path/to/project && ./vendor/bin/sail artisan schedule:run >> /dev/null 2>&1Avoid registering two cron lines (or cron + another duplicate scheduler) for the same app — that can cause double triggers until the per-minute lock stops the second run.
Option B — schedule:work (long-running)
Runs the scheduler in a single process (good for Docker/dev):
php artisan schedule:workOption C — voodflow:work (development)
Starts schedule:work, queue:work, and Reverb (if available) together. If this process is not running, scheduled workflows will not fire on their own until you run Option A or B.
php artisan voodflow:workDebugging
Manual run (same logic the scheduler uses):
php artisan voodflow:schedule-run -vVerbose output shows the configured timezone, current time in that zone, resolved cron, and shouldRun per schedule node.
Example use cases
- Daily reports: Send email reports every morning at 08:00
- Scheduled cleanups: Delete old records every night at 00:00
- Periodic sync: Pull data from an external API every 15 minutes
- Business-hours cron: Use custom
cronexpressions for complex patterns