Section 10: Money on a Ten-Second Delay - Deep Dive: Auction, Pacing & the Billing Loop
Executive Summary: Section 9 handed us 500 calibrated scores. The auction ranks by eCPM = bid × pCTR × 1,000, applies a reserve price and re-rank constraints, and charges each winner the minimum it needs to keep its rank: Trailhead wins at $25.20 eCPM against a runner-up at $21.00 and pays $1.01 per click on a $1.20 bid. Budgets are enforced with no counter on the request path: a 10 s pacing loop compares spend with the expected-spend curve and pushes participation probabilities to every leaf. Trailhead at 2:00 p.m. is at $3,600 against $3,000 expected, so its probability drops to ~0.7. The platform absorbs the lag overspend, capped at 0.1% of daily spend. Billing is a separate, slower consumer of the same verified event log, and each consumer deduplicates on the tracking token.
"You have 500 scores. Who wins, what do they pay, and how do you keep Trailhead from blowing its budget by lunch?"
You: "Three separate problems with three different clocks. The auction runs inside the request, in 5 ms. Pacing runs in a loop every 10 seconds. Billing runs once a day. I'll keep them apart so a slow one never holds up a fast one."
The Auction: 500 Scores to 3 Winners
Every candidate gets a common currency, expected revenue per thousand impressions. A CPC bid becomes eCPM = bid × pCTR × 1,000. A CPM bid enters directly. A conversion bid uses bid × pCTR × pCVR × 1,000, so any calibration error lands straight in the price.
For Maya's request, Trailhead's ad scores pCTR 2.1%, so its eCPM is $1.20 × 0.021 × 1,000 = $25.20. The next ad is at $21.00. Under generalized second price, Trailhead pays the smallest CPC that would still have beaten the runner-up: 21.00 / (0.021 × 1,000) = $1.00, plus a $0.01 increment, so $1.01 if Maya clicks. That is below its $1.20 bid, as it must be. The other two slots are priced the same way, each against the ad ranked just below it. The reserve price sets the floor, so a weak lone bidder doesn't take a slot for a fraction of a cent.
Re-rank runs before pricing so prices match the final order. It makes sure no advertiser takes more than one of the three slots, honors the frequency caps the user context carried (Trailhead: 3 impressions per user per day), and applies position and ad-load rules.
"Second price means advertisers just bid their true value, right?"
You: "Not with three slots. GSP isn't truthful: an advertiser can sometimes gain by shading below its value to drop to a cheaper slot. VCG is truthful, because each winner pays the externality it imposes on the slots below, and some large platforms report running VCG-style auctions. I choose GSP because its per-slot rule, pay the minimum to keep your rank, is one advertisers and their tools understand, and it's simple to compute when ranking is position-independent. I'd flip to VCG if we wanted truthful bidding or started optimising richer slot externalities such as ad load. At the same bids VCG charges less, so that flip is a revenue trade-off I'd A/B test."
"Why not first price? It's simpler still."
You: "The rule is simpler, but the burden moves to the advertiser. Under first price everyone pays their bid, so serious advertisers need bid-shading tools, and our 10 million small advertisers would overpay until they learned. I'd flip if we started taking external demand from exchanges that have already moved to first price."
| Option | Price paid | Truthful? | Verdict |
|---|---|---|---|
| Rank by bid only | Bid | No | Rejected: ignores relevance |
| First price on eCPM | Own bid | No, needs shading | Rejected for now; flip trigger is external first-price demand |
| VCG | Externality imposed on others | Yes | The honest alternative; flip trigger is truthful bidding or richer slot externalities |
| GSP on eCPM + reserve | Minimum to keep rank | Not in general | Chosen (D8) |
Quick check before moving on:
Sign in to continue reading
The rest of this lesson is available with a free account. Signing in with Google or Microsoft is free.
Sign in to read the full lesson