Action nodes
Log
@wf::action.log · LogNode
Writes a message to the Laravel log at the chosen level.
| Field | Type | Default | Notes |
|---|---|---|---|
level | select | info | debug, info, warning, error. |
message | text | — | Required. Supports {{ expressions }}. |
Output: { "level": "info", "message": "<resolved message>" }
HTTP request
@wf::http:request · HttpRequestNode
Makes an outbound HTTP request with Laravel's HTTP client.
| Field | Type | Default | Notes |
|---|---|---|---|
url | text | — | Required. Supports {{ }}. |
method | select | get | get, post, put, patch, delete, head. |
headers | json | — | Map of header name → value. |
query | json | — | Map of query-string parameters. |
body | json | — | JSON request body. (when method is post/put/patch/delete) |
timeout | number | 30 | Seconds. |
fail_on_error | checkbox | true | When 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_erroris 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.
| Field | Type | Default | Notes |
|---|---|---|---|
waitType | select | duration | duration (relative), date (absolute), or webhook (wait for a call). |
duration | number | 60 | (when waitType is duration) Amount to wait. |
units | select | seconds | (when waitType is duration) seconds, hours, days. |
until | text | — | (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: webhookand thedateoption are part of Wait v2, the current version. Workflows already saved against v1 (which offered onlydurationand anuntiloption) keep running on v1 unchanged — see Node versioning.php artisan workflow:buildbuilds new Wait nodes as v2 automatically. In a hand-written definition, set the type to@wf::action:wait{v2}— the bare@wf::action:wait(andWaitNode::type()) still resolves to v1.
Call workflow
@wf::action:call-workflow · CallWorkflowNode
Runs another workflow as a child of this one.
| Field | Type | Default | Notes |
|---|---|---|---|
workflow | select | — | Required. The child workflow's id (must have a Manual trigger). |
response_mode | select | immediately | immediately = queue the child and continue right away (fire-and-forget). last_node = wait for the child, then continue with its output. |
payload | group | — | Values passed to the child as its trigger payload. |
A workflow saved before
response_modeexisted behaves aslast_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.
| Field | Type | Notes |
|---|---|---|
output | json | The 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.
| Field | Type | Default | Notes |
|---|---|---|---|
outcome | select | success | success stops intentionally; failure terminates as an error. |
message | text | — | (when outcome is failure) Required. Recorded as the failure reason. |
output | json | — | (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.
| Field | Type | Notes |
|---|---|---|
data | json | Optional 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.