Skip to content

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

  1. Active workflows onlystatus must be active. Draft/disabled workflows are skipped.
  2. Timezonedaily / weekly use the timezone from Voodflow → Settings → Timezone (e.g. Europe/Rome), not APP_TIMEZONE alone.
  3. 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.
  4. 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

HandleDirectionDescription
(none)InputTrigger nodes have no input
outputOutputEmits a timestamp payload when triggered

Configuration

FieldTypeDefaultDescription
typeenumintervalSchedule type: interval, daily, weekly, cron
intervalinteger5Interval value (used with interval type)
unitenumminutesUnit for interval: minutes, hours, days
timestring12:00Time of day in HH:MM (or HH:MM:SS) — used with daily and weekly
daysarray["monday"]Days of the week (used with weekly type)
cronstring*/5 * * * *Full cron expression (used with cron type)

Schedule Types

interval

Runs the workflow every N units of time.

SettingExampleMeaning
interval: 5, unit: minutes*/5 * * * *Every 5 minutes
interval: 2, unit: hours0 */2 * * *Every 2 hours
interval: 1, unit: days0 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

json
{
    "timestamp": "2025-03-16 08:00:00",
    "schedule_type": "daily",
    "execution_mode": "scheduled",
    "triggered_at": "2025-03-16T08:00:00+00:00"
}

Validation Rules

ConditionError
type is emptySchedule type is required
type = interval and interval is emptyInterval is required
type = cron and cron is emptyCron expression is required

Server setup

Laravel must invoke scheduled tasks once per minute. Voodflow’s job is already on the schedule list:

bash
php artisan schedule:list | grep voodflow
# * * * * *  php artisan voodflow:schedule-run

Option A — Cron + schedule:run (typical production)

cron
* * * * * cd /var/www/html && php artisan schedule:run >> /dev/null 2>&1

With Laravel Sail:

cron
* * * * * 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):

bash
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.

bash
php artisan voodflow:work

Debugging

Manual run (same logic the scheduler uses):

bash
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 cron expressions for complex patterns

Proprietary software — source-available. All rights reserved.