Building a workflow
Opening an automation takes over the screen with the builder: a node canvas on the right, a palette or inspector on the left, and a toolbar across the top. It stays open on top of your workspace; there is no separate page or tab.
Quick overview
- Create or open an automation to enter the builder.
- Drag a node from the palette onto the canvas.
- Drag from a node's connector to the next node to link them.
- Click a node to open its settings in the left panel.
- Click Validate, then Test to run it once, or Activate to go live.
Detailed reference
Layout
| Region | What it holds |
|---|---|
| Icon rail (far left) | Three views: Flow (the canvas), Settings (per-automation options), Activity (run history). |
| Left panel | The node palette when nothing is selected, or the selected node's settings when one is. The two swap in place. |
| Canvas | The graph itself: a grid background, pan and zoom, a minimap, and zoom controls. |
| Toolbar | Exit, the automation's name and autosave status, undo and redo, Validate, a status pill, and Test / Activate / Pause. |
The node palette
The left panel's palette has a search box and three tabs matching the node catalog: Triggers, Actions, and Rules, each grouped into smaller subcategories (for example Design, AI, or Notification under Actions). Drag any node onto the canvas to place it; see Nodes for the full catalog.
Connecting nodes
Drag from a node's bottom connector to the top of the next node to link them. A trigger has no input; an exit node has no output. Condition-style nodes (like If) expose two connectors, one for each branch, so you wire a "yes" path and a "no" path separately.
Configuring a node
Click a node to swap the left panel to its inspector: a title, a short description, and its fields.
| Field type | Rendered as |
|---|---|
| Text | A single-line input |
| Textarea | A multi-line input, for prompts and longer content |
| Number | A numeric input, with min and max where relevant |
| Select | A dropdown; some (like folders) load your live workspace data |
| Boolean | A toggle switch |
| Part picker | A button that opens the part picker described below |
Picking a project part
Some action nodes, starting with Pick a part, need a specific piece of a project rather than a whole design. The picker is a two-step overlay above the builder: choose a project first, then a part inside it, a page, a frame, or a slide, with a live preview thumbnail per project. Once picked, an Open in editor link jumps straight to that exact part.
Per-node error handling
Every node's inspector has two tabs: Parameters, the fields covered above, and Settings, which only shows options for action-kind nodes (triggers and logic nodes have nothing to configure here, since they have no side effect to retry):
| Setting | Does |
|---|---|
| On error | Continue swallows the failure and moves on, Stop the run fails the whole run, Route to an error output adds a second, red "Hata" connector out of the node so you can wire a dedicated failure path |
| Retry (0-5) | Re-attempts the same step this many times before falling through to the On error behavior |
| Wait (ms) | How long to pause between retry attempts |
| Note | A free-text note on the node, for your own reference; it has no effect on execution |
A node left on the default Continue just logs an error step and moves the run forward as if nothing happened, so an unreachable webhook or a bounced email does not by itself stop the rest of the graph.
The Settings view
The icon rail's Settings view holds options for the whole automation, saved with the draft:
| Group | Setting | Does |
|---|---|---|
| Execution | Concurrency | Free (many runs at once), Single at a time, Skip if busy, or Queue up to a cap |
| Execution | Max concurrent | The queue's cap, only shown in Queue mode |
| Execution | Max run duration | A run older than this many seconds is auto-failed, even mid-delay |
| Execution | Priority | Higher-priority automations' runs are advanced first when the engine has a backlog |
| Error | Default on-error behavior | Continue or Stop, used by any node that has not set its own On error |
| Error | Error notifications | In-app, email, and/or Slack, sent when a run fails |
| Error | Error automation | Another automation to start (fire-and-forget) whenever this one fails |
| Error | Circuit breaker | Auto-pauses the automation after this many runs fail back to back |
| Scheduling | Quiet hours | A start/end time window (in the automation's timezone) during which triggers are deferred rather than fired |
| Scheduling | Debounce | A minimum gap enforced between fires, on top of any debounce set on the trigger node itself |
| Data & retention | Save execution data | All step logs, errors only, or none, a privacy/storage trade-off |
| Data & retention | Run history retention | Finished runs older than this many days are deleted automatically; empty keeps everything |
None of this is checked by Validate, only the graph itself is; a nonsensical setting (like a Queue cap of 0) simply behaves conservatively rather than blocking Activate.
Toolbar controls
| Control | Does |
|---|---|
| Exit | Closes the builder and returns to the overview. |
| Name + status text | Shows the automation's name and whether it is saved, saving, or failed to save. |
| Undo / Redo | Steps back and forward through your edits to the graph. |
| Validate | Checks the graph and lists errors and warnings inline, under the toolbar. |
| Status pill | Draft, Active, Paused, or Error, at a glance. |
| Test | Saves, then runs the graph once immediately. See Running and monitoring. |
| Activate / Pause | Publishes and goes live, or stops listening without losing the draft. |
Keyboard shortcuts
| Shortcut | Action |
|---|---|
Delete / Backspace | Delete the selected node (and its connected edges) |
Ctrl/Cmd + Z | Undo |
Ctrl/Cmd + Shift + Z (or Ctrl+Y) | Redo |
Ctrl/Cmd + C / V | Copy and paste the selected node |
Ctrl/Cmd + D | Duplicate the selected node |
Dragged nodes snap to a grid, and dragging on empty canvas box-selects multiple nodes at once.
Step by step
These build complete, real automations from nodes that run for real today (see Nodes for which ones do). Anchors below are linked from other pages.
Walkthrough: a scheduled AI digest, by email
- Drag a Scheduled trigger onto the canvas (Triggers tab, Zaman group). Open its inspector and set Frequency: pick Weekly for a fixed day, Interval plus an "Every (minutes)" value for a tight cadence, or Cron with a raw cron expression and a timezone for exact control (see Triggers).
- Drag a Generate copy node from Actions > AI and connect the trigger's connector to it. Open its inspector and write a prompt, for example "Write 3 short social post ideas for this week, one line each." This step runs through whatever AI provider key you've connected under Settings > AI; without one, it logs a skipped step instead of failing the run.
- Drag a Send email node from Actions > Notification and connect Generate copy to it. Set To to your address, Subject to something like "This week's post ideas," and Body to
{{ context.__aiText }}so it carries the AI step's output through. - Click Validate, fix anything it flags (a common one: To or Subject left blank), then click Test. Open the Activity view and confirm the AI step produced text and the email step shows
ok(or a clear skipped reason if no SMTP connection or AI key is configured yet). - Click Activate. It now runs itself on the schedule you configured; you do not need to keep the app open.
Walkthrough: webhook intake with an AI reply
- Drag an Incoming webhook trigger onto the canvas. Its inbound URL is built from the automation's own id (
/api/workflow/hook/<automation id>); there is no copy-URL button in the builder yet, so find the id from the network requests the page already makes (for example the browser's dev tools while the builder is open) rather than expecting it printed on the node. Optionally set an HMAC secret so only requests carrying a valid signature are accepted. - Point an external form tool, CRM, or chat widget at that URL as its webhook target, with a JSON body such as
{ "email": "...", "message": "..." }. - Drag a Set a variable node after the trigger to normalize a field you will reuse, for example key
customerEmail, value{{ context.email }}. - Drag a Generate copy node after it with a prompt like
Write a short, friendly reply to: {{ context.message }}. - Drag a Slack / Discord node, paste your channel's incoming webhook URL, and set the message to
New submission from {{ context.customerEmail }}: {{ context.__aiText }}. - Validate, then Test with a sample JSON body (any HTTP client, or your tool's own "send test event" button works, since it just needs to
POSTthe webhook URL). Check Activity, then Activate.
Walkthrough: branch on a condition after a save
- Start from a Design updated trigger; of the design/workspace event triggers, this is the one the app fires automatically today, whenever a design is saved (see Triggers).
- Drag on Pick a part so later steps have something concrete to act on; open the part picker and choose a project, then a page, frame, or slide inside it.
- Drag on a Condition (yes/no) node. Its inspector builds a rule (a field, a comparison such as equals or contains, and a value) rather than a raw typed expression; either side of the rule can pull from the run's context.
- On the yes branch, add an In-app notification telling your team the part is ready for review. On the no branch, add a Write an audit entry step so the pass-through case is still recorded.
- Validate, then Test; Test runs immediately regardless of the trigger, so you can try both branches without actually saving a design. Confirm both paths show up correctly in Activity, then Activate.
Troubleshooting
- A node's Settings tab looks empty. Only action-kind nodes have an On error / Retry / Note tab. Triggers and logic nodes (Condition, Filter, Delay, Set a variable, and similar) have no side effect to retry, so their Settings tab has nothing but the Note field.
- I set "Route to an error output" but there's nowhere to connect the failure path. A second, red connector only appears on the node itself after you flip that setting; look at the bottom of the node again; the new "Hata" handle sits next to the normal output.
- Copy/paste (
Ctrl/Cmd+C/V) seems to have done nothing. The pasted copy lands a little offset from the original, at a small random jitter, not exactly on top of it; look just below and to the right of the source node. - Validate is clean but Activate still fails. Activate re-validates and publishes in one step; if a field depends on live data (like a folder that has since been deleted), it can fail at that moment even though Validate looked fine a minute earlier. Re-open the failing node's inspector and re-pick the value.
- A required field shows an error I can't find. Validate's message names the node and field, but the inspector only shows fields whose
displayIfcondition is currently met; a field can be required yet hidden if a different field controls its visibility (for example the HTTP node's body only appears once a body-carrying method is chosen).
Tips
Validate before you activate
Validation catches an empty graph, more than one trigger, a required field left blank, a dangling connection, or an unwired branch, before you try to go live.
Changes save on their own
Edits autosave a moment after you stop typing or moving something; the toolbar's status text confirms it. There is no separate save button.
Deleting a node removes its edges
There is no separate step to clean up connections; deleting a node takes any edges touching it with it.