Actions
Actions let your assistant do more than talk: look up a customer before the call starts, check stock during the conversation, and send an email, SMS or webhook once it ends. This article explains how actions work and which building blocks you have to hand.
Where to find actions
You manage actions per assistant, on the Tasks tab, under Actions in the editor. That is where you create them and switch them on or off. If an action should apply to more assistants, set it up on each of them.
To create an action:
- Open the assistant, go to the Tasks tab, open Actions and click Add new.
- Choose the type: Email, SMS, HTTP request, Google Sheets or WhatsApp.
- Give the action a name. For an HTTP request or Google Sheets, choose the timing under When: Before the call (HTTP request only), During the conversation or After the conversation. Email, SMS and WhatsApp always run after the conversation.
- Fill in the settings.
- Optionally add a condition (not for an action before the call) and, for an action after the conversation, custom variables.
There is no save button: the action saves automatically once its fields are valid. An action without a name is not saved, nor is an HTTP request without a valid URL or a Google Sheets action without a Spreadsheet id. A WhatsApp action also needs a Template name and a valid Team number, and a custom variable or parameter needs a valid name. If one is missing, you get an error message and your changes to the assistant stay unsaved until you fill it in.
Duplicate on an action's row copies that action with a new id and a name ending in “(copy)”.
Three timings
| Timing | What happens | Available types |
|---|---|---|
| Before the call | Once an inbound phone call has been answered, before the greeting, the platform sends an HTTP request to your system. The response becomes context for the assistant: it already knows the caller's name, or whether there is an unpaid invoice. | HTTP request, CRM (look up the caller) |
| During the conversation | The action becomes a tool the assistant can use itself whenever the condition is met. Think of looking up a customer, checking stock or creating a ticket. The response is handed back to the assistant, who uses it straight away in the conversation. | HTTP request, Google Sheets (look up rows or append a row) |
| After the conversation | Shortly after the conversation has ended, it is post-processed: the summary and your custom variables are worked out and the actions run one after the other. | Email, SMS, WhatsApp template, HTTP request, Google Sheets (append a row), CRM (note, contact and deal) |
An HTTP request before the call only runs on inbound phone calls, not on outbound calls, SMS, WhatsApp or webchat. Your system has to answer within 3 seconds with a JSON object, otherwise the call proceeds without that context. See HTTP request action. A CRM task before the call also looks the customer up on outbound calls, SMS and WhatsApp, and in the webchat once the customer has confirmed their number with a code.
An SMS, WhatsApp or chat conversation ends when the assistant closes it, when someone clicks End conversation in the Inbox, or after a time without activity: on webchat the assistant's Inactivity timeout (60 minutes by default), on SMS and WhatsApp 6 hours, and with your team only 18 hours after the last message, never while the customer waits for an answer. Only then do the actions after the conversation run.
A WhatsApp action sends a template message to a verified team number, never to the customer, and only works when WhatsApp is connected on this assistant. You verify the number with a code in the action itself.
Conditions
For an action during or after the conversation, write, in plain language, when the action applies. The AI model reads this sentence and decides accordingly.
For tools during the conversation, the field is called When should the assistant use this?. It describes when the assistant should use the tool. Leave it empty and the assistant goes by the action's name alone. For example:
- "When the caller mentions their customer number."
- "When the caller asks whether a part is in stock."
- "When the caller wants to report a fault and has given their address."
For actions after the conversation, the field is called Under what condition should this run after the conversation?. It decides whether the action runs at all. Leave it empty and the action runs after every conversation. Otherwise, for example:
- "Only if the caller wanted to book an appointment."
- "Only if it was an emergency."
- "Only if the caller was not transferred to a team member."
For an action before the call, the condition is not used: that action runs on every conversation it can run on (see above) while it is switched on. The field stays visible, with the wording for an action after the conversation, but whatever you type there has no effect.
Put the condition on the action, not in the prompt
It is tempting to write "send an email if …" in the prompt. That does not work: the prompt shapes how the assistant talks, the condition decides whether an action runs. Keep the prompt clean and put the logic in the action's condition.
Variables
In templates (subject, body, URL, headers, request body, columns) you use variables that are filled automatically with data from the conversation. These built-in variables are available in actions after the conversation:
| Variable | Meaning |
|---|---|
personNumber | The caller's number (or, for outbound calls, the number that was called). Empty for webchat, because the widget and the chat page do not pass on a phone number |
agentNumber | Your platform number the call came in on or was placed from. Empty for webchat |
conversationId | Unique id of the conversation |
conversationLink | Direct link to the conversation in the Inbox |
startTimestamp | Start time of the conversation (ISO 8601, e.g. 2026-09-11T14:32:10.000Z) |
direction | inbound or outbound |
channel | voice (phone call), sms, whatsapp or webchat |
durationSeconds | Length of the conversation in seconds (0 for SMS, WhatsApp and webchat) |
disconnectReason | Technical code for why the phone call ended, for example completed, transferred or user_busy. Empty for SMS, WhatsApp and webchat |
summary | Summary of the conversation, written by the AI model |
plainTranscript | Full transcript as plain text |
audioLink | Link to the conversation in the Inbox, where you can listen to the recording. This is not a link to an audio file. Empty if there is no recording; recordings are deleted after 30 days |
outcome | Outcome, as a code: resolved, transferred, appointment_booked, callback_requested, voicemail, abandoned, no_interaction or spam |
assistant.name | Name of the assistant that handled the conversation |
company.name | Your business name |
company.website, company.phone, company.email | Your website and the phone number and e-mail address for customers. Empty if you have not filled them in |
company.address | Your address, only when you share it with customers. Otherwise empty |
contact.name | Name of the contact, if the number was recognised under Customers → Contacts when the conversation started, or if the contact was created from this conversation. Empty for webchat, and for outbound calls to a number that is already a contact |
contact.company | The contact's company, if known. Empty in the same cases as contact.name |
inboundContext.<field> | Any field your system returned before the call, e.g. inboundContext.customerId |
At the other moments you have different variables:
- Before the call:
fromNumber,toNumber,personNumber,agentNumberand thecompanyvariables from the table. - During the conversation: the values the assistant fills in under Parameters the assistant fills. You have that field on an HTTP request and on Look up rows (during the call) in Google Sheets. Built-in variables such as
personNumberandconversationIdstay empty here. If you need the caller's number, for example, make it a parameter. A Google Sheets action that adds a row during the conversation does not have this field: its columns can then only use fixed text and the variables from a campaign or the API. If you want data from the conversation in the row, choose After the conversation.
For a call from a campaign or through the API, the variables passed along with it are also available during and after the conversation.
Custom variables
Want to capture something that is not on the list, such as the postcode or the type of fault? Define a custom variable on an action after the conversation, under Custom variables to extract. Each custom variable has:
| Setting | Meaning | Default |
|---|---|---|
| Variable name | The name you use in templates, e.g. postcode. Starts with a letter and otherwise contains only letters, digits and _ | — |
| Type | string (text), number or boolean (yes/no) | string |
| Description for the assistant | The explanation the AI model uses to extract the value from the conversation | — |
After the conversation, the AI model reads the transcript and fills each custom variable based on its description. You can then use the value in every action that runs after that conversation. Example: name postcode, type string, description "The postcode of the caller's address".
Tips:
- Write a precise description. "The address" is vague; "Only the postcode of the address where the fault is, e.g. SW1A 1AA" gives better results.
- Prefer a built-in variable when one exists. Do not create a custom
phoneNumber; usepersonNumber. - If something is not mentioned in the conversation, the variable stays empty, even if you ticked required. That stops the model from guessing.
Template syntax
Put a variable in a template between double curly braces: {{summary}}. Nested fields use a dot: {{contact.name}}, {{company.name}}, {{inboundContext.customerId}}. Custom variables work the same way: {{postcode}}.
Unknown or empty variables are replaced with an empty string, so the template always works. An example email body:
New conversation via {{channel}} on {{startTimestamp}}
Caller: {{contact.name}} ({{personNumber}})
Outcome: {{outcome}}
Postcode: {{postcode}}
Summary:
{{summary}}
View the conversation: {{conversationLink}}See results
The result of every action after the conversation is stored with the conversation. Open a conversation in the Inbox and expand Technical details. Under What the actions did you see each action's name, with a short technical line in English. The name is red if the action failed and green if no error occurred. So green does not always mean something was sent, because a skipped action is green too. Check the technical line as well:
sent to office@example.comorHTTP 200: the action ran. If there is no number aftersent to, nothing was sent. That happens with an SMS to the caller after a webchat, because no phone number is known there.HTTP 401:with the start of the response: the action failed and the name is red.skipped: ...: nothing was sent. For exampleskipped: condition not metwhen the condition did not apply, but alsoskipped: no recipient,skipped: email sender not configured,skipped: business has no SMS-capable number or sender nameorskipped: empty textwhen something is missing.
That is how you quickly check that your email went out, or why a webhook returned a 401. More about the Inbox in Inbox & analytics.
Actions before the call and during the conversation are not in this list. What was fetched before the call is under Details looked up before the call. The values of your custom variables are under Details from the conversation.