read whyRequest A Demo
Thank you! Your submission has been received!
Something went wrong while submitting the form
June 22, 2016

Price Floor Optimization in AdX

On, we were shocked by a recent report we ran in Google’s Ad Exchange showing that the average Winning Bid CPM for a slice of our traffic was $3.74, while the average Close CPM--the...

Chris Cummings

On, we were shocked by a recent report we ran in Google’s Ad Exchange showing that the average Winning Bid CPM for a slice of our traffic was$3.74, while the average Close CPM--the final transacted price--was $1.01. Wow! Are we really losing more than 70% of our potential revenue in the gap between the Winning Bid and the Close CPM? We decided to dig in, and see if setting price floors could boost our revenue by adding additional price pressure to the AdX auction. Here’s what we learned.

The Mystery: The Giant Gap Between the Winning Bid CPM and the Close CPM

Note: The data in this article is real, but only represents a certain segment of our traffic.

Price Floor Theory

Price floors establish the minimum price for an ad to serve, similar to a reserve price in an auction. If the winning bid doesn’t exceed the price floor, the impression is not sold in the auction. Historically, price floors have been the key lever in establishing an ad network waterfall. If a network couldn’t meet the price floor, the next network would get a chance to serve the impression. Waterfall setups have become less popular due to the advent of real-time exchanges and header bidding, which opened the door to a new potential use for price floors.

Many ad exchanges, including Google’s, use second price auctions, meaning that the winner of the auction pays 1 cent more than the 2nd highest bidder in the auction. This provides a strong incentive for buyers to bid the true maximum value for the impression, but it also can reduce the value of the inventory for publishers. If the winning bid is $3.74 (hypothetically speaking) and the second price bid is $1.00, the auction close price will be $1.01. Here’s where the price floor can influence the outcome. As Google lays out in its docs:

“The Ad Exchange auction closing price is determined as the greater of the second-highest net bid in the Ad Exchange auction or the reserve price applied to that impression.”

So in the example above, if the winning bid is $3.74, the second price is $1.00, and the price floor is $2.00, the close price will be $2.01. Going from $1.01 to $2.01 would be a big gain for the publisher.

The downside of price floors, of course, is that every single bid below the floor will be ignored, even if it was the highest bid. Here’s a summary of how a price floor can influence an auction:

  • Upside - a CPM increase on every auction where the winning bid is above the price floor and the second price bid is below the price floor.
  • Downside - a CPM decrease on every auction where the winning bid is below the price floor.
  • Unaffected - every auction where the winning bid and the second price bid are both above the price floor.

Here’s a visualization of the scenarios:

The value of setting a price floor is equal to the gains from the upside scenario minus the losses from the downside scenario. In our situation, we were nervous about the potential losses from establishing a price floor, so we took a look at our bid data to better understand the impact of establishing price floors.

Analyzing the Ad Exchange Bid Data

We started by segmenting our data by the bid ranges variable to see if the giant gap between the Winning Bid CPM and Close CPM occurred at all price levels. We analyzed more than 160 million bids, according to the winning bid range.

Two major insights jumped out at us. First, more than 87% of all the winning bids within AdX were for less than $1. The implication for setting a price floor is that any price floor above $1 would immediately chop off more than 87% of all winning bids. A price floor above $2 would eliminate nearly 93% of all winning bids. The second insight we noticed was a cluster of winning bids near the $5 dollar mark. Those ended up being test bids from the “Google Testing Network”, rather than actual bids.

We followed up with a similar analysis of how many times those bids won the impression. The impression is won only when the AdX winning bid is higher than the price from all other sources of demand.

The trend is similar but not as dramatic. A $1 CPM price floor would eliminate 46% of the impressions won. A $2 CPM price floor would eliminate 75%.

But what if we look at the bids in terms of their contribution to revenue? In this instance, we’ll take the Impressions Won and multiply it by the average Close CPM for each bid range.

The pictures looks different here. A $1 price floor in this instance would eliminate 17% of revenue, while a $2 price floor would knock out 39%. Much of the action in terms of revenue is in the higher range.

Collectively, the charts above suggest even a modest $1 or $2 price floor would cut down on winning bids, winning impressions, and revenue, slicing off large chunks of the action. But let’s do some modeling and estimate the actual impact.

Optimizing the Price Floor

To determine the revenue potential for adding a price floor, we looked looked at each .10 cent bid range and recalculated the Close CPM based on various price floors. For example, in the $1.00-$1.10 bid range, the winning bid averaged $1.03, while the Close CPM averaged $0.64 cents. In the model, we assumed that with a $1 price floor in place, the Close CPM would be $1.01. We then recalculated the revenue at this Close CPM. We took the new revenue, subtracted from it the original revenue, and were left with the upside from the price floor. Next we calculated the downside. Any instance where the winning bid was less than the price floor, we subtracted that revenue as part of the downside, since those bids would be eliminated. Finally, we made a note of the revenue that would be unaffected. Here’s an example of how the calculations worked out at different price floors:

