genalpha-bss

A composable, multi-tenant Business Support System on TM Forum ODA

Product overview · 31 ODA components · 5 channels · 2 demo operators on one deployment · July 2026 · github.com/kundanvarma/genalpha-bss

Executive summary

genalpha-bss is a complete telecom BSS built the way TM Forum's Open Digital Architecture says systems should be built: as independent components, each exposing a standard TMF Open API, composed behind one gateway. It is vendor-neutral — any OIDC identity provider, any PostgreSQL, any Kafka-protocol broker — and multi-tenant to the bone: two demo operators, GenAlpha and Nova Telecom, run side by side on a single deployment with cryptographic identity isolation and database row-level security between them.

Three properties distinguish it from reference implementations and demo-ware:

The five-minute story

  1. An anonymous visitor browses GenAlpha's storefront, configures a triple-play bundle (phone model, color, storage — the price follows each choice), applies promo code WELCOME10, and sees the discount before having any identity.
  2. Checkout validates the address (TMF673 standardizes it), checks fiber serviceability (TMF679), books an installer slot (TMF646), reserves the phone from stock (TMF687), and authorizes payment (TMF676) — the visitor registers mid-flow and the interrupted checkout resumes itself.
  3. A purely digital order needs nobody: the thin SOM (TMF641/640) activates it in seconds, draws a phone number from the tenant's pool (TMF685), and completes the order machine-side — provisioning inventory (TMF637), capturing payment, minting a 12-month commitment agreement (TMF651) and redeeming the promo (TMF671) on the way.
  4. The network reports 12.3 GB of roaming (TMF635); the customer's meter shows 12.3 / 10 GB — over allowance. The monthly billing run (TMF678) puts the overage and the promo discount on one bill, which the customer pays with the card vaulted at checkout (TMF670) — one click, no retyping.
  5. A critical alarm (TMF642) becomes a service problem (TMF656) and every agent's CSR console shows the outage banner; resolution clears it. Each event along the whole journey became a customer notification (TMF681).
  6. Meanwhile Nova Telecom's customers do all of the same on shop.nova.localhost against Nova's own identity realm, Nova's own catalog and Nova's own number range — and neither operator can see one byte of the other's world.

The module catalog

Core commerce — always deployed

ComponentTMF APIPortPurpose
product-catalogTMF6208081Offerings, prices, bundles, commitment terms
product-orderingTMF6228082Order capture, validation, completion orchestration
product-inventoryTMF6378083What each customer has, provisioned per order item
party-accountTMF632 / 666 / 6698084Individuals, organizations, accounts, party roles
gatewayODA exposure8080Single entry point; white-label host → tenant routing

Optional components — compose per deployment

ComponentTMF APIPortPurpose
product-stockTMF6878086Device shelf: reserve at order, consume at completion
paymentTMF6768087Authorize/capture behind a PSP adapter (mock PSP in dev)
billingTMF6788088Billing runs: recurring + usage + discounts on one bill
qualificationTMF6798089Serviceability: where fiber-class offerings can be delivered
appointmentTMF6468091Installer slots, booked at checkout
trouble-ticketTMF6218092Support cases, org-scoped for partner agents
party-interactionTMF6838093Every touchpoint on the customer timeline
communicationTMF6818095Event-driven notifications (the martech door)
shopping-cartTMF6638096Server-side carts: guest secret-id, claim on login, abandonment events
usageTMF635 / 6778097Mediation intake, rating, allowance meters, overage charges
agreementTMF6518098Commitment periods minted automatically at order completion
promotionTMF6718099Promo codes: anonymous validation → redemption → bill discount
user-rolesTMF6728100Tenant admins manage staff via TMF API over their own IdP
geographic-addressTMF6738101Address validation and standardization at checkout
recommendationTMF6808102Cross-sell with a learning seam: rule-selected candidates, popularity-ranked; a trained model plugs into the same Ranker interface
payment-methodTMF6708103Tokenized card vault: save at checkout, pay bills one-click
documentTMF6678106Content store: tenant logos and offering artwork the channels wear
campaignmartech8108Event-triggered journeys: once-per-customer messages carrying promo codes — marketers run them from the console GUI
quoteTMF6488110B2B quotes born from TMF921 intents: OSS proposal priced, token allowances on line items, acceptance places the order
intelligenceAI8109Any-LLM seam with per-tenant overrides: copy assistant + CSR copilot + a churn engine that begins as transparent rules (commitment ending, allowance pressure, support friction, outage exposure) and learns in production — daily feature snapshots + labeled outcomes train a per-tenant model in-service, or import the operator's history and be production-grade on day one
policyrules8113Business rules AND dynamic pricing as data, not code: eligibility / quantity / incompatibility / verified-identity rules enforced at order time, plus pricing rules (percent or amount adjustments by segment / cart / verified identity) applied at cart and bill time — author or disable any in the console as JSON-logic, no redeploy. Pluggable engine seam (JSON-logic today, Drools/CEL swappable); RLS-isolated; fails open if unreachable

