VoiceOI

Build your bots

Script Builder: build a voice bot call flow

The Script Builder is where you build the call flow a VoiceOI voice bot follows. You add nodes such as Play Audio, Listen and Transfer Call to a canvas, connect them with lines, set each node, and press Save Flow. The same script runs on the VICIdial® path and on the built-in dialer, but the two bot engines do not read every setting the same way, and this page marks each difference. Test every script in the Simulator before it takes live calls.

Applies to:Every account

Last checked against the product: . Found a mistake? Tell us.

How do the VICIdial and built-in engines differ?

Your bots run on one of two engines. The VICIdial (SIP) engine takes the calls VICIdial sends to the bots. The built-in (Asterisk) engine takes the calls the built-in dialer places. To find out which one you have, see Which setup do I have?

Setting or nodeVICIdial (SIP) engineBuilt-in (Asterisk) engine
Check ConditionNot run. A call that reaches the node ends and the caller is hung up.Runs.
ZIP Resolver and Matrix RouterNot run. A call that reaches either node ends and the caller is hung up.The steps run. Whether they route a call correctly has not been confirmed: ask the VoiceOI team before you rely on them.
Allow InterruptionThe Interruption line is not followed, and Play Audio always plays to the end.The Interruption line is followed.
AM DetectChecks the first answer against your Immediate Hangups rules and treats a long first answer as a machine. The four timing fields are not used. Skipped in AI Voice Agent scripts.Asterisk machine detection with the four timing fields.
Timeout (sec) and Transcription AttemptsNot read.Read.
Speech Silence (sec)How long the bot waits for the caller to start speaking. Values under 5 count as 5.The silence that ends the caller’s answer.
Post Speech DelayUsed with Turbo and Turbo 2.0 only.Not used.
Transfer CallSIP Blind Transfer (REFER) and ViciDial Native API Transfer (Instant Release).All modes in the list.
Cloud PrecisionRuns once you add your key. Until then it runs as Deep Precision.Runs as Deep Precision.
Safety limit on looping callsYes. A call that keeps looping or hears silence several times in a row is ended.No.

Where do I find my scripts?

Open Scripts in the sidebar. The page is titled Script Editor, and its Campaign Assignment column shows each script’s linked campaign or Unassigned. Team members with the SubManager role do not see it.

The Scripts page
ControlWhat it does
New ScriptAsks for a Script Name and an optional Assign Campaign (optional). Create & Open Editor makes an empty script and opens it.
Generate with AIOpens Script Studio, when it is turned on for your account. See ways to build a script.
Row menu (three dots)Open Editor, Copy Script ID, Duplicate, Smart Listen with AI (Admin and Manager roles, when Smart Listen is on for your account), Publish to Marketplace and Delete Script, which asks you to confirm.

The VoiceOI team creates your campaigns. You link a script to one in Script Settings (the gear icon in the builder) under Assigned Campaign. The Simulator tests the linked script. A script linked to a live campaign can start taking calls at once, so read the warning under How do I test a script? first. On a VICIdial account whose bot route names a script ID, a live call runs that script, whichever script is linked. Copy Script ID in the row menu gives the ID, and the VoiceOI team adds it to the route with you; to move a campaign to another script, send the team its ID. Duplicate makes a script with a new ID and no campaign. See Always dial the script ID.

A script controls what the bot says and where a call goes. Which leads are dialed, and when, stays in VICIdial or the built-in dialer.

How can I build a script?

There are three ways to build a script, plus templates. Which ones you see depends on what the VoiceOI team has turned on for your account.

Ways to build a script
WayWhere you startWhat you get
Classic Call FlowNew Script, then Create & Open Editor. If AI Voice is on for your account, the builder asks “What are you building?”: pick Classic Call Flow.A decision tree you build by hand on the canvas with recorded audio, branches and transfers. The standard bot script.
AI Voice AgentThe same “What are you building?” choice, AI Voice Agent. It appears only when AI Voice is on for your account.You describe the agent in plain language (persona, questions, guardrails) and it compiles the call flow for you. There is no node graph to wire. See the AI Voice Agent editor.
Script StudioGenerate with AI on the Scripts page. It appears only when Script Studio is on for your account.You paste a call script, or just name the campaign, and Script Studio writes a keyword-bot script for you to review. Nothing is recorded until you approve it. The form shows the price of the draft and the price per 1,000 characters of recording, and both are charged to your balance.
Marketplace templateMarketplace in the sidebar (titled Script Marketplace), with tabs Official and Community.Install creates a script named after the template, a draft campaign for it, and uploads the template’s audio. The VoiceOI team does the campaign setup that connects it to your dialer. Before the script takes calls, check the destination and the spreadsheet in every Transfer Call and Integration node: they come from the template’s author.

