Build and connect data
- Choose a manual, scheduled, GitHub, or source-upload trigger.
- Add HTTP, AI, Slack, email, condition, switch, Set, For each, Sequence, Retry, or Call workflow nodes.
- Connect execution order on the canvas.
- Select a node. Its settings open on the Configuration tab. A setting that can take its value from an earlier step shows a port mark beside its name: type a value, insert fields from earlier steps by typing
{{or with the braces button beside the box, or wire the port on the canvas. An inserted field shows as a pill naming its step and field; a red pill names a step that does not run before this one. Backspace removes a pill whole. On the canvas, each pill draws a thin dashed line from the field it reads to the setting’s port; it cannot be selected or moved. Data wires are thin solid lines, and the connections that decide the order steps run in are thicker. A wired setting shows which step feeds it. - Review the Outputs tab for expected fields. Test results show actual redacted values.
Summary: {{ nodes.summarize.text }}. Missing required values stop the action. Fields from a conditional branch need an optional binding or fallback because that branch may be skipped.
HTTP JSON responses have an unknown shape until you declare output fields such as json.items with type array. Samples help discover fields but do not guarantee their presence. HTTP bodies can be structured JSON; binding resolution happens before serialization, so quotes and line breaks remain valid JSON. AI nodes can declare structured json.* output fields.
Loops and branching
For each requires an array. Connect Each item to the body, select the body nodes in the inspector, and connect Done to the next step. Body nodes can read the loop’sitem and index. Configure collected output bindings to expose iterationOutputs after the loop. Items run sequentially; an empty array follows Done with an empty result. Nested loops are not supported.
Sequence runs multiple downstream paths in a fixed order. Add named outputs on the node, connect one path to each output handle, and list the outputs in the order they should run. The workflow finishes the first path completely before starting the next. Use it when later steps must wait for earlier paths to finish, for example sending Slack before email.
Retry wraps steps that may fail with transient errors. Connect Attempt to the body (same body-selection pattern as For each). Connect Succeeded when the body finishes without a retryable failure, or Exhausted when all attempts are used. Defaults are 3 attempts, a 1 second initial delay, 2× backoff, and jitter; the cap is 10 attempts. Only configured error codes retry (defaults include HTTP and node execution failures). Delays between attempts use durable backoff so runs survive restarts.
Retry bodies cannot nest another Retry or For each. When the body calls Slack, email, AI, or non-idempotent HTTP actions, enable Acknowledge duplicate risk in the Retry configuration, or make HTTP calls idempotent (GET, or a custom Idempotency-Key header on POST). Publish validation blocks non-idempotent retry bodies without that acknowledgement. Retry outputs include attemptNumber, exhausted, and optional lastErrorCode / lastErrorMessage.
Conditions use true/false connections. Switches use case/default connections. Action failures can stop, continue with a visible handled error, or select an error branch. A merge waits for all incoming connections to settle and runs if any is selected.
End the run on purpose
Use Stop, Return, and Fail when a branch should finish the workflow without running every downstream step.
These nodes have no outgoing execution edges. When one runs on a parallel path, unsettled sibling branches are cancelled so later steps do not keep executing.
Call reusable workflows
Call workflow runs a pinned published version of another visual workflow as a subworkflow. Use it to share a reviewed branch (validation, notifications, enrichment) across many parent workflows without copying nodes.Make a workflow reusable
A published workflow appears in the Call workflow picker only when it defines a stable contract:- Use a Manual trigger only. Scheduled, GitHub, and source-upload triggers are not reusable.
- On the trigger’s Outputs tab, declare output fields (
pathand type). These paths are the subworkflow inputs callers must supply. - Add a Return node and declare named outputs with types. Every Return on the canvas must expose the same output set. These fields are what the Call workflow step exposes to downstream nodes.
- Publish the workflow. Callers pin a specific version number; changing the draft does not affect runs until you publish again.
Call from a parent workflow
- Add Call workflow and select the reusable workflow and version.
- Wire each
value.<fieldId>input on the canvas from upstream data, or use the Configuration tab rows that say to connect on the canvas. Input and output field IDs and types must match the target workflow’s published contract at publish time. - Use the step’s success output paths (
value.<outputId>) like any other step. Configure On error the same way as HTTP or Slack steps.
Undo and redo edits
Undo and Redo in the editor header walk back and forward through your edits in order. You can also press Ctrl+Z and Ctrl+Shift+Z (⌘Z and ⌘⇧Z on a Mac). Hover either button to see which edit it applies to. Each of these is one step:- Adding a step, or removing one together with its connections.
- Connecting or disconnecting two steps.
- Moving a step. A drag counts once, when you drop it.
- Changing a step’s settings or its type. Typing in one setting is grouped into a single step.
- Renaming the workflow.
Build with the assistant
Select Configure with assistant in the editor header to describe what the workflow should do in your own words. The assistant opens beside the canvas and changes the draft directly: it adds and removes steps, connects them, fills in their settings, and renames the workflow. Each request it carries out is one step that Undo takes back, after asking. Steps it adds are marked with a violet band until you select them. The assistant writes values the way you would on the Configuration tab, including fields of earlier steps such as{{ nodes.notify_slack.sent }}. It tells you about any reference that cannot be read when the step runs.
It leaves some things to you: picking a Slack channel, credential, connection, project, repository, or the workflow a Call workflow step runs; filling each step’s Test tab; and saving, testing, and publishing. Its conversation for a workflow is yours alone and stays with that workflow.
Test, save, and publish
Tests use test data unless you choose otherwise. A test follows the same bindings, branches, and loops as a real run. Set the values a test uses on the Test tab of the trigger and of each step that calls out: HTTP, AI, Slack, email, content sync, and Call workflow. The trigger’s values are its sample event. A step’s values are what it returns in place of doing its work. Other steps, such as If, Set fields, Wait, and Merge, work out their own results from their inputs. Nothing is made up. A test does not start while a value it needs is empty, and it names the first one and opens its Test tab. Fill with examples writes example values that you can see and change, and Use last run copies the step’s output from the last test. In the run history, Use as test data copies a past run’s values into every step. After a test, hover over a pin to see the value that passed through it. On a step’s Test tab you can also choose:- In a test run: Run for real. The step calls out for real when you test: requests are sent, content is generated, and messages are delivered. A broadcast mark on the step shows it on the canvas. Its test data is kept for when you switch back to Use test data.
- Outcome: Fails. The step fails with the error code and message you give instead of returning its test data. What follows depends on its On error setting: the test stops, goes on, or takes the step’s error path.
Credentials
Create or select an organization credential for HTTP authentication. Sensitive header and body fields can reference a credential using a destination such asheaders.X-API-Key or body.token. Do not place credentials in URLs or literal authentication fields. Slack and email use the existing organization connections.

