In 2014, an ad operations lead at a mid-size publisher opens DoubleClick for Publishers and looks at a list of line items sorted by priority. Sponsorship at the top. Standard below that. Then a stack of Network and Price Priority items sold by the direct team and by a handful of networks. House ads at the bottom, catching whatever falls through. Every one of those line items has already declared, in advance, what the impression is worth to it. Wired into the same ad server, not as a line item but as a native participant, sits Google’s own ad exchange. When the page loads, AdX gets to see the number it has to beat. No other exchange in the building does.
That asymmetry had a name in the trade: last look. It is a single mechanic, narrow enough to describe in a sentence, and it explains most of what publishers, exchanges, and one open-source project spent the following decade doing. This chapter follows it from the waterfall it replaced, through the browser-side workaround built to defeat it, to the server-side product Google shipped to absorb that workaround, and finally to the day Google gave last look up and took something else away in the same release.
From DART to a Server With an Exchange Inside It
DoubleClick’s DART was the incumbent publisher ad server through the 2000s. It scheduled campaigns, counted impressions, and served creative for a large share of the commercial web. Google announced its acquisition of DoubleClick for $3.1bn in April 2007 (Google press release, 2007). The Federal Trade Commission closed its investigation and cleared the deal in December 2007 on a 4-1 vote (FTC, 2007), and the transaction closed in March 2008.
What Google bought was not only an ad server. DoubleClick had already begun building an exchange. Google inherited the ad server, the DoubleClick user ID, and that nascent marketplace, rebuilt the exchange on its own infrastructure, and relaunched it as the DoubleClick Ad Exchange on September 18, 2009 (Google Agency Blog, 2009). The launch mattered less for the exchange technology than for what got connected to it: AdWords advertisers could now buy display inventory on Ad Exchange sites through the interface they already used (TechCrunch, 2009). Millions of small advertiser accounts became exchange demand overnight.
In 2010, DART was rebranded DoubleClick for Publishers, and a free tier arrived alongside it as DFP Small Business (DoubleClick Publisher Blog, 2010). By the early 2010s the standard configuration for a professional publisher was DFP as the ad server plus AdX as the largest single source of programmatic demand, sold and supported by the same company. The buy-side half of that arrangement is the subject of One Company, Both Sides of the Table. This chapter stays on the sell side, where the two products physically touched.
The Waterfall Was Blind
Before real-time competition, publishers monetized unsold inventory with a waterfall. The ad server called network A. If network A had no ad worth serving at the agreed price, it returned a passback tag, and the browser called network B. Then network C. Each hop added a request, a redirect, and several hundred milliseconds. The order of the hops was set in advance from historical averages: network A ahead of network B because network A had paid more last month.
The problem was not latency, although the latency was real and users felt it. The problem was that the sequence was blind to the specific impression. A reader who had just researched a car loan was worth substantially more to one buyer than the monthly average implied, and the waterfall had no way to discover that. Networks lower in the stack never saw impressions they would have paid a premium for, because a network higher up filled them at a lower price. Publishers knew they were leaving money on the table. They could not see how much.
Priority tiers made the picture more complicated. Guaranteed line items, the Sponsorship and Standard tiers, represented contracts the publisher had already signed and had to deliver. An ad server that simply sold every impression to the highest bidder would under-deliver those contracts and create make-good liabilities. So guaranteed demand sat above the auction by design, not by accident, and the real question was how to let a live bid compete against a promise.
Dynamic Allocation and the Price to Beat
Google’s answer to that question was dynamic allocation, and its documentation still describes the mechanic plainly. When a guaranteed Standard or Sponsorship line item is eligible for an impression, it competes using “a temporary CPM or ‘opportunity cost’ that Ad Manager calculates automatically” from the line item’s delivery progress and historical non-guaranteed bid data (Google Ad Manager Help). AdX then bids against that number in real time, impression by impression, and wins only when it clears it (Google Ad Manager Help).
Read as yield management, this is a genuine improvement over the waterfall. A guaranteed campaign that is behind schedule gets a higher temporary CPM and is protected. One that is ahead of schedule gets a lower one and lets the auction take the impression. The publisher captures value the fixed ordering used to throw away.
Read as market structure, the same mechanic hands one participant the answer key. The temporary CPM, and the highest remnant line item price alongside it, is the price to beat for that specific impression. AdX received it because AdX ran inside the ad server. Rival exchanges received a passback tag and a guess. An exchange that knows the clearing threshold can bid a fraction above it and win at close to the minimum price that wins. An exchange that does not know it must either overbid and lose margin, or underbid and lose the impression. That is last look, and it is a positional advantage that no amount of bidding sophistication on the rival’s side can offset.
The advantage compounded in a second way. Because AdX won a large share of impressions and Google Ads demand flowed through AdX, Google accumulated bid-level data on what buyers would pay for specific inventory, which improved the pricing of the next bid. Publishers, meanwhile, saw only the outcome.
Header Bidding Was an Engineering Protest
The industry’s response did not come from a regulator. It came from JavaScript.
Header bidding inverted the sequence. Instead of letting the ad server run the auction and hand AdX the last look, a wrapper script in the page header called several exchanges first, collected their bids while the page was still loading, and then passed the winning bid into the ad server as key-value targeting on a Price Priority line item. By the time dynamic allocation ran, the number AdX had to beat was no longer an internal estimate. It was a real competing bid from a real exchange.
Prebid.js standardized this. It was written in early 2015 by Matt Kendall and Paul Yang at AppNexus, with Nick Jacob of the publisher Aplus (Prebid.org). Before it, every wrapper was proprietary and every integration was bespoke, which meant a publisher adding a fourth demand partner rewrote page code. Prebid gave publishers one adapter interface and one auction loop, and gave exchanges one integration to build against.
The costs were not small. Browser-side auctions added latency on the critical rendering path. Timeouts had to be tuned per partner. Publishers created hundreds of Price Priority line items in DFP, one per price bucket per partner, because that was the only channel through which a header bid could enter the ad server. Ad ops headcount went up. Publishers paid all of it anyway, which is the most direct measurement available of what last look was worth to them. Open-Source as Antitrust Remedy takes up what happened when that codebase acquired a governing foundation.
Open Bidding Moved the Auction Back Inside
Google’s counter was to offer the same multi-exchange competition without the browser. Exchange Bidding in Dynamic Allocation, universally shortened to EBDA and later renamed Open Bidding, entered beta in 2016 and moved the multi-exchange auction server-side, inside Ad Manager (AdMonsters). Partner exchanges bid into Google’s infrastructure rather than into a wrapper on the page. Google reported that it gave up last look within that auction in 2017 (Blockthrough).
For a publisher, the trade was legible. Open Bidding removed the latency and the line item sprawl, and it removed the operational burden of maintaining wrapper configuration. It also moved the auction back into infrastructure operated by the company whose exchange was the largest bidder in it, and Google took a share of revenue when a partner exchange won. Sophisticated publishers refused to choose. They ran Prebid in the header and Open Bidding in the server at the same time, and treated the gap between them as an arbitrage to be measured monthly.
Two Changes Shipped in One Release
In March 2019, Google announced that Ad Manager would move from second-price to first-price for its unified auction, rolling out over the following months (Google Ad Manager Blog, 2019), and confirmed completion later that year (Google Ad Manager Blog, 2019). Last look went away with it. Every source of indirect demand, AdX included, now bid into one auction under the same pricing rules.
Publishers reading only that sentence would have called it a win. The same package included unified pricing rules, which required a single floor to apply across all indirect programmatic demand and capped publishers at 100 rules (Google Ad Manager Help). Before unified pricing rules, a publisher who suspected AdX was underpaying could set a higher floor specifically for AdX and a lower one for a rival exchange. After them, that lever was gone. Google surrendered its informational advantage and simultaneously removed the publisher’s ability to price against it.
The full arc of what happened next belongs to What Google Gave Back, and When, but the endpoint is worth stating here. In April 2025, Judge Leonie Brinkema found Google liable for monopolizing the open-web publisher ad server and ad exchange markets and for unlawfully tying DFP to AdX (CNBC, 2025). Unified pricing rules were part of the conduct at issue, and Google removed them from Ad Manager in December 2025 (Search Engine Land, 2025). Publishers can set bidder-specific floors again, roughly six years after losing the ability to.
| Era | Who saw the price to beat | Publisher’s main lever | Where the auction ran |
|---|---|---|---|
| Waterfall, pre-2010 | nobody, per impression | ordering the passback chain | sequential browser calls |
| Dynamic allocation, 2010-2015 | AdX only | priority tiers and network mix | inside the ad server |
| Header bidding, 2015-2019 | every wrapper partner | Prebid partner mix and timeouts | browser, then the ad server |
| Open Bidding, 2016 onward | Google’s server, for all bidders | Open Bidding partner selection | Google’s infrastructure |
| Unified first-price, 2019-2025 | no bidder, by design | one floor, capped at 100 rules | one auction in Ad Manager |
| Post-UPR, from December 2025 | no bidder, by design | bidder-specific floors, again | one auction in Ad Manager |
The pattern in that table is the argument of this part of the book. Each row is a response to the row above it. None of the responses came from a publisher gaining leverage in a negotiation. They came from engineers writing a workaround, Google shipping a product that absorbed the workaround, and finally a court.
Key Sources
| Source | Author/Org | Year | Link | Why it matters |
|---|---|---|---|---|
| Google to Acquire DoubleClick | 2007 | press release | Establishes the $3.1bn price and the fact that an ad server, not an exchange, was the headline asset | |
| FTC Closes Google/DoubleClick Investigation | Federal Trade Commission | 2007 | FTC | The clearance decision that later enforcement actions are implicitly relitigating |
| The New DoubleClick Ad Exchange | Google Agency Blog | 2009 | blog | Dates the AdX relaunch that put an exchange inside Google’s ad server |
| Google’s DoubleClick Launches New Marketplace for Display Ads | TechCrunch | 2009 | article | Notes the AdWords demand connection, the loop that made AdX the largest exchange |
| Ad competition with dynamic allocation | Google Ad Manager Help | current | help | Google’s own wording for the temporary CPM and opportunity cost that constituted the price to beat |
| Use dynamic allocation to optimize every impression | Google Ad Manager Help | current | help | Describes AdX bidding in real time against guaranteed and remnant demand |
| About Prebid.js | Prebid.org | current | docs | Primary record of Prebid.js authorship in early 2015 and its standardization goal |
| Open Bidding (EBDA): Frequently Asked Questions | Blockthrough | current | article | Traces EBDA’s origin and the reported 2017 removal of last look inside it |
| Rolling out first price auctions to Google Ad Manager partners | 2019 | blog | The announcement that bundled the end of last look with unified pricing rules | |
| Google scraps unified pricing rules in Ad Manager after antitrust pressure | Search Engine Land | 2025 | article | Dates the reversal of the 2019 floor restriction to December 2025 |
PM Lens
Papers referenced
- Google to Acquire DoubleClick Google · 2007
- Federal Trade Commission Closes Google/DoubleClick Investigation Federal Trade Commission · 2007
- The New DoubleClick Ad Exchange Google Agency Blog · 2009
- Google's DoubleClick Launches New Marketplace For Display Ads TechCrunch · 2009
- Introducing DFP Small Business DoubleClick Publisher Blog · 2010
- Ad competition with dynamic allocation Google Ad Manager Help · 2025
- Use dynamic allocation to optimize every impression Google Ad Manager Help · 2025
- About Prebid.js for Header Bidding Prebid.org · 2025
- Open Bidding (EBDA): Frequently asked questions Blockthrough · 2021
- Ad Ops Decoder: What Is EBDA? AdMonsters · 2018
- Rolling out first price auctions to Google Ad Manager partners Google Ad Manager Blog · 2019
- An update on first price auctions for Google Ad Manager Google Ad Manager Blog · 2019
- Pricing rules Google Ad Manager Help · 2025
- Judge finds Google holds illegal online ad tech monopolies CNBC · 2025
- Google scraps unified pricing rules in Ad Manager after antitrust pressure Search Engine Land · 2025