To share a script, use Publish to Marketplace in the row menu. The template carries your recordings and every node’s settings as saved, including a Transfer Call destination and any Google Sheets details, and other accounts can install it once it is listed. Remove or replace those first, and leave your customers’ details out. A community submission goes to review before it is listed.

How do I build a flow on the canvas?

  1. Create the script

    You

    On Scripts, press New Script, type a Script Name and press Create & Open Editor. If you have no campaign yet, ask the VoiceOI team for one and link it later in Script Settings.

  2. Add a node

    You

    Press Add Node at the top left of the canvas and pick a type, or drag a type onto the canvas. The Step Configuration panel opens on the right. Give the node a clear Step Name: the Google Sheets step lists earlier answers by step name.

  3. Mark the start

    You

    Select the first node and turn on Set as Start Node. A script has one start node. It shows a START badge and has no input dot, so no line can lead back to it.

  4. Connect the nodes

    You

    Drag from the dot on the right edge of a node to the dot on the left edge of the next one. Each output dot holds one line, so connecting it again moves the line. Select a line or a node and press Delete or Backspace to remove it.

  5. Set the audio and the settings

    You

    Choose or upload a recording for each audio node and set the fields described in node types.

  6. Save and test

    You

    Press Save Flow, then run the script in the Simulator.

Header controls
ControlWhat it does
Export (download icon)Downloads a .voiceoi bundle with the script, its recordings and its voices.
Import (upload icon)Accepts a .voiceoi or .json file. It clears the current canvas, so it asks you to confirm first. After an import, check every Transfer Call and Integration node: they keep the settings of the file.
Gear icon (Script Settings)Edits the Script Name and the Assigned Campaign.

How do I build a simple yes or no script?

This small flow asks one question, asks again when the caller says something else, sends yes to a transfer and ends the call on no.

  1. Add the greeting

    You

    Add a Play Audio node with your greeting recording and turn on Set as Start Node.

  2. Add the question

    You

    Add a Listen node and connect the greeting to it. Choose the question recording as Prompt Audio (Bot Speaks First), and under Expected Answers (Keywords) add one option with the keyword yes and one with no.

  3. Draw the re-ask loop

    You

    Add a second Play Audio node with a short “sorry, I didn’t catch that” recording. Connect Any Other Input and No Answer / Silence to it, then connect it back to the Listen node. Set Max Retries on the Listen node to 2, so the call ends after two re-asks instead of looping.

  4. Send yes to a transfer

    Both

    Add a Transfer Call node, connect the yes option to it and enter the destination the VoiceOI team gave you. See Transfer Call.

  5. End the call on no

    You

    Add an End Call node, connect the no option to it and set its Vicidial Disposition to NI.

  6. Handle opt-outs yourself

    You

    Callers who ask not to be called again may use words this script does not treat as an opt-out. The keyword no also matches “stop”, so “stop calling me” ends as NI, and “take me off your list” matches neither option and is asked again. Add the opt-out phrases you want honored as rules in the DNC Keywords (Profanity/Abuse) category on Immediate Hangups: an answer that matches one ends the call before the keyword options are checked and logs DNC. See do-not-call handling.

  7. Save and test

    You

    Press Save Flow, then run the script in the Simulator. It has no disclosure line built in. If you need one, record it and put it at the start.

What does each node type do?

The controls every node shares are under settings every node has.

