Skip to main content
A transition (edge) connects two nodes and tells the agent when to move from one to the other. The editor supports three trigger types: Intent (LLM-evaluated), Rule (deterministic expression), and Always (unconditional).

Creating a transition

A selected node on the canvas showing three outgoing intent transitions with condition labels
Method 1 — drag from a node handle Click a node to reveal its output handle (the circle on its bottom edge). Drag from the handle onto another node. The Create transition form opens. Method 2 — from the node inspector Open the node inspector for a source node. Click Transition at the top of the inspector. The Create transition form opens.

Create transition form


Trigger types

Intent (LLM-evaluated)

The routing LLM reads the condition text and decides whether the customer’s last message matches it.
The condition text becomes the tool description passed to the routing LLM. Write it as a factual statement about what should have happened, not as an instruction.
Make conditions specific and mutually exclusive. “Customer is interested” is ambiguous; “Customer confirms they want to proceed with purchase” is not.

Rule (expression)

Edge inspector showing the Rule expression builder with AND logic, a condition row for recipient_data.current_hour with the eq operator, and an Add Condition button
A rule-based check on context variables. Fires instantly before the routing LLM runs — zero latency, zero LLM cost. The expression builder in the edge inspector has:
  • Logic: AND (all conditions must be true) or OR (any one is enough)
  • Conditions: one or more rows, each with a variable, operator, and value
Built-in variables available in every expression (populated automatically per call): You can also reference any variable captured via transition parameters (see Inline data extraction) or passed in recipient_data when the call was created. Example — route to transfer after 2 failed attempts on a node: Set _node_turns gte 2. Example — route to after-hours node outside 10 AM–6 PM: Logic: OR
  • recipient_data.current_hour lt 10
  • recipient_data.current_hour gte 18

Always (unconditional)

Takes this transition on every routing evaluation, regardless of what the user said. Use when a node has exactly one possible next step.
An Always transition fires before the routing LLM runs. If a node has both an Intent transition and an Always transition, the Always transition fires first and the Intent transition never evaluates. To prevent this, give the Always transition a higher priority number (e.g. 101) so the Intent transitions are evaluated first.

Event

A fourth trigger type — Event — fires only when a matching external event arrives via the Bolna REST API, not during speech routing. It is used for payment webhooks, form submissions, and other external signals. See Event injection for the full reference.

Edge inspector

Click any transition arrow on the canvas to open the edge inspector.

Fields

Priority

When a node has multiple deterministic transitions (Rule or Always), they are evaluated in ascending priority order. The first one that matches fires. Use distinct priorities to make evaluation order explicit — e.g. priority 0 for the retry escalation check, priority 1 for the after-hours check.

Parameters (inline data extraction)

Intent transitions can capture typed values from the user’s reply during routing. Add a parameter name and type (e.g. order_id: string). After the transition fires, the value is available as {order_id} in node prompts and as a variable in expression rules. To add parameters, expand the Advanced (optional) accordion in the edge inspector and use the Extract parameters section — see Inline data extraction.

Deleting a transition

From the canvas: Click the transition arrow to select it, then click the Delete button in the edge inspector. From the node inspector: In the Transitions list at the bottom of the node inspector, click the trash icon on the row for the transition you want to remove.

Transition display on the canvas

The canvas draws a bezier curve for each transition with a label in the middle. When two nodes have multiple transitions between them (parallel edges), the curves are offset horizontally so they don’t overlap. Each curve shows the condition text (or “Always” for unconditional edges) as a label.