Every publisher I talk to has price floors. Almost none of them can tell me when the numbers were last changed, or what question the numbers were an answer to.
The floor was set during an integration, it looked defensible, and it has been sitting there ever since — collecting nothing, because a floor does not collect. It refuses.
That distinction matters more than it used to. When Google Ad Manager completed its move to a unified first-price auction through 2019, it changed what a floor is. Under second-price rules a floor was mostly a guard rail: bid what you like, you will pay one cent over the runner-up, and the floor only bites at the bottom of the distribution. Under first-price rules the winner pays exactly what it bid — so every buyer now has to guess how little it can offer and still win. Your floor is the single most useful clue you give them.
01What a floor actually does
A price floor is the lowest price you will accept for an impression. Said that way it sounds protective, and that framing is where the money goes missing. Turn it around: a floor is a standing instruction to reject every bid beneath a number you chose in advance, without seeing the bids.
On the other side of that instruction sits bid shading. Demand-side platforms run shading algorithms precisely because first-price auctions punish overbidding: the algorithm's job is to find the lowest price that still wins, and it will use whatever signal it can get about where that line sits. A published floor is the cleanest signal available. Set one at $2.40 and you have told every shading model in the market that $2.40 clears — which is also a fairly strong hint that it need not offer $3.10.
A floor does two jobs at once, and they pull in opposite directions. It stops you selling too cheaply, and it caps what the market will bother to offer. Any floor you cannot revisit is only doing the second job.
02The two ways a floor loses money
Set it too low and you sell inventory below what the auction would have paid. That loss is invisible: the impression cleared, the report looks healthy, and nothing anywhere records the bid you would have received had you asked for more.
Set it too high and the bid never arrives. The impression goes unfilled, or drops to a lower-paying backfill. That loss is visible — as a fill-rate dip — which is why publishers who get burned once tend to over-correct downward and stay there. The asymmetry is the trap: one failure mode announces itself and the other never does.
The arithmetic is unforgiving at scale. Take a placement doing 40 million monthly impressions at a $2.10 average CPM:
| Scenario | CPM | Fill | Monthly revenue | vs baseline |
|---|---|---|---|---|
| Baseline | $2.10 | 92% | $77,280 | — |
| Floor raised, demand absorbs it | $2.31 | 92% | $85,008 | +10.0% |
| Floor raised, demand walks | $2.31 | 81% | $74,844 | −3.2% |
| Floor lowered to protect fill | $1.95 | 96% | $74,880 | −3.1% |
You cannot reason your way to the answer. The inventory has to tell you, repeatedly.
03Why one number cannot fit
The deeper problem is not that the floor is stale. It is that a single number is being asked to describe inventory that is not uniform. The same ad slot, in the same week, carries impressions worth wildly different amounts — and the tooling already assumes you know that.
Geography, device, format, time of day, session position and consent state all move the clearing price of the same slot. A quarterly number cannot see any of it.
04What a moving floor looks like
The alternative is not a cleverer constant. It is a floor recomputed from the auction's own history, per segment, on a schedule short enough to track demand rather than trail it. Prebid supports this directly: with dynamic floors enabled, the library fetches floor data from a provider endpoint at auction time instead of reading a static config.
What matters is what sits behind that endpoint. A floor engine worth running has to do three unglamorous things well:
- Segment honestly. Slice until the segments are behaviourally different, then stop. Over-segmentation starves each bucket of the data it needs to be right.
- Keep a control group. If some share of traffic is not being optimised, you have no counterfactual, and every uplift number you report is a story rather than a measurement.
- Respond, then wait. A floor that chases every hourly wobble teaches the shading models on the other side that your prices are noise.
Dynamic flooring is not free money, and anyone selling it that way is selling something else. It is a measurement discipline. The gain comes from finding the price the market was already willing to pay and no longer refusing it.
05How to tell whether yours are costing you
06Where we land
We built Archon Cortex because this is arithmetic nobody has time to do by hand, at a frequency no human schedule survives. It reprices floors per segment against the auction's own history, and holds back a control group so the number it reports is a measurement rather than a claim. That is the whole pitch.
If your floors have not moved this quarter, the first useful thing is not our product — it is opening the report and finding out how many distinct floor values you are actually running. If you would like us to do that with you, the free yield audit starts exactly there.
Sources
- AdExchanger — Google Switches To First-Price Auction
- DoubleVerify — What Google's Move to a Unified First-Price Auction Means for Publishers
- Prebid — Price Floors module (dimensions, dynamic provider endpoint)
- Prebid Server — Price Floors for header bidding
- Publift — A guide to bid shading