TL;DR: An outbound voice agent is not an inbound agent pointed the other way. Inbound, the caller chose to talk to you and will forgive a lot. Outbound, you interrupted someone, and everything follows from that: the first eight seconds have to earn the rest of the call, the list matters more than the prompt, answering machines are the majority outcome rather than an edge case, and retry cadence is a compliance decision instead of a tuning knob. The measurement changes too. Resolution rate is an inbound metric. Outbound lives or dies on contact rate, conversion on contact, and attempts per contact.
Most of the voice agent work I get asked about starts inbound, because a missed call is easy to point at. Somewhere around month two the client asks the obvious follow-up: if it can answer the phone, can it call people? At Tested Media I built the voice and chat agents behind CallSetter AI, with GoHighLevel running campaigns and lead management underneath, so the outbound half is not a hypothetical for me. It is also where I have watched the most projects go sideways, almost always because the same agent that worked inbound was reused with the direction flipped.
Here is what actually changes.
Everything falls out of one asymmetry
Inbound, the person dialed you. They have a reason, they are already holding the phone, and their patience budget is large because they want something. A three second pause is annoying. It is not fatal.
Outbound, you took someone out of whatever they were doing. Attention is not granted, it is borrowed, and it gets withdrawn the moment the call sounds like a telemarketer. There is no goodwill in the account to spend.
That single inversion is why copying an inbound agent outbound produces something that technically works and books nothing. The conversation design, the failure modes, the infrastructure and the metrics all shift.
The first eight seconds are the whole product
An inbound agent opens with a greeting and a question, because the caller is about to tell it why they rang. An outbound agent has to answer three questions before the human decides whether to stay on the line: who is this, why are you calling me, and what do you want.
The structure I use, in order:
- Name the business the person recognizes, not the agency and not the platform. The name has to be the one they interacted with.
- Anchor the call to something they did. "You enquired about a service on our site this morning" is a different call than "we have an offer for you." One is a follow-up, the other is a cold call, and people can hear the difference instantly.
- Ask a short question that gives them an exit. "Is now an okay time?" costs two seconds and dramatically changes how the rest of the call goes, because it converts an interruption into a choice.
Things that belong nowhere near an outbound opener: "How are you today," any pause longer than a beat before the first word, and pitch language before the reason for the call. Silence on a call you did not ask for reads as a robodialer, and people hang up on it, so the first turn is where to spend the latency budget.
On disclosure, my rule is simple and I do not negotiate it: the agent never claims to be a person, and if someone asks directly it says plainly that it is an AI assistant calling on behalf of the business. Some jurisdictions require that up front on outbound calls. Beyond the legal question, an agent caught pretending is worse for the client than no agent, because the recording of that call is the thing that gets shared.
The list is the product, not the prompt
The single largest determinant of outbound performance is not the agent. It is who you dial and how long after they raised their hand.
The best outbound call in this category is the one that goes out sixty seconds after a missed call or a form fill, while the person still remembers doing it. That is a callback, not a cold call, and it is why missed-call textback plus an AI callback is the outbound build I recommend before any other. Contact rates on a sixty second callback are in a different universe from a list that has been sitting for a week.
The other half of list quality is suppression, and it needs to be enforced before a dial job is ever created:
- Do-not-call entries, both the national list where it applies and the client's own.
- Anyone who already booked, already bought, or is mid-conversation with a human on the team.
- Anyone who opted out on any channel, including a reply to an SMS.
- Wrong numbers, which must be recorded as a permanent state rather than a failed attempt, or the system will keep redialing a stranger.
Every one of those lives in the CRM, which is the point. If the suppression logic sits inside the voice platform, it applies to one agent and gets forgotten. If it sits in front of the dial queue, it applies to every campaign and every channel.
Answering machines are the normal case
Inbound, a voicemail is an edge case. Outbound, machines answer a large share of the calls, and how the agent handles that is a real feature rather than an afterthought.
Two failure modes, and they pull in opposite directions. Detection that is too eager clips a real human who answered slowly, so the agent starts leaving a voicemail over a live person saying hello. Detection that is too patient means the agent has a warm conversation with a beep and burns a minute of billable audio doing it. Neither one is solved in the prompt. It is a setting on the telephony layer, and it needs to be tested against real numbers on real carriers, including mobile voicemail greetings that are long and personal enough to look like a conversation.
The voicemail itself should be short and boring. Who called, one sentence on why, one number to call back, done. Not a pitch, not three sentences of value proposition, and never three voicemails across three attempts. The callback number matters as much as the script: it needs to be a number that is answered, ideally by the same agent, or the whole loop dead ends. That is a piece of the phone number layer, which is also where the registration work lives that keeps your outbound number from being labelled Spam Likely.
Retry cadence is compliance, not tuning
Inbound has no cadence problem. Outbound has almost nothing but cadence problems, and this is the area where I insist on getting the client's rules in writing before I encode anything. I am an engineer, not their lawyer, and outbound calling in the US sits under consent rules with real financial teeth.
What I build regardless of the specific rules:
- Calling windows in the recipient's local time, not the business's. Deriving a time zone from the area code is a guess, and mobile numbers make it a bad one. Store the time zone on the contact record and treat it as data, the same discipline I described for booking against a calendar.
- A hard attempt cap per contact per day and per campaign, with spacing between attempts rather than a burst.
- Explicit stop conditions. Contact made, booked, opted out, wrong number. Any one of them ends the sequence permanently.
- One place where all of this is enforced. Quiet hours checked in three different workflows will disagree within a month.
There is a reputational layer on top of the legal one. Carriers score numbers, and a burst of very short outbound calls is exactly the pattern spam analytics look for. A cadence that is polite to the recipient also happens to be the cadence that keeps your number answerable, which is a rare case of the compliant thing and the effective thing being identical.
The metrics change
The inbound numbers I hold clients to do not transfer cleanly. Resolution rate assumes someone called with a problem. Outbound needs its own set:
- Contact rate. Attempts that reached a live human. This is mostly a list and timing metric, not an agent metric, and reading it as agent performance sends people optimizing the prompt when the real fix is dialing faster after the lead comes in.
- Conversion on contact. Of the conversations that actually happened, how many reached the goal. This is the honest agent quality number, and separating it from contact rate is what stops a bad list from hiding a good agent, or the reverse.
- Attempts per contact. The cost and annoyance metric. If it is climbing, the list is aging or the calling windows are wrong.
- Opt-out rate. The one nobody wants on the dashboard and everybody needs. A rising opt-out rate is the system telling you the targeting is wrong before the client's customers tell them.
- Cost per booked appointment. Survives the direction change unchanged, and it is still the number the owner cares about.
Where the logic lives
Structurally, my outbound build looks like my inbound build with one addition: the dial queue. The agent stays thin and handles the conversation. Everything around it, suppression, quiet hours, retry scheduling, outcome write-back and the follow-up SMS, runs in n8n against the CRM, which is where the campaign and the contact history already live. The voice platform triggers a call and reports what happened. It does not own the strategy.
That separation is what makes the system auditable, and auditability is the thing an outbound program needs most, because when a client asks why their customer got called at 7am on a Sunday, "the agent decided to" is not an answer. It also keeps the escalation path clean, since a live outbound contact who asks for a human is the highest value handoff you will ever get, and handing off well is worth more here than anywhere inbound.
When outbound should not be an agent at all
Sometimes the right answer is not a call. If the reason for contact fits in one sentence and needs no back and forth, a text outperforms a call on cost, on annoyance, and often on response. That is the same channel logic I laid out in chat agent versus voice agent: the channel is a consequence of where the interaction is actually being lost.
My filter is one question. Can you state the reason for this call in a single sentence tied to something this specific person did? If yes, the call is welcome and an agent can make it well. If no, you are building a robodialer, and no amount of prompt engineering makes that a good product.
The short version
- Inbound gets forgiveness, outbound gets none. Design for the interruption.
- Open with who, why, and a question that gives an exit. Never claim to be human.
- Dial fast against fresh, consented leads. Speed to lead beats prompt quality.
- Enforce suppression in front of the queue, not inside the agent.
- Treat answering machines as the normal case and tune detection against real carriers.
- Get the client's calling rules in writing, then encode windows, caps and stop conditions in exactly one place.
- Measure contact rate and conversion on contact separately, and put opt-out rate on the dashboard.
- If the message fits in a text, send a text.
Inbound is about not losing what you already have. Outbound is about being welcome enough to be worth the interruption. They are different products that happen to share a voice.
I build production voice and chat agents on Retell, wired into n8n, GoHighLevel and Twilio, with the CRM, campaign and reporting layer behind them actually working. More about my background here, or book a call.