Passthrough Auctions: Rethinking Supply Path Optimization

Last August, I wrote a post introducing the concept of Supply Path Optimization to address the commoditization of programmatic supply access due to header bidding. Over the next two quarters, I worked closely with a team at AppNexus that did a domain-by-domain analysis of supply paths and rolled out a preliminary version of Supply Path Optimization (SPO).

Here are a few things we learned:

  1. Implementing SPO can dramatically reduce CPMs. Overall, we saw CPM reduction of around 20% across the platform by choosing the optimal intermediary to buy through. Interestingly, this didn't seem to impact CPMs paid to publishers.
  2. Bidding on fewer intermediaries does not impact delivery or reach (which makes sense since it's the same impression being auctioned multiple times)
  3. The SSP with the most price reduction in the header may not give the buyer the best outcome overall.

The first two learnings are more or less what I expected when we started the project. The third item, however, came as a surprise - especially since the point of my previous article was to attack aggressive SSPs in the header. It was so surprising, to me at least, that it's worth repeating: The intermediary SSP with the most price reduction doesn't give the buyer or the seller the best outcome.

To frame the issue, let's remember how the pieces fit together. The header components (bidders and wrapper) submit bids into an underlying ad server that makes the final decision about what ad to show. For traditional ad servers like DFP, this means converting these bids into priority-based campaigns in a waterfall and paying the price you bid (there's no second price mechanism). Newer ad servers like AppNexus Publisher Suite take the opposite approach, using forecasting data to convert direct-sold campaigns into bids in a unified auction.

Andrew Casale asked me "why the second price option was selected originally. If there was an assumption that we'd have lots of bids, that hasn't really come to fruition which makes second price ineffective at balancing all needs." In the unified auction, all demand looks like a bid, creating true scarcity and allowing a second price mechanism. However, as Andrew points out, when you don't have a unified auction, second price doesn't work well.

In theory, regardless of auction mechanics, the highest bid should win. The mere fact that header bidding improves yield for DFP publishers when the same bidders are also bidding into AdX tells you that something is fundamentally flawed in exchange auction mechanics. Moreover, since (outside of the handful of unified auction examples) the ad exchange can't guarantee how the publisher makes the final decision, an attempt to run a preliminary second-price auction may actually damage the outcome.

To see how this works, let's look at the example from the previous post.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$5.00$2.352nd priceLoss
SSP 2$5.00$3.65Soft floorsLoss
SSP 3$5.00$1.482nd priceLoss
SSP 4$5.00$5.001st priceWin$5.00
SSP 5$5.00$2.522nd priceLoss

We can't really look at this example without understanding how bids are actually submitted into DFP and compete with other demand, for instance from AdX or from direct-sold campaigns. Let's say there's a bid coming through from AdX at $4.00, and do what the previous post suggests and turn off SSP 4.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$5.00$2.352nd priceLoss
SSP 2$5.00$3.65Soft floorsLoss
SSP 3$5.00$1.482nd priceLoss
SSP 41st price
SSP 5$5.00$2.522nd priceLoss

Oops. We lose! All of this auction logic from SSPs in the header just serves to lower our bid below the actual threshold. Actually, we would have been better off leaving SSP 4 on because it would have paid more than the $4.00 bid from AdX.

A New Theory of Bidding and Yield Management: Uniform Shading and Hard Floors

My original theory of bidding and yield management was basically that sellers should run second price auctions and that buyers should express their full expected value, and good things would happen. As we've now learned, that doesn't match the empirical data. So, we need a new theory that operates in this multi-tiered auction environment.

Rule 1: Buyers should (almost) always shade bids. Shading means "bid less than you think the impression is worth." As an example, let's say you're willing to pay $5 CPM for an impression. You might only bid $4.00 so that you're certain the impression is profitable. A basic shading algorithm might analyze win rates at different bid prices for a particular publisher and try to find the optimal point in the curve. If paying $2 wins 50% of the time, and paying $3 only wins 55% of the time... is it really worth bidding higher? The exception to this rule is the unified auction case I mentioned above, where a publisher could operate a true second price auction across all sources of demand.

Rule 2: Header bidders and wrappers should pass-through all bids. In the example above, we saw how auction logic in the header hurt both the buyer and the seller. The only auction logic that makes sense is a unified auction in the underlying ad server. Wrappers and header bidders should not do any price reduction or flooring; they should just pass the highest bid price down to the underlying ad server.