Node types every account has
NodeWhat it doesKey settings
Play Audio“Play an audio file to customer”. Plays one recording, then goes to the next node.Audio File, Audio Takes, Voice. See audio files, takes and voices.
Listen“Listen for speech response”. Plays a prompt, listens, and sends the call down the path that matches what the caller says.Prompt Audio (Bot Speaks First), Expected Answers (Keywords), Recognition Engine (ASR), timing fields, Listen for a number. See Listen settings.
Check Condition“Branch based on variables”. Tests rules and follows True or False. Not run on the VICIdial (SIP) engine.Match Rule, Rules to Check. See Check Condition.
Transfer Call“Transfer call to agent/SIP”. Hands the live call to the destination you enter.Transfer Mode, the destination, Notes for the closer. See Transfer Call.
End Call“Terminate the call session”. Ends the call. This is the hang-up node and it has no output.Only the common settings. Set Vicidial Disposition here to log how the call ended.
Wait“Delay call execution”. Stays silent for a set time, then moves on.Duration (seconds), at least 1.
AM Detect“Voicemail/machine detection”. Decides whether a person or a machine answered. See AM Detect.Greeting Audio (Played during detection) and four timing fields.
Integration“Post data to Google Sheets”. Adds one row to a spreadsheet. This is the Google Sheets step.Integration Type, Integration Account, spreadsheet, tab and column mapping. See the Google Sheets step.

Settings every node has

SettingWhat it does
Step NameThe name shown on the node. Give each node a name you will recognize.
Set as Start NodeThe call begins at this node. One per script.
Vicidial DispositionLogs a status when the bot reaches the node: “This disposition will be logged when the bot reaches this node.” Leave it at No Disposition on nodes that should not set one.
Delete NodeRemoves the node and its lines.

The Vicidial Disposition list offers A Answering Machine, B Busy, CALLBK Call Back, DAIR Dead Air, DC Disconnected Number, DEC Declined Sale, DNC Do Not Call, N No Answer, NI Not Interested, NP No Pitch No Price, NQ Not Qualified, SALE Sale Made, XFER Call Transferred and CBHOLD Scheduled Callback. The list also shows OVERAGE (Overage / Insufficient Funds). Do not pick it: it has 7 characters, VICIdial statuses are 1 to 6 characters long, and VICIdial cannot store it.

  • VICIdial drops statuses it does not know. A status that is not in your VICIdial campaign’s status list is dropped by VICIdial. The VoiceOI team checks the list during onboarding. Ask before you use NQ.
  • Dead air depends on the transcript. On the VICIdial (SIP) engine, DAIR is written only when nothing was transcribed on the call. If the caller said anything, it is written as NA.
  • Some codes are sticky. Once a call holds SALE, NI, CALLBK, DEC, DNC, CBHOLD or AM, a later node can replace it only with another code from that group.
  • The code is set when the bot reaches the node, not when it leaves it.
  • These are status labels only. On the built-in dialer, NQ and DC are recorded as N. CALLBK and CBHOLD log the label and nothing more: VoiceOI does not schedule a callback or redial the lead.

Nodes that appear only when enabled

These nodes appear in Add Node only when the VoiceOI team turns the matching feature on for your account.

NodeWhat it doesKey settings
AI Voice Agent“Multi-turn conversational AI voice loop”. The step the AI Voice Agent editor builds. You do not wire it by hand.Opening Greeting Text, Degraded Fallback Line (Required), System Prompt & Instructions, TTS Voice, Max Turns, Exit Conditions & Branches. See the AI Voice Agent editor.
Smart Reply“Answer side questions in the call’s own voice”. A Play Audio node that works out what the caller asked, such as “who is this?”, and plays a recorded answer.Its AI paths and Can’t Answer. If the node was reached from a Listen node and Can’t Answer has no line, the bot asks the question again instead of ending the call. See Smart Listen and Smart Reply.
Age ExtractionAsks for the caller’s age with its prompt, reads the number and keeps it for the rest of the call for a Matrix Router. The age is not written to the lead: to pass it to your closers, include it in Notes for the closer.Understand spoken ages, Qualifying ages (optional), Max Retries (shows 2; 0 to 10), Success Route (Age Extracted), Failed / Else Route, Speech Recognition Engine.
ZIP ResolverIs meant to replace the state taken from the phone’s area code with the state of the ZIP code on the lead, not a ZIP the caller says. Not run on the VICIdial (SIP) engine.No settings. Connect it directly to a Matrix Router.
Matrix RouterIs meant to compare the caller’s confirmed age and state with the Matrix Rules of the campaign and send the call to the matching rule’s target node. Not run on the VICIdial (SIP) engine.Fallback Route (No Rules Match). The script must be linked to a campaign, and the rules are set in Closer Hub. See live transfers and notes for your closers.

