✦ Case study · platform architecture

A Modular Telecom BSS/OSS Suite

Modernizing a legacy telecom stack into a modular, TM Forum-aligned suite — operators license only the modules they need, and every module is its own service, its own schema, and its own event stream.

Context

A telecom solutions provider has served operators for decades with its BSS/OSS suite — the systems that run an operator's business: product catalog, customers, orders, billing, field inventory, trouble tickets. The modernization mandate was bigger than a rewrite: turn the suite into a composable product, where a customer can license just a product catalog and a CRM today, add billing next year, and never deploy — or pay for — the modules they don't use. That commercial model is an architectural requirement, not a pricing table.

Constraints

Architecture

Angular 22 staff console module tiles appear by entitlement Customer self-service portal Angular 22 · B2C + B2B · EN / AR API Gateway single origin · JWT verification · customer-token isolation · module licensing enforced at the edge PLATFORM CORE Auth Service RS256 JWT · JWKS · licensing Logs / Audit append-only audit trails Notifications templated email / SMS Self-care BFF ownership-scoped aggregates 10 LICENSED MODULES — ONE SERVICE · ONE SCHEMA · ONE TOPIC EACH Catalog TMF620 CRM parties · quotes Orders TMF622 Billing TMF678 · rating Warehouse stock · POs Network Inv. sites · IPAM Trouble Tickets TMF621 · SLA Projects task-DAG engine Integration ERP · fraud · PGW Reporting KPI facts Apache Kafka event backbone transactional outbox per module → topics → audit · notifications · KPIs · cross-module flows one origin, two audiences login · JWKS routes by entitlement outbox events core consumes facts

light = data. amber: request path · blue: the event backbone feeding audit, notifications, and reporting

How it's put together

Why it's built this way

The architecture is the business model. Because each module is a sealed unit — its own service, schema, migrations, and event topic — "which modules did you license?" is answered by what gets deployed, not by feature flags in a monolith. Module boundaries double as blast-radius boundaries: a billing incident can't lock a CRM table, and a Kafka outage delays audit trails without ever blocking an order. Keeping ownership logical rather than physical is what makes that affordable: a small operator runs every schema on one Postgres server, while a large one moves billing onto dedicated hardware by editing a connection string — the isolation rules were never about the box the data sits on. The discipline costs something up front — outboxes instead of joins, events instead of foreign keys — but it buys the two things a twenty-year platform needs most: modules can be added without surgery on the ones already running, and every module can evolve, scale, and fail alone.

Stack

Java 21 · Spring Boot · Spring Cloud Gateway · Angular 22 · PostgreSQL · Apache Kafka · Flyway · Docker Compose · Prometheus · Grafana & Loki · TM Forum Open APIs

← All projects Discuss a similar problem