advanceddeep-dive

First Price and the Rise of Bid Shading

Why the industry abandoned second-price auctions, what that broke for buyers, and how shading algorithms reconstruct the price discipline that was lost.

4 min readUpdated Nov 10, 2026By AdTechDocs
On this page

For most of programmatic's history, display inventory cleared at . Around 2018 the industry switched to in the space of about eighteen months. Understanding why is the clearest window into how this market actually behaves.

What second price gave us

In a sealed-bid second-price auction, the winner pays just above the runner-up. The useful property is that bidding your true valuation is optimal: you cannot improve your outcome by shading down, because the price you pay was never determined by your own bid.

That property is why second price was chosen. A buyer could compute a value, submit it, and stop thinking about game theory.

What broke it

Three things, compounding.

Soft floors

Exchanges introduced floors that were not disclosed and not uniformly enforced. With a soft floor, "second price" became "the greater of the runner-up and some number the exchange would not show you". The clearing price stopped being derivable from the bids, and the honesty guarantee quietly evaporated.

Header bidding

let a publisher run several auctions in parallel and pass the winners into the ad server. But each upstream auction resolved at second price and submitted its clearing price — not its top bid — into the final comparison.

The effect: a buyer who won an exchange auction at $4.01 against a $4.00 runner-up entered the final round holding $4.01, even though it had been willing to pay $9.00. Publishers watched genuinely high bids lose to lower ones. From their side this looked exactly like money being destroyed in transit, and they were not wrong.

No way to audit

A buyer could not verify that the reported clearing price corresponded to any real runner-up. Publishers could not verify that exchanges were not shaving. With neither side able to audit, the only stable equilibrium was to make the rule trivial: you pay what you bid.

The problem it created

Under first price, bidding true value means paying true value — which, averaged over thousands of auctions, means systematically overpaying for every impression you win.

Consider an impression worth $8.00 to you, where the next-highest bid is $3.00.

  • Second price: you bid $8.00, you pay $3.01. Surplus $4.99.
  • First price, naive: you bid $8.00, you pay $8.00. Surplus $0.00.

The surplus did not vanish from the market, it moved to the publisher. For a buyer, the fix is to bid less than value — but not so much less that you stop winning.

Auction simulator

Move the controls and watch who wins and what the publisher keeps.

  • DSP A
    $7.40
    won
  • DSP B
    $5.90
  • DSP C
    $4.20
  • DSP D
    $2.80
Floor
$1.00
Winner
DSP A
Advertiser pays
$7.40
Intermediary fees
$1.48
Publisher keeps
$5.92
$1.00

Raise it past the top bid to see a no-fill.

0%

Buyers discounting their true value under first price.

20%

Combined cut of every intermediary in the path.

Under first price the winner pays its own bid, so bidding true value overpays — which is why shading exists.

Set shading to 0% and watch the winner pay its full valuation. Push shading to 30% and the clearing price drops while the winner usually stays the same — until it does not, and you lose the impression entirely. That cliff is the whole problem.

How shading works

is an estimator. For a given impression, the DSP predicts the distribution of what it would have taken to win, then bids slightly above the useful part of that distribution.

Concretely:

  1. Segment. Group historical auctions by features that predict clearing price: exchange, publisher, ad size, position, geography, time of day, device.
  2. Model the win curve. Within a segment, estimate P(win | bid) from the empirical distribution of past clearing prices. Minimum-bid-to-win feedback, where exchanges provide it, makes this far more accurate than win/loss alone.
  3. Optimise. Choose the bid maximising expected surplus:
expected_surplus(b) = P(win | b) × (value − b)

Differentiate, or just evaluate on a grid of candidate bids — the function is usually single-peaked, so a coarse grid is enough. The optimum sits where the marginal gain from a higher win probability stops exceeding the marginal cost of the higher price.

shade.py
def optimal_bid(value: float, win_curve, grid_step: float = 0.05) -> float:
    """Pick the bid maximising expected surplus against an empirical win curve.
 
    win_curve(b) -> probability of winning at bid b, estimated per segment from
    recent clearing prices. Grid search rather than a closed form: the curve is
    non-parametric and re-fitted continuously, so there is nothing to differentiate.
    """
    best_bid, best_surplus = 0.0, 0.0
    bid = grid_step
    while bid < value:
        surplus = win_curve(bid) * (value - bid)
        if surplus > best_surplus:
            best_bid, best_surplus = bid, surplus
        bid += grid_step
    return best_bid

Who this leaves where

Buyers gave up a guarantee and took on a modelling problem. A DSP without competent shading overpays by 10–30%, which is the difference between a viable business and a dying one.

Publishers captured surplus, then discovered the ceiling: shading converges towards the old second-price clearing level. The transition was a one-time revenue gain, not a permanent one.

Exchanges lost a lever and gained a simpler story. Several now publish clearing-price feedback precisely because better-informed buyers bid more confidently.

Check yourself

A DSP values an impression at $10.00. Its model says bidding $6.00 wins 70% of the time and $8.00 wins 85%. Which bid maximises expected surplus?

Key takeaways

  • First price won on auditability, not theory: a buyer can verify it from its own logs with no trust in the exchange.
  • Soft floors and header bidding made the second-price clearing rule unverifiable, which is what killed it.
  • Under first price, bidding true value means zero surplus on every win, so shading is mandatory rather than clever.
  • Shading maximises P(win | bid) × (value − bid) against a per-segment empirical win curve.
  • Reserve an unshaded exploration slice of traffic, or the model poisons its own training data and the win rate decays silently.