Rule 3: Publishers should set uniform hard floors to create scarcity and maximize yield. For publishers to maximize overall revenue, they need to create scarcity. In a first price auction, soft floors don't do anything, and buyers will keep lowering their bids through shading until they stop winning. This means that publishers need to set hard floors to signal to buyers that they need to pay more to win more. These floors should be consistent across intermediaries for a given impression, but could be dynamic by buyer.

Case Study: Shading Rules

Let's see how these rules work in practice. Let's go back to our example, with more of the SSPs implementing Rule 2 (passthrough).

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$5.00$5.00PassthroughTie$5.00
SSP 2$5.00$3.65Soft floorsLoss
SSP 3$5.00$1.482nd priceLoss
SSP 4$5.00$5.00PassthroughTie$5.00
SSP 5$5.00$5.00PassthroughTie$5.00

You can see clearly that a) the buyer actually wins with the highest bid, unlike before and b) SSPs 2 and 3 are going to change their auction mechanics so they can compete!

Now the buyer starts shading (rule 1). The algorithm starts by knocking $0.75 off its bids.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$4.25$4.25PassthroughTie$4.25
SSP 2$4.25$3.65Soft floorsLoss
SSP 3$4.25$1.482nd priceLoss
SSP 4$4.25$4.25PassthroughTie$4.25
SSP 5$4.25$4.25PassthroughTie$4.25

The buyer is happy; she saved $0.75. Now the algorithm tries knocking another $0.75 off its bids.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$3.50$3.50PassthroughLoss
SSP 2$3.50$3.50Soft floorsLoss
SSP 3$3.50$1.482nd priceLoss
SSP 4$3.50$3.50PassthroughLoss
SSP 5$3.50$3.50PassthroughLoss

Oops, too far. After a few more tries, the algorithm figures out that the optimal price was $4.05.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$4.05$4.05PassthroughTie$4.05
SSP 2$4.05$3.65Soft floorsLoss
SSP 3$4.05$1.482nd priceLoss
SSP 4$4.05$4.05PassthroughTie$4.05
SSP 5$4.05$4.05PassthroughTie$4.05

You can see how Rules 1 and 2 allow the buyer and seller to get fairly good outcomes. I think it's probably clear how Rule 3 would work here - imagine the seller creating a hard floor at $4.25 to see if it can get the buyer to up its bids.

Case Study: Penalizing non-transparent fees

I was wrong in my previous post in blaming first-price intermediaries for being bad actors. In the context of a multi-tier auction, the header tier should not introduce auction logic, and in fact will create suboptimal outcomes if it does so.

Let's look at a different kind of bad actor. There has been a lot of recent press around non-transparent pricing in the programmatic space. Let's imagine that one of our SSPs is taking a non-transparent 10% margin and see what happens.

With a naive bidder that doesn't shade, a smart intermediary could set a soft floor at $4.05, win the underlying auction, and make an additional $0.40 of profit.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$5.00$2.352nd priceLoss
SSP 2$5.00$3.65Soft floorsLoss
SSP 3$5.00$1.482nd priceLoss
SSP 41st priceNo bid
SSP 5$5.00$4.05Soft floor + 10% extra marginWin$4.46

With passthrough and uniform shading, this doesn't work anymore.

SSPBid PriceSubmitted PriceAuction LogicOutcomePrice Paid
SSP 1$4.05$4.05PassthroughTie$4.05
SSP 2$4.05$3.65Soft floorsLoss
SSP 3$4.05$1.482nd priceLoss
SSP 4$4.05$4.05PassthroughTie$4.05
SSP 5$4.05$3.65Passthrough + 10%Loss
Implications and Next Steps

If my assessment is correct - and I welcome feedback - then we are about to see a dramatic change in how the programmatic space works. A low-cost, transparent, pass-through exchange will outperform any other path to supply simply because bids will be higher. This provides a clear path to solving the "infrastructure problem" that bidders face with massively duplicated volume from header bidding.

Based on this thesis, AppNexus is going to begin testing passthrough auctions for header bidding. Look out for BidRequest.at = 546 in OpenRTB requests. We're using a new auction type value because we don't control the underlying auction, which could be first or second price, and we encourage other industry players to follow our lead. We're also starting to pass the source.tid field that allows bidders to de-dup impressions.

I'm optimistic that by providing transparent, fair auction logic we can eliminate the incentives for intermediaries to mess with auction dynamics and help ensure that the best bid wins every auction. This should increase yield for publishers, improve results for buyers, and remove some of the friction that inhibits programmatic from becoming the best way to execute digital advertising. I look forward to your thoughts and comments!