Saltar al contenido principal

Call Flows — the IVR builder

Customer Admin

A call flow is how you turn "a call came in" into "the right person helped them." It's a visual script Orbit follows for every call — you drag blocks onto a canvas and connect them, no code.

What you'll build with it — real examples:

  • Route by need: "Press 1 for Sales, 2 for Support" → send each to the right team.
  • After-hours: outside business hours, play a "we're closed" message and offer a callback instead of ringing an empty floor.
  • Take a payment safely: collect a card number with the recording masked (PCI).
  • Screen outbound: on a campaign, only connect an agent when a human answers.
  • Reusable pieces: build an "identify the caller" mini-flow once and reuse it across every flow (a module).

Why it's worth doing well: one flow change updates every call instantly; a good flow shortens queues, protects sensitive data, and frees agents from routing by hand.

Menu path: Routing → Call Flows.

The Call Flows list with inbound, queue, hold, whisper, and disconnect flows Each flow has a type and a published/draft status. The "Main Inbound IVR" is the entry flow.


1. Key ideas before you build

  • A flow is a graph. Each block has one or more outputs (e.g. Success, Error, timeout, Pressed 1, Pressed 2). You draw a line from an output to the next block. The call walks the graph from the Entry block, following whichever output matches what happened.

  • Flow types. A flow's type says when it runs. The most common is Inbound, but flows also power the experiences around a call:

    Flow typeRuns when…
    InboundA call arrives from outside (the main IVR).
    Customer QueueA caller is waiting in a queue (music + position announcements).
    Customer Hold / Agent HoldEither party is put on hold.
    Customer Whisper / Agent WhisperPlays just before the two parties are connected.
    Agent Disconnect RecoveryRuns if the agent drops, to recover the caller.
    ModuleA reusable mini-flow you can call from other flows.
    Pick the type first — and pick it right

    A flow's type isn't just a label: it determines which blocks are even available on the palette (a Whisper flow doesn't offer Transfer to Queue, and so on). You can't convert an Inbound flow into a Queue flow later — you'd rebuild it from scratch. Choose the type deliberately when you create the flow.

  • Voice only. Orbit flows are voice — there are no chat/task/email flow types to worry about.

  • Publish to use. A flow is a draft until you publish it. A phone number (Telephony) points at a published flow. Publishing also creates a version you can roll back to if a change misbehaves.


2. The editor

Open a flow (or Create Flow) to land in the visual editor.

The visual call flow editor showing the Main Inbound IVR graph The drag-and-drop editor: block palette on the left, canvas in the middle, a minimap bottom-right, and the property panel on the right when a block is selected.

The editor has five parts:

AreaWhat it's for
Block palette (left)Every block you can add, grouped into 7 categories (Interact, Set, Check, Analyze, Logic, Integrate, Terminate). Search by name at the top.
Canvas (center)Drag blocks here and connect their outputs to the next block. Zoom/pan with the on-canvas + / − / fit / lock controls; a minimap (bottom-right) shows the whole flow.
Property panel (right)Appears when you click a block — every setting for that block. This is where the real configuration happens (covered block-by-block below).
Toolbar (top)The flow's name + type + published/draft badge, the editing and TTS controls, and the save/publish actions (detailed below).
Status bar (bottom)Block count, connection count, validity (Valid / errors / warnings), and the current zoom level.

The toolbar, left to right

ControlWhat it does
← BackReturn to the Call Flows list. Next to it: the flow name, a type badge (e.g. inbound), and a Published / Draft badge.
Undo / RedoStep backward/forward through your edits.
Copy / Cut / Paste / DuplicateStandard clipboard actions on the selected block(s).
KokoroThe TTS engine used to speak prompts (the default local voice engine).
VoiceThe voice used for spoken prompts (pick from the engine's voices).
CodeOpen the flow's underlying JSON in a viewer. Use it to copy and share a flow (paste it to a colleague or into a ticket), review exactly what a block is configured to do, or diff two flows. It's the flow's portable, shareable source.
Unsaved changesAppears when the canvas differs from the last save — a reminder to Save.
ValidateCheck the flow for problems (unwired outputs, unreachable blocks, misconfigured fields) before publishing.
SaveSave your work as a draft (does not affect live calls).
Publish / UnpublishPublish makes the flow live for calls (and creates a version you can roll back to); Unpublish takes it back to draft.

How to build: drag a block from the palette onto the canvas → click it to open its property panel on the right → fill the settings → drag from one block's output handle to the next block's input → ValidateSavePublish.


3. Common tasks

Quick recipes for the things you'll do most. Each starts from Routing → Call Flows.

Create a flow

  1. Routing → Call Flows → Create Flow.
  2. Name it and pick a type (usually Inbound). Pick the type carefully — you can't change it later. Agree a naming convention up front (e.g. Inbound – Main IVR, Queue – Sales); renaming a live flow is best avoided.
  3. Drag blocks from the palette; connect each block's output handle to the next block.
  4. Validate → Save → Publish. Validate surfaces problems before you go live — unwired outputs, unreachable blocks, and misconfigured fields — so you can fix them. Wire every output (see §7): an output left unconnected simply dead-ends that branch of the call, which validation flags as a warning.
  5. Point a phone number at it in Telephony.
Start from a sample, not a blank canvas

If your instance ships a "Main Inbound IVR" or sample flows, clone one and adapt it rather than starting empty — it's the fastest way to a working flow and you inherit sensible error/timeout wiring.

Build a "Press 1 / Press 2" menu

  1. Add Get Customer Input and write the prompt ("Press 1 for Sales, 2 for Support").
  2. Set Max Digits = 1.
  3. Under Digit Branches, add option 1 and option 2.
  4. Wire Pressed 1Set Working Queue: SalesTransfer to Queue; Pressed 2 → Support.
  5. Wire Timeout / Default back to the menu prompt so bad input re-prompts.

Turn on recording + sentiment

  1. Add Set Recording & Analytics near the start of the flow.
  2. Toggle Record this call, pick Stereo, and choose Record Start (Call Start includes IVR/queue; Agent Connect is the conversation only).
  3. Enable Sentiment / Transcription (post-call and/or real-time) as needed.

Route after-hours

  1. Add Check Hours and pick a saved Business Hours schedule.
  2. Wire In Hours → your menu; Out of Hours / Holiday → a "we're closed" Play PromptDisconnect (or offer a callback).

Take a card number safely (PCI)

  1. Where you collect the card, use Secure Input (PCI) instead of Store Customer Input.
  2. The recording is masked automatically while the caller types — see §7 and Compliance.

4. Worked example — a complete inbound IVR

Goal: greet the caller, offer Sales/Support, route to the right queue, and after hours play a closed message. Here's the finished flow, then the steps to build it:

The complete Main Inbound IVR flow: Entry → Check Hours → Set Recording → Main Menu → Set Queue → Transfer, with after-hours and error branches A complete inbound IVR as a connected graph — each block's outputs wired to the next.

  1. EntryCheck Hours.
  2. Check Hours Out of Hours / HolidayPlay Prompt ("We're closed…") → Disconnect.
  3. Check Hours In HoursSet Recording & Analytics (turn on recording + sentiment) → Get Customer Input ("Press 1 for Sales, 2 for Support").
  4. Get Customer Input Pressed 1Set Working Queue: SalesTransfer to Queue.
  5. Get Customer Input Pressed 2Set Working Queue: SupportTransfer to Queue.
  6. Get Customer Input Timeout / Default → loop back to the menu prompt.
  7. ValidateSavePublish, then point a phone number at this flow in Telephony.

5. Block reference

Every block is below, grouped by palette category. Click any block on the canvas to open its property panel; the screenshots show the palette block and its properties panel, and the tables explain every field.

The "Label" field

Every block has a Label — a free-text name shown on the block in the canvas (e.g. "Main Menu"). It's cosmetic; use it to keep large flows readable.

🗣️ Interact — talk to and listen to the caller

Play Prompt

Speak text (TTS) or play an audio file to the caller.

The play prompt block in the palette

The play prompt properties panel

FieldWhat it does
PromptSource of the audio — TTS (Text-to-Speech) (type the text) or a pre-recorded audio file.
LanguageTTS language (e.g. en-US).
VoiceThe TTS voice for the prompt. The editor's Kokoro / Voice toolbar sets the engine and available voices.
Interruptible (DTMF)If on, a key press stops the prompt early.

Get Customer Input

Ask a question and branch on the digit the caller presses (a DTMF menu).

The get customer input block in the palette

The get customer input properties panel

FieldWhat it does
Prompt / Language / VoiceThe question to play (TTS or file), as in Play Prompt.
Max DigitsHow many digits to collect (1 for a single-key menu).
Timeout (ms)How long to wait for the first digit before the Timeout branch fires.
Inter-digit (ms)Max gap allowed between digits.
RetriesHow many times to re-prompt on no/invalid input.
Allow interruptCapture a key press during the prompt (no need to wait for it to finish).
Digit BranchesOne output per option (e.g. Pressed 1, Pressed 2). + Add a condition to add more. Plus automatic Timeout and Default outputs.

Store Customer Input

Collect multiple digits (e.g. an account number) into a variable for later use.

The store customer input block in the palette

The store customer input properties panel

FieldWhat it does
Variable NameThe variable the collected digits are stored in.
Prompt / Language / VoiceThe prompt to play.
Max Digits / Timeout / Inter-digit / RetriesDTMF collection settings (as above).
Allow interruptCapture key presses during the prompt.
TerminatorsKey(s) that end input early (e.g. #).

Secure Input (PCI) — ✅ Available

Collect sensitive digits (e.g. a card number) without capturing them in the recording. While the caller enters the digits, the call recording is masked (muted), then resumes automatically afterward — so card data never reaches stored audio.

FieldWhat it does
Variable NameWhere the collected digits are stored (for your payment integration).
Prompt / Max Digits / TerminatorsAs in Store Customer Input.
PCI today

This is the secure-DTMF capability that keeps card numbers out of recordings now. Broader automatic payment-pause/redaction is still being expanded — see Compliance.

Verify Identity — ✅ Available

Resolve the caller against your customer records — e.g. collect an account number (and optional PIN) and validate it. In connector mode the check runs against your own backend API, so Orbit never holds your customer database; it just asks your system "is this account + PIN valid?" A verified caller's identity then gates downstream data lookups (see the AI voice self-service in Getting Started).

The verify identity block in the palette

FieldWhat it does
Prompt(s)What to play when collecting the account number / PIN.
Account / PIN inputThe DTMF fields collected to identify the caller.
Validation sourceWhere the identity is checked — a connector (your backend API) or local records.
OutputsVerified and Failed / Not found — branch accordingly.

Capture Speech

Speak a prompt, then record the caller speaking and store the recognized transcript in a variable (speech-to-text). Use it for spoken answers instead of keypad input.

The capture speech block in the palette

Panel not built yet

The Capture Speech block exists but its properties panel isn't implemented yet (it shows "Unknown node type"). Use it knowing configuration is minimal for now.

FieldWhat it does
LabelBlock name.
PromptWhat to ask before recording.
VariableWhere the recognized transcript is stored for later branching.

Hold

Place the caller or agent on / off hold.

The hold block in the palette

The hold properties panel

FieldWhat it does
TargetWho to hold — Customer or agent.
ActionHold or resume.

⚙️ Set — configure the call

These blocks set state used by later blocks. The most important:

Agent Capabilities — ✅ Available

Enable per-call agent secure controls — the buttons an agent may use on this call. Turn on Pause Recording (so the agent can manually mask the recording during a sensitive moment) and/or Take Payment (agent-assisted card capture). Only the capabilities you enable here appear on the agent's softphone for the call.

The agent capabilities block in the palette

FieldWhat it does
Pause RecordingLets the agent manually pause/resume recording on this call (PCI moments).
Take PaymentLets the agent start an agent-assisted secure payment capture.

Set Working Queue

Choose which queue a later Transfer to Queue will use. (Shown on the canvas as e.g. "Set Sales Queue".)

The set working queue block in the palette

The set working queue properties panel

FieldWhat it does
SourceWhere the queue comes from — pick a specific queue.
QueueThe queue to make "current"; Transfer to Queue then sends the caller here.

Tip: add Change Priority / Set Queue Flow / Set Attributes after this, then Transfer to Queue.

Set Recording & Analytics

Turn on recording and AI analytics for the call. This one block controls recording, sentiment, and transcription — see Recordings & AI.

The set recording block in the palette

The set recording properties panel

The panel is grouped into Recording, Call-record analytics, Real-time analytics, Redaction, and Next release:

Section / FieldWhat it does
Recording → Record this callMaster switch for recording.
Recording → ModeStereo (Dual-Channel) — caller = left, agent = right in one file (recommended; best for review, transcription & sentiment). Also Mono / single-channel.
Recording → Record StartCall Start (includes IVR + queue) or Agent Connect (capture begins only when an agent is bridged in — the IVR/queue wait is not recorded).
Recording → Recording disclosurePlay a "this call is being recorded…" prompt, with an editable message.
Recording → Require caller confirmation (press 1)Gate recording on explicit consent — the caller must press 1 to accept (else the flow follows the Consent Declined output).
Call-record analytics → SentimentHigh-accuracy tone scoring of the recording after the call.
Call-record analytics → TranscriptionHigh-accuracy post-call speech-to-text (included with Sentiment).
Real-time analytics → SentimentLive tone scoring streamed to the Live Monitor during the call (doesn't need recording).
Real-time analytics → TranscriptionLive speech-to-text during the call (included with Sentiment).
Redaction → PII / PCI redactionAvailable now — mask sensitive data in this call's transcripts: PCI categories (card/CVV) always, and other PII per your Redaction matrix.
Next releaseCall summary, language detection, and automated QA scoring — 🔜 coming.
Outputs

Because recording can be consent-gated, the block exposes Success, Consent Declined, and Error outputs — wire Consent Declined to whatever should happen when a caller refuses (e.g. skip recording and continue, or play a notice).

Set Logging

Enable or disable detailed call logging for this flow.

The set logging block in the palette

The set logging properties panel

FieldWhat it does
EnabledTurn logging on/off.
LevelVerbosity (e.g. Info).

Set Voice

Set the TTS language and voice used by the prompts that follow.

The set voice block in the palette

The set voice properties panel

FieldWhat it does
LanguageTTS language for subsequent prompts (e.g. en-US).
VoiceTTS voice for subsequent prompts.

Set Attributes

Store key/value data on the contact, read later by Check Attributes to branch.

The set attributes block in the palette

The set attributes properties panel

FieldWhat it does
AttributesOne or more key/value pairs stored on the contact (add as many as you need).

Change Priority

Raise or lower the caller's routing priority.

The change priority block in the palette

The change priority properties panel

FieldWhat it does
ActionWhat to do — e.g. Set Priority.
ValueThe priority value to apply.

Set Whisper / Hold / Queue / Disconnect Flow

Four blocks that each point at a saved sub-flow for a specific moment of the call.

The set whisper flow block The set hold flow block The set queue flow block The set disconnect flow block

BlockPicks the flow for…
Set Whisper Flowwhat the agent hears just before connect (Agent Whisper Flow).
Set Hold Flowthe caller's hold experience (Customer Hold Flow).
Set Queue Flowthe in-queue experience (Customer Queue Flow).
Set Disconnect Flowthe flow to run when this call disconnects — post-call clean-up / follow-up actions.
"Disconnect Flow" vs "Agent Disconnect Recovery"

These are different things. Set Disconnect Flow points at a flow that runs when the call disconnects (wrap-up/clean-up). The Agent Disconnect Recovery flow type (§1) is what runs when the agent's leg drops mid-call, to recover the still-connected caller. Build the right one for the moment you mean.

Each has one field — a dropdown to pick a saved flow (or None):

A set-flow properties panel — pick a saved flow or None

Set Wrap-Up Form

Attach the after-call work (ACW) form the agent fills in when this call ends.

The set wrap-up form block in the palette

The set wrap-up form properties panel

FieldWhat it does
Wrap-Up FormThe form shown to the agent during wrap-up (managed on the Wrap-Up Forms page).

Resume Contact

Resume a contact that was parked or put on hold.

The resume contact block in the palette

The resume contact properties panel

FieldWhat it does
SourceWhere to resume from (e.g. Park).

🔀 Check — branch on conditions

Check Hours

Branch on business hours / holidays.

The check hours block in the palette

The check hours properties panel

FieldWhat it does
Business HoursPick a saved schedule (managed on the Business Hours page) or define one inline.
OutputsIn Hours, Out of Hours, Holiday, Error.

Check Attributes

Branch on a stored contact attribute's value.

The check attributes block in the palette

The check attributes properties panel

FieldWhat it does
Attribute NameThe contact attribute to test.
ConditionsOne or more value conditions, each with its own output branch.

Check Queue Status

Branch on a queue's live metrics (e.g. how many callers are waiting).

The check queue status block in the palette

The check queue status properties panel

FieldWhat it does
QueueThe queue to inspect.
MetricWhat to test — e.g. Waiting Count, wait time.
Operator / ValueThe comparison (e.g. < 5) that decides the branch.

Check Staffing

Branch on whether agents are available.

The check staffing block in the palette

The check staffing properties panel

FieldWhat it does
QueueThe queue whose agents to check.
Check TypeWhat to require — e.g. Available agents present.

🧠 Analyze — recording, logging & media analysis

Two of these — Set Recording & Analytics and Set Logging — live in the Analyze palette group (they're documented under Set above for reading flow, but you'll find them here in the editor).

Start Media Stream

Fork the call audio to the AI pipeline (live STT / sentiment).

The start media stream block in the palette

The start media stream properties panel

FieldWhat it does
TargetWhich pipeline(s) to stream to (e.g. All Pipelines).
Stream ModeWhich audio — Both Legs, caller only, or agent only.
Sample RateAudio sample rate (e.g. 16000 Hz).

Stop Media Stream

Stop the audio fork started above.

The stop media stream block in the palette

The stop media stream properties panel

FieldWhat it does
TargetWhich stream(s) to stop (e.g. All Pipelines).

🔁 Logic — flow control

Loop

Repeat a branch a fixed number of times.

The loop block in the palette

The loop properties panel

FieldWhat it does
Max IterationsHow many times to repeat before falling through.
OutputsLoop (taken each iteration — wire it to the body you want repeated) and Done (taken after the last iteration — wire it to what comes next).

Wait

Pause the flow for a set time.

The wait block in the palette

The wait properties panel

FieldWhat it does
Duration (ms)How long to pause (e.g. 5 seconds).

🔗 Integrate — transfers & AI

Transfer to Queue

Send the caller into the ACD queue chosen by an earlier Set Working Queue.

The transfer to queue block in the palette

The transfer to queue properties panel

FieldWhat it does
SourceWorking Queue — the queue set earlier by Set Working Queue.
Priority (override)Optionally bump this caller's priority in the queue.
OutputsSuccess (caller queued/connected) and Failed / Error (no such queue, at capacity) — wire the failure path to a fallback.

Transfer to Agent

Transfer directly to a specific agent.

The transfer to agent block in the palette

The transfer to agent properties panel

FieldWhat it does
Agent AORThe agent's SIP address (address-of-record).
Timeout (ms)How long to ring before giving up.
OutputsAnswered, No Answer, and Busy / Failed — always wire No Answer/Failed (e.g. fall back to a queue) so a missed agent doesn't dead-end the call.

Transfer to Number

Transfer the caller to an external phone number via a trunk.

The transfer to number block in the palette

The transfer to number properties panel

FieldWhat it does
Phone NumberThe external destination (E.164, e.g. +902121234567).
TrunkWhich carrier/trunk carries the outbound leg.
Caller IDThe number shown to the called party.
Timeout (ms)How long to wait for an answer.
OutputsAnswered, No Answer / Busy, and Failed (no route/trunk error) — wire the non-answer paths to a fallback.

Transfer to Flow

Jump to another flow / reusable module.

The transfer to flow block in the palette

The transfer to flow properties panel

FieldWhat it does
Target Flow (module)The flow/module to run.
Return After CompleteIf on, control returns here when the sub-flow finishes (otherwise it takes over).

AI Assistant — 🔜 Preview

Run a turn-based conversational AI bot, with escalation to a human.

Preview block

The AI Assistant block is being wired up. The panel below configures it, but it only runs when an AI backend is connected — otherwise it follows its Error output. Treat it as preview until your deployment confirms the AI backend.

The ai assistant block in the palette

The ai assistant properties panel

FieldWhat it does
ModelThe AI model that powers the assistant.
System PromptThe instructions that define the bot's behavior and scope.
LanguageConversation language (e.g. en-US).
Max Duration (ms)Hard cap on the bot conversation before it escalates/ends.
OutputsCompleted, Escalate (hand to a human), Error.

Under the hood the runtime also honors turn timeout, escalation keywords, and a confidence threshold for auto-escalation.


⏹️ Terminate — end the call

Disconnect

End the call.

The disconnect block in the palette

The disconnect properties panel

FieldWhat it does
ReasonOptional disconnect reason recorded on the call.

6. Reusable modules

A module is a mini-flow you build once and reuse across many flows — like "identify the caller", "collect a callback number", or "play the after-hours message". Change the module once and every flow that uses it updates.

Create a module: Routing → Call Flows → Create Flow → set the type to Module → build the shared logic → Publish.

Use a module in a flow: add a Transfer to Flow block → pick your published module → enable Return After Complete if the call should continue in the parent flow afterward (otherwise the module takes over).

When to make something a module

If you find yourself building the same 3–4 blocks in more than one flow (a greeting, an authentication step, a disclosure), pull it into a module. It's less to maintain and impossible to get out of sync.


7. Limitations & gotchas

Know these before you publish:

  • Wire every Error/Timeout output. An unconnected Error output just stops that branch. Always give errors a path (a "sorry" prompt → Disconnect, or a fallback queue).
  • You must Publish. Saving isn't enough — a flow only affects live calls after Publish, and a phone number must point at it (Telephony).
  • Some blocks are preview / partial: AI Assistant needs an AI backend wired (§Integrate), and Capture Speech's properties panel isn't built yet. Test them in your deployment before relying on them.
  • Answering-machine detection (AMD) applies to outbound calls (campaign dialing), not to inbound flows.
  • Card data: only Secure Input (PCI) masks the recording during entry. Using plain Get/Store Customer Input for a card number will capture it in the recording.
  • Validate before publishing. The editor's Validate catches unreachable blocks, missing wires, and misconfigured fields — the status bar shows errors/warnings.

8. Variables, conditions & error handling

A few cross-cutting rules every flow author should know:

  • Variables. Store Customer Input and Capture Speech write a named variable; Check Attributes reads contact attributes to branch. Use a clear Variable Name and reference it in later blocks/conditions. (Your admin or integrator can confirm the exact interpolation syntax for your deployment.)
  • Every block has Timeout / Error outputs. Wire them. A block whose Error output is left unconnected will simply stop that branch — always give errors a path (e.g. a "sorry" prompt → Disconnect, or a fallback queue).
  • Unknown / unconfigured steps fall through. If a step can't run, the engine follows its success path rather than crashing the call — so test your flow with Validate before publishing.
  • Sub-flows (modules). Transfer to Flow with Return After Complete runs a reusable module and comes back; without it, the module takes over the call.