Skip to main content

Voice Calls & Scheduling

Erdo agents can place real outbound phone calls on your behalf. You tell an agent who to call and what to accomplish; it dials out, holds a natural spoken conversation, and reports back with a transcript. If the call involves scheduling, the agent can check your calendar availability live and book the meeting before hanging up.
A call is always you asking an agent to make it — in chat, the agent proposes the call and you approve it before anything dials out. Erdo never places calls on its own.
Voice agents answer with calm, concise speech on website conversations and phone calls. You can choose a different voice for each configured language. The voice picker includes voices already in the deployment’s ElevenLabs account as well as shared-library voices. Existing voices and configured languages carry forward when an agent upgrades. Erdo-created voice agents use the house voices by default: Matilda for every language except Spanish, which uses Ana María. You can pick another voice when you want a particular accent or delivery.

Choosing the voice model

Every voice agent runs Realtime Max unless you choose otherwise. In Agents → Deployments, you can pick one of these for a website widget or phone deployment:
  • Realtime Max (default): a low-latency conversation model, tuned together with the speech recognition and the voice, that reasons before it answers. It replies fastest and looks facts up in your knowledge before stating them.
  • Realtime Mini: a lighter, cheaper version of Realtime Max for plain conversation.
  • Standard: Erdo’s own conversational model between the same speech recognition and voice. Slower to reply.
All three use the agent’s brief, knowledge, tools and voice in the same way, so switching changes how quickly it answers, not what it knows or how it sounds. Agents also start drafting a reply before the caller has quite finished speaking, and drop the draft if the caller keeps going. This shortens the pause before each answer. Your prompt, voices, languages, knowledge and tools stay the same whichever model you pick. A website widget that shares an agent with a phone line follows the phone line’s setting; change it on the phone deployment. You can also change the setting with erdo voice agents realtime-model <slug> <off|mini|max> or erdo voice widgets realtime-model <widget> <off|mini|max>, or with POST /v1/voice/agents/{slug}/realtime-model and POST /v1/voice/widgets/{widget}/realtime-model. MCP clients can use erdo_set_voice_agent_realtime_model and erdo_set_voice_widget_realtime_model. Voice MCP tools are in the voice toolset, so a connection with the curated list on does not list them. Add X-Erdo-MCP-Toolsets: voice, or ?toolsets=voice on the MCP URL. See Toolsets.

What you can do

  • Qualify or follow up with a lead — “Call this number, confirm they still want a demo, and note their timeline.”
  • Confirm a detail — “Call the venue and check they have availability for 40 people on the 14th.”
  • Book a meeting on the call — “Call this lead and, if they’re interested, book a 30-minute intro on my calendar this week.”

Before you start

Booking uses the calendar of the person who asked for the call — yours. The agent checks your availability and creates the event on your calendar, adding the person you called as a guest. If your Google Calendar isn’t connected, an agent asked to book will tell you to connect it first (and won’t place the call), so connect it up front when scheduling is the goal.

Connect your calendar

1

Open Settings → Connectors

Find Google Calendar in the connector list.
2

Connect and authorize

Sign in with Google and approve calendar access. That’s it — the connection is per user, so each person who wants the agent to book on their behalf connects their own calendar.

Make a call

Just ask an agent in chat. Give it the number, what to say, and — for compliance — why the call is allowed (an opt-in, an existing relationship, an internal test, etc.). For scheduling, mention it explicitly and include the recipient’s email if you want them invited.
“Call +1 555 010 0142 (Jordan at Acme). Confirm they’re still interested in the pilot, and if so book a 30-minute intro on my calendar sometime next week. They opted in on our site. Invite jordan@acme.com.”
The agent will:
1

Propose the call for your approval

You see who it will call and why, and approve before it dials.
2

Hold the conversation

It introduces itself as an AI assistant, follows your instructions, and asks one thing at a time.
3

Check availability and book (if scheduling)

It reads your real free/busy times, offers slots that actually work, and creates the calendar event with the recipient invited.
4

Report back

Ask for the transcript afterward — “What did they say on the call?” — to see exactly what happened.

Calling is compliance-gated

Voice calls are held to the same standard as SMS: a call is blocked before it dials — and never charged — if the recipient has opted out or is on your organization’s do-not-call list, or if it falls outside your organization’s configured calling hours. Suppression is per-organization, and a number can be added to it directly (an opted-out or DNC number never needs to be given a compliance reason again — the agent is simply told it can’t be called). Calling hours are shared with SMS — configure them once and both channels respect them — but opt-out/DNC, consent, and rate limits are tracked per channel: opting out of SMS does not by itself suppress voice calls to that number, and vice versa. To stop all outreach to a recipient, suppress them on each channel you use.

