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.
Vocabulary
Section titled “Vocabulary”| 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 |
A first workflow
Section titled “A first workflow”The canvas has templates. Here’s a workflow that waits a week:
#!/usr/bin/env bashspool step welcome -- curl -fsS -X POST https://example.com/hooks/welcomespool sleep 7dspool step follow-up -- curl -fsS -X POST https://example.com/hooks/follow-upSubmit 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, retries and failures
Section titled “Waiting, retries and failures”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.
What we haven’t built
Section titled “What we haven’t built”- 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>@3prints 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
httpnode, or acodestep with the service’s SDK.