Skip to content
Proofbell

Call flows

A call flow decides what happens when somebody rings one of your tracking numbers: whether you are open, what they hear, which phones ring and in what order, and where the call goes when nobody picks up. It replaces "forward every call to this one number" with something that can tell Tuesday lunchtime from Sunday night.

Until you make a flow live, every inbound call rings your project's forwarding number — regardless of the hour, who is calling, or which campaign they came from. That is the state every project is in to begin with, and nothing errors to tell you so: a set of opening hours with no live flow behind it is simply never consulted.

The Call flows screen states which of the two is happening for the project you are looking at, because neither list of flows answers it on its own.

Draft, published, live — three states, not two

This is the part people expect to be two steps and it is three. Publishing does not change what happens to a single call.

StateWhat it means
Draft Saved and editable. Half-finished is fine — a dangling reference is reported back to you rather than refused, so you never lose the work in the middle of an edit.
Published Checked and frozen. Every problem findable without a caller on the line is found here. A published version cannot be edited — an edit is a new version.
Live The one version inbound calls actually run. Exactly one per project, and it is a separate act from publishing.

Publishing is where the checking happens because a malformed flow discovered while somebody is listening to it is already a lost call. Activating an unpublished draft is refused for the same reason.

Why a published version is immutable: a call that is part-way through a menu resumes against the version it started on, by node name. Editing that version underneath a live call would send the caller to a step that no longer exists. So when you make a new version live, calls already in progress finish on the old one and calls arriving from that moment run the new one.

Turning flows off again puts the project back to ringing its forwarding number — hours, menus and call caps stop applying. That is refused if no forwarding number is set, because with neither a flow nor a number there is nowhere to send a call and every caller would hear an apology.

Call flows are on every plan. There is no tier that withholds opening hours, an IVR menu or a ring group.

Including the free plan — where a flow routes nothing. A free account has no tracking number, so no call can arrive for a flow to run. You can author one, publish it and make it live, and it will sit there correctly configured and never be consulted. That is not a fault: it is the same reason a free account's call log is empty. A number comes with a paid plan — see what each plan includes.

Where you build one

The Call flows screen is a step editor. Each step is a card with its own fields and a then go to choice, and the picture underneath redraws as you change them so you can see the shape a call takes rather than infer it from a list. Every kind of step the engine runs is there except the AI voice agent, which is refused at publish for the reason given further down. Start from the common shape gives you opening hours, a ring group and voicemail either side in one click; Start empty gives you a blank flow.

The checks the platform runs when you publish run in the editor as you type, so a step that points nowhere or a menu with two keys the same is named before you save. A draft can be edited; a published version cannot, because calls in progress resume against the steps it holds — Duplicate as a new draft is how you change one.

Everything the screen does, the API does too, and a flow is a named graph of nodes there:

GET    /v1/projects/:projectId/call-flows            the flows, and which is live
POST   /v1/projects/:projectId/call-flows            save a draft (or the next version)
PUT    /v1/projects/:projectId/call-flows/:flowId    replace a draft's graph
POST   /v1/projects/:projectId/call-flows/:flowId/publish
POST   /v1/projects/:projectId/call-flows/:flowId/activate
POST   /v1/projects/:projectId/call-flows/deactivate

A graph names its entry node and then each node names where to go next:

{
  "entryNodeId": "hours",
  "nodes": {
    "hours": {
      "type": "schedule",
      "timezone": "Europe/London",
      "rules": [
        { "daysOfWeek": [1, 2, 3, 4, 5], "startTime": "09:00", "endTime": "17:30" }
      ],
      "holidays": ["2026-12-25"],
      "openNext": "desks",
      "closedNext": "closed"
    },
    "desks": {
      "type": "ring",
      "strategy": "simultaneous",
      "destinations": [
        { "e164": "+441242555123" },
        { "e164": "+447700900801", "isMobile": true }
      ],
      "timeoutSeconds": 25,
      "noAnswerNext": "voicemail"
    },
    "closed": {
      "type": "greeting",
      "text": "Thank you for calling. The office is closed.",
      "next": "voicemail"
    },
    "voicemail": {
      "type": "voicemail",
      "prompt": "Please leave a message after the tone.",
      "maxSeconds": 120,
      "next": null
    }
  }
}

Saving returns any problems with the graph, so you can see them before you publish. Authoring, publishing and activating all need the project-manage permission — the same one that lets somebody change your forwarding number. Making a flow live is recorded in the audit log as a restricted change, naming who did it and what it replaced, because a flow decides where your business's calls go.

The nodes

