> ## Documentation Index
> Fetch the complete documentation index at: https://docs.persistence.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Flow nodes

> Configure every node type on a Persistence conversation flow.

The canvas toolbar adds nodes in this order: **Conversation**, **Condition**, **Function**, **MCP**, **Extract**, **Transfer call**, and **End call**. The start node is already on the canvas.

Click a node to expand it. Compact mode keeps unselected nodes collapsed.

## Start

The start node is the entry of every flow. It is not in the toolbar.

| Control | What it does |
| - | - |
| **Agent** starts first | The agent speaks after the pause. |
| **User** starts first | The caller speaks first. If they stay silent, the agent starts after the silence timeout. |
| Pause | 0–60 seconds, in 0.5 second steps. |

Connect start to the first conversation or action.

## Conversation

Use **Conversation** for one stage of the call: greet, qualify, collect a field, or confirm.

| Control | What it does |
| - | - |
| Node name | Shown on the canvas. Name the stage, not the whole agent. |
| **Speak exact message** | Off: the node prompt describes what the agent should say. On: the agent speaks the text as written. |
| Prompt field | Placeholder is **Describe what the agent should say...** or **Enter the exact message to speak...** |
| **Transitions** | Add **Prompt**, **Condition (if)**, **Else**, **Before user response**, or **After user response**. |

Keep one goal per conversation node. Move tool calls to **Function** or **MCP**, and stored values to **Extract**.

## Condition

**Condition** routes silently. It does not speak.

Add one or more rules, then choose **Any** or **All** of the following conditions match.

| Operator | Meaning |
| - | - |
| Equals / Does not equal | Exact comparison |
| Greater than / Less than / Greater than or equal / Less than or equal | Numeric comparison |
| Contains / Does not contain | Text containment |
| Is present / Does not exist | Existence checks |

Use a variable reference in the field. Always add an **Else** edge.

## Function

**Function** runs a configured HTTP function when the call enters the node, then branches on the result.

Open the node to set method, URL, headers, and body. Reference [secrets](/accounts/secrets) instead of pasting tokens.

Default transition labels:

| Transition | When it fires |
| - | - |
| **Prompt transition** | Model decides the next node from the response. |
| **If...** | A rule on the response or a variable matches. |
| **If failed to call** | The HTTP request did not succeed. |

Give every function a failure edge. Do not rely on the model to recover from a timeout.

## MCP

**MCP** runs a tool from a configured MCP server. Configure the server URL, headers, query parameters, timeout, and the tool this node may call.

Treat MCP like any other privileged integration: grant the smallest useful tool set and verify authentication and failure behavior. See [Actions and tools](/build/actions#mcp-servers).

## Extract

**Extract Variables** stores values from the conversation for later nodes, prompts, and post-call work.

Add variables with a name, description, and type:

| Type | Use it for |
| - | - |
| **text** | Names, IDs, free-form answers |
| **number** | Amounts, counts, scores |
| **boolean** | Yes/no flags |
| **date** | Dates the later steps must parse |

Transition labels:

| Transition | When it fires |
| - | - |
| **Prompt transition** | Extraction succeeded and the model routes onward. |
| **If...** | A rule on an extracted value matches. |
| **If failed** | The node could not extract the required values. |

Extract before a condition that depends on the value.

## Transfer call

**Transfer call** hands the live call to a destination. Configure routing in the node. A destination can be a phone number, SIP URI, or supported dynamic variable.

Warm vs cold transfer, SIP invite vs SIP refer, caller ID, ring duration, and custom SIP headers follow the same rules as the [Transfer call action](/build/actions). This node is terminal unless you intentionally continue after a failed transfer.

## End call

**End call** hangs up at a defined terminal point. Use it for successful completion, a hard stop, or a fallback that should not transfer.

Do not leave hanging conversation nodes with no transfer or end edge.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.