VCG position auction
The same slots to the same bidders, but each winner pays the externality they impose. Truthful.
Bidding your true value is a dominant strategy here: it is at least as good as anything else you could do, whatever the other bidders do.
A worked example
The same two slots, the same three bidders, the same click-through decay as the GSP page — everything is held constant except the pricing rule.
| 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 externality they impose on everybody else: for every slot below them, the clicks that slot's holder loses by being pushed one place down, valued at that holder's own bid. A winner's own bid never appears anywhere in their own bill — it only decides which slot they get — so raising it can never raise their price and lowering it can only cost them clicks. That is why bidding your true value per click is dominant here.
p_i = sum over j > i of (ctr_(j-1) - ctr_j) x b_j
- slot price A holds slot 0. Without A: B would move up into slot 0, gaining 0.5 clicks they value at 72 each; C would move up into slot 1, gaining 0.5 clicks they value at 41 each. The total of what everybody else would have gained is exactly what A is charged.
p_A = 0.5 x 72 + 0.5 x 41 = 56.5
- slot price B holds slot 1. Without B: C would move up into slot 1, gaining 0.5 clicks they value at 41 each. The total of what everybody else would have gained is exactly what B is charged.
p_B = 0.5 x 41 = 20.5
- payments A tops the ladder and pays 56.5, the harm their presence does to the bidders below them; nobody is ever charged for value they did not take away from somebody else.
revenue = 56.5 + 20.5 = 77
How it came out
| Winner | A |
|---|---|
| Everyone who won something | A -> 0, B -> 1 |
| Price paid by the winner | 56.5 |
| Seller revenue | 77 |
| Value created | 136 |
| Went to whoever valued it most | yes |
| Bidder | Paid | Ended up with |
|---|---|---|
| A | 56.5 | 43.5 |
| B | 20.5 | 15.5 |
| C | 0 | 0 |
The slots go to the same people. What changes is the bill: each winner pays the harm they did to everybody else by being there — the welfare the others would have had in their absence, minus what they actually got. Charge that, and no bidder can improve their position by misreporting, because their report no longer moves their own price. This is the general recipe behind every truthful mechanism on this site.
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. |