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

# Best practices

> Patterns that make flows reliable in production

## Label like you're writing tool descriptions

Because edge labels literally become LLM tool descriptions, write them as **conditions from the caller's perspective**:

* ✅ `caller confirms they are an existing customer`
* ✅ `caller wants to cancel or reschedule`
* ❌ `yes`, `path A`, `continue`

Make sibling labels **mutually exclusive** and cover the realistic cases. If two labels overlap, routing becomes a coin flip.

## Keep agents small and single-purpose

One agent = one job (qualify, answer billing questions, book). Short, focused instructions per agent outperform one mega-agent with a wall of text. Handoffs are cheap — use them.

## Validate data with collect nodes, not prompts

Emails and phone numbers transcribed from speech are noisy. `collect` nodes confirm and validate ("Was that m-e-y-e-r?") and only proceed on success. Always name the **variable** clearly (`callback_phone`, not `var1`) — those names surface in webhooks and call details.

## Design the failure paths

* Give `collect` nodes a `failed` edge that leads somewhere sensible (a human transfer or a polite goodbye).
* Set warm-transfer `fallback` deliberately: `continue` for optional handovers, `cold_transfer` when the caller *must* reach someone.
* End every branch with an `end` node with a proper farewell.

## Test with web calls, watch the events

Run [test calls from the browser](/quickstart#2-test-it-with-a-web-call) after each change. In the call detail view, the event log shows node transitions, tool calls, collect results, and transfer outcomes — read it like a stack trace when the flow misbehaves.

## Use async tools for anything slower than \~2 seconds

Synchronous tool calls freeze the conversation. Mark slow webhooks `async` and configure filler phrases; the assistant stays responsive while the request runs. See the [tool node](/flow-builder/nodes#tool).

## Start from the prompt, graduate to the flow

Prototype behavior with a plain [system prompt](/assistants/overview) first. When the call develops distinct phases or needs guaranteed data capture, move that structure into a flow — agent nodes with empty instructions inherit the system prompt, so migration is incremental.
