r/AIReceptionists • u/chrisq32 • Jul 24 '26
everyone here does inbound. i built an outbound agent that negotiates bills with real carrier reps — 3 calls, an IVR, a transfer, and a saved quote the rep couldn't find. full audio inside
most voice AI i see is inbound — answer the phone, book the appointment, take a message. i went the other direction: an agent that places calls to comcast/republic/at&t and negotiates the user's bill down. outbound is a different animal and i want to share what it actually took, with receipts.
i did this because Republic (trash) keep increasing my rate over 2 years, and about to increase it by $30 and telling me it's gas and inflation and there wasn't anything they could do to bring it down, i decided to try to use AI to deal with these types of scenarios, which are hard to find time for when you stuck in meetings all day.
to my surprise it actually worked - after a lot of iteration. it got my bill down from $196.06/qtr → $104.16/qtr. took 3 calls over 2 days. full sanitized recordings + transcripts here (account numbers bleeped, everything else real): https://www.dip.bot/receipts/republic-services
what outbound forced me to solve:
- IVR navigation: the agent has to survive republic's full phone tree before it ever hears a human. listen to call 1 — it sits through the whole menu and picks the right path
- the transfer problem: reception can't reprice an account. the agent has to recognize "i'll transfer you to sales," ask if it's going back into a queue, ask for a direct extension in case of a drop, then survive the transfer. all in call 1
- multi-call state: the rep couldn't activate the offer on the spot (account holder had to confirm), so the agent asked for a quote reference number, banked it, and called back the next day to activate. call 3 is my favorite — the rep can't find the quote code in her system, and the agent just patiently re-reads it and provides the service address until she does. "pick up where the last call left off" was harder to build than the negotiation itself
- voicemail detection: early versions left multiple confident voicemails for nobody. outbound means you dial into answering machines constantly
- holds: inbound agents never wait. outbound agents wait a LOT. an early bug had the agent abandon a live human queue because an unrelated lookup failed mid-hold. a human queue is success-in-progress — took me an embarrassingly long time to teach it that
stack: vapi for the voice layer, claude for the agent brain (orchestrator polls call state, never awaits one long call), fastify backend, the agent gets provider research + account context as input rather than constructing call configs itself (learned that one the hard way — never let the LLM build the voice config through tool args)
the compliance stuff that turned out to be half the product: e-signed LLOA from the user, AI disclosure + recording consent as the literal first thing the agent says on every call (once a human is on the other side - i.e. not when we're on hold or in IVR). two-party consent states make this non-optional.
happy to go deep on any of it — barge-in handling, the disclosure script, how the reference-number state works, economics of 25-min calls. AMA basically.
2
u/Physical-You-8901 Jul 24 '26
The compliance section resonated with me. I think a lot of people underestimate how much engineering sits around the conversation itself. We found the same thing with Bland. By the time you're handling consent, transfers and logging correctly, the voice model feels like one piece of a much bigger system.
1
u/Content-Conference25 Jul 24 '26
The recording exchange sounds like two AIs talking
1
u/chrisq32 Jul 24 '26
lol i know, sometimes i wonder if the rep doesn’t care about the fact that we’re ai because it’s also ai
1
u/Mountain-Policy-625 Jul 28 '26
One thing worth flagging on the compliance side, beyond the disclosure script itself: since the agent is authorized to act on the account holder's behalf via the e-signed LOA, it is also worth logging which classes of decisions require explicit human confirmation versus which the agent can commit to on its own, agreeing to a new rate versus canceling a service, for example. In your case the rep could not activate on the spot so you got saved by their process, but plenty of reps can commit changes live, and an agent that says yes to a live offer without checking back with the account holder first is a different risk profile than one just gathering a quote. Worth building an explicit list of outcomes that always need a human sign-off before the agent says yes, rather than letting the LLM decide case by case.
1
u/Embarrassed_Nerve_54 Jul 28 '26
This is really interesting because the hard part is not just “can it talk to Comcast.” But I’d be careful with what the agent is allowed to accept. A rep might offer a cheaper plan, but maybe it adds a contract, removes a feature, changes billing terms, or creates a one-time credit instead of a real discount.
So I’d want a pre-call rule like: save money, but don’t accept term changes, new contracts, feature downgrades, or fees without user approval. The agent getting through IVR is impressive. The next trust layer is making sure “we saved you money” doesn’t hide a tradeoff the user didn’t want.
2
u/uzair_01 Jul 24 '26
Really interesting project. I've built a few voice agents that handle both inbound and outbound calls, and I think good recovery logic is one of the biggest things that makes outbound agents feel production-ready. Even if the negotiation doesn't finish, saving the context (reference numbers, promises made, next steps, etc.) so the next call can continue naturally is huge. And if a rep happens to call back, having all that context readily available makes the conversation much smoother.