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

# Conditions and Values

> Branch rules, and where a step gets its values from

Many steps need a value: a template placeholder, a URL parameter, a header, an attribute to write, or the thing a branch rule tests. Each one names a **source** and, where needed, which field of it to use.

## Value sources

| Source | Gives you |
| - | - |
| **Contact** | A field from the contact's CRM record, e.g. `city` or `email`. |
| **Phone Number** | The contact's phone number. |
| **Static Value** | A fixed value you type in. |
| **Call Metadata** | Data the contact was enrolled with, plus anything the call carried. |
| **Post Call Data** | A post-call variable the agent extracted from the last call. |
| **Function Response** | A value an earlier API step returned, e.g. its `status` or a field of its `body`. |
| **Connected Call** | `true` / `false`: whether the last call was answered. |
| **Voicemail** | `true` / `false`: whether the last call went to voicemail. |
| **Hangup Reason** | Why the last call ended, e.g. user rejected or unavailable. |
| **Call Duration** | How long the last call lasted, in seconds. |
| **Conversion Status** | The outcome the agent recorded for the last call. |
| **Secret** | Headers only: one of your saved secrets. |

WhatsApp steps use the first five. API steps and Conditions use all of them.

<Note>
  The last-call sources (Connected Call, Voicemail, Hangup Reason, Call Duration, Conversion Status) are empty until a **Send Call** step has run. Put a Send Call before any Conditions step that tests them.
</Note>

**Connected** means the call was actually answered and the conversation ended normally: the same definition the call reports use, so a workflow and a report always agree about the same call.

## Branch rules

A **Conditions** step has a list of **Branch Rules**, each with its own exit, plus **Otherwise**.

* Rules are checked **top to bottom**, and the **first match** decides where the contact goes.
* **Otherwise** catches everyone who matched none of the rules. Without it, a contact who matches nothing stops at this step.

Each rule is a source, a field where needed, an operator and a value:

| Operator | True when |
| - | - |
| **is** / **is not** | The value matches, ignoring case and surrounding spaces. |
| **contains** | The value includes the text. |
| **is more than** / **is less than** | Both sides are numbers and the comparison holds. Text never matches. |
| **is empty** / **is not empty** | The value is missing or blank, or it is not. |

<Tip>
  Order rules from most specific to least. *"Connected Call is true"* placed above *"Post Call Data: interested is yes"* sends every connected contact down the first path, including the interested ones.
</Tip>

## Example: call, then follow up on WhatsApp

1. **Send Call** with your voice agent and 2 retries.
2. **Conditions**:
   * *Post Call Data → interested is yes* → **Update Contact** (`lead_stage` = `hot`) → **End**
   * *Connected Call is false* → **Send WhatsApp Template** ("Sorry we missed you") → **Wait** 1440 minutes → **Send Call** → …
   * **Otherwise** → **End**


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