Skip to main content
Actions let your agent do things during a conversation — book a meeting, transfer a call, send an email, post to Slack, or call an external API. Configure actions from the Actions tab. Each action has a condition that tells the agent when to use it. Write it in plain language, like “When the contact wants to book an appointment” or “When the caller asks to speak with a manager”.

Calendar booking

Book meetings on your connected calendar during a call or chat. Setup:
  1. Connect a calendar provider in Settings > Integrations (Google Calendar, Calendly, Cal.com, or GoHighLevel)
  2. Add a calendar action on the Actions tab
  3. Set the condition, select the provider, and choose the calendar
Configuration:
FieldDescription
NameAction display name
ConditionWhen the agent should offer booking
Calendar typeGoogle Calendar, Calendly, Cal.com, or LeadConnector
Calendar IDWhich specific calendar to use
TimezoneIANA timezone, or leave blank to let the AI ask the contact
The agent checks real-time availability and books directly on your calendar. The default booking flow (asking for the contact’s timezone, offering a couple of slots at a time, collecting name + email only after a slot is selected) lives in your agent’s prompt and is fully editable. See Calendar booking instructions to customize it.

Call transfer

Transfer a live call to a human or another phone number. Transfer types:
TypeDescription
WarmThe agent introduces the caller before connecting them
ColdThe agent connects the caller directly without introduction
Configuration:
FieldDescription
NameTransfer target name (e.g., “Sales Team”)
ConditionWhen to transfer (e.g., “Caller asks for a human”)
Transfer typeWarm or Cold
Phone numberE.164 format destination number
Transfer sentenceThe exact sentence the agent speaks immediately before connecting the call. Use this to set the right language, tone, and any handoff context (e.g., “Un momento, le paso con un agente.”).
The agent speaks the Transfer sentence exactly as configured, in whatever language you write it. There is no hard-coded English fallback — if you leave the field blank, the agent stays silent through the handoff. Set the sentence in the language your callers speak.

Email

Send an email during or after a conversation. Requires: A verified email domain in Settings > Integrations > Email. Configuration:
FieldDescription
NameAction name
ConditionWhen to send
From nameSender display name
From addressEmail local part (domain comes from your email integration)
SubjectEmail subject (supports {{contact.X}} variables)
BodyThe email content. Supports {{contact.X}} variables and the dynamic variable picker.
Recipient typeContact’s email, a specific address, or ask the contact

Confirming recipient on voice calls

When the agent triggers Email during a live voice call, it does not send blindly. Before dispatching the email it confirms two things out loud with the caller:
  1. Recipient name — who the email is for. If the contact record on file has a name, the agent confirms that name. If there is no contact yet, the agent collects the name from the caller.
  2. Destination email address — the address to send to. The agent reads it back character-by-character (including domain) and asks the caller to confirm before sending.
If the caller corrects either value, the agent uses the corrected value and asks for confirmation again. The email is only sent after explicit confirmation. This same flow runs whether the caller is an existing contact or a brand-new one — for new contacts, both the name and the email are collected during the call and saved on the contact record afterwards.

Slack message

Post a message to a Slack channel during a conversation. Requires: Slack connected in Settings > Integrations > Slack. Configuration:
FieldDescription
NameAction name
ConditionWhen to send
ChannelWhich Slack channel to post to
MessageSlack message body. Supports {{contact.X}} variables and the dynamic variable picker.

SMS

Send a text message to a contact during a conversation. Configuration:
FieldDescription
NameAction name
ConditionWhen to send
MessageSMS content. Supports {{contact.X}} variables and the dynamic variable picker.

Confirming recipient on voice calls

When the agent triggers SMS during a live voice call, it confirms the recipient before sending:
  1. Recipient name — who the SMS is for. If the contact has a name on file, the agent confirms it; if there is no contact yet, the agent asks for the name.
  2. Destination phone number — the agent reads back the phone number digit-by-digit (including country code) and asks the caller to confirm before sending.
If the caller corrects either value, the agent uses the new value and re-confirms. The SMS is only sent after explicit confirmation. For brand-new contacts, the name and phone collected during this flow are saved on the contact record afterwards.

Custom action

Call any external API during a conversation. Use this to look up data, update records, or trigger actions in systems that don’t have a native integration. Configuration:
FieldDescription
NameAction name
ConditionWhen to trigger
MethodGET, POST, PUT, PATCH, or DELETE
URLThe endpoint to call
ParametersNamed parameters the agent collects from the conversation
Auth typeNone, Bearer token, API key, or Basic auth
HeadersCustom HTTP headers
How parameters work: Define parameters with a name and description. The agent gathers the required information from the conversation and includes it in the API call. For example, a parameter named order_number with description “The customer’s order number” tells the agent to ask for and extract that value.

Request format

When the action triggers, the voice engine sends an HTTP request to your configured URL. The request body contains a message object with the tool call details and the parameters the agent extracted from the conversation. Example request:
POST https://your-api.com/check-order
Content-Type: application/json
Authorization: Bearer your-secret-token

{
  "message": {
    "toolCallList": [
      {
        "id": "test_call_id",
        "type": "function",
        "function": {
          "name": "check_order",
          "arguments": {
            "order_number": "ORD-12345",
            "customer_name": "John Doe"
          }
        }
      }
    ]
  }
}
The toolCallList array contains one object per tool call. Each tool call includes:
FieldTypeDescription
idstringUnique identifier for this tool call
typestringAlways "function"
function.namestringThe action name (lowercased, spaces replaced with underscores)
function.argumentsobjectKey-value pairs where each key matches a parameter name you defined, and the value is what the agent extracted from the conversation
Headers sent with the request:
Auth typeHeader added
Bearer tokenAuthorization: Bearer {your token}
API keyX-API-Key: {your key}
Basic authAuthorization: Basic {your credentials}
Any custom headers you configured are also included.

Response format

Your endpoint must return a JSON response. The agent reads the response and uses it to continue the conversation. Successful response (200):
{
  "results": [
    {
      "toolCallId": "test_call_id",
      "result": "Order ORD-12345 is currently in transit and expected to arrive on January 20th."
    }
  ]
}
The results array should contain one object with:
FieldTypeDescription
toolCallIdstringThe tool call ID from the request (echo it back)
resultstringThe information the agent should use in the conversation
The agent takes the result string and incorporates it into its response to the contact. Keep the result concise and factual — the agent will phrase it naturally. Error response: If something goes wrong, return an error message in the result. The agent will handle it gracefully:
{
  "results": [
    {
      "toolCallId": "test_call_id",
      "result": "Error: Order not found."
    }
  ]
}
The action executes synchronously — the call pauses briefly while waiting for your endpoint to respond. Keep your endpoint fast (under a few seconds) to avoid awkward silence during the call.

Managing actions

  • Click Add to create a new action
  • Use the kebab (...) menu on each action to Edit, Duplicate, or Delete it
  • Toggle Active/Inactive on each action to enable or disable it without deleting

Duplicate

Duplicating clones an existing action as a starting point for a new one. Available on every action type, but most useful for custom actions — most teams build a small set of similar custom actions (same auth, similar headers, similar URL patterns) and duplicating saves rewriting that boilerplate. The duplicated action:
  • Is created inactive — toggle it on once you’ve finished editing.
  • Gets a new name with ” (copy)” appended; rename it before saving.
  • Copies every field: condition, method, URL, parameters, auth type, headers, and any provider-specific settings.
  • Is independent of the original — editing one does not affect the other.