Generalized second-price (GSP)
Slots go to the highest bids; each winner pays the next bidder's bid per click. Not truthful.
Bidding your true value is not dominant here. A bidder who knows something about their rivals can do better by bidding something else, and the worked example below shows what and why.
A worked example
Two advertising slots, not one item, and the top slot gets twice the clicks of the second. Bids are per click. This is, in outline, how search advertising was actually sold.
| Bidder | Worth to them | Bid |
|---|---|---|
| A | 100 | 95 |
| B | 72 | 72 |
| C | 41 | 41 |
What the mechanism does, step by step
- collect bids Each bidder submits one sealed bid; private values are never revealed.
- sort Bids are ranked from highest to lowest. Equal bids keep the order the bidders were listed in, so a tie goes to the first-listed bidder.
95 >= 72 >= 41
- click-through rates A bid here is a price per click, and the 2 slots differ only in how often they are clicked: slot i receives 0.5^i of the clicks slot 0 gets. A slot is therefore worth its holder's value per click times that rate, so the same bidder is worth less further down the page.
ctr_0 = 1, ctr_1 = 0.5
- assign slots The highest bid takes the most clicked slot, the next bid the one below it, and so on down: A takes slot 0 at ctr 1, B takes slot 1 at ctr 0.5. Both payment rules allocate exactly this way — only the bill that follows differs.
slot 0 -> A (95/click) | slot 1 -> B (72/click)
- price rule Each winner pays the next bidder's bid for every click their slot gets, never their own bid. That is the rule that breaks truthfulness: your own bid decides which slot you land in, but the bidder below you decides what that slot costs, so deliberately bidding low enough to drop a slot can buy cheaper clicks and leave you better off than bidding your value.
p_i = ctr_i x b_(i+1)
- slot price A holds slot 0 and is charged B's bid of 72 on every one of that slot's clicks.
p_A = ctr_0 x b_1 = 1 x 72 = 72
- slot price B holds slot 1 and is charged C's bid of 41 on every one of that slot's clicks.
p_B = ctr_1 x b_2 = 0.5 x 41 = 20.5
- payments A tops the ladder and pays 72. Every winner is billed at whatever sits one rung below them — the next bidder's bid, or the reserve once the ladder runs out — and anybody who won no slot pays nothing.
revenue = 72 + 20.5 = 92.5
How it came out
| Winner | A |
|---|---|
| Everyone who won something | A -> 0, B -> 1 |
| Price paid by the winner | 72 |
| Seller revenue | 92.5 |
| Value created | 136 |
| Went to whoever valued it most | yes |
| Bidder | Paid | Ended up with |
|---|---|---|
| A | 72 | 28 |
| B | 20.5 | 15.5 |
| C | 0 | 0 |
A takes the top slot and pays B's bid per click; B takes the second and pays C's. It looks like a second-price auction repeated down the page, and it is not: truthful bidding is not dominant here. A bidder can sometimes do better by bidding *down* into a cheaper slot whose clicks cost less than the ones above. Compare the VCG position auction, which sells the same slots to the same bidders and prices them so that honesty is safe.
The link carries the whole setup, so you can change a bid and watch what moves — and send the result to somebody else.
Settings
| Setting | Default | What it does |
|---|---|---|
| Reserve price per click | 0 | Bids below the reserve win no slot, and the lowest winner pays it. |
| Slots | 3 | How many positions are for sale. Slot 0 is the most clicked. |
| Click-through decay | 0.5 | Slot i receives ctr_decay^i of the clicks slot 0 receives. |