Guido Hosman Product Builder · Designer · AI-Native
← Work

Case Study

Rebuilding a live platform from the ground up — without dropping a call.

Company
XOIP
Cloud telephony · SME market
My role
Product Lead
Strategy · Design · Build
Scale
50,000+
Customers migrated
Stack
Asterisk · Python
React · New product suite
XOIP call plan interface showing the branching office hours UI with work-hours routing logic
The finished Call Plan UI: a clear mental model for SME owners that maps to how calls actually behave — conditions followed by outcomes, branching only where it matters.

01 · Business Context

The legacy platform had reached a ceiling it couldn't grow past.

XOIP had been running cloud telephony services on a stack of purchased "unified messaging" boxes — appliances from an older era of telecoms that handled the hard work of connecting to carrier trunks, converting voicemail to email, routing fax as PDF. On top sat a PHP web app. The whole thing worked, in the way that something held together with years of careful patches works: reliably until it doesn't, and impossible to change without breaking something else.

The ceiling showed up in three places at once. Product ideas that should have been straightforward weren't feasible inside the constraints of the purchased platform. New pricing strategies couldn't be modeled. And the frontend — a direct translation of the boxes' underlying settings into input fields and toggles — communicated nothing coherent to a small business owner who just wanted their phone to work.

The decision to rebuild rather than iterate came from a clear-eyed assessment: the old stack would never let us build the product we wanted to build or serve the market we wanted to own. The question was how to execute a full replacement underneath 50,000 active customers.

02 · Strategic Direction

Not enterprise. Deliberately, strategically SME.

The rebuild wasn't just a technical project — it was an opportunity to sharpen who XOIP was for. The enterprise telephony market is a different game: bespoke implementations, long sales cycles, customers with in-house IT who can absorb complexity. XOIP was not going to win there and had no reason to try.

The SME market offered something more interesting: a large customer base that genuinely needed professional phone capabilities — call routing, voicemail, office hours, number management — but had no appetite for a telecom engineer's learning curve. The opportunity was a product that gave them real functionality without requiring them to understand how it worked under the hood.

That strategic choice — SME-first, simplicity as a feature, not a constraint — cascaded directly into every product, design, and technical decision that followed.

Strategic principle

Simplicity isn't the absence of features. It's the presence of a clear mental model. The design goal was a product any SME owner could configure themselves, on first contact, without support.

03 · Architecture as Product Decision

The choice of Asterisk was a design decision, not just an engineering one.

The team evaluated more full-featured telephony platforms during the rebuild — systems with every PBX bell and whistle available. The problem was that full-featured meant infinitely configurable, and infinitely configurable meant inevitably complex. You'd design a clean surface and then find yourself mired in settings screens with unforeseen interdependencies.

Asterisk solved the right problem. As an open-source PBX framework, it gave complete programmatic control over call logic — without imposing its own configuration model onto the product. Telephony logic could live on the Asterisk gateways where it belonged. Product logic, user management, billing, admin, and the call plan itself could live in Python with a React frontend where I could design exactly the experience we needed.

The architecture created the conditions for the design. That causality — strategy sets design imperatives, design imperatives influence technical choices — only happens when someone is fluent across the whole stack. It's the kind of outcome that requires holding all disciplines in one mind simultaneously.

XOIP admin product management screen showing product list and Voice Pro edit panel
The admin backend: product configuration separated cleanly from telephony logic, enabling rapid product and pricing iteration.
XOIP admin numbers management screen
Number management — fully owned in the new stack, independent of the legacy carrier configuration layer.

04 · Design Decisions

A mental model, not a settings panel.

The legacy interface was a direct translation of the unified messaging platform's underlying settings: inputs, selects, and toggles scattered across several pages with no organizing logic. Users had to understand the system's internals to configure it. That's the wrong relationship between a product and its customers.

The breakthrough was recognizing that Asterisk's flexibility made a different mental model possible. An incoming call isn't a settings object — it's an event that passes through a logical sequence of conditions and ends with an outcome. That framing is something every SME owner already understands intuitively: you've been transferred, sent to voicemail, or heard a greeting. The Call Plan was built around that prior knowledge.

Two levels of depth, one interface

The Call Plan reads top to bottom: block check, office hours, greeting, transfer, voicemail, goodbye. Each step is a toggle bar — on or off, with its current configuration summarized inline. That's the overview level. An SME owner can scan the entire call plan at a glance without touching a single setting.

Each bar also has an Edit button. Opening it folds out the full configuration for that step — and only that step. The "Send call to" bar, for example, expands to reveal a meaningful choice: forward to a single number, or to a call list where up to five destinations can ring one at a time or all simultaneously, each with its own ring duration. Caller ID behavior is configurable here too. It's a genuinely capable routing system — but it surfaces only when the user asks for it, and it closes again once they're done.

This two-level structure is what allowed the product to offer real depth without imposing it. The overview stays simple regardless of how the detail is configured. Complexity is always opt-in.