The recording notice

Every outbound call to a US or Canadian number (including Puerto Rico and the other US territories) tells the person it may be recorded. Straight after the opening line, the agent says “This call may be recorded for quality assurance.”, so it is the second or third sentence they hear. The notice is said in the call’s language when you pass language (an ISO 639-1 code such as es) with the opening line: English, Spanish, Portuguese, French, Italian, German and Russian are covered, and any other language hears it in English. Erdo adds it to every such call the voice agent places, whether a chat agent or the lead playbook asked for it, so you never need to put it in a call’s instructions. A call you place yourself from your organization’s number is not covered. Calls to numbers anywhere else open without it. When you place a call with an opening line of your own, keep it to one or two sentences saying who is calling and why, and leave the question for after the notice.

Give an agent its own phone number (inbound calls)

Open Agents → Deployments to see voice runtimes and phone numbers alongside the agent’s website deployments. Choose Voice or phone there to start guided setup for an existing agent; Erdo will help cast the language and voice before it creates anything. By default a voice agent places outbound calls from Erdo’s shared number. If you want an agent to receive calls too, ask Erdo to give it its own phone number — “give my Sofia agent a phone number”. Erdo buys a number, assigns it to that agent, and from then on calls to it are answered by that agent (and it also becomes the agent’s outbound caller ID). It’s approval-gated, since it adds a number to your account. Agents running on your own connected voice provider account are the exception — assign a number to those in that account directly. Releasing a number is approval-gated too: it can’t be undone, so the approval card names the exact number about to go (read live from the agent, not from the conversation) before anything is released. If you want a number in a particular area code, say so — “give Sofia a 305 number” — rather than releasing and re-buying: buying and releasing numbers in quick succession can get the account temporarily blocked from buying more, and Erdo will tell you if that happens rather than keep trying. Calls that come in on that number are kept, the same way the calls your agent places are: who called, how long it lasted, a summary, and the full transcript. On an inbound call the agent knows it is on the phone and already has the caller’s number from caller ID, so it asks for their name but never for the number they dialled from, and takes an email only when they want something sent. On an outbound call it never asks, because you already told Erdo who to reach. When the caller is done, the agent says goodbye and hangs up rather than waiting on silence. Someone who has been in touch before is recognised by their number: the agent greets them by the name they gave and picks up from what they asked, whether that was on an earlier call or in SMS or WhatsApp messages to the same number. Someone your agent called who rings the number back is recognised too: the agent greets them by the name you called them by and treats it as a callback (“Hi Dana, thanks for calling us back”), and if they say a different name it uses theirs. For a caller it can name, that greeting replaces your agent’s usual opening line on the call, in English, Spanish or Portuguese; agents set up in other languages keep their usual opening and use the name from the next line. A text works the same way: it knows about their earlier calls, and about messages on the other channel. See Phone Call Records for how to read them from chat, the CLI, the API, or an MCP client. An inbound call is also saved as a lead. Someone who dials your number wants something from you, so every call that arrives with a caller ID becomes a row in your leads dataset — phone from the caller ID, name and email when the caller gave them, and the call’s summary saying why they rang. The row carries source = phone_incoming_call, so callers are distinguishable from the leads your landing pages and website widget capture in the same table, and a repeat call from the same number merges into that caller’s existing lead rather than duplicating it. Which dataset receives them is a setting on the phone deployment (Agents → Deployments → the phone runtime → Save leads) — a dataset you pick, else your organization’s leads dataset when you have exactly one, else a “Widget leads” dataset Erdo creates for you. Turn it off there and calls are still recorded, just not written as leads. Outbound calls never produce a lead: you already knew who you were calling. See An inbound caller becomes a lead.

Greetings, languages, voices and guardrails

The phone runtime’s card on Agents → Deployments has an Edit button (organization admins). It edits:
  • Greetings — one per language: what the agent says when someone calls the number. Follow-up calls the agent places open with a line written for that call instead; a call you ask for in chat does too whenever it was given an opening line, and falls back to this greeting only when it was not.
  • Languages — which languages the agent answers in, and which one a call starts in (the default language, listed first).
  • Voices — the voice each language is spoken in.
  • Guardrails — the compliance rules the agent must always follow.
Saving changes only what you edited; the agent’s instructions, transfer rule, business hours, lead saving, texting and booking settings are left exactly as they were. The agent’s name and instructions are edited on the Agents page. You can also ask Erdo in chat to change the agent — for example “make the phone agent offer a tour at the end of every call”. Erdo reads the agent’s current setup first and changes only what you asked for: its voices, greetings, guardrails and labels stay as they are unless you ask to change them, and the approval card shows the update before it goes live.

Texting the number

