Beating the Second Price Auction

Tyler Fitch"The Sell-Sider" is a column written by the sell-side of the digital media community.

Tyler Fitch is Director of Yield Management at Mindjolt, an online games company.

First, a disclaimer from me: In order to effectively optimize inventory, a publisher must have 100% transparency of their own inventory by page, country, and frequency. Too many publishers have no idea what the value of their inventory is and/or what people are paying for each impression. Setting floors too high or too low can cause catastrophic losses in revenue. End disclaimer.

This article came to me last week when I was speaking with a friend who recently took over at a very large publisher to remain nameless.  He asked me for a few pointers on how he could increase the CPM’s on his site.  Willing to help out a friend, I agreed and started taking a look around to see what ads he was serving.

They were the same exact remnant ads I was showing on my own sites!  When I asked him what his average US CPM was, they were 3x lower than what I was getting paid to show the exact same DoubleClick ad. How could this happen? The second price auction…

The best explanation of second price auctions could be Mike Nolet's “Price floors, second price auctions and market dynamics.” To sum it up, in an exchange's second price auction, the highest bidder always wins by .01 cent over the 2nd highest bidder no matter how much the impression is worth to the winning advertiser.  DSP’s constantly optimize on the Max Bid, creating constant downward pressure on Publisher CPM’s.  The Publishers only way to counter is with pricing floors.  Pricing floors are highly inefficient and usually end up hurting the publisher when they price themselves out of the market.

So how do you beat the second price auction? Demand. This is how the yield optimizers are doing it.  Get as many remnant advertisers as possible, prioritize them according to how much they pay out, and stick them inside an exchange with multiple DSP’s (Yes, I know there is more to Yield Optimizers so please save the hate mail for now, I am just keeping this short for time’s sake). This will definitely help yield to some extent, but there is a fundamental flaw to their system; Yield Optimizers work using an ad network model.  But, to work effectively using an ad network or revenue share model, you have to have pricing transparency for the publisher AND for the exchange, which yield optimizers do not. They're not alone. Many big publishers are guilty of not understanding their own pricing versus that of the exchange and are just plugging in revenue from each ad network and letting it compete with the exchange (even I was guilty of a lack of complete exchange transparency till about 6 months ago.).

“Controlled Inflation” is the key to getting premium yield. In the table below, I know that my managed advertiser is only going to pay me $1.15, but the exchange advertisers don’t know what I am being paid. Managed advertisers are not transparent to Exchange advertisers and, in turn, are “mini floors”. Using managed advertisers within an exchange allows me to control exchange arbitrage by ad unit, country and frequency.

Theoretically, lets say I start with 20% inflation on my pricing for my managed advertiser and slowly keep moving it up until Exchange 2 will stop paying. I find that the exchange advertiser will still pay for that impression at 1.75. In the end, I cause the Exchange Advertiser to pay 35% more than they would have paid in test #2. This optimization continues all the way down the chain until you hit your lowest paying advertisers. In test #3, just one of my exchange advertisers has optimized pricing to get the first bid. Now the exchange has paid the exact minimum for the two exchange advertisers to get the first 3 impressions of my user session.

Auction for Test #1 (Bid) Exchange Advertiser #1 Exchange Advertiser #2 Managed Inflated (Actual Payout 1.15) Winning Bid in Second Price Auction
1 3.00 1.76 1.75 (1.15) 1.77
2 No Bid 1.76 1.75 (1.15) 1.76
3 No Bid 1.76 1.75 (1.15) 1.76
4 No Bid No Bid 1.15 (actual rev) 1.15
Auction for test #2 Exchange 1 Exchange 2 Managed Non Inflated (Actual Payout 1.15) Winning Bid in Second Price Auction
1 3.00 1.76 1.15 1.77
2 No Bid 1.76 1.15 1.16
3 No Bid 1.76 1.15 1.16
4 No Bid No Bid 1.15 1.15
Auction for test #3 Exchange 1 Exchange 2 Optimized Managed Non Inflated (Actual Payout 1.15) Winning Bid in Second Price Auction
1 3.00 1.16 1.15 1.17
2 No Bid 1.16 1.15 1.16
3 No Bid 1.16 1.15 1.16
4 No Bid No Bid 1.15 1.15

So, why don’t more publisher do this? Well… it takes a lot of work to effectively optimize like this.  There are a lot more spreadsheets and manual data entry than I would like to admit, but it needs to be done.  Some publishers just don’t think that it will make that much of a difference, but I have already seen large gains from “Controlled Inflation.”

With slight improvements in daily incremental revenue, it’s a serious amount of cash for your bottom line annually.

Definitely worth the extra 2 hours.

Follow Tyler Fitch (@tylerwfitch) and (@adexchanger) on Twitter.


  1. I'd also argue that you need insight into how advertisers are leveraging data to buy inventory. Publishers need to match the tactics of the buyer when analyzing/optimizing inventory in order to maximize the return in a second price auction.

  2. Matt Smith


    Well written and insightful article. My question is- what is the difference between Exchange 2 in test 2 and Exchange 2 (optimized) in test 3?

    Also- how do you find the breaking point at which an exchange will stop bidding, and do you not find that it constantly changes? How do you factor frequency for exchanges that aren't 100% fill in to the equation?

    Agree with Christopher Murphy's response as well.

    • Thanks Matt,

      Exchange 2 (optimized) represents someones RTB bidding engine. Eventually a DSP will find the minimum price they need to pay in order to win an impression.

      And, I find the breaking point a few ways. Any exchange will tell you what the advertiser paid, and where. Find your CPM on that placement and keep inching it up. If you overshoot your CPM, the DSP should pick up the impression further down the chain (this impression should hit another "Inflated CPM" further down the chain). Also, some ad servers will give you CPM by impression (RMX).

      As for fill rate, these are not standard floors that are all or nothing. I am still getting paid on exchange defaulted impressions because my "floors" are other networks that work outside the exchange. Fill rate should be 100%

      Make sense?

      • Matt Smith

        Thanks for the response Tyler. It definitely makes sense.

        I am not sure that DSPs are finding the minimum price they need to pay on a placement level per publisher. The 2nd price auction mechanics prevent them from having to do this- ie in auction test 2 and 3, "exchange 2" has the same closing price- so no real value prop in them optimizing at that level, no?

        What I really want to know is what technology you use that allows you to plug in multiple exchanges and networks, inflate the network cpm's on a placement basis, and set floors at such a granular level.

        Genuinely trying to gain understanding because I would love to learn!

  3. Mark McEachran (the Rubicon Project)

    There are several good points here. It’s true that you have to watch out for floor testing behavior by the buy side and figuring out and setting smart floors (managed inflated payout) to maximize yield is a necessary move by publishers to maximize their revenue in an auction. Spreadsheets, however, will get out of control when you try to do this at scale. Your examples could include a fourth and fifth scenario, as well. You could demonstrate what happens when your floor is set too high for some bids and you make less money, as well as what happens when your floor is too high for some bids, but you still maximize yield. Both scenarios happen in real-world situations.

  4. Matt Smith

    In response to Mark-

    The question then becomes- at what level of granularity can you (Rubicon) set floors at with your optimization engine? What tactics have proven successful so far?


Add a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>