XOIP call plan with the Send call to bar expanded showing call list configuration — multiple destinations, One at a time / Simultaneous toggle, ring duration per number
The call plan with the ‘Send call to’ step open: three destination numbers, configurable ring order (sequential or simultaneous), and per-destination ring duration. The bars above and below remain collapsed — the rest of the plan stays visible and scannable.
XOIP office hours edit panel showing working days selector and time range picker
The office hours step expanded: day selector and time range with timezone. When this is enabled, the call plan branches into two sub-plans — during hours and after hours — each following the same condition-outcome structure.
XOIP call list configuration showing multiple destination numbers, One at a time or Simultaneous routing, ring duration per number, and caller ID settings
The call list detail: up to five destinations with per-number ring duration, sequential or simultaneous routing, and caller ID behavior — the depth layer behind a single collapsed toggle bar.

The branch that had to be visible

Office hours routing introduces the one genuine moment of branching in the Call Plan: separate behavior for inside and outside working hours. The UI needed to make that split legible — not just functional. A user enabling office hours should immediately see that they now have two sub-plans to configure, and understand why.

The initial engineering position was to implement a simpler approach — faster to build, but it obscured the branching and broke the mental model we'd maintained everywhere else. The visual connectors that show the call path splitting weren't in my engineering remit on this project. I implemented them in React myself. The "bent noodle" that makes the branch legible was the difference between a feature users understand and one they have to decode. Some design decisions are too important to negotiate away.

05 · Product & Pricing

Separating what needed to be separate.

The legacy product bundled voice and fax on the same number inside the same subscription. That made sense when fax was a common business tool. By the time of the rebuild, fax usage had contracted to specific professional contexts — legal and financial — where privacy and delivery proof still mattered. Most voice customers had no fax requirement at all.

The internal argument for keeping them together was mostly inertia. The case for separation was cleaner: two different user bases with almost no overlap, different usage patterns, different value propositions, different messaging. Mixing them would dilute both. The extra engineering effort required to make dual voice/fax on the same Asterisk number reliably handle codec negotiation — work the old appliances had done but the open-source community hadn't prioritized — made the separation argument easier to win. We split the portfolio into a voice product line and a fax product line, each with its own subscriptions, pricing, and customer journey.

Within the voice line, the key insight from customer research was that usage volume — not features — drove the purchase decision. Three tiers emerged, differentiated by bundle size and per-minute rate: heavy users gravitated toward higher subscriptions with larger inclusive minutes and lower per-minute costs; occasional users toward lighter plans. A free tier covered pay-as-you-go customers, with upgrade prompts tied to new features as they shipped.

XOIP voice subscription plans — Voice Free, Voice Light, Voice Pro with pricing
The voice product line: three tiers differentiated by usage economics, not features. The model reflects how SME owners actually make buying decisions.
XOIP admin customer subscriptions view
Customer subscriptions in the admin view — voice and fax tracked separately, each with their own lifecycle.

06 · The Migration

50,000 customers. No major incidents.

The migration was the part of the project that could have undone everything else. 50,000 active customers — businesses whose phone numbers are on their letterheads and their Google listings — expecting uninterrupted service through a complete platform replacement.

The approach was phased by product type and usage level. Each wave started with lower-activity accounts in a given product segment, which gave us the ability to surface any product-specific edge cases before migrating the most active customers. Both platforms stayed live throughout — a problematic migration could be caught before it propagated, though practically speaking there was no path back once the new experience was live.

The experience on the new platform was demonstrably better. The complaints we anticipated — users resistant to a new UX — didn't materialize at the scale we'd prepared for. The one genuine disruption was passwords: we couldn't migrate credentials securely across systems, so every user had to set a new one. Careful email sequencing — advance notice, migration trigger, follow-up — made this manageable.

Existing customers kept their original products and pricing. The migration wasn't the moment to ask them to absorb new commercial terms alongside a new experience. Over time, targeted campaigns moved users to comparable products in the new portfolio — on their terms, at their pace.

What made it work

Phased rollout by product and activity segment. Parallel platforms throughout. No combined commercial and UX change at migration time. The new experience was better enough that customers accepted it.

XOIP admin customer invoices view
The admin surface gave operations full visibility into each customer's invoice history and subscription state during and after migration.
XOIP admin customer voice numbers view showing number assignment and minutes remaining
Per-customer number management: subscription tier, minutes remaining, and routing config — all in one view.

07 · Reflection

The meta-skill was the point.

Looking back at this project from where I work now — building AI voice agents, designing multi-agent architectures, running eval systems — what strikes me most is how much this rebuild was practice for exactly that.

The most consequential decision in the project — choosing Asterisk as the telephony platform — wasn't a technical decision or a design decision or a strategic decision. It was all three at once, legible only to someone holding all three simultaneously. The strategy (serve SMEs, not enterprise) set the design imperative (clarity and simplicity as non-negotiable). The design imperative ruled out platforms that would have imposed their own complexity model. That left Asterisk, which gave full programmatic control and let the design lead.

That chain of reasoning — and the speed at which it can be executed — is the skill that AI tools are now compressing whole teams to produce. The difference is that I've been building that cross-disciplinary fluency for two decades, not acquiring it from a tool. The XOIP rebuild was an early, extended, high-stakes version of the work I do now — and the connective tissue between then and now is the same: hold the whole picture, make decisions that no single specialist would make, ship things that feel inevitable in retrospect.

What this project demonstrates

Strategy, product management, design, and engineering converging in a single mind isn't a new idea. What's new is that the market is now demanding it at scale — and calling it AI-native.

← Back to work

Also: XOIP AI Voice Agent · Cerbex Hotel Marketplace · TravelBot AI Guide