How do the Listen node settings work?

A Listen node has one output dot for each answer option, plus No Answer / Silence (nothing was heard) and Any Other Input (something was heard that matches no option). With Smart Listen on, Any Other Input is renamed Not understood. Connect every dot: a path with no line ends the call when it is taken. Which engine reads which field is in the engine table.

Listen fields
FieldWhat it does
Prompt Audio (Bot Speaks First)The question the bot plays before it listens.
Expected Answers (Keywords)One option for each answer you expect, with an Option Name (Display Only) and Words to Detect (Keywords): type a word and press Enter. Add Option adds another. The answer takes the option with a keyword it contains as a whole word, and the longest keyword wins. The keywords yes, no, not interested, busy, hello and good also match common alternatives (for example yes matches “sure”, and no matches “nope” and “stop”).
Timeout (sec)Built-in engine only: the longest the bot records one answer. The box shows 5.
Speech Silence (sec)The screen says “Wait time after user stops talking (default 1.2s)”. On the VICIdial engine an empty field waits about 8 seconds, unless the campaign sets its own wait.
Post Speech DelayThe screen says “Extra wait time to catch long pauses (default 0s)”. With Turbo or Turbo 2.0 on the VICIdial engine, the pause that ends an answer is 1.2 seconds or this value, whichever is larger.
Transcription AttemptsBuilt-in engine only. A number from 1 to 5, default 3: how many times the bot records and transcribes until it hears speech.
Max RetriesHow many times the call can go down No Answer / Silence or Any Other Input from this node before the call ends, so how often the bot asks the same question again in one call. It is not a redial setting. 0 means this field sets no limit, but on the VICIdial (SIP) engine a separate safety limit still ends a call that keeps looping or hears silence several times in a row. The VoiceOI team can tell you the current limits.
Recognition Engine (ASR)How the answer is turned into text. See recognition engines.
Listen for a numberA switch. It routes on the number the caller says (“sixty five”, “65”, “in my sixties”) by a range on each answer: No number, From – to or Any other number. Try an answer shows where a typed answer would go. Keywords still catch “yes” and “not interested”.

What does Allow Interruption do?

Allow Interruption is a switch on Play Audio, Listen, Check Condition, Wait and AM Detect nodes. It lets the caller talk over a recording, and it adds an Interruption dot to the node. Only the built-in engine follows the line from that dot; see the engine table and, for Turbo answers while a question plays, recognition engines.

How does AM Detect work?

AM Detect separates a person from an answering machine. A machine ends the call and logs it as AM. A person continues to the next node. VoiceOI has no voicemail drop, and detection is not perfect, so review calls logged as AM. The node has an optional Greeting Audio (Played during detection) and four timing fields with these defaults: Greeting Threshold (sec) 2.5, Silence Threshold (sec) 1.2, Initial Silence (sec) 2.5 and Total Analysis Time (sec) 5. The boxes under Advanced AMD Parameters are not settings you tune. Leave them as they are.

  • Engines. The built-in engine sends the four timing fields to Asterisk’s machine detection and ignores some low-confidence machine verdicts, such as an initial silence, so the call carries on. The VICIdial (SIP) engine does not use them: see the engine table.
  • Both engines also check every answer a Listen node hears against your Immediate Hangups rules, whatever their category. A rule in Machines (Voicemail/Beeps) ends the call and logs AM. A rule in DNC Keywords (Profanity/Abuse) ends the call and logs DNC. It does not add the number to any list. See what happens at voicemail.

How do audio files, takes and voices work?

Play Audio, Listen, AM Detect and Age Extraction nodes share the same audio controls: Audio File to choose or upload a recording, Audio Takes to add other versions of a line, and Voices to manage voices. A call keeps one voice for the whole conversation, so record every audible step in that voice. The full guide is Voices, audio takes and the Simulator, with takes and rotation and adding audio files.

Which recognition engine should I pick?

A Listen node, and an Age Extraction node, turns the caller’s answer into text with the engine you choose under Recognition Engine (ASR). The screen’s own guidance is: “Turbo for instant menus/yes-no, Turbo 2.0 for ages and numbers, Neural for conversational dialogue, Precision for names/addresses.”

