A price floor is the single most powerful lever most publishers never touch correctly. Set it too high and impressions go unsold; set it too low and you hand buyers your inventory at a discount they would happily have paid more to avoid. Getting floors right is not a one-time setting in Google Ad Manager — it is an ongoing exercise in reading your own demand and pricing against it. This guide walks through what floors actually do, the different floor types and how the modern auction changed them, how floors interact with header bidding and Ad Manager's Unified Pricing Rules, and a repeatable method for testing floors by placement, geo, and device.
What a price floor actually is
A price floor (or bid floor) is the minimum CPM — cost per mille, the price per 1,000 impressions — that you will accept for an ad slot. Buyers bidding through programmatic channels must meet or exceed that floor to win the impression. Below it, their bid is rejected and either a different demand source fills the slot or it goes unfilled.
The reason floors matter comes down to auction mechanics. In an open auction, a buyer's goal is to win the impression for the lowest price that still beats the competition. A floor changes the math: it becomes a reserve price the buyer must clear. Used well, a floor raises clearing prices on impressions that are genuinely worth more than the market is currently paying. Used carelessly, it silently blocks demand you needed.
Hard, soft, and dynamic floors
Hard floors are an absolute minimum. Any bid below the hard floor is thrown out — no exceptions. This is the floor type publishers most often reach for, and it is the bluntest instrument in the box. A hard floor guarantees you never sell below a price, but it also guarantees unsold impressions whenever real demand sits just underneath it.
Soft floors are a concept inherited from the second-price auction era. When exchanges ran second-price auctions, a soft floor sat above the hard floor as a target price. Bids above it competed normally; when the top bid landed between the soft and hard floor, the buyer paid closer to its own bid rather than the (lower) runner-up price — nudging clearing prices upward without rejecting the impression outright. Since Google and most major exchanges moved to first-price auctions (Google Ad Manager transitioned its programmatic demand to a unified first-price auction in 2019), the buyer simply pays what it bids. In that world the hard/soft distinction has largely collapsed. What most publishers mean by "floor" today is a single reserve price.
Dynamic floors (sometimes called optimized or unified floors, though "unified" also refers to Ad Manager's specific product below) adjust automatically. Instead of one fixed number, an algorithm sets a per-impression or per-segment floor based on historical bid data — how much buyers have actually paid for similar impressions. Dynamic floors are the state of the art because bid values vary enormously by user, page, time of day, and demand conditions. A static floor is a compromise across all of that variance; a dynamic floor prices each impression closer to what it is actually worth. Prebid's Price Floors Module, for example, can pull floor data from a provider and apply floors per impression across dimensions like media type, size, ad unit, and domain.
Floors in the modern stack: GAM and header bidding
Most publishers run floors in two places at once, and the interaction between them is where money is won or lost.
Google Ad Manager Unified Pricing Rules
Google Ad Manager's Unified Pricing Rules (UPR) are the ad server's floor mechanism. UPR replaced the older, fragmented system that let publishers set different floors for different buyers — a practice Google considered inequitable. A Unified Pricing Rule applies a single floor across your programmatic demand (Authorized Buyers, Open Bidding) rather than favoring one buyer over another. Critically, you can target UPRs by inventory dimension: ad unit, placement, format, device category, and geography, among others. That targeting is exactly what makes granular floor strategy possible inside Ad Manager without writing a rule per slot.
Header bidding and the Prebid Price Floors Module
In header bidding, a wrapper such as Prebid runs its own auction among SSPs in the browser before anything reaches the ad server. Floors set in Prebid's Price Floors Module apply at that stage — they filter or adjust SSP bids inside the wrapper auction. The winning header bid is then passed into Google Ad Manager as a key-value (typically hb_pb) attached to a price-priority line item, where it competes against Ad Manager's own demand.
The trap is running two uncoordinated floor systems. If your GAM floor is set higher than what your header bidding partners can realistically clear, you will systematically reject header demand and never see it in the auction. Conversely, a floor set only in Prebid does nothing to discipline the AdX/Open Auction demand flowing through the ad server. The two layers should be reasoned about together: your wrapper floor governs the SSP competition, and your UPR governs the ad server competition, and they should tell a consistent story about what an impression is worth.
The core tradeoff: fill versus yield
Every floor decision is a bet on the shape of your demand curve. Push the floor up and you increase the price of the impressions that still sell, but you shrink the number that sell at all. Push it down and you fill more, but you leave money on impressions buyers would have paid more for.
Floors too high cost you fill. Floors too low cost you yield. The right floor sits at the point where the marginal revenue from a higher price stops outweighing the revenue lost to unfilled impressions.
Here is an illustrative example (numbers invented purely to show the mechanic, not a benchmark): suppose a slot currently fills 95% of the time at an average price of $1.00. You raise the floor. Fill drops to 80%, but the impressions that do sell now average $1.40. Whether that is a win depends entirely on total revenue: 95% × $1.00 versus 80% × $1.40. In this made-up case the higher floor wins (0.95 vs 1.12 per available impression). Flip the numbers — fill collapsing to 60% at $1.20 — and the higher floor loses (0.95 vs 0.72). You cannot know which case you are in without measuring. That is the entire argument for testing rather than guessing.
A practical method to set and tune floors
Treat floors as an experiment with a clear baseline, one variable at a time, and enough time to gather signal. A workable loop:
- Establish a baseline. Before changing anything, record current fill rate, average CPM, and total revenue for each placement over a stable period (a full week at minimum, to average out weekday/weekend and daypart effects). You cannot judge a floor change without knowing what you moved from.
- Segment where the value actually varies. Floors should be granular along the dimensions that move price: placement (an above-the-fold unit is worth more than a footer), geography (advertiser demand differs sharply by country), and device (desktop, mobile web, and in-app often clear at different prices). A single site-wide floor averages across all of this and is almost always wrong somewhere.
- Change one variable at a time. Raise the floor on one segment while leaving comparable segments untouched as a control. If you change floors, ad sizes, and layout in the same week, you will never know which move caused the revenue swing.
- Move in small steps. Adjust in modest increments rather than doubling a floor overnight. Small steps let you find the inflection point where fill starts dropping faster than price rises — the signal that you have gone too far.
- Wait for real signal, then read total revenue. Give each change enough traffic to be meaningful before judging it, and judge on revenue per available impression (revenue divided by all requests, filled or not), never on CPM alone. A rising CPM with falling fill can easily mean less money — the CPM only describes the impressions that sold.
- Graduate to dynamic floors. Once you understand your demand by segment, hand the per-impression pricing to a dynamic floor system. Manual floors are a coarse approximation of value that changes minute to minute; dynamic floors price each impression against real historical bids and free you from re-tuning by hand.
Common floor mistakes
- Optimizing for CPM instead of total revenue. The single most common error. High CPM with low fill is a vanity metric.
- One global floor. A flat floor over-prices weak inventory (killing its fill) and under-prices strong inventory (leaking yield) at the same time.
- Uncoordinated floors across layers. A GAM floor that silently blocks header bidding demand, or a Prebid floor that leaves the ad server undisciplined.
- Changing floors too often or too fast. Buyers' bidding algorithms adapt to your floors over time; whipsawing them produces noise, not insight. Give changes room to settle.
- Ignoring geo and device. A floor tuned to your highest-value traffic will strangle fill on everything else.
- Never revisiting. Demand is seasonal and cyclical. A floor that was right in Q4 may be far too high in the January slowdown.
Where a monetization partner fits
Sophisticated floor management — dynamic per-impression pricing, coordinated wrapper and ad-server floors, and continuous testing by segment — is a lot of infrastructure to build and maintain alone. A publisher-first monetization partner like WeForAds handles this layer for you, running dynamic floors across demand sources so you capture yield without hand-tuning rules every week. If floors are eating into your fill or your CPMs feel soft, it is worth having someone measure it properly.
Practical takeaways
- A floor is a reserve price. Too high loses fill; too low loses yield. There is no safe default — only a measured optimum.
- The hard/soft floor distinction is mostly historical now that auctions are first-price. Think in terms of a single reserve price plus dynamic adjustment.
- Coordinate floors across GAM Unified Pricing Rules and your header bidding wrapper so one layer doesn't silently block the other's demand.
- Segment floors by placement, geo, and device — a single site-wide floor is wrong somewhere by definition.
- Judge every floor change on revenue per available impression, never on CPM alone, and give each test enough time to produce real signal.
- Once you understand your demand, move to dynamic floors and stop hand-tuning static numbers.