Three ways to put Retell's voice engine behind your brand, what each costs you in margin and lock-in, and the one thing that turns this from reselling someone else's product into a product of your own.
Retell is API-first, so wrapping it in your own UI is a normal integration, not a fight. You can absolutely have clients log into Replyee, configure a voice agent, and never see the word "Retell."
But don't wire Retell in directly. Put it behind an adapter — the same pattern Posttee already uses for social platforms. Same build time, and you keep the freedom to swap engines later without touching a line of UI.
Framing what you'd be buying, so the options below make sense.
Retell is a voice AI agent platform. It handles the genuinely hard parts of a real-time phone conversation:
| Layer | What it does | Why it's hard to build |
|---|---|---|
| Telephony | Answers/places calls, manages numbers | Solvable — you already have Twilio |
| Speech-to-text | Caller's voice → text, streaming | Solvable — Deepgram, Whisper |
| LLM orchestration | Text → response, with context | Solvable — you do this already in Replyee |
| Text-to-speech | Response → natural voice | Solvable — ElevenLabs, Cartesia |
| Turn-taking & barge-in | Knowing when the caller stopped, letting them interrupt | This is the hard part. Sub-second latency, endpointing, interruption handling. It is what Retell actually sells. |
Four of those five layers you could assemble yourself in a few weeks. The fifth is where voice products live or die — a 400ms delay or an agent that talks over people feels broken to a caller in a way that no feature list compensates for.
Ordered as they'd appear if you were only thinking about speed. The recommendation is third for a reason.
Clients log into Replyee, configure a "voice agent," see transcripts in the Replyee inbox. You call Retell's REST API to create and update agents; their webhooks post call events back to you. Retell is invisible.
Twilio Voice (already in your stack for SMS) + Deepgram + ElevenLabs + Claude, wired together yourself.
Identical client experience to Option 1 and near-identical build time — but every Retell call goes through a VoiceProvider interface instead of being scattered through your routes. Swapping to Vapi, Bland, or your own Twilio stack later becomes a new file, not a rewrite.
types.ts states the contract outright — "NOTHING in the app talks to a social platform directly" — and registry.ts is a single swap-point map with a liveChannels() filter for adapters that have working credentials. That decision is what let you drop Ayrshare for direct platform APIs without rewriting Posttee. Copy it verbatim for voice.
This section is the actual argument. Everything above is plumbing.
Replyee already has a working RAG stack — pgvector embeddings, ingestion from URL, PDF, and pasted text, plus automatic BOO menu ingest. That knowledge base is an asset Retell does not have and cannot sell.
A client uploads their menu once and gets a website chatbot and a phone agent that know exactly the same things — and stay in sync when the menu changes. Retell alone can't do that. Retell plus your knowledge base is a product you can charge for.
Voice is conversation. Conversation is Replyee. It does not become a 15th app — the same ruling you already made for SMS, and consistent with the rule that no two apps do the same job.
Sequenced so each step is testable before the next one starts.
Get written answers on branding removal, agency/reseller pricing, per-minute rate at your projected volume, and data ownership over call recordings and transcripts. If white-labeling requires an enterprise tier you can't justify yet, that changes the plan — better to know on day zero.
VoiceProvider interfaceSmall and deliberately generic — nothing Retell-specific in the shape:
export interface VoiceProvider {
// NOTHING in the app talks to a voice vendor directly.
createAgent(cfg: AgentConfig): Promise<{ providerAgentId: string }>
updateAgent(id: string, cfg: Partial<AgentConfig>): Promise<void>
deleteAgent(id: string): Promise<void>
assignNumber(agentId: string, e164: string): Promise<void>
parseWebhook(req: Request): Promise<CallEvent>
}
retell.ts — the only file that knows Retell existsMirror Posttee/src/lib/publishers/registry.ts: a provider map plus a liveProviders() filter so an unkeyed provider is skipped instead of throwing.
Reuse each bot's system_prompt and knowledge chunks. A client who already has a working chatbot should get a working phone agent with no reconfiguration — that's the whole pitch, and it should be a one-click upgrade.
Write call transcripts into replyee_conversations / replyee_messages with a channel: 'voice' discriminator. Voice then appears in the inbox you already built, for free. Add the column in a numbered migration — Replyee's migrations are clean, keep them that way.
Your Twilio 10DLC reseller setup already covers the plumbing and the compliance posture from the SMS build.
Voice is the first thing you'd sell with a genuinely variable per-unit cost. Meter from the first call. See §6.
Every other Boom app has near-zero marginal cost per customer. Voice does not.
At roughly $0.07–0.10/min plus telephony, a single heavy client can erase the margin on several light ones. A flat "unlimited" tier is an open-ended liability, not a simple pricing choice.
| Model | Shape | Assessment |
|---|---|---|
| Flat unlimited | $X/mo, no cap | Avoid. One high-volume restaurant on a busy Friday can eat a month of margin. |
| Included minutes + overage | e.g. 500 min included, then per-minute | Recommended. Predictable for the client, capped downside for you. Mirrors how you already think about SMS. |
| Pure per-minute | Cost + markup | Safest margin, hardest to sell — buyers dislike unpredictable bills. |
/api/internal/order-status). The bot cannot call it. Order data only reaches the model if BOO pushes it in advance.
This is worth fixing before or alongside the voice work, for two reasons:
| Gap | Effect on the voice product |
|---|---|
| No streaming (answers arrive as one block) | Chat-only issue — Retell handles voice streaming itself |
| No AI-driven escalation (handoff needs a button click) | Serious for voice. A phone caller can't click. Needs a "transfer to a human" path from day one. |
| No multilingual | More visible on the phone than in chat |
Config surface is one system_prompt textarea | Voice needs more: greeting, voice selection, speaking rate, business hours |
| No business-hours model | After-hours is one of the strongest voice-agent selling points. Currently no concept of hours exists. |
| Question | Answer |
|---|---|
| Can Replyee be the front end for Retell? | Yes — Retell is API-first |
| Can it be fully your brand? | Technically yes; confirm their white-label terms in writing |
| Should Retell be wired in directly? | No — put it behind a VoiceProvider adapter |
| Does voice become a 15th app? | No — voice is conversation, conversation is Replyee |
| What makes it defensible? | One shared knowledge base driving chat + voice together |
| Biggest technical blocker? | No tool-calling — blocks "where's my order?" |
| Biggest commercial risk? | Per-minute cost under a flat-rate plan |
| Can you leave Retell later? | Yes, if you build the adapter now |
Email Retell sales about white-label and agency pricing today. It's the only step with an external dependency and a multi-day turnaround, and its answer determines whether the rest of the plan holds. Everything else is code you control.