Skip to main content

Action nodes


Log

@wf::action.log · LogNode

Writes a message to the Laravel log at the chosen level.

FieldTypeDefaultNotes
levelselectinfodebug, info, warning, error.
messagetextRequired. Supports {{ expressions }}.

Output: { "level": "info", "message": "<resolved message>" }


HTTP request

@wf::http:request · HttpRequestNode

Makes an outbound HTTP request with Laravel's HTTP client.

FieldTypeDefaultNotes
urltextRequired. Supports {{ }}.
methodselectgetget, post, put, patch, delete, head.
headersjsonMap of header name → value.
queryjsonMap of query-string parameters.
bodyjsonJSON request body. (when method is post/put/patch/delete)
timeoutnumber30Seconds.
fail_on_errorcheckboxtrueWhen true, a 4xx/5xx response fails the node.

Output

{ "status": 200, "ok": true, "headers": { }, "body": { } }

body is the decoded JSON when the response is JSON, otherwise the raw string.

When fail_on_error is on and the response is an error status, the node throws — which means the node's retry settings apply.


Wait

@wf::action:wait · WaitNodeV2

Pauses the workflow until a time elapses, an absolute moment is reached, or an incoming webhook call resumes it. See Suspend & resume.

FieldTypeDefaultNotes
waitTypeselectdurationduration (relative), date (absolute), or webhook (wait for a call).
durationnumber60(when waitType is duration) Amount to wait.
unitsselectseconds(when waitType is duration) seconds, hours, days.
untiltext(when waitType is date) Absolute date/time, e.g. 2026-01-01T00:00:00Z. Supports {{ }}.

For duration / date: in Sync mode, a wait within sync_wait_timeout (config, default 30s) sleeps in-process and continues without suspending; anything longer suspends and queues a delayed resume. In Async mode a wait always suspends. In Test mode it resolves instantly.

For webhook: the workflow always suspends and stays suspended until a request hits the resume endpoint for that execution — no timer, no queue worker involved. Use it for approvals and other "wait for a human / an external system" steps.

Output

  • duration / date: { "until": "<ISO 8601>" }
  • webhook: { "resumed_via": "webhook", "payload": { ...the resume request's data } }

Versioning. waitType: webhook and the date option are part of Wait v2, the current version. Workflows already saved against v1 (which offered only duration and an until option) keep running on v1 unchanged — see Node versioning. php artisan workflow:build builds new Wait nodes as v2 automatically. In a hand-written definition, set the type to @wf::action:wait{v2} — the bare @wf::action:wait (and WaitNode::type()) still resolves to v1.


Call workflow

@wf::action:call-workflow · CallWorkflowNode

Runs another workflow as a child of this one.

FieldTypeDefaultNotes
workflowselectRequired. The child workflow's id (must have a Manual trigger).
response_modeselectimmediatelyimmediately = queue the child and continue right away (fire-and-forget). last_node = wait for the child, then continue with its output.
payloadgroupValues passed to the child as its trigger payload.

A workflow saved before response_mode existed behaves as last_node (wait).

Output

  • immediately: { "status": true } — the child is dispatched, this workflow does not wait.
  • last_node: the child's output. If the child fails or is cancelled, this node fails with the child's error message.

Set output

@wf::action.output · OutputNode — label "Set output"

Does not affect control flow. Its configured value becomes the execution's final output. Place it at the end of a flow so the result isn't whatever side-effecting node happened to run last.

FieldTypeNotes
outputjsonThe value the workflow should return. Supports {{ }}, e.g. { "ticket_id": "{{ nodes.create-ticket.id }}" }.

Output: the configured value (also becomes $execution->output).


Stop

@wf::action:stop · StopNode

Ends the workflow immediately.

FieldTypeDefaultNotes
outcomeselectsuccesssuccess stops intentionally; failure terminates as an error.
messagetext(when outcome is failure) Required. Recorded as the failure reason.
outputjson(when outcome is success) Optional data to record as this node's output.

On success the execution status is Cancelled; on failure it is Failed.


Scope

@wf::action:scope · ScopeNode

Groups a run of nodes. Enters its body branch once; when the body is exhausted, traversal continues on the Scope's main edge.

FieldTypeNotes
datajsonOptional data passed into the scope; becomes the node's output. Supports {{ }}.

Branches: body, then main.


Do nothing

@wf::action.do-nothing · DoNothingNode

A no-op placeholder. No config, empty output. Useful as a join point or a stubbed step.