The Situation
Clear Channel Broadcast Group operates three regional radio stations under a single ownership group, each with its own sales team, traffic coordinator, and agency relationships. Ad inventory — spot availabilities, holds, confirmed buys, and run-history — was tracked in three separate Excel workbooks, one per station, with no shared view across the group. Invoicing went through QuickBooks Online manually at the end of each month, with traffic coordinators printing run logs and hand-keying line items. Agencies had no portal at all; they emailed insertion orders as PDFs and waited two to three days for confirmation. Month-end reconciliation took the controller four full working days, and the ownership group had no real-time visibility into group-level sell-through.
The Challenge
The platform had to handle multi-tenancy correctly the first time — three station tenants today, with the ownership group planning to acquire a fourth. Each tenant needed its own inventory, its own agency relationships, and its own invoicing flow, but the controller and the owner needed a group-level view. Data isolation was the hard requirement: no cross-tenant leakage was tolerable, even by accident, because some agencies bought across stations and some did not. Stripe had to handle invoicing with line-item detail matching insertion orders, and agencies needed a self-serve portal where they could place orders, see run logs, and view their own invoices — but only their own.
Our Approach
QuantLab built the platform on Next.js 16 with PostgreSQL row-level security policies enforced at the database layer, not in application code, so a missed check in a route handler could not leak data across tenants. We migrated the three stations on a phased rollout — Station A in weeks 8-10 while B and C kept running on spreadsheets, Station B in weeks 11-12, Station C in weeks 13-14 — so the operations team was never trying to learn the new system across all three at once. Stripe invoicing was wired to mirror insertion-order line items, and the agency portal launched after Station A had a clean month of internal-only usage.
What We Built
- Multi-tenant Next.js 16 platform with three station tenants and group-level admin view
- PostgreSQL row-level security policies enforcing tenant isolation at the database layer
- Stripe invoicing mirroring insertion-order line items with monthly billing cycles
- Agency self-serve portal for insertion orders, run logs, and invoice access
- Role-based Auth.js with station, group, and agency role separation
- Immutable audit log and inventory dashboards covering sell-through, fill rate, and revenue per station
Tech Stack
The Outcome
Month-end invoicing time dropped from four working days to just over one — about a seventy-percent cut — because line items now flow from the inventory side directly into Stripe rather than being re-keyed from printed run logs. The ownership group retired three separate Excel-and-email workflows and cancelled two third-party tools the stations had been carrying redundantly, saving roughly $25K per year in vendor licensing. All three stations were live in fourteen weeks, and the row-level security policies have caught zero cross-tenant access attempts in the audit log — exactly the result the design was aiming for.
Like to know more about this project? Talk to William.
Related Services