Skip to content
Fluxify

workflows & triggers Background work, on the same canvas.

A workflow is built exactly like a route — same blocks, same integrations, same custom blocks — but nobody waits for it. Schedules, queues and other routes start it; workers run it.

Read the docs
Schedule @every · cron · @at Route Trigger Workflow block Redis Streams consumer group RabbitMQ queue Kafka topic EE NATS JetStream stream EE Amazon SQS queue EE Trigger batch · concurrency Workflow runs on a worker · 5 min
A trigger starts one workflow. Kafka, NATS JetStream and SQS connectors are Enterprise (EE); everything else here is Community.

route or workflow?

Same blocks, different contract.

Rule of thumb: if someone is waiting for the answer, it's a route. If the work can happen later — sending email, syncing data, processing an upload — hand it to a workflow with the Trigger Workflow block and answer right away.

RouteWorkflow
Starts whensomeone calls its URLa trigger fires, a schedule ticks, or you run it
Who waitsthe caller, connection opennobody
Gives backan HTTP responsenothing — it finishes
Time limit30 seconds5 minutes, up to an hour
If it failsthe caller sees an errorit's retried automatically

batching

Handle events by the hundred, not one by one.

Set a batch size and a trigger collects events into one run. Writing 500 rows once is far cheaper than writing one row 500 times. Concurrency lets several batches run at once — at the cost of ordering.

events from the queue → one batch batch size 500 max wait 2 s max bytes 1 MB first limit reached closes the batch 1 workflow run trigger.data = [ …500 ]
Ten thousand events with batch size 1 is ten thousand runs; with 500 it's twenty. A batch succeeds or fails as one, and a retry resends the same events, so use meta.id to skip work already done.

failures

Nobody's waiting, so it tries again.

A failed workflow run is retried with a pause in between. Queue triggers go further: a dead-letter destination catches messages that keep failing, so one bad event can't block the rest.

run 1 ✕ pause run 2 ✕ pause run 3 ✕ dead-letter topic set copy, commit, move on no dead-letter topic keep retrying, never skip
Kafka and NATS: with a dead-letter topic set, messages that keep failing are copied there with x-fluxify-error headers and committed. Without one, they are retried instead of skipped.

schedules

On the clock.

A schedule is a trigger that fires on time instead of on an event. Intervals, cron, daily or a single moment — previewed before you save.

@every 30m → “every 30 minutes, from when you saved it” 09:00 09:30 10:00 10:30 11:00 11:30 12:00 next five runs
@every 30m, @daily, six-field cron like 0 0 9 * * 1-5, or a one-off @at time. The editor says what it means in words and lists the next five runs.

placement

Noisy triggers get their own workers.

Triggers belong to groups. Start workers with a group id and they run only that group's triggers, so a firehose of events can't slow your APIs. Workers can serve routes, workflows, or both.

  • Default group every trigger lands here unless you choose otherwise
  • WORKER_GROUP_ID start a worker that only runs one group's triggers
  • Worker types route, workflow, or both — on Community, one worker does both
next Custom blocks & middleware Package blocks into your own; run them before or after routes.