Execute Workflow (core.execute_workflow)
Call another workflow like a function: input items become the child's
trigger items, and (in wait mode) the child's final output becomes this
node's output. Compose big automations from small, testable pieces.
Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
workflow_id | picker | — | The child workflow (same environment). The picker lists what you're allowed to see. |
mode | wait | fire_and_forget | wait | wait: run the child and continue with its output. fire_and_forget: enqueue it and pass your input through untouched. |
Behavior
The child should start with a Sub-workflow trigger — your items arrive
there verbatim, binary attachments included. In wait mode the child runs
inline, gets its own execution row (linked to the parent — the executions
page shows the parent → child relationship, child rows badged "sub"), and
its successful leaf-node items come back as this node's output. If the child
fails, this node fails with the child's execution id in the error details.
fire_and_forget enqueues the child as an independent run (it gets live
events and its own error-workflow handling) and immediately passes your
input through.
Quirks & tips
- Recursion is guarded: cycles are refused, and nesting deeper than 3 levels fails with a clear error.
- Same environment only — a workflow id from another environment reads as "not found".
- Deleting a child workflow later makes this node fail at run time; the save-time validator only catches ids that never existed.
- An imported n8n
executeWorkflownode lands here with an empty workflow id — n8n ids don't transfer; re-pick the child (the import report reminds you). - Child runs respect their own limits, but the parent's
max_durationwall clock keeps ticking while it waits.
Related
- Sub-workflow trigger — the child's entry point.
- Error trigger — a workflow-level catch for failing children run in
fire_and_forget. - Loop Over Items — call a child per batch.