Zvonobot AI: voice AI-agent platform for B2B
Multi-tenant SaaS console for outbound voice AI agents. Launched the line from zero in the fall of 2025 inside Prof-IT: 80 paying B2B customers and 500,000+ minutes of live conversations in under a year. It's live, so you can open it and register.
- Voice AI agents
- LLM orchestration
- B2B SaaS
- Per-second billing
- SIP telephony
- Multi-tenant
Zvonobot AI: a voice AI-agent line launched from zero
Zvonobot AI is a product line I launched inside the Prof-IT group in the fall of 2025 and own end to end: product, pricing, go-to-market. Clients assemble a voice AI agent, give it a prompt and a base of contacts, and run outbound campaigns: sales, onboarding, reactivation, surveys. A team of four engineers ships it; the product decisions are mine.
In under a year: 80 paying B2B customers, 500,000+ minutes of live conversations in production, a sales team that grew from 4 to 15 to sell the line.
The task
Fall 2025. Zvonobot is a mature outbound-calling platform: robots that dial contact bases with pre-recorded scripts. LLMs had just learned to hold a real conversation, and it was clear that recorded scripts would only get us so far, and that someone would eat the category with live agents if we did not. The question was not whether to build voice AI, but how to find out fast and cheaply whether our customers would pay for it.
What made outbound worth automating for a mid-market B2B team, in four lines:
- Headcount does not scale linearly: a 30-60 seat outbound team is brutal to hire, train and keep.
- Speed-to-call decides the funnel: a lead called within minutes converts far better than one called tomorrow, and humans are not on every shift.
- Quality is uneven: two operators, one script, two conversations, and no cheap way to audit what was actually said.
- Lifecycle calls (onboarding nudges, reactivation, NPS, payment reminders) are cheap value each and huge volume together, which a human team cannot justify.
The decision
Rather than build a platform first, we went to market on a white-label voice AI platform in a few weeks. That put a real product in front of real customers at almost no engineering cost and answered the only question that mattered: do they pay, and do they come back.
They did. On warm lead lists the AI agents consistently outperformed the legacy robocalls on conversion to the target action, and the first customers renewed. With those numbers, not with a deck, I made the case to build our own platform: per-call-type margins and repeat payments showed where the white-label economics capped us and what owning the stack would return.
The result
- 80 paying B2B customers in under a year from launch.
- 500,000+ minutes of live conversations in production.
- 30% of the line’s revenue comes from repeat payments.
- Average customer spend grew 30% after the AI plans launched.
- The sales team grew from 4 to 15 to sell the line; I own pricing and per-call-type margins.
How the product works
The Zvonobot AI cabinet is the surface clients live in. It bundles agent assembly, dialing, billing and analytics into a single role-aware console.
- Signup without friction. Email, password, phone, and the client is in. The phone is verified inside the cabinet before the first call, not as a gate on the door; there is one-tap Yandex ID login too.
- Agent builder. Pick a voice, model and language, drop in a structured prompt, attach a contact base and a phone number, and have a working outbound agent in minutes.
- Campaigns. A campaign is “this agent calls this base from this number”. Pause, resume, retry, switch carriers without leaving the page.
- Call history with masked numbers. Every call lands with status, outcome, duration, cost and a recording; numbers are masked, so the cabinet is safe to demo and audit.
- A client never goes negative mid-campaign. A campaign holds its estimated cost up front, settles the real cost after every call, and releases the hold if it stops early.
- No call gets stuck and every minute is billed once. Webhooks get lost; a background poller reconciles every non-terminal call against the provider every 60 seconds and settles the wallet.
- Post-call analytics. After every call an LLM breaks the conversation into an outcome, a sentiment and custom parameters, and all of it rolls up into the dashboard: outcomes ranked by frequency, the sentiment split, the hours when people actually answer.
- Four roles, one codebase. Super-admin, manager, client owner, accountant, each with its own scope and views.
Under the hood
The stack is intentionally boring at the edges so the interesting work can happen in the middle.
- Frontend: React 19 + TypeScript + Vite, vanilla CSS with strict design tokens,
data-theme="dark"swap, role-aware sidebar. - Backend: Flask modular monolith, SQLAlchemy + Alembic, PostgreSQL for state, Redis for jobs.
- Voice + LLM: dialog orchestration on top of a voice provider’s execution layer; agent voice, ASR, TTS and the LLM behind the conversation are configurable per agent.
- Telephony: SIP trunk for Russian numbers, with operator detection via HLR lookup so a number is known to be reachable before it is dialed.
Three product decisions with engineering consequences, which I would defend again:
- Reconcile, do not trust webhooks. Providers drop lifecycle events. The 60-second poller is what makes “every minute billed exactly once” a fact rather than a hope.
- Hold, then settle. Estimated cost held on campaign start, real cost settled per call, row-locked so two concurrent calls cannot both spend the last ten rubles.
- Ingest that survives real CSVs. Client bases arrive as
+7 (982)…,8982…, numbers in the wrong column. Everything normalizes to a canonical form, deduplicates and gets an operator lookup, and flaky carrier routes are dropped by default. This started as thebazabotside project and was promoted into the product when every campaign turned out to need it.
How I work on it
I own the line: what gets built, what it costs, whom we sell it to and at what margin. A team of four engineers ships it. Specs, prioritization and review are mine, and when a hypothesis needs a working answer faster than a sprint, I prototype it myself with AI coding agents (Claude Code, Codex) and hand the learning, not the code, to the team.
In practice:
- The loop is hypothesis → smallest surface → live customers → decision, in days, not quarters. White-label first was that loop applied to the whole line.
- Boring infrastructure is a feature: holds, reconciliation, idempotency, masked PII decide whether a SaaS feels stable or fragile, and I treat them as product work.
- Pick the smallest stable surface and grow it. The cabinet started with one role and one report; today it carries four roles, billing, an agent builder, analytics and a real call pipeline.
What you can touch, and what’s under NDA
The cabinet is open: you can register yourself and assemble an agent. The screenshots above come from the live product on a demo account: the organization, the agent and the calls are generated and anonymised, which is what makes them safe to show.
What stays behind NDA is the specifics: real client names, their prompts and contact bases, the voice provider we run on top of, and the money. Everything described above is real, but those details are summarised. Happy to walk through any of it on a call.