Skip to main content
QuantLab Logo
Media / Broadcasting2026·14 weeks

Multi-tenant ad inventory + invoicing SaaS for a regional broadcaster

A multi-tenant ad inventory and invoicing SaaS with Stripe billing, an agency self-serve portal, role-based auth, and Postgres row-level security — built so a regional broadcaster could replace three stations' worth of disconnected spreadsheets with one shared platform.

Client: Clear Channel Broadcast Group
Invoicing time cut 70%
$25K/year saved on canceled vendor tools
3 stations live in 14 weeks
Zero data leakage between tenants

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

Next.js 16PostgreSQL with row-level securityStripeResendVercelAuth.js

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.

Have a similar problem? Let's talk.

Tell us what you're dealing with. We'll be honest about whether we can help.