skip to content

Search

← The Google Marketing Stack

Part V — The Sell Side: Ad Manager and AdX

The Last Look

Dynamic allocation gave AdX the price to beat inside Google's own ad server. Header bidding routed around it; Google eventually gave it up.

2009–2019 11 min read 15 papers

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.

A decade of engineering built around one mechanic AdX could see the price it had to beat before it bid. Everything below follows from that one fact. Grey monospace text names who could see the floor at each step. 2008 DoubleClick closes Google inherits DART and a half-built exchange $3.1B, closed Mar 2008 2009 AdX relaunches AdWords demand pipes into the exchange 18 September 2009 2010 Dynamic allocation AdX bids inside the ad server, sees the floor DART becomes DFP 2015 Prebid.js ships header bidding lets rivals see a real bid AppNexus and Aplus, early 2015 2016 Exchange Bidding beta multi-exchange auction moves server-side EBDA, later Open Bidding 2019 First-price, one auction last look ends, unified pricing arrives one concession, one new limit 2025 Liability found Brinkema rules, UPR scrapped in December six years to get floors back inherited infrastructure the positional advantage the industry's workaround the legal reckoning Google gave up last look in 2019 and took away bidder-specific floors in the same release.
Google gave up last look in 2019 and took away bidder-specific price floors in the same release. Six years later a court called the whole arrangement illegal. PNG ↓

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.

EraWho saw the price to beatPublisher’s main leverWhere the auction ran
Waterfall, pre-2010nobody, per impressionordering the passback chainsequential browser calls
Dynamic allocation, 2010-2015AdX onlypriority tiers and network mixinside the ad server
Header bidding, 2015-2019every wrapper partnerPrebid partner mix and timeoutsbrowser, then the ad server
Open Bidding, 2016 onwardGoogle’s server, for all biddersOpen Bidding partner selectionGoogle’s infrastructure
Unified first-price, 2019-2025no bidder, by designone floor, capped at 100 rulesone auction in Ad Manager
Post-UPR, from December 2025no bidder, by designbidder-specific floors, againone 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

SourceAuthor/OrgYearLinkWhy it matters
Google to Acquire DoubleClickGoogle2007press releaseEstablishes the $3.1bn price and the fact that an ad server, not an exchange, was the headline asset
FTC Closes Google/DoubleClick InvestigationFederal Trade Commission2007FTCThe clearance decision that later enforcement actions are implicitly relitigating
The New DoubleClick Ad ExchangeGoogle Agency Blog2009blogDates the AdX relaunch that put an exchange inside Google’s ad server
Google’s DoubleClick Launches New Marketplace for Display AdsTechCrunch2009articleNotes the AdWords demand connection, the loop that made AdX the largest exchange
Ad competition with dynamic allocationGoogle Ad Manager HelpcurrenthelpGoogle’s own wording for the temporary CPM and opportunity cost that constituted the price to beat
Use dynamic allocation to optimize every impressionGoogle Ad Manager HelpcurrenthelpDescribes AdX bidding in real time against guaranteed and remnant demand
About Prebid.jsPrebid.orgcurrentdocsPrimary record of Prebid.js authorship in early 2015 and its standardization goal
Open Bidding (EBDA): Frequently Asked QuestionsBlockthroughcurrentarticleTraces EBDA’s origin and the reported 2017 removal of last look inside it
Rolling out first price auctions to Google Ad Manager partnersGoogle2019blogThe announcement that bundled the end of last look with unified pricing rules
Google scraps unified pricing rules in Ad Manager after antitrust pressureSearch Engine Land2025articleDates the reversal of the 2019 floor restriction to December 2025

PM Lens

Papers referenced