Smart Pricing for Ad Inventory

Ad pricing lived entirely in spreadsheets. Every rate change required a developer, creating bottlenecks and slowing the sales cycle.

I designed a self-serve pricing tool that gave sales teams full control over rate cards and inventory types, removing engineering dependency entirely.

Ad Tech Internal Tool

Timeline

5 months

Impact

Weeks → Minutes
Rate card creation
0
Dev dependency

The pricing team could now create and update rate cards on their own. No more waiting on engineering to update a rate card.

*AI images used for illustrative purposes only.

Background

Hulu Ad Manager (now Disney Campaign Manager) launched in March 2020, giving advertisers a self-serve way to create and manage streaming campaigns. At launch, the platform ran on a single fixed CPM (Cost per 1,000 impressions). Every advertiser paid the same rate, regardless of targeting sophistication, deal type, or seasonal demand.

That flat structure made sense early on. But as the platform matured and advertiser needs diversified, it became a ceiling. The pricing team had no way to:

  • Charge a premium for advanced targeting options like geography, demographics, or interests
  • Offer promotional or custom rates for agencies, new advertisers, or high-value accounts
  • Adjust pricing dynamically for seasonal inventory shifts
Inventory Needle
The inventory panel exposed one CPM to all advertisers. There was no way to vary pricing by account, targeting type, or deal structure.

Beyond the missed revenue opportunities, there was an operational problem. Any CPM change, no matter how minor, required an engineering ticket. The pricing team worked entirely in spreadsheets, manually tracking which advertisers had which rates:

Spreadsheet Example
The pricing team maintained separate spreadsheets to track custom CPMs per advertiser. Advertiser names and rates have been blurred.

When a rate needed to change, they submitted a ticket and waited. Depending on engineering bandwidth, that wait could stretch to weeks.

CPM Updates
Every CPM update went through an engineering ticket. The pricing team had no direct control over the rates they were responsible for managing.

Requirements

"Pricing Manager" had sat in the backlog for years. The concept was clear: give the pricing team a self-serve tool to create and manage multiple rate cards without engineering support. In late 2022, it finally got resourced.

The core design challenge wasn't just building a CRUD interface for rate cards. It was making a system with real business complexity feel simple and manageable for a non-technical team. Rate cards needed flexible logic: start and end dates, pricing add-ons for targeting, priority ordering when multiple cards applied, and a way to assign advertisers in bulk rather than one at a time.

MVP requirements for launch:

  • Flexible rate cards: Start/end dates and premium pricing add-ons per card
  • Rate card classification: Support for distinct pricing models (e.g., political advertising)
  • Prioritization logic: Higher-priority cards override lower-priority ones when multiple cards apply to the same advertiser
  • Advertiser group management: Create reusable groups that can be bulk-assigned to rate cards, eliminating the need to add advertisers one by one

Discovery

With a compressed timeline, late 2022 start to early 2024 launch, I focused discovery on the people who would use this tool every day. Through interviews with the pricing team, I mapped their end-to-end workflow: how they tracked rates, how they made decisions about which advertisers got which CPMs, and what kinds of exceptions came up most frequently.

The biggest insight wasn't about features. It was about mental models. The pricing team already thought about their work in terms of rate cards as objects you manage in a list, not forms you fill out one at a time. That informed the entire structural approach.

Learning from Internal Precedents

External competitive research wasn't possible for this internal tool. Instead, I audited two existing tools in our ad suite that had comparable complexity:

  • A deal package management tool that handled similar advertiser-level configuration. It used a table-plus-side-panel pattern that the pricing team was already familiar with, reducing the learning curve for a new tool.
  • A legacy linear TV rate card system that predated streaming. It showed what to avoid: too much information density on a single screen, with no clear separation between viewing and editing states.

These patterns gave me a starting point grounded in how this team already worked, rather than starting from scratch.

The deal package tool (left) and legacy TV rate card system (right). The table-and-panel pattern from the deal tool directly influenced the final design. The legacy system was a cautionary example of what information overload looks like in practice.

Initial Design Explorations

Early explorations tested two approaches: a form-driven flow where users built rate cards step by step, and a table-first approach where rate cards lived as rows you could select, expand, and edit inline. The form approach felt intuitive for creation but made it harder to get a quick overview of all active cards. The table view matched how the pricing team already thought about their work, so that became the foundation.

Early wireframes testing the two core approaches: form-driven creation (left) vs. table-first browsing with inline editing (right). The table approach won because it matched how the pricing team already scanned and managed their rate cards.

Key Design Decision: Table + Side Panel

The final interface uses a table view with an expandable side panel for editing. This was a deliberate choice over a full-page edit flow. The pricing team needed to frequently compare cards, check active dates, and understand priority order at a glance. A full-page editor would have broken that context every time they opened a card.

The side panel kept the list visible while allowing focused editing. It also created a consistent interaction pattern: select a row, edit in the panel. I carried this same pattern into advertiser group management so the tool felt like one coherent system rather than a collection of separate screens.

I iterated on this pattern through regular working sessions with the pricing team, walking through Figma prototypes and adjusting based on how they described their actual decision-making process. There was no formal usability testing given the timeline, but the tight feedback loop with the end users served as a practical substitute.

The rate card table gives a quick overview of all active cards, their dates, and priority. Selecting a row opens the side panel for detailed configuration and editing without losing list context.

Advertiser group management uses the same table-and-panel structure. The consistency was intentional: once a user understood how to work with rate cards, advertiser groups should feel immediately familiar. It also reduced the cognitive overhead of learning two different interaction models in the same tool.

Advertiser groups let the pricing team bundle related accounts and assign them to rate cards in bulk. The same table-and-panel layout made the feature immediately learnable.

Final Design

The walkthrough below shows the full end-to-end flow: creating a rate card with targeting add-ons, setting priority order, assigning advertisers via group management, and publishing changes without any engineering involvement. Watch for how the side panel keeps context intact throughout.

Outcome

The tool launched in early 2023. What had previously required an engineering ticket and days or weeks of wait time became a few clicks. The pricing team went from maintaining spreadsheets outside the platform to managing everything directly, in real time.

Post-launch, the tool has continued to expand. Publisher-level targeting was added, letting the pricing team specify whether a rate applies to Disney+, Hulu, or both, a capability that simply wasn't possible under the old system. It's a sign that once you remove a hard dependency, the roadmap opens up.

Reflection

The hardest part of this project wasn't the interface. It was understanding the pricing logic well enough to design for it. Rate card prioritization, in particular, required multiple conversations to get right: when does one card override another? What happens when an advertiser belongs to multiple groups? Getting those rules right in the design before they became engineering decisions was the most important work I did on this project.

Given more time, I would have pushed harder on the prioritization UI specifically. The current design communicates priority order clearly, but there's an opportunity to make the conflict resolution logic more transparent so users understand not just what the system will do, but why.