Building and editing workflows. Each one is a canvas you place nodes on and join up.
Data is referenced in one language
Wherever you need a value from somewhere else, it is written in one of three shapes:
{{trigger.…}}— data the trigger brought with it.{{steps.<node id>.…}}— the output of a node that has already run.{{vars.…}}— variables you have defined on the workflow itself.
The picker beside each field inserts these at the cursor, so none of it has to be remembered.
A dry run is deliberately incomplete
In a dry run only actions with no outside effect are actually performed. No email is sent, no invoice is created, no outbound request is made.
Skipped nodes produce no output at all, and where a later node referenced one, it is reported as unresolved rather than filled in with an invented value.
So a dry run proves the path and the shape of the data; it does not stand in for a real run.
A node tries once unless told otherwise
The default is a single attempt. Automatic retry is something you turn on deliberately, with the number of attempts and the gap between them set on that node.
The default is deliberate: retrying an action that moves money or sends a message can do that thing several times.
Failure can be given a path
Any node can have an "on error" branch. A failure that follows it is a designed path rather than a breakage — and it is not recorded among the dead letters either.
Node timeouts
Each node has its own timeout; without one, the workflow's timeout and finally the default apply. A stuck node never waits forever.
The rate of execution can be held back
There are three independent levers on a workflow, all off by default:
- Max concurrent — never more than this many runs in flight at once.
- Throttle — at least this long between two starts.
- Debounce — collapse a burst of triggers into one run carrying the freshest data.
A run held back by these is recorded as skipped; it does not vanish quietly.