> ## 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.

# Step Types

> All thirteen step types, every field, and what each one does in a conversation

## At a glance

| Step | Waits for the user? | Sends | Exits |
| - | - | - | - |
| [Start](#start) | — | nothing | 1 |
| [Send text](#send-text) | optional | a message | 1 |
| [Send buttons](#send-buttons) | yes | a message with reply buttons or a list | one per button, AI branches, anything else |
| [Send template](#send-template) | with buttons, or optional | an approved WhatsApp template | one per quick reply, AI branches, anything else — or 1 |
| [Send media](#send-media) | optional | an image, video, audio or document | 1 |
| [Ask & save](#ask-and-save) | yes | a question | 1 |
| [Custom function](#custom-function) | optional | nothing (unless the function sends) | 2 — success, failure |
| [Update contact](#update-contact) | no | nothing | 1 |
| [Condition](#condition) | no | nothing | one per branch, otherwise |
| [Schedule call](#schedule-call) | no | nothing — places a voice call | 1 |
| [Send contact card](#send-contact-card) | no | a contact card | 1 |
| [Global intent](#global-intent) | — | nothing | 1 |
| [End](#end) | — | an optional closing message | none |

***

## Start

Where every conversation begins. It has one exit: connect it to the first step. A conversation whose messages carry no step yet starts there.

Nothing can point back into Start.

***

## Send text

One WhatsApp message.

| Field | |
| - | - |
| **Message** | **Exact text** (sent word for word, with [variables](/chat-agents/advanced/flow-builder#variables-in-exact-text) filled in) or **AI writes it** (guidance the AI writes the message from) |
| **Wait for the reply** | On: the turn ends here. Off: the flow moves straight on to the next step in the same turn |
| **Next step** | Where to go |

Use **Wait for the reply** for a question. Leave it off for a line that leads into the next step — "Let me check that for you" before a function, or a greeting before a template.

***

## Send buttons

A message with up to **3 reply buttons** of 20 characters. With a 4th button, or a title over 20 characters, it is sent as a **list** of up to 10 rows of 24 characters instead.

| Field | |
| - | - |
| **Message text** | Exact text or AI writes it. The buttons are always added by code, exactly as you typed them |
| **Buttons** | Each button's text, an optional row description (lists only, 72 characters), an optional **Also when**, and where it goes |
| **Branches the AI decides** | Branches for typed replies that are not a button — see [Branches and conditions](/chat-agents/advanced/branches-and-conditions) |
| **Anything else** | Where a reply that matches nothing goes. Left empty: the AI answers briefly and asks again |
| **Footer** | Optional, 60 characters |
| **List button** | The label of the list's menu button, 20 characters (default "Select") |

Always waits for the reply.

***

## Send template

An approved WhatsApp template — the one kind of message WhatsApp lets you send outside the 24-hour window.

| Field | |
| - | - |
| **WhatsApp template** | Any approved template on the account. Its preview shows below |
| **Variables** | A [source](/chat-agents/advanced/flow-builder#where-a-value-comes-from) for each placeholder: the media header, `{{1}}` in the header and body, and URL-button suffixes. An image, video or document header has an **Upload** button that hosts the file and fills in its link |
| **Buttons** | The template's quick-reply buttons, each a branch with an optional **Also when** |
| **Branches the AI decides** | Branches for typed replies |
| **Anything else** / **Next step** | Where the rest goes |
| **Wait for the reply** | Only when the template has no buttons and no AI branches |
| **Track link clicks** | For templates with URL buttons |

Every variable except **AI decides** is filled in by code, so a name or a link is never retyped. The AI fills only the variables marked **AI decides**, from the prompt you give each one.

> [!NOTE]
>
> A document header's file name cannot be set from a chat agent; the variable is not listed.

***

## Send media

An image, video, audio clip or document.

| Field | |
| - | - |
| **Type** | Image, Video, Audio or Document |
| **Link** | A source. As a fixed value, upload a file to get a permanent link, or paste a public `https://` link |
| **File name** | Documents only — what the user sees, with its extension |
| **Caption** | Not for audio. Up to 1,024 characters |
| **Wait for the reply** | Off by default |

WhatsApp's limits: images 5 MB (JPEG, PNG; others are converted), video 16 MB (MP4), audio 16 MB (MP3, OGG, AAC), documents 100 MB. Never put a link in a caption — it is not clickable there.

***

## Ask and save

Shown as **Ask & save** in the step menu.

Asks for one thing, checks the answer, and saves it on the contact.

| Field | |
| - | - |
| **Question** | Exact text or AI writes it |
| **Expected answer** | Any text, Email, Phone number, Number, Date or Link |
| **When the answer is not valid** | Optional, sent as is. Empty: the AI says so in its own words and asks again |
| **Save the answer to** | Optional — a contact attribute |
| **Skip when already known** | On (default): a contact who already has that attribute skips straight to the next step |

Always waits. The AI saves a valid answer with `update_contact` before moving on.

***

## Custom function

Calls one of the agent's own functions — a Python function from the **Functions** page, see [Custom Functions](/chat-agents/functions/custom-functions).

| Field | |
| - | - |
| **Function** | One of the agent's code functions |
| **How to call it** | Optional guidance for its arguments — "Pass the date the user asked for, as YYYY-MM-DD" |
| **Wait for the reply** | Turn on when the function sends a message itself (a **direct send** function, such as one that posts a payment link): the flow waits for the user's answer to that message |
| **Success** / **Failure** | Where to go. Failure means the function errored or returned an error |

The function's result can fill later steps: pick **Function result** as a source, or use `{{function_name.field}}` in exact text. A [Condition](#condition) right after it can branch on a field of the result, checked by code the moment the function returns.

***

## Update contact

Saves values on the contact's CRM record. Sends nothing.

Each row is an **attribute** and a **source**: a fixed value, another contact attribute, a field of a function result, or **AI decides** ("the city the user mentioned").

The attributes are your account's contact attributes (**Contacts → Attributes**); only attributes set to update from chat messages are written by a chat agent.

***

## Condition

Sends the conversation down one branch. Sends nothing.

Each branch is either:

* **Rule (checked by code)** — a contact attribute or a field of a function result, compared with `equals`, `does not equal`, `contains`, `is greater than`, `is less than`, `is empty` or `is not empty`. Text compares ignore case; greater and less compare numbers.
* **AI judges (prompt)** — a condition in words: "The user sounds ready to buy".

Branches are checked top to bottom; the first true one wins. **Otherwise** takes everything else. See [Branches and conditions](/chat-agents/advanced/branches-and-conditions).

***

## Schedule call

Places — or schedules — a voice call to the user with one of your voice agents.

| Field | |
| - | - |
| **Voice agent** | The agent that makes the call |
| **When to call** | Guidance for the AI. Empty: now, unless the user asked for a time |
| **Calling hours (IST)** | From / to, 0–24. A call outside them is moved to the next window, or skipped — your choice |

In Test Chat no call is placed; the AI is told what would have happened.

***

## Send contact card

Shares a contact card the user can save in one tap: first and last name, display name, phone, email, organization. It needs a name, and a phone number or an email.

***

## Global intent

A detour available **at any point** of the conversation — "asks for the price", "wants to talk to a person", "says stop".

| Field | |
| - | - |
| **When does this apply?** | The trigger, in words |
| **Next step** | The first step of the detour |

Nothing can point into a global intent; it has no input. Build its branch like any other, and leave the branch's last exit unconnected: when the detour is done, the AI returns to the step the conversation was on. End the branch with an **End** step when the detour should finish the conversation (an opt-out, for example).

***

## End

The planned flow finishes here.

| Field | |
| - | - |
| **Closing message** | Optional — exact text or AI writes it. Empty: it finishes without a message |

With follow-ups on, the conversation is marked done, so no follow-up is sent. If the user writes again, the AI helps within the persona's role and goal.


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