Skip to main content
Visual workflows compose fixed automation steps on a canvas. Open Automations → Visual workflows to create or inspect a workflow. If it is unavailable, ask your administrator or support about workspace access.

Build and connect data

  1. Choose a manual, scheduled, GitHub, or source-upload trigger.
  2. Add HTTP, AI, Slack, email, condition, switch, Set, For each, Sequence, Retry, or Call workflow nodes.
  3. Connect execution order on the canvas.
  4. 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.
  5. Review the Outputs tab for expected fields. Test results show actual redacted values.
Direct field bindings preserve objects, arrays, numbers, booleans, and null. Templates produce text, for example 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’s item 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:
  1. Use a Manual trigger only. Scheduled, GitHub, and source-upload triggers are not reusable.
  2. On the trigger’s Outputs tab, declare output fields (path and type). These paths are the subworkflow inputs callers must supply.
  3. 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.
  4. 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

  1. Add Call workflow and select the reusable workflow and version.
  2. 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.
  3. Use the step’s success output paths (value.<outputId>) like any other step. Configure On error the same way as HTTP or Slack steps.
Publish validation blocks missing workflows, wrong versions, contract mismatches, direct recursion, and call chains deeper than eight levels. Mock a Call workflow step on its Test tab like other steps that call out.

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.
When an undo or redo changes the settings of a step whose settings panel is closed, a notice names the change and offers the way back. A step that appears or changes without you selecting it, for example one that an undo brings back, has a violet band until you select it. Undo and redo change the draft on the canvas only. Nothing is saved or published until you select Save or Publish. The history is cleared when you reload or leave the page, and the editor does not warn you about unsaved changes, so save before you leave.

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.
Before a test in which any step runs for real, the editor lists those steps and asks you to confirm. It also names any of them that use test data from a mocked step, because such a step acts for real on test values. In Test settings beside Test workflow, you can see how many steps run for real and set all of them to use test data or to run for real at once. When every step runs for real, the test is a live run, in which Wait steps really wait. A test never publishes your draft. Test data and these choices are saved with the draft when you select Save. They are never published. Save updates the draft. Publish validates and activates an immutable version. Active workflows continue using the published version while you edit or test. Concurrent changes return a conflict rather than overwrite another editor’s work. Pause prevents new automatic runs; it does not cancel existing runs.

Credentials

Create or select an organization credential for HTTP authentication. Sensitive header and body fields can reference a credential using a destination such as headers.X-API-Key or body.token. Do not place credentials in URLs or literal authentication fields. Slack and email use the existing organization connections.

Inspect and recover runs

Open a historical run to see its executed graph, version, mock/live mode, and node details independently of the current draft. In a test run, the steps that ran for real are marked. Details include redacted inputs and outputs, errors, iterations, and attempts. Skipped, blocked, cancelled, handled-error, and needs-attention states remain visible. Cancel stops further steps and supported requests. An external action may already have completed. If a run needs attention, inspect the provider before retrying: retry requires acknowledgement that an uncertain action might be duplicated. Successful completed actions are retained during recovery.

Limits

A workflow supports 200 nodes, 400 connections, 100 loop items, and 1,000 execution steps. HTTP requests time out after 30 seconds, AI requests after 120 seconds, and a run after 15 minutes. HTTP responses must fit the shared security size limit and contain valid JSON when declared as JSON. Arbitrary code nodes, nested loops, and nested retry regions are not supported.