Skip to content

Nodes, edges & pins

When you build a flow, you’re really arranging three things: nodes, edges, and pins. You’ll mostly think in terms of “blocks and connections,” but it helps to know the proper names — especially when you want one step to use the result of an earlier one.

Node (also called a block) : A single step in your flow. One node does one thing — “Send Message,” “Create Task,” “If/Else.” Nodes run one at a time, in order.

Edge : A connection between two nodes. An edge decides what runs next: when a node finishes, its edge points to the node that should run after it. In a branching step like If/Else, different edges lead down different paths.

Pin : A named input or output on a node — the little ports where data goes in and comes out. Most pins are hidden from view; you’ll mainly meet them by name when you reference one node’s output inside another. (For example, a “Create Task” node has an output pin carrying the new task_id.)

Here’s the key idea: nodes don’t push data along the edges. Instead, each node quietly saves its outputs, and any later node can reach back and pull them in using a small template.

The template syntax looks like this:

{{ ctx.<node>.<field> }}

Read it as “from the context (ctx), take the <field> that the <node> produced.” For example:

{{ ctx.start.task_id }}

means “the ID of the task that started this flow.” You’d drop that into a message to say something like:

You've been assigned task {{ ctx.start.task_id }} — take a look when you can!

Each block type exposes specific outputs. A few you’ll use often:

BlockUseful outputs
Start (Task Created)task_id, assignee_id, priority, status, custom fields
Create Tasktask_id, assignee_id
Send Messagemessage_ids
Create Channelchannel_id
List Entries (database)entries, count
Raw HTTP Requeststatus_code, body_json, body_text
Generate Message (AI)message
Template Rendererresult