Skip to Content
FeaturesActions

Actions

Actions are the things an agent can do — not just talk. Some run during the call, when the agent decides they’re needed: booking an appointment, texting a link, transferring to a human, calling your own system. Others run automatically after every conversation: an email summary, a webhook to your CRM, a WhatsApp follow-up.

Where: open an agent → Actions. The list is split into During the call and After the call, and so is this page.

Actions are real. When the agent says “let me check availability,” it actually calls your calendar and reads back the true open slots — it won’t fabricate a booking. (See the agent’s built-in guardrails on the Agents page.)


Adding an action

Pick a type

On the agent, go to Actions → Add Action and pick one of the seven types below.

Configure it

Every action gets a short snake_case name (e.g. book_consultation) — it’s how the action shows up in logs. In-call actions also ask “When should the AI use it?” — a short sentence telling the agent when this action applies (e.g. “when the caller wants to book or reschedule”). This is how the agent knows to reach for it. After-call actions don’t need one: they always run.

Save and test

For an in-call action, make a test call and trigger it naturally (“I’d like to book an appointment”), then confirm the agent runs it and reports the real outcome. For an after-call action, end the conversation and check the email / webhook / message actually arrived.

Each action has an on/off toggle, so you can pause one without deleting it. Every run — success or failure — is logged on the conversation in Call history.


During the call

The agent decides when to run these mid-conversation, based on your “when to use it” description.

📅 Booking (Cal.com)

Check real availability and book appointments on the call.

  • Requires connecting Cal.com first in Integrations.
  • Pick the service (a Cal.com event type), a timezone (defaults to your local one), and how far ahead it’s bookable — 1–60 days, default 14.
  • On the call the agent checks open times, offers a few conversationally, takes the caller’s name (and any details), and books — then confirms the real booking reference.

After it books, two optional instant confirmations:

  • Text the caller a confirmation (on by default) — a short SMS with the service and time (“Your consultation is booked for …”), sent from your Televox phone number to the caller’s number.
  • Email the office (optional) — enter an address and every booking sends a summary email: service, time, attendee name, phone, and the booking reference.

Both confirmations are logged with the call like any other action run. The text confirmation needs a number to send to — the caller’s caller ID, or a number they gave while booking.

See it end-to-end in the AI receptionist guide.

☎️ Transfer Call

Hand the call off to a human (a real phone number) when the agent can’t or shouldn’t handle something.

  • Transfer to — the destination number in international format (e.g. +15551234567).
  • Announce message — spoken to the caller right before the hand-off. Default: “One moment please, I’m transferring you now.”
  • Working hours (optional) — a timezone, days of the week, and a from/to window. Outside those hours the agent never transfers — it offers to take a message and arrange a callback instead of ringing a dark office. Overnight windows (e.g. 18:00–02:00) are supported.

If someone on your team is watching the Live board (or reachable by push on mobile), the first time a caller asks for a human the agent holds the transfer and alerts your team to join live — it only proceeds with the phone transfer if the caller insists. See smarter escalation.

A phone transfer only works on phone calls. On web calls and WhatsApp calls (beta) the agent explains it can’t transfer and keeps helping — there, joining from the Live board is the hand-off.

💬 Send SMS

Text the caller — a confirmation, a link, directions — or text a fixed number (e.g. your front desk).

  • When to send — “During the call (AI decides)” is this section; switch it to “After the call (automatic)” and it becomes an after-call action.
  • Send to — the caller’s own number, or a fixed number.
  • Message template — optional during the call. Leave it empty and the AI writes the text from the conversation; fill it in and that exact text is always sent. In-call templates support {{caller_number}} and {{agent_number}}.
  • Sent from one of your active phone numbers.

🔌 Custom API

Call your own endpoint to look something up or submit data — check an order status, create a ticket, verify a customer. The agent sends the relevant details and uses the response in the conversation.

  • URL and method (GET, POST, PUT, PATCH, DELETE), plus optional JSON headers for auth.
  • Parameters — fields the AI fills from the conversation. Each has a name, a type, and a description (e.g. order_id — “the customer’s order number”). GET requests send them as query parameters; every other method sends them as a JSON body.
  • Response instructions — how the agent should use the reply (“Tell the caller the order status and estimated delivery date.”).

Requests time out after 10 seconds, and the agent works from roughly the first 1,500 characters of the response — return a small, speakable payload, not a full data dump.

Custom API requests are made by our servers. For your security, Televox blocks requests to internal / private addresses (an SSRF guard) — your endpoint must be a public URL.

Holding phrases (no awkward silence)

Booking, SMS, and API actions take a moment. The instant one starts, the agent speaks a brief holding message so the caller isn’t left in silence, then shares the real result. Defaults: “Sure, let me check what’s available.” (booking), “Sure, I’ll send that over now.” (SMS), “One moment while I look that up.” (API) — customize each in the action’s Holding message field. Transfer speaks its announce message instead.