Production (OSS) — the layer below, thin but real

ComponentTMF APIPortPurpose
service-orchestrationTMF641 / 638 / 640 / 6858104Digital orders decompose, activate (drawing MSISDNs from per-tenant resource pools) and complete themselves; physical orders wait for fulfilment
assuranceTMF642 / 6568105Critical alarms become service problems; the CSR console shows live outages
The production block is deliberately thin: the boundaries (APIs, events, machine identity, tenancy) are built at full fidelity, while internals — instant mock activation, one-rule alarm correlation, counter-based number pools — are placeholders behind seams. An operator's real OSS, or deeper adapters, slot in without touching anything around them; the same pattern as the mock PSP behind the payment adapter.

Channels — one build each, white-labeled per tenant by hostname

ChannelPathAudience
storefront/shopSelf-service: guest browse → configure → cart → checkout → bills → support (React + Vite PWA). Devices sell with product-shot galleries, colour-variant imagery that follows the picker, and an About-this-device facts table — all plain TMF620 attachments, from the internal content store or the operator's own PIM (per-tenant seam)
business-console/bizB2B self-care: a company admin adds people, orders their subscriptions (own-org boundary enforced server-side), sees live lines, reads the consolidated company invoice, and sets the company policy — a configurable device allowance. Split billing: company-placed orders are payer-stamped to the org; a member's own purchases and any device cost above the allowance bill to the member personally
csr-console/csrAssisted service: customer 360, ticket queue, outage banner, number-porting panel + service cease, org-scoped agents
admin-console/consoleBack office: catalog, stock, campaigns, AI audit, porting orders, and business Rules with a live dry-run (authored live, no redeploy)

Architecture at a glance

Engagement — channels storefront /shop · csr-console /csr · admin-console /console — one build each; the hostname decides the tenant, a gateway-served config script decides the IdP
▼
API Gateway (8080) Single entry point · routes TMF paths to components · maps hostname → tenant for anonymous traffic (X-Tenant-Id, inbound copies stripped)
▼
Party management party-account (632/666/669) · user-roles (672, over each tenant's own IdP)
Core commerce catalog · ordering · inventory · cart · qualification · address · appointment · stock · agreement · promotion · recommendation
Revenue payment · payment-method vault · billing · usage
Care & Production trouble-ticket · interaction · communication · service-orchestration · assurance
▼
Backbone PostgreSQL (one DB per component, tenant_id + row-level security) · Kafka (transactional outbox, tenant-tagged TMF688-style envelopes) · OIDC IdPs (one issuer per tenant; Keycloak realms in dev, Cognito/Entra-ready)

Machine-to-machine calls (ordering → catalog/stock/payment/agreement/promotion, billing → inventory/usage/promotion, SOM → ordering, payment → vault) always use the acting tenant's client credentials, so downstream tenancy holds even for background work. Interactive diagrams: docs/architecture.md.

Multitenancy — the pool model with two locks

Composability

The ODA promise made operational: every optional module has an enabled flag in the Helm chart, the composer page enforces the dependency matrix (billing needs payment; appointment needs qualification; the vault needs payment…) and emits a ready-to-use values override, and the channels degrade gracefully — a deployment without the stock component simply has nothing stock-managed, without qualification nothing is serviceability-gated, without the vault the card form still works. Cross-component calls go through conditional clients with no-op fallbacks, so absent modules cost nothing at runtime.

How it is verified

Security & post-quantum readiness

The BSS embeds almost no cryptography of its own — identity, transport and payment crypto live behind the same seams as every other vendor dependency, which is precisely the crypto-agility that post-quantum migration guidance calls for. The full inventory is published in docs/pqc-readiness.md; the shipped state:

Deployment

Local: mvn package → docker compose up (~27 containers, seeded demo data, both operators live). Kubernetes: a Helm chart carrying both realms, per-service RLS roles and per-tenant issuers, composed via the module picker; Terraform stacks target EKS and AKS. Dedicated single-tenant deployments (the “silo” tier for regulated customers) use the same chart with one tenant configured — the pool and silo models are one codebase.

Roadmap