Skip to content

Chapter 7 · Build

Workflow steps

Every step in the designer’s palette — what it is for, what you fill in, and what it leaves behind for the steps below — plus the variables every call knows.

Start call

Where every call begins. It is added for you, has no settings and one line out: connect it to the first thing the caller should hear. Nothing can be wired into it.

Speak

Speaks a line to the caller and moves on. Write what to speak in Speak, and put any {variable} at the end of the phrase — for example “Your appointment is booked for {appointment_time}.” Pause after speaking (seconds) adds real silence after it, up to 10 seconds; a new Speak step starts with one second so two lines in a row do not run together.

Ask Question

Asks the caller a question, listens, and saves the answer in the variable named under Save answer in variable — for example caller_name. Write the question in Question, and put any {variable} at the end — e.g. “How can I help you today, {name}?” The latest answer is also in {last_answer}.

  • How they answer? — Spoken answer, or Keypad digits (DTMF) for numbers typed on the phone.
  • Possible answers — one per row (a pasted comma list splits into rows). AI snaps whatever the caller said, in any language and any phrasing, onto one of them: “haan, theek hai” lands on “yes”. Leave the list empty for free answers such as a name, which are tidied up before they are stored.
  • Refine the possible answers Using AI (the box under the answers) — for example “the city they are calling from”, or “‘sure’ and ‘go ahead’ count as yes”.
  • Long answer — waits for about two seconds of silence before the turn ends, for addresses and complaints.
  • Max time to wait for an answer (seconds) — 0 means no limit.
  • Keypad mode: Caller types several digits, How many digits (0 = any), the Done key (# by default), and how long to wait with no key.

FAQ

Answers a question from your own list of questions and answers. It speaks its optional prompt (“What would you like to know?”) — or lets a Speak step above it do the asking — listens, finds the closest question with AI and speaks its answer, then takes the answered line. When nothing fits it takes the no match line.

  • Add entries under Questions and answers with Add question: a Question and its Answer. Each answer can have its own recording.
  • Question (optional) is asked before the caller answers — or leave it empty when a Speak step above asks.
  • The matched entry is in {faq_question} and {faq_answer}.

Condition

Compares values and takes the true or the false line. Each test has a Variable, a Test — is equal to, is not equal to, contains, is greater than, is less than, is at least, is at most, is empty, is not empty — and a Value. Join several tests with and / or; they are read left to right.

Match

Takes the line named after a variable’s value: one outgoing line per value you list, plus a no match line for anything else. Choose the variable under Check this variable and list the Match values.

Reading an Ask Question step, a Match fills its values in from its possible answers, flags a value the question does not list (it could never match), and renames the line when you rename a value. Values match exactly — the Ask has already turned what the caller said into one of its answers.

Call an API

Calls your own system mid-call — to look up an order, check a slot, create a booking — and stores fields of the reply as variables.

  • Method (POST, GET, PUT, PATCH, DELETE) and URL, which can contain variables: https://crm.example/orders/{order_id}.
  • Headers as name/value rows. Put credentials in the secret store and write them as {{name}}: Authorization: Bearer {{crm_api_key}}.
  • Body as field/value rows, or Edit as raw JSON. Left empty, the body sends everything the call has collected.
  • Response — map a variable to a field of the reply, such as {response.body.booking.id}.
  • While it waits — Say while it waits (“One moment while I check that.”) and what The caller hears after it: a melody or silence.

Datamold

Finds, saves or updates rows in one of your DataMold forms. Offered only while DataMold is connected under Settings → Integrations.

  • Form and What to do: Find one row, Find many rows, Save one row or Update one row.
  • Find: Where conditions (is, contains, starts with, is more than, is empty …), Match all of them or Match any of them, With status and With tag, and for Find many Rows to fetch (1–50).
  • Save / update: each form field and its value — typed, or a {variable} the call collected; Add every field lists them all, and * marks a required one. A value that comes out empty is left out. A choice field takes one of its options, whatever the case.
  • Status and Tags: only the ones the form defines in DataMold. An update keeps the row’s own when they are left empty; chosen tags replace the row’s tags.
  • Update one changes the Row to update (such as {datamold.row.id}), or with that empty the first row matching Where.
  • The result goes under Save the result as (default datamold): {datamold.ok}, {datamold.found}, {datamold.count}, {datamold.error}, {datamold.status}, {datamold.tags}, {datamold.row.<field>} and {datamold.rows}.
  • Music while it works plays after the wait line until DataMold answers.

Send Wago Message

Sends a WhatsApp message from your own number through Wago — an approved template at any time (fill in its {{1}}, {{2}} … from variables), or a text message to someone who has messaged you in the last 24 hours. Choose Send to (for example {phone_number}). Offered while Wago is connected under Settings → Integrations.

The result is in {wago.ok}, {wago.sent}, {wago.message_id} and {wago.error}. A text outside the 24-hour window is queued and delivered as soon as that person writes to you (it still counts as ok).

Notify on WhatsApp

Tells your own team something on WhatsApp — a lead called, a booking was made — from HelloCall’s number. Notify one of the WhatsApp numbers on your organisation’s profile, or Everyone on the list, with a Message that can use variables. Add the numbers under Settings → Organisation → Edit.

Notify on email

Emails your team about the call from HelloCall’s mailbox. Send to one of the notification emails on your organisation’s profile, or Everyone on the list; write a Subject and Body with variables; and switch on Send the conversation and Send all variables to attach the transcript and everything collected. The result is in {email.ok}, {email.sent} and {email.error}.

Set variable

Works out a value and keeps it: a fixed value, joined text, or arithmetic such as {subtotal} * 1.18. Each row has Set (the name) and Value. Only under a condition… adds If / Else if / Otherwise rules, so one step can set a discount by customer type or a message by time of day. Add another variable sets several at once.

Get party info

Looks up the person on the line in your parties and fills in {party.name}, {party.email}, {party.city} and your own party fields, plus {party_found}. Put it above the first step that uses them.

  • Look up this number — empty means the caller; or use a number the call collected.
  • Don’t wait for the answer — starts the lookup and walks on at once; a later Get party info step waits for the same lookup.

HelloCall Agent

The HelloCall Agent is HelloCall’s own voice agent, on HelloCall’s own stack: the call’s recogniser hears the caller (Sarvam for Indian languages, Whisper otherwise), gpt-oss on Cerebras answers from your instruction, the workflow’s voice speaks the answer, and it listens again — in a loop, on a phone call, a local modem, a web test call or a website chat (text there). It works the same way as the ChatGPT Agent but needs no key, and it costs AI tokens rather than a provider’s minutes.

With Hold the conversation on (the default) the step is that complete agent, like the ChatGPT or Gemini Agent but on HelloCall’s own voice and recogniser (and plain text in a website chat): it speaks its answer, listens for the next words and answers again, turn after turn, until the caller wants one of its actions or is done (END). No Speak step or loop after it. Agent speaks first opens with a greeting (the prompt is its brief for that line); Wait for a reply is its patience before asking “still there?” and letting go. With the switch off it is one exchange: it works an answer out with AI and stores it — it is not spoken; a Speak step below reads it out. Your Instruction tells the model who it is and what to do (Templates offers 125 ready-made instructions in 25 groups, and Improve with AI rewrites the whole step as you ask — the instruction, the prompt, the actions and the tools — and shows what changed before it goes on the step); the model also sees the last twenty turns of the call; the Prompt is the request, for example “The caller just said: {last_answer}. Answer in one sentence.” The answer, in the call’s language, goes into Save answer in.

Actions are what the AI may do instead of answering. Give each a name in capital letters, like END — “talk to human” becomes TALK_TO_HUMAN — and say when to take it, for example “the caller asks for a person or the manager”. They are sent to the AI with the instruction, and each gets its own line on the step: when what the caller said calls for one, the call goes down that line, to a Transfer or a booking question, instead of the Answer line. An action whose line is not connected is not offered.

END is always there: the caller wants to end the call — “bye-bye”, “let’s end the call”, “that’s all”. Connect it to your goodbye. It is also taken when nothing comes back. The answer variable is empty on every line but Answer.

ChatGPT Agent

Hands the call to ChatGPT, live: it hears the caller and answers in its own voice from your Instruction, keeps the conversation going, and ends the call itself after a goodbye — or carries on to the next step when its Time limit is reached. Needs ChatGPT connected under Settings → Integrations; OpenAI bills your account for the minutes, your wallet pays the plan’s per-second talk rate as on any call.

  • Instruction — who the agent is and how it should behave, written for a phone call. Templates offers the agent library; Improve with AI takes one request — said or typed, in any language — and changes whichever parts of the step it needs: the instruction, the voice and model, how it listens, the time limit, the actions and the tools, then shows every change for review before it goes on the step. Attach files or add a link to your website and its facts — services, prices, hours, policies — are written into the instruction.
  • Model, Voice, Reasoning effort and Max tokens per reply — gpt-realtime-2.1-mini and the voice Verse by default.
  • Noise reduction, Caller transcript, Speech threshold and Silence that ends a turn — how it listens on a phone line.
  • Agent speaks first and Time limit — the call itself.
  • Actions — like the HelloCall Agent step’s: a NAME, when the caller wants it, and the parameters to collect first (e.g. date, time). Each is a line out of the step: the agent says a closing sentence, the parameters become {variables} and {agent_action} names it, and the call takes that line — a Transfer, a booking, a Speak, and a line back into the agent to carry on. END is built in and is the unlabelled line (also taken on the time limit or an error). Suggested actions are one click away.
  • Tools — lookups that stay in the conversation: a NAME, parameters, and an HTTP request with {parameter}, {variables} and {{secrets}}. The answer is read to the agent and kept in {tool_<name>}. e.g. check_order (order_id) → GET …/orders/{order_id}. MCP servers are not offered yet.

Everything said on the call — by the caller and by any agent — is in {call_thread}, kept up to date after each agent. An Extract variables step after the agent pulls out what you need (a name, a date, the reason for calling) from that conversation, the same way after every kind of agent.

Inworld Agent

The same live conversation, run by Inworld’s Realtime API in one of your Inworld voices — including a voice you cloned. Choose the Language model behind it, the Voice (empty uses the integration’s saved voice), the Speech model and Speaking speed, and how it takes turns: Semantic (it knows when a sentence is finished) or Silence. Fillers while thinking and “Uh-huh” while the caller speaks make it sound like a person. Needs Inworld connected under Settings → Integrations; Inworld bills your account.

Gemini Agent

The same live conversation, run by Google’s Gemini Live API in one of Google’s voices (Kore by default). Set the Live model, Voice, Temperature, how sensitive it is to the start and end of speech, the Silence that ends a turn, and whether to write a transcript. Needs Gemini connected under Settings → Integrations with a Google AI Studio key from a paid project; Google bills that project.

Summarize call

Reads the whole conversation and writes one or two plain sentences — who called, what they wanted, what was agreed — into {call_summary} (or the name under Save summary in). Focus (optional) steers it, for example “the complaint and the promised fix”. Nothing is spoken. Put it below End call, then send the summary on by email, WhatsApp, an API call or Save to party.

Extract variables

Pulls several values out of the conversation at once with AI — a name, a budget, a reason for calling — each into its own variable. Under Variables to extract, add rows of Save as and What it is. Switch on Send the conversation so far and, if useful, Send all variables. A value that was not said is left empty; a failure is described in {extract_error}. Best below End call, where the whole call is there to read.

Date & time

Reads a date or time — what the caller said (“tomorrow evening”, “next Monday at 4”), a variable, or, left empty, right now — and stores every fact about it under one variable (Save the facts in, for example when): {when.day}, {when.date}, {when.time}, {when.spoken} (“Friday the 4th of September”), {when.relative} (“in 3 days”), {when.is_holiday}, {when.is_working_hours}, {when.opens_at}, {when.next_working_day} and more.

Opening hours and holidays come from Settings → Working hours.

Schedule a call

Books a call back at the time the caller asked for. Put a Date & time step above it and pass its variable in When (the caller’s own words work too).

  • Book through a campaign off: the call appears under Scheduled calls, running the Workflow to run (this workflow by default) from the line in Ring from (this call’s line by default).
  • Book through a campaign on: the number is added to the chosen Campaign’s list for that time, inside the campaign’s calling hours.
  • Number to call — empty means this caller; Their name — for the list.
  • Save the result in gets scheduled, duplicate (already booked) or failed, so the next Speak step never promises a call that was not booked.

Save to party

Creates or updates the caller’s record in your parties. Fields you set yourself map values onto party fields and always win. Let AI read the call fills in the rest of your party fields from the conversation — leaving out anything it did not hear rather than guessing — with Anything else it should look for as a hint. It never blanks a value already saved. The result (created, updated or failed) goes in Save the result in.

Workflow

Runs another workflow here, then carries on with this one. Pick it under Workflow to run; Open this workflow jumps to it, and Variables it brings back lists what it collects for the steps below. See Reuse a workflow inside another.

Transfer to human

Rings a person — or a list of people — and puts the caller through. Say before transfer tells the caller what is happening.

  • Who to ring — one or more numbers. With two or more, Ring them all at once (the first to answer takes it) or Ring them one after another.
  • Ring for (seconds) — 5 to 120, 25 by default; Caller ID; and what The caller hears while it rings.
  • When they answer — Whisper to them a line only the person hears (for example the caller’s name), and Record the transferred call.
  • When somebody answers — Hand over and end the call, Wait for them to finish, then carry on below, or Carry on below straight away.
  • When nobody answers — Carry on below (offer to take a message, try another queue) or End the call.

What happened is in {human_transfer_state} — connected, completed, no_answer, busy, rejected or failed — with {transfer_answered_number} and {transfer_duration}.

End call

Says an optional Goodbye message, waits for it to finish playing, and hangs up. Steps wired below it run after the caller has gone. A workflow needs at least one End call step.

Older steps

Two steps may appear in older workflows but are no longer in the palette: AI agent, which handed the conversation to a free-talking agent, and Send SMS. They still show on the canvas so an existing workflow keeps drawing. For texting, use a local number’s SMS, or Send Wago Message for WhatsApp.

Variables every call knows

These are filled in by HelloCall on every call and can be read by any step:

  • Call — {phone_number} (the other end, with country code), {call_direction} (in / out), {language}, {call_id}, {org_id}, {phone_id}, {last_answer}, {call_thread} (the conversation so far, ready for a model) and {call_variables} (everything collected, as one JSON object).
  • Workflow — {workflow_id} and {workflow_execution_id} (unique to this run).
  • Campaign — {campaign_id} and {campaign_contact_id}; empty when the call was not placed by a campaign.
  • Date & time, in your timezone and updated before every step — {current_date}, {current_time}, {current_datetime}, {current_day}, {current_month}, {current_year}, {org_timezone}, and {call_started_at} for when the call began.
  • Working hours — {is_working_hours}, {is_working_day}, {is_holiday}, {holiday_name}, {working_hours_today}, {next_working_time} and {next_working_day}.
  • Caller — {party.name} and the rest, after a Get party info step.
  • Secrets — {{name}} from the secret store, usable in Call an API headers and bodies only; never spoken.

Questions about workflow steps

Every question from every chapter is also on the FAQ page.

What is the difference between Condition and Match?

Condition tests values (equal, greater than, contains, empty …) and has two lines, true and false. Match has one line per value of a single variable, plus “no match”. Use Match under an Ask Question step; use Condition for numbers, flags and anything else.

How does Ask Question understand different ways of saying yes?

List the possible answers — for example yes and no. AI maps what the caller said onto one of them in any language: “sure, go ahead”, “haan ji” and “okay” all land on yes. Add a note for the AI for readings only you would know.

Which steps can run after the call has ended?

Steps that need no caller: Call an API, Set variable, Get party info, HelloCall Agent, Summarize call, Extract variables, Save to party, Datamold, Send Wago Message, Notify on WhatsApp and Notify on email. Speak, Ask Question, FAQ and Transfer cannot.

Why is the Datamold, Wago, ChatGPT, Inworld or Gemini step missing from my palette?

Integration steps appear only when the integration is switched on and connected under Settings → Integrations — that includes the ChatGPT, Inworld and Gemini agent steps, which need their provider connected with a key. Notify on email appears when the platform mailbox is set up.

How do I use an API key in a Call an API step without exposing it?

Store it in Settings → Secret store and write {{name}} where it goes, for example in an Authorization header. The value is added only as the request is sent and never appears in the workflow, the transcript or the logs.

Can the agent read out a price from my system?

Yes. Use Call an API to fetch it into a variable, then a Speak step with the variable at the end of the line: “The price is {price}”.

Why does a Speak step using {party.name} show a problem?

Party details are only filled in by a Get party info step. Add one above the first step that uses {party.…}.

What happens if nobody answers a transfer?

By default the call carries on at the step below the Transfer, so you can offer to take a message or try another number. Branch on {human_transfer_state} to tell no_answer from busy or rejected.