There are a couple of assumptions that need to be made transparent about this model:

  • Close CPM was set to the minimum theoretical average - If the $1.50-$1.60 range had an average Close CPM of $0.88, setting the price floor of $1.00 would almost certainly move the average Close CPM above $1.01 because of the instances where the second price was above $1.01. We ignored these instances--having no way to calculate their impact--and set the average Close CPM to $1.01.
  • Recovery Rate was initially set to zero - On the downside scenario, we initially assumed that all the revenue would be lost if the winning AdX bid wasn’t in the auction. In reality, there may be other bids from other header bidders, helping to recover some of the lost revenue. We called this the “Recovery Rate”, which we expressed as the percentage of the original AdX revenue that we’d recover if the price floor eliminated the AdX bid.

These assumptions made it more difficult for price floors to prove their worth, and we were OK with that, because we felt like managing price floors introduced more complexity into our ad stack, so we’d only do it if the data suggested it would add value under the majority of circumstances.

Analyzing a range of price floors, here’s what we found:

In the initial analysis, even at the optimal level--in our case the $0.80 price floor--the downside seemed to outweigh the upside.

We decided to tweak one of our assumptions above and try the analysis assuming that if AdX didn’t win the auction, we’d have another bidder recover revenue at 50% of the original AdX revenue, plugging in a Recovery Rate of 50%. We found virtually the same result: price floors at all levels lowered revenue. Once we bumped the Recovery Rate up to 80%, a few price floors started to look attractive. Here’s the impact of various price floors at an 80% recovery rate:

The lesson here seems to be that if you don’t have consistent, high demand outside of the AdX auction, don’t set price floors. The usefulness of price floors hinges on the Recovery Rate.

Given the centrality of the Recovery Rate, we wanted to calculate our actual recovery rate. In theory, we’d be able to analyze the bids from all our other header bidders on any impression where AdX won and then calculate the average price for the second place bid. The difference between AdX’s bid and the second place bid would reflect the Recovery Rate. Unfortunately, our header bidding setup does not yet allow us to systematically track the bids from all header bidder on each impression. Furthermore, when AdX wins, it doesn’t provide single impression level data on what it paid. It only indicates the average CPM for an aggregated set of impressions. Both of these factors prevented us from calculating an actual Recovery Rate, but we’d like to explore this more in the future.

Advanced Price Floors

The analysis above was conducted across all impressions. But what if we segmented our ads, establishing different price floors for different ad units and different geographies? Would that lead to an even greater improvement? We decided to find out.

Our AdX integration with DFP uses Tags that segment our traffic by ad unit, geography, and a/b testing channel. We ran the same analysis as above--using the 80% Recovery Rate--but this time we added the Tag dimension. We then calculated the net revenue opportunity for each tag at various price floors. The resulting table provides insight into the optimal price floor for each tag, which we’ve highlighted in blue in the table below. In the “Max” column, we show the maximum revenue for each tag.

It’s interesting to see how the optimal price floor does vary--ranging from $0.60 to $2.00--according to the tag. However, on the whole the maximum revenue improvement rose modestly, from 4.2% when we set the across-the-board $0.80 price floor above, to 5.6% when we set price floors at the optimal level for each tag.

Analyzing Your Own Data

Whether or not it’s a good idea to set a price floor can vary by site. If you’d like to give this a try for yourself, here’s the report variables to use in the AdX Query Tool:

Just export that data to Excel, and add it to the price floor model that we’ve made available for download.


We began with a mystery: why is the average AdX Winning Bid CPM $3.74 while the average Close CPM is $1.01? It turns out that the biggest drivers were actually the 8 million bids from the Google Testing Network at the $5.00 level, none of which won an auction, and ultra-high $20-$100 bids that ended up with a Close CPM dramatically lower than the winning bid price. Price floors in the $1-$2 range, it turns out, wouldn’t affect either of these issues.

We did find, however, that if the Recovery Rate is high, a price floor can provide a modest boost in revenue, in our case up to 5%. We decided to hold off on implementing the price floors for now, recognizing that if our Recovery Rate is not above 50%, a price floor will actively cause revenue to drop. So the next steps for us are to figure out our actual recovery rate, and then work to boost it. In the end, the best way to close the gap between the Winning Bid and the Close CPM may well just be to increase the number and price points for other bidders in the header bidder auction.

Follow PubNation Blog

A/B Testing Advertising: A Playbook for Publishers

Six months ago we launched an A/B testing framework for our site,, that has allowed us to make ad ops decisions smarter, faster, and with measurable improvements to revenue. Our fir...

Header Bidder Optimization: When Ads Compete, You Win

In the past two months, we've radically overhauled our programmatic advertising stack on, shifting our focus to header bidding advertisers--advertisers that submit the price they wi...