Skip to content

Coming from n8n or Zapier

This page maps your words onto ours and lists the canvas features we haven’t built.

There is a canvas: open any graph under Workflows in the console. It has a node palette, and each node’s inspector is generated from that node kind’s schema, so the fields you get are the fields the node takes. Expressions autocomplete, validation runs as you type and marks the offending node, and you can switch a graph between editing and watching a live run with the node statuses on it.

Every node has a page in the node reference: its fields, what it returns, when to use it and a graph that uses it. The ? beside a step’s kind in the inspector opens that page.

Your word Here Notes
node node trigger, http, shell, code, workflow, transform, switch, fan_out, wait, approval, event, emit, state, plus one per connector action; see the node reference
connection edge edges carry order; data comes from expressions
credential credential, or a connected account a project credential, or a Google account a member connected under Settings > Connections; resolved to auth when the request is sent, never stored in the graph
execution run one entry in the run list, with its full history
execution history run history kept per plan: 14 days on Free, 90 on Team, 365 on Business
Test workflow Try it a dry run: waits finish at once, approvals answer themselves, and nodes with outside effects are stubbed
HTTP Request node http node the palette’s Presets add one already set up for a common API
Set / Edit Fields node transform node a field table, or the JavaScript it compiles to; see Reshaping data
IF / Switch node switch node, or a node’s if:
Code node code node, or a transform code is a real script on an agent (bash, Python, JavaScript and Go on managed environments); a transform is one expression, run in the engine
Webhook node webhook trigger owns an endpoint; a manifest verifies the delivery
Schedule trigger schedule cron or interval; each tick is a fresh run
Wait node wait node waits without holding a machine, for weeks if needed
Send and Wait for Approval approval node a person answers a form; rejecting cancels the run
Google Sheets node google-sheets.* actions read rows as objects, append without duplicates on a retry, update a row by key, or work with ranges
Slack, Telegram, Matrix, SMS nodes connector actions slack.post_message, telegram.send_message, matrix.send_message, 46elks.send_sms
OpenAI / Anthropic nodes connector actions anthropic.messages, and openai-compatible.chat for any API that speaks OpenAI’s chat completions
sub-workflow child run a workflow node, or the workflow: job kind in YAML
Split In Batches / Loop Over Items fan_out, or a graph that calls itself see Repeating work
static / workflow data state cell state node, or spool state; run-scoped or shared
error workflow a run.failed handler a graph triggered by the event, like any other
expression $expr { "$expr": "nodes.fetch.output.status == 200" }, CEL
pinned data pin a step’s output, kept in your browser for editing the steps below it
Sort / Limit / Remove Duplicates / Merge transform recipes named starting points, so you pick the operation rather than write it
Execute Node run this node runs that one step for real, on its own

The canvas has templates. Here’s a workflow that waits a week:

#!/usr/bin/env bash
spool step welcome -- curl -fsS -X POST https://example.com/hooks/welcome
spool sleep 7d
spool step follow-up -- curl -fsS -X POST https://example.com/hooks/follow-up

Submit it with spool submit onboarding.sh. The run is asleep for a week without holding anything, survives restarts and deploys, and stays in the run list the whole time with what it is waiting for. See the authoring model for the few rules that apply once a workflow gets longer than this.

Waiting costs nothing. A run waiting for a timer, a signal or a bus event holds no machine, and it can wait weeks. “Wait seven days, then send the follow-up” is a line in the workflow.

Steps are memoized, so retries don’t repeat work. A completed step’s result is recorded, and a resumed run replays it instead of running it again. For dedup across separate runs (the same webhook delivered twice, two schedules picking up one record), a state node with op: add claims the key and tells you whether you were first. See Durable state.

The canvas isn’t the only way in. A graph is a document you can read and edit as JSON or YAML, and the same workflow can be a YAML pipeline in your repo or a script in your language. A branching workflow that has outgrown the canvas can move to code.

You can work against real data. Run one step on its own, pin what it returned, and edit every step below it against that: a transform shows what each field produces as you type, and offers the fields the data has. A pinned sample stays in your browser rather than in the graph, because a graph gets published and shared and the sample is a real response. See Reshaping data.

Failures are events. A failed run emits run.failed on the project bus, and a handler graph subscribed to it can notify, escalate or open a ticket. The run page also says what a run is waiting for.

  • Partial execution. You can run a single node, and rerun a finished run from a chosen node, but you can’t run an arbitrary slice of a graph from the editor.
  • Binary data. Files don’t flow between nodes yet. Artifact storage is reachable from a shell or script step with spool artifact put / get, but no node produces or consumes a file as a value.
  • A stuck-run watchdog. A run that fails tells you. A run quietly waiting for something that will never arrive doesn’t page you yet.
  • Version history. A workflow’s settings show its draft and its published version, spool workflow export <name>@3 prints any stored version, and a version can be run by number. There is no diff or rollback.
  • Your own connectors. The built-in connectors are listed with every action in the node reference. For any other service, use an http node, or a code step with the service’s SDK.