After the call

These run automatically every time a conversation ends — voice calls and chats alike. No AI decision involved: if the action is enabled, it runs, and each run is logged in Call history.

Follow-ups addressed to the caller’s own number need a conversation that has one — phone calls and WhatsApp conversations do; web chats don’t, so there the run is logged as failed instead of sent. The SMS follow-up also sends from one of your phone numbers, so it’s for phone calls — for WhatsApp conversations, use the WhatsApp Message action instead.

Template variables

After-call subjects, bodies, and templates share one set of variables:

VariableValue
{{caller_number}}the caller’s number (“unknown” on web chats)
{{agent_name}}the agent that handled the conversation
{{duration}}call length, e.g. “3m 42s”
{{duration_seconds}}call length as a plain number
{{conversation_id}}the conversation’s ID (matches Call history)
{{transcript}}the full transcript
{{extracted.<field>}}one field captured by your Extractors
{{extracted_data}}all captured fields as one JSON object

📧 Send Email

Email a follow-up after every conversation — a call summary to the owner, a lead alert to sales.

  • To — one address, or several comma-separated.
  • Subject — defaults to “Call summary”.
  • Body — plain text; all the variables above work in every field.

A body like Call from {{caller_number}} ({{duration}}) + {{extracted.caller_name}} + {{transcript}} gives you a complete, skimmable record in your inbox.

🪝 Webhook

Post conversation data to any URL after every conversation — your CRM, Zapier/Make, your own backend.

  • URL and method (POST, PUT, PATCH), plus optional JSON headers.
  • Body — a JSON template, prefilled with the default below and freely editable. Text variables are JSON-escaped automatically (a multi-line transcript won’t break your JSON); {{extracted_data}} and {{duration_seconds}} are inserted as a real object / number, not strings.

Your endpoint receives (default body):

{ "event": "call.ended", "conversation_id": "8b1c9f2a-…", "agent_name": "Front Desk", "caller_number": "+15551234567", "duration_seconds": 222, "transcript": "AGENT: …\nUSER: …", "extracted_data": { "caller_name": "Jane Roe", "reason": "reschedule" } }

sent with Content-Type: application/json.

Verifying it’s really us. Every webhook carries two extra headers:

  • X-Televox-Timestamp — Unix time (seconds) when the request was signed.
  • X-Televox-Signaturesha256=<hex digest>: an HMAC-SHA256 of "<timestamp>.<raw request body>", keyed with your workspace signing secret (workspace owner: Dashboard → Team → Webhook Signing Secret).

To verify: take the timestamp header, a literal dot, and the raw body exactly as received; compute HMAC-SHA256 with your secret; compare the hex digest against the signature header (use a constant-time compare). Rejecting timestamps older than a few minutes protects against replays.

Delivery is honest but simple: one attempt, 10-second timeout. A 400+ response (or a timeout) is logged as an error — there are no automatic retries, so check Call history when a delivery matters.

🟢 WhatsApp Message

Send an approved WhatsApp template after the conversation — e.g. a booking confirmation — from the agent’s connected WhatsApp number.

  • Requires WhatsApp connected on the agent first — see the WhatsApp page. Sends fail while the WhatsApp channel is toggled off there.
  • Pick a template from your approved list (loaded live from Meta, with a link to create more in WhatsApp Manager). Templates that use named parameters or media/button variables aren’t supported yet and are hidden.
  • Send to — the caller’s own number (on WhatsApp), or a fixed number.
  • Fill each template placeholder with fixed text or variables like {{caller_number}}, {{agent_name}}, {{duration}}, {{extracted.<field>}}. Values are flattened to a single line — WhatsApp rejects multi-line parameters.

Two honesty notes: “success” in the log means Meta accepted the message — if delivery later fails (e.g. the number isn’t on WhatsApp), the log entry is updated to an error. And business-initiated WhatsApp messages require the customer’s opt-in — make sure your agent or intake flow collects it.

💬 Send SMS (automatic)

The Send SMS action with When to send set to “After the call (automatic)”. Two differences from the in-call version: the message template is required (there’s no AI in the loop to write one), and it supports all the template variables above — including {{transcript}} and extracted fields.


Best practices

  • Write the “when to use it” like an instruction to a new hire — specific triggers beat vague ones.
  • Keep results truthful — the agent reads back exactly what your action returns, so make sure your API returns clean, speakable data.
  • Start with one action. A receptionist that only books is already valuable; add SMS, transfer, and after-call follow-ups later.
  • Pair after-call actions with Extractors — a webhook or email full of captured fields is far more useful than a raw transcript.

Next steps

Last updated on