EngineNotes
Turbo Realtime Engine (Ultra-Fast)The default for a new node. It streams the answer. On the VICIdial engine, only this engine and Turbo 2.0 let the caller answer while the question plays, and only with Allow Interruption on.
Turbo 2.0 (Bigger Numbers Model)Turbo’s speed with a bigger model listening for the number. It needs Listen for a number (or Understand spoken ages) switched on: without that it works as plain Turbo.
Smart Neural Engine (Balanced)For conversational answers.
Deep Precision Engine (High Accuracy)For names and addresses. It records the answer first, then transcribes it.
Cloud Precision Engine (Best on Phone Calls)Records the answer like Deep Precision, then a cloud engine trained on phone calls transcribes it. The screen says it is best on ages, numbers and short answers, and that Deep Precision takes the turn if the cloud engine is slow or fails. It needs your own speech-to-text key under Integrations > Cloud Precision. Until you add it, and always on the built-in engine, the node runs on Deep Precision.

The screen shows no price for any engine. Callers are understood in English only today.

How does Check Condition work?

A Check Condition node tests one or more rules and sends the call down True or False. It plays nothing.

FieldChoices
Match RuleMust Match ALL Conditions (the default) or Match ANY One Condition.
Rules to Check and Add RuleEach rule has a variable (Lead Status, Lead Name, Call Length or Last Answer), an operator (Is Exactly, Contains, Starts With, Higher Than or Lower Than) and a Value. Call Length, Higher Than and Lower Than do nothing: see below.
  • Use Last Answer, Lead Status and Lead Name with Is Exactly, Contains and Starts With. Text matching ignores capital letters.
  • Higher Than and Lower Than do nothing: a rule that uses either is never true, whatever the variable. Call Length is not read, so no rule can test how long the call has run.
  • Last Answer tests the caller’s most recent answer, so place the node after a Listen node.
  • A node with no rules always takes True. A path with no line ends the call when it is taken.

How does the Transfer Call node work?

The Transfer Call node hands the live call to the destination you enter, such as your closers, and the bot then ends its part of the call. Transfer modes, notes for the closer and the Closer Hub rules are covered in live transfers and notes for your closers. This section covers what to set in the builder.

SettingWhat it does
Transfer ModeA new node starts on SIP Blind Transfer (REFER).
DestinationThe label changes with the mode: Destination Phone Number, Extension / Dialplan Number or Dialplan Extension or Target Number. Enter the number or extension to send the call to. On the VICIdial (SIP) engine, leave it empty and the call ends there. On the built-in (Asterisk) engine, an empty destination skips the transfer and the call follows the node’s next line, if one is connected.
Notes for the closerThe caller’s answers, for example “Age: 67 | Zip: 33101”, written into the lead’s Comments before the transfer, up to 255 characters.
Also send the notes to a closer dialerWrites the same notes into the lead’s Comments on your closer dialer, set up under Integrations > Closer dialer. List for new leads (optional) is where a caller with no lead yet is added.
Vicidial DispositionThe transfer logs XFER unless you pick another code on this node.

How does the Google Sheets step work?

The Integration node adds one row to a Google spreadsheet when a call reaches it. Integration Type has one choice, Google Sheets. VoiceOI has no public API and no native CRM sync. Connecting your Google account is covered in Monitoring and reports, and there is a product overview at Google Sheets with VoiceOI. In the builder you set the following.

  • Integration Account. System Default (Latest Integration) or a named Google Sheets connection.
  • Select Spreadsheet and Select Sheet (Tab), under Google Sheets Configuration.
  • Column Mapping. One box for each header in the first row of the tab. Type a value, or press + for the helper menu: Full Call Transcript, Last User Response, Lead Name (from Dialer), Lead Phone (from Dialer), Call Timestamp, or the answer of an earlier Listen or Play Audio step. Refresh Headers rereads the headers after you rename a column.
  • Variables. The screen’s own help says: “Use {{Node Name}} for user responses or {{lead.name}} for lead data.” If VoiceOI cannot read the lead’s name, Lead Name becomes “Valued Customer”.

