Call scripts and variables
Tell a call batch's agent why it is calling and how the call should go, with each person's own details filled in from your list, written by hand or drafted with AI.
A call batch rings everyone on a list. What makes each call worth answering is that the agent knows who it is talking to: their plan, their booking, the date that matters to them. You write the call once, and each person's call is filled in from their own row when it is placed.
This happens in the Message step of a call batch. First choose the Agent that will make the calls; only published agents are listed. Then fill two fields.
| Field | What it is | Limit |
|---|---|---|
| Why is it calling? | One or two sentences. The agent opens the call with this reason. | 600 characters |
| Call script | Optional. The steps to cover, in order. | 3,000 characters |
The script is a guide, not something the agent reads out. It covers your points in your order, in its own words, answers whatever the person asks along the way, and skips a step that has already been answered. Write steps, not lines: "Confirm they still want the Tuesday slot" works better than a paragraph to recite.
Adding variables #
A variable stands for a value that differs per person. In the editor it is a highlighted chip, like a mention in a chat app.
- 1
Type @
A list of your variables appears as you type, filtered as you go. It forgives typos and shortcuts:
ddfinds Due date,renwlfinds Renewal date. Use ↑ and ↓ to move, Enter or Tab to insert, Esc to close. - 2
Or click a tag
Above the fields, every variable is shown as a tag. A click inserts it where your cursor was, in whichever field you used last.
A chip is deleted whole with one Backspace. Pasting text that already contains variables brings them back as chips.
Which variables you get #
Every call batch has phone. The rest depend on the audience:
| Audience | Variables |
|---|---|
| Uploaded list | Every column in your file, under your own header names |
| Contacts or a tag | name, phone and email from each contact |
Under the chip, what is stored is a plain token such as {{name}} or {{csv.room_number}}. The Campaigns API takes the same tokens in a voice campaign's purpose. Its audiences are contacts and tags, so there it is name, phone, email and all.
@all: everything at once #
@All details hands the agent every column for the person it is calling, under your column names, in the order of your file. Use it when many columns might matter. A guest list with the hotel, room, roommate and travel mode is a good example: you don't know in advance which one the guest will ask about.
The agent treats this as information about the person, never as instructions. A notes column that happens to read like a command is still just a note.
Name what matters, add @all for the rest
Put the one or two values the call is about in the purpose or script, like "tell them their room number is @room_number". Add @all when the agent should also be able to answer questions about everything else.
Retrying numbers that don't answer #
Below the fields, Try again if nobody answers is off by default. Turn it on and a number that rings out is called once more about two hours later, or the next morning if that would fall outside calling hours of 10:00 to 19:00. Until then the recipient shows as being tried again rather than unanswered. Nobody is called more than twice, and the second call carries the same details as the first.
Built-in safeguards #
It checks it is talking to the right person. A number on a list is not always answered by its owner. Whenever a call carries personal details, the agent opens with the reason in general terms, like "about your booking", and confirms who it is speaking to before it mentions an amount, a date, a room or an account detail. If someone else answers, it shares none of it and offers to call back.
A blank cell does not stop the call. If someone's row has no value for a variable, the agent sees it as not on file and is told never to mention or guess it. The person is still called. This is different from a WhatsApp broadcast, where a missing value skips the recipient, because a written message with a gap in it is broken and a conversation can simply move past it.
Retries and call-backs keep the details. A second attempt after no answer, or a call-back the person asked for, carries the same per-person brief as the first call.
Write with AI #
Write with AI, above the variables, drafts both fields for you. It's disabled until you choose the agent.
- 1
Describe the calls
In your own words: what the call is for, and anything the agent should offer, avoid or confirm.
- 2
Pick a style
Professional: clear and courteous. Friendly: warm and relaxed. Empathetic: patient and reassuring, for dues, health or complaints.
- 3
Review the draft
You see the purpose and a numbered script, with your variables as chips. Try again, go back with Change the description, or Use this to fill both fields. If the fields already have text the button reads Replace what's there. Nothing changes until you press it.
Press Ctrl+Enter (⌘+Enter on a Mac) in the description to write without reaching for the mouse.
The AI reads your column names and your list's first five rows so it can tell a date column from an amount column. It never copies anyone's values into the script, and a draft that looks like it did is flagged. It is grounded in what your agent knows about your business. It uses only variables your list actually has: anything else it tries to use is removed, and the draft tells you so. Choose the agent first, because the draft uses what that agent knows.
Check it before you launch #
The review step shows what the agent will be told, in two views: As written, with chips, and For your first recipient, with their real values filled in. Reading the second one is the fastest way to spot a variable pointing at the wrong column.
After launch, the campaign page shows the same brief, and each call's record shows the reason it was placed, filled in for that person.
A variable your list doesn't have
If the purpose or script uses a column the list doesn't have (for example after swapping in a different file), the editor flags it in red and the step won't continue. The API refuses it too, with unknown_variable and the token it could not fill. Remove the chip or upload a list with that column.