The same number receives texts, and your agent answers them — from that number, with the same persona and the same knowledge it uses on a call. Texts are grouped as one conversation per person rather than as loose messages, with STOP and START honored the way they are for outbound SMS. Answering is on by default for an agent that has a number. The switch is on Agents → Deployments beside the number, or ask in chat (“stop my Ana agent answering texts”); with it off, texts still arrive and are still readable, the agent just does not write back. One thing has to happen first: US carriers require a local number to be registered before it can SEND texts, so until that is done your agent reads texts and cannot reply — Erdo puts an item in your work feed telling you so. Anything that stops replies this way — an unregistered number, a conversation that has had its day’s replies, an empty credit balance — clears itself from the feed as soon as a reply gets through, so what is listed is what is still true. The same switch is reachable outside the app: POST /v1/voice/agents/{slug}/sms-replies with {"enabled": false}, erdo voice agents sms-replies <slug> --off from the CLI, and the MCP tool erdo_set_voice_agent_sms_replies — all three take the agent’s slug, need organization admin access, and change nothing else about the agent. See Incoming texts for how a reply is written, the 24-hour posture, and how to read a conversation. Receiving works from the day the number exists. Replying additionally needs the number cleared by US carriers, which is a one-off business-details form and an approval rather than anything technical — Registering a Number for Texts walks through it, and erdo voice numbers list shows where each of your numbers stands.

Booking meetings on the line’s calls

A phone line can let callers book a meeting on a connected calendar of your organization’s choosing, including on the calls the follow-up engine places to your leads. Turn it on in the line’s Booking section. See Booking Meetings on Phone Calls.

Call a lead yourself, from your organization’s number

Your team can also place a call themselves: Erdo rings their own phone, they press 1, and it dials the lead — from your organization’s number, with the call recorded and transcribed like any other. See Calling a Lead. It is the opposite of the live transfer below, where the agent is already on a call and hands it over.

Live-transfer a call to a real person

You can have an agent’s calls hand off to one of your team’s own phone numbers when it makes sense — a qualified lead who wants to talk to someone, or anyone who explicitly asks for a person. Ask Erdo to set it up in chat, on the voice agent you want it for:
“For my Sofia agent, transfer the call to +1 555 010 0199 whenever the caller is a qualified lead asking to speak with someone, during business hours — 9am-6pm Eastern, Monday through Friday.”
Give Erdo the destination number and describe, in your own words, when it should transfer — including any hours you want it limited to. The agent checks that condition itself during the call, so phrase it the way you’d explain it to a new team member.
By default the agent introduces the handoff to your team member before connecting the caller (“warm transfer”) — ask for a direct connect with no announcement instead if you’d rather it just connect the call silently.
If your team member doesn’t pick up, or the transfer doesn’t go through, the agent doesn’t just hang up — it comes back on the line, apologizes, and takes a message (name, callback number, and what they need) so nothing gets lost. This only applies to phone calls the agent places or receives — not the chat widget on your website, which has no phone line to transfer to.

Business hours for calls INTO your number

By default, transfer is available always — any call, any hour. That’s the right default for most teams: the number a caller reaches is usually your own staff’s direct line, and they’d rather have every qualified call handed to them than miss one because it landed at 7pm. If you’d rather restrict it, ask Erdo to gate transfer to real business hours for calls that dial your agent’s own number directly (the number from “give my Sofia agent a phone number” above — for example, one printed on a landing page). This is an explicit opt-in — Erdo enforces your calling hours for real, rather than relying on the agent’s own sense of time:
“For my Sofia agent, only transfer during business hours — 9am to 6pm Eastern, Monday through Friday.”
Give Erdo the timezone and hours (and which days, if it’s not every day). Erdo checks the real time against that window at the moment each call comes in and tells the agent whether your team is open — the agent never has to guess or calculate it. Outside those hours, the agent never transfers, even if the caller insists or would otherwise qualify — it takes a message instead, the same way it does when nobody picks up (and the same way it does under the always-available default, any time your team simply doesn’t answer). This hours check applies to calls made to your agent’s number, and only when you’ve opted into it. Calls your agent places on your behalf still transfer purely on the condition you described above — describe any hours restriction for those calls in that condition’s wording, as before.

Good to know

  • Consent matters. Every call needs a stated reason it’s permitted; the agent won’t place a call without one. If the person asks not to be called again, the agent acknowledges it and ends the call.
  • The agent never claims to be human. It identifies as an AI assistant.
  • Booking won’t guess. If the agent can’t read your calendar (not connected, or access revoked), it tells you rather than booking over your existing events.
  • One calendar per call. Availability and the booked event belong to whoever asked for the call — not the person being called.

Troubleshooting