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:00
weekly
Runs on specific days of the week at a specific time.
type: weekly
days: ["monday", "wednesday", "friday"]
time: 09:00
cron
Full control using a standard cron expression.
type: cron
cron: "0 8 * * 1-5" # 8 AM, Monday through Friday
Output 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-run
Option A — Cron + schedule:run (typical production)
* * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1
With Laravel Sail:
* * * * * cd /path/to/project && ./vendor/bin/sail artisan schedule:run >> /dev/null 2>&1
Avoid 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:work
Option 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:work
Debugging
Manual run (same logic the scheduler uses):
php artisan voodflow:schedule-run -v
Verbose 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