The panel also shows an older group of fields above that block (Spreadsheet ID, Sheet Name, Column Mappings with Col (A,B..)). Leave it empty: once you use Google Sheets Configuration, the older mappings are ignored. Changing Integration Account clears the spreadsheet, the tab and the Column Mapping boxes. Changing Select Spreadsheet clears the tab and the mapping boxes. Changing Select Sheet (Tab) clears the mapping boxes. Choose these first and fill the mapping last. A column is matched by its header text, ignoring capital letters, spaces and punctuation, never by letter. If no box has a value, no row is added.

How do I test a script?

Open Simulator in the sidebar. Pick a campaign under Select Campaign to Test, choose Text Simulator (Dry Run) or Browser Mic (WebSpeech API - Dry Run), and press Start Simulation. It tests the script linked to that campaign, so a script marked Unassigned cannot be tested until you pick a campaign under Assigned Campaign in Script Settings. Simulator calls are left out of your Dashboard numbers. The full Simulator guide is Voices, audio takes and the Simulator.

The Simulator is a dry run:

  • It places no call. No phone line, carrier or dialer is involved, so nothing is written to a lead or to VICIdial and no transfer happens. A Transfer Call node shows the notes a live call would write.
  • It does not use your recognition engine. Text mode uses what you type. Browser Mic mode uses your browser’s own speech recognition (Chrome or Edge). Check engine choices, pauses and Allow Interruption on a real call to a phone you control.
  • It does not run ZIP Resolver or Matrix Router, and it does run Check Condition, which the VICIdial engine does not run. See Check Condition.
  • It does write a row to your real spreadsheet when the test reaches a Google Sheets step that has no line leaving it, and it then ends the test as SALE. It writes nothing if every mapped value is empty. Point the step at a test sheet while you test.

After the Simulator, run a test call to a phone you control and check it on Call Logs: see Monitoring and reports.

What happens when I press Save Flow?

  • It sends the change to your bots. If a bot does not pick up a change, press Force Bot Sync in the sidebar footer, or Force bot sync on Integrations, and read the result. See the bot sync entry.
  • Nothing is saved until you press it. The browser warns you if you close or reload the tab with unsaved changes. Back to List does not warn you.

Common questions

What is the difference between Classic Call Flow and AI Voice Agent?

A Classic Call Flow is a decision tree you build by hand on the canvas. An AI Voice Agent is described in plain language, with a persona, questions and guardrails, and the editor compiles the call flow for you. You choose once, when you create the script.

Why does my script say Unassigned?

Unassigned means no campaign is linked to the script. Press the gear icon for Script Settings and pick a campaign under Assigned Campaign. Ask the VoiceOI team if the list is empty, because the team creates campaigns.

Does the Script Builder keep old versions of my script?

No. Save Flow saves over the script, and there is no draft, publish step or version history. Duplicate the script, or export a .voiceoi bundle, before you change a working one.

Which transfer mode should I use with VICIdial?

Use SIP Blind Transfer (REFER) or ViciDial Native API Transfer (Instant Release), and always enter a destination: on the VICIdial path a Transfer Call node with no destination ends the script and hangs up the caller. The VoiceOI team confirms the mode during onboarding.

Why does a call end when it reaches Check Condition, ZIP Resolver or Matrix Router?

The bot engine that VICIdial remote agents use (SIP) does not run these three nodes, so a call that reaches one ends and the caller is hung up. The built-in dialer engine runs all three, but routing results there have not been confirmed. Ask the VoiceOI team which engine your bots use and whether routing runs for your account.

Can the bot leave a voicemail message?

No. VoiceOI has no voicemail drop. An AM Detect node, or a rule you set on Immediate Hangups, ends the call and logs it as AM. Detection is not perfect, so review those calls.

Why was my call marked as a sale when no row reached my Google Sheet?

Reaching an Integration node marks the call as a sale even when no spreadsheet is set or the write fails, for example when your Google sign-in has expired. Place the step only after the caller has qualified, and check that Integrations shows the connected Google account.

Related

VoiceOI provides tools. The customer is the caller and is responsible for consent, do-not-call lists, calling hours, caller ID, recording and monitoring consent, and disclosures. This page is not legal advice.

VICIdial is a registered trademark of the Vicidial Group. VoiceOI is an independent product and is not affiliated with or endorsed by the Vicidial Group. Asterisk, Twilio and other product names are trademarks of their respective owners.

Questions about your setup? Talk to the VoiceOI team.