NodeWhat it does
Greeting Plays a message — typed text read aloud, or an audio file of yours — then continues.
Schedule Open or closed, by day and time, with a list of holiday dates that close you regardless of the rules. Two branches: open and closed.
Geographic routing Branches on the caller's country as the carrier reports it, or on a dialling prefix of their number such as +4420 for London. Anything unmatched takes the default branch.
IVR menu "Press 1 for sales." One key per option, 09, * and #. A wrong key or silence re-prompts up to the number of attempts you set, then takes the fallback branch.
Ring group One or more numbers to ring, in one of five strategies below, for up to 120 seconds. Can play a whisper to whoever answers — the caller does not hear it. Has a no-answer branch.
Voicemail A prompt and a recording, up to ten minutes, optionally transcribed.
Survey Asks the caller a question and collects one or two keypad digits, stored with the wording as they heard it. Results read back on the Call flows screen — see post-call surveys.
Call cap Refuses onward routing once a number or a project has taken too many calls in a window.
Spam filter Branches on the spam score the call already carries, at a threshold you choose.
Hang up Ends the call, optionally after a farewell message.
Reject Refuses the call without answering it — an engaged tone, or a plain rejection.

A menu may loop back on itself — "press 9 to return to the main menu" is an ordinary thing to want and it is allowed, because a menu waits for the caller and so cannot spin. A loop of greetings and schedule branches with no point at which the flow waits for anybody is refused at publish, because it would never finish.

Opening hours are evaluated in your timezone, and once

A schedule carries its own timezone and every comparison happens against the wall clock there, not against our server's. This matters more than it sounds: a "Mon–Fri, 09:00–17:00" rule evaluated in UTC sends British callers to voicemail for the last hour of every summer afternoon, because British Summer Time is an hour ahead — and the report insists those calls were out of hours, so it reads as a reporting fault rather than a routing one.

  • Holidays win over the rules. A date in the holiday list is closed even though it happens to be a Thursday inside your normal hours.
  • Overnight rules work. 22:00–06:00 wraps past midnight rather than matching nothing, which is what an out-of-hours emergency line needs.
  • Start times are inclusive and end times exclusive, so 09:00–17:00 is open at 09:00 and closed at 17:00. Use 24:00 for end of day.

A call takes one path. The schedule is evaluated at the moment the call started, not each time the flow moves on. Somebody who rings at 16:59 and then spends two minutes choosing from a menu is not tipped into the out-of-hours branch at 17:01 half way through — which would hand a caller to voicemail after they had already chosen sales.

Ring strategies

StrategyWhat happens
Simultaneous Every phone rings at once; the first to pick up gets the call.
Sequential In the order you listed them, one after another.
Priority Lowest priority number first. Same as sequential, ordered by a field instead of by position.
Weighted Shares calls in proportion to a weight per destination — 3 and 1 gives one person three calls in four. Spread evenly rather than in bursts, so nobody takes three in a row while a colleague sits idle.
Round robin Takes turns, starting one further along the list each call.

Weighted and round robin are about fairness across calls, so they need a counter that remembers who was last picked. Under the last two strategies the chosen phone is rung first and the others follow, so a call is not lost because one person stepped away.

If that counter is unavailable, the call still connects — every destination rings at once. Worth knowing because it is a visible change in behaviour rather than a failure: you will notice everybody's phone ringing. The alternative would be to keep taking turns from a counter that has reset, which quietly sends every call to the same person.

Recording: your account setting is a ceiling

A ring group can ask for the call to be recorded, but a flow cannot record on an account where recording is switched off. The request is dropped and the call connects without recording. Recording is off for a legal reason often enough — one-party and two-party consent differ by country and by US state — and nothing in a flow knows which jurisdiction you are in.

It works the same way in the other direction: where your account requires a recording announcement, a flow node cannot switch it off. If the node has no announcement of its own, a standard one is played. Publishing a flow that records with no announcement anywhere is allowed but warns you, because recording without notice is unlawful in two-party-consent jurisdictions and we cannot tell whether you notify the caller in an earlier greeting.

Asking for a voicemail to be transcribed is a request, not a guarantee. Every paid plan includes transcription, so a missing transcript is almost always the per-project switch — it is off until somebody turns it on, and with it off you keep the recording and get no transcript. The only other case is a free account, which has no calls to transcribe at all.

Call caps

A cap refuses onward routing once a number or a project has taken more than a set number of calls in a window. It exists for two situations that are both expensive:

  • A campaign that runs away. A number promoted somewhere far larger than expected floods a line that cannot answer, and every unanswered call is a lead you have paid for and lost badly rather than politely.
  • Toll fraud on a forwarding destination. An uncapped number that forwards to a premium or international destination is an open invoice, and the bill arrives before anybody notices the traffic. Premium, personal-numbering and international destinations are refused outright now — see which numbers can receive a forwarded call — so a cap is protecting you against volume rather than against a rate.

Two scopes work, and one is refused:

  • Per number — calls to one tracking number.
  • Per project — calls to every number on the project.
  • Per destination is refused at publish. A cap is evaluated before any destination has been chosen — the ring group comes later in the flow — so the question cannot be answered. The refusal says so and names the two scopes that can.

A cap is not a hard limit, and you should size it as a safety net rather than as a quota. Two things follow from how it is counted:

  • The count is a read, taken before the call is recorded. Two people ringing at the same instant can therefore both pass a cap of one.
  • It counts calls that arrived before this one, so a cap of five admits the fifth caller and refuses the sixth.

