IVR Studio
"Press 1 for your booking." Ask the caller for a reference, look it up in your own system while they wait, and read the answer back in a real voice.
TL;DR
- What it is — a visual builder for call flows. A flow is a diagram of steps: play something, collect digits, check a condition, call your API, then route. Drafts are private until you publish, and you can test one against a pretend caller without dialling in.
- Who it's for — admins who have outgrown a fixed menu tree — anyone whose callers ask questions the answer to which lives in another system.
- Top outcome — callers who used to wait for an agent to look something up now hear the answer in seconds, and the ones who still need a person arrive at the right team already identified.
At a glance
| Plan tier | Included with every Lodgestory Voice plan. |
| Who can manage | Account Owners and Admins build and publish flows. Callers experience them. |
| Caller input | Keypad only — digits 0–9, * and #. Speaking an answer is not supported yet. |
| Step types | Play, Menu, Collect digits, Language, Set value, Condition, Business hours, Caller lookup, Fetch data, Send WhatsApp, and routing to a department, agent, extension, external number, voicemail, AI agent, another flow, a classic menu, or hang up. |
| Voices | Text-to-speech in the voice you choose, per language, or your own uploaded audio. |
| Versions | Every publish is a numbered version. The live version keeps answering calls while you edit the draft. |
| Testing | A built-in simulator runs the flow against a pretend caller, with your API calls either live or mocked. |
| Limits | 500 steps per flow. A flow may hand a call to another flow, up to a small chain depth. |
How to find it
Sidebar: Settings → Calling → [your account] → IVR Studio.
Direct URLs:
- Flow list:
/crm/settings/calling/{accountId}/ivr-flows - Flow builder:
/crm/settings/calling/{accountId}/ivr-flows/{flowId}
📸 [SCREENSHOT: ivrstudio-list.png — flow list with LIVE and DRAFT badges and the "Used by" line]
IVR Studio or Voice Menus?
Both are supported and they sit on separate tabs. Neither replaces the other, and a flow can hand a call to a classic menu.
| Voice Menus (classic) | IVR Studio | |
|---|---|---|
| Shape | A tree of menus and keys | A diagram of steps |
| Caller input | One keypress per menu | One keypress, or a multi-digit entry like a booking number |
| Can it look something up? | No | Yes — your own API, mid-call |
| Can it say something it was not told in advance? | No | Yes |
| Editing safety | Saves apply immediately | Drafts are private until published |
| Testing | Place a real call | Simulator, no call needed |
Use Voice Menus when the whole job is "send this caller to the right team."
Use IVR Studio when the caller needs to be asked something, recognised, or told something that changes call to call.
Building a flow
1. Start from a template, or empty
The list page offers templates for the common shapes — a reception menu, a booking lookup, an after-hours flow. Each opens as an ordinary draft you can rewire. Nothing you do reaches a caller until you publish.
2. Drag steps onto the canvas
Each step has exits — the ways a caller can leave it. A Menu has one per key, plus separate exits for nothing pressed and wrong key. Connect every exit you care about: an unconnected exit on a live flow is silence on an open line, so publishing refuses until they lead somewhere.
📸 [SCREENSHOT: ivrstudio-canvas.png — canvas with a menu, a collect step and a fetch step wired together]
3. Write what the caller hears
Any prompt can be typed text spoken by a chosen voice, or a file from your media library. Text can include values picked up earlier in the call, and you can control how each one is read aloud:
| Say it as | LMV-8821 becomes | Use it for |
|---|---|---|
| Reference | "L M V, 8 8 2 1" | booking and order numbers |
| Digits | "8 8 2 1" | codes, PINs, room numbers |
| Number | "eighty-eight twenty-one" | counts and quantities |
| Money | "two lakh fifty thousand rupees" | amounts, in Indian or Western grouping |
| Date / Time | "the twentieth of September" | check-in dates, appointment times |
| Phone | read in the local grouping | numbers read back to the caller |
Prompts can have a version per language. A Language step early in the flow lets the caller choose, and every later prompt follows that choice automatically — so one flow serves every language instead of a parallel copy per language.
4. Ask for something
Collect digits takes a multi-digit entry — a booking reference, a room number, an order id — with a minimum and maximum length and an optional read-back: "I heard 8 8 2 1. Press 1 if that is right, 2 to enter it again." On a keypad that read-back is what stops a mistyped digit sending someone down the wrong path.
Mark a value sensitive and it is masked everywhere afterwards — in the call's journey, in webhooks, and in logs.
5. Look something up
Fetch data calls one of the APIs already saved under Settings → APIs. Under What to send it the step lists every part of that API a call can fill: any {{blank}} the API declares, the :segment parts of its address, its query parameters and its body fields (for POST, PUT and PATCH). Put a call value in any of them — {{ caller.number }} for the number the call came from, {{ vars.bookingId }} for digits a Collect step gathered — and it replaces the value the API was saved with, on this flow only. Leave a field empty to keep what the API has; a value that turns out empty on a call is sent empty, never the saved sample. You can also add query or body fields the API does not list yet, and a body field that is exactly one {{ value }} keeps that value's type. Then map fields of the response onto names you can use later. Every step after it can branch on what came back, or read it aloud. The simulator shows exactly what each lookup sent.
Caller lookup recognises the caller from your CRM contacts before they press anything — so the flow can greet them by name, take a VIP straight to a person, or refuse a blocked number.
If the lookup fails or times out, the flow takes its failure exit. Callers never hear the difference between "we could not reach the system" and dead air unless you write a prompt for it, so write one.
6. Decide and route
Condition compares values and takes the first matching branch. Business hours follows one of your schedules and has an exit for Open, Closed, each named period and — optionally — Holiday. Without a Holiday exit, holiday callers take Closed. The step reads the schedule's own time zone, not the flow's, and respects Close now. Then route the call — to a department queue, a specific agent, an extension, an outside number, voicemail, an AI voice agent, another flow, or a classic menu.
Send WhatsApp messages the caller an approved template while they are still on the line — a payment link, directions, a confirmation. The call carries on without waiting for it, and the message respects the same opt-out and daily limits as every other automated message you send.
Testing before anyone calls
Open Simulate in the builder, enter a pretend caller number and press keys. You see each prompt with real values filled in, which branch was taken and why, and how long each step took.
A flow with a Business hours step can be tested for any moment: tick Test business hours as if it were another time and enter a date and time — the evening of a holiday, a Sunday morning. They are read on each schedule's own clock.
By default your APIs are mocked, so simulating costs nothing and cannot change live data. Switch a step to live when you want to see a real response. A WhatsApp send is never live in a simulation.
📸 [SCREENSHOT: ivrstudio-simulator.png — simulator panel with the path lit up on the canvas]
Publishing, and going back
Publishing creates a numbered version and makes it the one callers reach. Editing afterwards changes only your draft — a call already in progress finishes on the version it started on, and new calls keep reaching the published one until you publish again.
Version history lists every publish with its date and notes, and you can restore an earlier one, which publishes it again as a new version. Nothing is overwritten.
Pointing a number at a flow
A published flow does nothing until something sends calls to it. Set it as the routing destination of:
- a phone number (Settings → Calling → Numbers)
- a business-hours destination — open, closed, holidays, a single holiday, or a named period
- a WhatsApp calling number
- a department's failover, for calls nobody answered
The flow list shows a Used by line under each flow, and says so plainly when a live flow has nothing pointing at it.
Seeing what happened
Every call through a flow records its journey. On the call in Calls you get the steps in order, which exit each took, what the caller pressed, what was captured (sensitive values masked), and how long any API call took.
The same journey rides on the call.completed and call.missed webhooks as ivr_flow.
For automations, these fields are available as conditions on those events:
| Field | What it holds |
|---|---|
call.ivrFlowName / call.ivrFlowId | which flow the caller went through |
call.ivrOutcome | how it ended, e.g. route_department:<id>, hangup, no_input_exhausted |
call.ivrLastStep | the step they were on at the end |
call.ivrReachedPerson | false when the flow ended without sending them to a department, agent, extension or number |
All are empty when the call never entered a flow. call.ivrReachedPerson describes where the flow sent the call, not whether anyone picked up — pair it with the call.missed trigger for "routed to a person, still missed."
That makes "a caller who asked about billing and never got to anyone" an ordinary automation: condition on call.ivrReachedPerson being false together with the flow name, then create a ticket or send a follow-up.
Limits and things to know
- Keypad only. Callers press digits; speaking an answer is not supported yet. Steps are shaped so that speech can be added later without rebuilding a flow.
- Text-to-speech needs to be configured on the account for spoken prompts. Without it, flows still run and still route correctly — prompts fall back to a plain built-in voice.
- Loops are allowed — "repeat that" and "back to the main menu" are normal. Each step has a visit limit so a call can never spin forever.
- Publishing is blocked, not warned, when a required exit is unconnected or a step points at something that no longer exists. Saving a draft is never blocked.
- A flow cannot be deleted or archived while something routes to it. Point that number or schedule elsewhere first.
Related
- Voice Menus (IVR) — the classic single-key menus; a flow can hand a call to one.
- Business hours — the schedules a Business hours step follows, and that can send callers into a flow.
- Departments — the queues a flow routes into.
- AI Voice Agents — a flow can hand a call to an AI agent, passing on what it already collected.
- Call Recording & Voicemail — where a flow's voicemail route lands.
Updated about 1 hour ago
