Skip to content
Braav Labs — Where human intelligence meets artificial intelligence to build the future.
Braav Labs, internal

Voice agents that play a hard prospect

Two voice agents, a receptionist and an owner, chained into one call so a sales pitch can be rehearsed against a real gatekeeper before it is spent on a real lead.

Status
Live
Year
2026
Services
Missed calls
Published results
None yet

The problem

Cold calls are learned on live prospects, which means every bad opener costs a lead that will not pick up twice. Most voice-agent examples are built to help the caller. Practice needs the opposite: an agent that is difficult in the specific ways a real front desk and a busy owner are difficult.

How it worked before

  • Openers were rehearsed out loud with nobody on the other end
  • The first real test of a pitch was a real prospect
  • Nothing recorded how a practice call ended or why

What was in scope.

Deliverables, not outcomes. Anything not on this list was not built, and is not implied to have been.

  • A receptionist agent that screens and decides whether to transfer
  • An owner agent that only ever takes transferred calls
  • A squad chaining the two with a live call transfer
  • A closed outcome per call: Booked, Callback or Dead, with a reason
  • Every call logged to a sheet through an n8n webhook

The system, stage by stage.

Each stage does one thing and hands off. The marked stages are the ones a person owns: they are in the diagram because they are part of the design, not because nothing else could reach them.

  1. The pitch starts

    Human decision

    A person makes the call, cold, with no context handed to the agent.

  2. 02

    Receptionist screens

    Gives up as little as possible. Not customer support, and told so in writing.

  3. 03

    Transfer or stop

    Only a caller who earns it gets passed to the owner.

  4. 04

    Owner answers

    Busy and skeptical. Knows the call was transferred, so he does not re-screen.

  5. 05

    Outcome returned

    A typed field from a closed schema, not a guess from keywords in the transcript.

  6. 06

    Call logged

    One row per call: agent, duration, outcome, reason, recording and transcript.

One stage in this system is owned by a person. It stops there deliberately: those are the points where being wrong is expensive.

Runs on

Tools you can keep without us.

Everything is set up on your own accounts and your own billing, so the system does not stop working if we do.

  • Voice platformsSpeech in and out for voice agents, connected to a real phone number and a real calendar.
  • OpenAI & Claude modelsUsed at the points in a workflow that need interpretation: reading an unstructured message, summarising a call, classifying a request. Not used where a rule would do.
  • n8nThe workflow layer most of our automation runs on. Self-hostable, which matters when a client wants everything on their own infrastructure.
  • WebhooksHow one system tells another that something happened, without either polling the other.
  • Google SheetsUsed honestly: as a queue, a log or a review surface a non-technical person can actually open. Not used as a database.

These are tools we build with. Braav Labs is not affiliated with, endorsed by or a partner of any of them, and all names belong to their owners.

Why it was built this way.

  1. 01

    Hard is a prompt problem, not a model problem

    A helpful-by-default model slides into answering the caller's questions. The work is in the refusals: what each agent will not explain, will not offer and will not do. The behaviour lives in those constraints.

  2. 02

    The smaller model is the realistic one

    On a phone call, latency reads as hesitation. A faster, cheaper model with a strong prompt sounds more like a real prospect than a larger one that pauses.

  3. 03

    A blank outcome beats a guessed one

    When the platform returns no outcome, the cell stays empty. A blank row is a known unknown. A guessed one is a wrong number that looks like data.

Results

No measured result yet.

This build has not run long enough to produce a number we can stand behind and show you the source of. When it has, the figure and where it came from go here. We would rather this section say nothing than say something we cannot evidence.

On visual evidence

The screenshots are the public repository as it stands. Call recordings are not published.

The code

Read it yourself.

The vapi-voice-agents repository on GitHub: config folder, export and wiring scripts, and the README
The README's design notes and stack table: Vapi, Deepgram, OpenAI gpt-4o-mini, ElevenLabs

What we would change

What we would do differently.

Written down because the next client gets the version of us that already made these mistakes.

  • The first build was one agent playing both roles. Splitting it into a squad with a transfer is what made it feel like a real call.

  • Outcome capture should have been designed with the first agent, not added after a week of calls that left no record.

Want something like this built for your business?

Get my free audit

How an engagement runs.

The same five steps whatever we are building, so you always know which one you are in.

Pricing
Fixed price, quoted after a scope call
You have the number before anything is built. Nothing is billed by the hour.
Timeline
A date at quote time
Stated as a commitment, not an estimate that drifts once work starts.
Ownership
Everything stays in your name
Domains, hosting, inboxes and every account, on your billing, documented.
  1. 01

    Scope call

    Twenty minutes on how inquiries reach you today. No deck, no discovery package.

  2. 02

    Written scope and a fixed quote

    What gets built, when it lands, what it costs. Fixed before anything starts.

  3. 03

    Build and review

    You see it working on your own content, not a screenshot of it working.

  4. 04

    Launch and handover

    Accounts in your name, a written record of what runs where, a walkthrough.

  5. 05

    Support, if you want it

    A separate decision, made after something is already running.