And if the count itself cannot be taken, the cap lets the call through. Refusing a real customer because a counter was briefly unavailable is worse than going slightly over a limit you set as a precaution.

Spam is already handled before your flow runs

Calls scored as spam clearly enough to block are refused by the platform, before any flow is consulted — so adding a flow never starts connecting calls that used to be rejected. The spam filter node is for the softer band: scored as suspicious, not blocked outright, and you decide whether that goes to a person, to voicemail, or nowhere.

Blocking a specific number

Spam scoring is a judgement about a call. A blocklist is an instruction about a number, and it overrides the judgement entirely: a blocked number is rejected before it rings, no matter what it scores, and it is never billed to you.

Open Blocked callers from the header of the Calls page — the link carries the number of entries already on the list — and on that page enter the number and why. The reason is required — the only question ever asked of a blocklist six months later is "can we unblock this one yet", and a bare number cannot answer it.

A UK number can be entered as 07700 900123 or +447700900123; both are stored in the same international form, because the match has to be exact against what the carrier sends. It is stored per account, so blocking a number for one client does not affect any other client you manage — the same caller may be a legitimate customer of theirs.

Some numbers show as Blocked for everyone. Those are blocked by Proofbell across the whole platform — a dialler working through the phone book, usually — and cannot be removed from your account. They are listed rather than hidden so that a number you never blocked being rejected always has a visible explanation.

What a blocklist is not for

It matches one number exactly. There is no wildcard or prefix — "block everything starting 0843" is a different feature with a much worse failure mode, since one wrong prefix silently rejects a whole range and the only evidence is calls that never arrived. If you are blocking numbers one at a time and they keep coming from new ones, the spam score and the spam filter node are the tools for that pattern; a blocklist is for the one persistent caller you can name.

When something goes wrong, the caller still gets somewhere

A caller is a real person holding a phone, so nothing here fails by going silent. What happens instead, in each case:

ProblemWhat the caller gets
The live flow cannot be loaded or run Your forwarding number, as though no flow were live. The call connects.
The flow reaches a step that no longer exists A short apology and a clean end, rather than dead air.
The distribution counter is unavailable Every destination in the group rings at once.
A call cap cannot be counted The call is allowed through.
Nobody answers the ring group The no-answer branch — usually voicemail.

Two details in that last row are worth stating, because both would be wrong in the obvious implementation. A caller who did speak to somebody is not then offered voicemail. And a caller who hung up while the phone was still ringing counts as nobody answering, so they are not treated as a conversation that happened.

Every call records which flow version ran it, and the number it actually rang rather than the project's forwarding number — so a call that reached voicemail out of hours shows no destination, which is the truth about it.

One node the platform will not publish

The AI voice agent. The step exists in the engine's schema and no agent exists to answer a call, so publishing a flow that contains one is refused, with a sentence naming the step and asking you to remove it or replace it with a ring or a voicemail. It used to be accepted with a warning that it "does nothing", which meant a caller reaching it was passed silently to the next step — a flow that looked configured and was not. The editor does not offer the step at all; a flow that already carries one shows it read-only with the reason.

The post-call survey works. It used to be refused at publish because there was nowhere to store what the caller pressed. Answers are stored now, and the results appear on the Call flows page — see below.

Post-call surveys

A survey step asks the caller a question and collects one or two keypad digits — "How did we do? Press one for good, two for bad." Put it after the call has finished its business, not before.

Answers appear under What callers said on the Call flows page, grouped by the question and with a response rate. Two numbers there are worth understanding:

  • The response rate counts callers who were asked and pressed something, out of everyone who was asked. It is shown with both figures rather than as a percentage alone, because 60% of five callers and 60% of six hundred are not the same fact.
  • No reply counts callers who were asked and stayed silent. That is recorded rather than discarded, because it is a result: a high number there usually means the question came too late in the call, or was too long to sit through.

We do not ask twice. If a caller says nothing, the flow moves on — an IVR digit is how somebody reaches the person they rang, so re-prompting there is worth it, but a survey answer is a favour they are doing you after the call is over.

Reword a question and it becomes a new question in the report. The wording is stored with each answer, so a "2" collected before you reversed the scale is never counted alongside a "2" collected after. The alternative — resolving old answers against current wording — would produce a plausible-looking figure that is wrong.

Answers are deleted with the call they came from, under the same retention setting as the call itself.

What is not built

  • No drag-and-drop canvas. The editor is a list of step cards with a drawn graph beneath it, not a canvas you drag boxes around on. Every step and every branch is reachable; the picture is a picture.
  • No AI voice agent, as above.
  • No softphone. Calls ring telephone numbers you nominate. There is nothing to answer a call inside Proofbell.
  • Caller ID is a website setting, not a step setting. Whether the phone that answers shows the caller's own number or your tracking number is chosen per website on the Numbers screen, and applies to every ring step in every flow.
Next Recordings and transcripts