Dynamic Price Floors: How AI is Changing Yield Optimization
Google's own historical claim, dated May 12, 2016, holds that optimized pricing applied to about 15 percent of transactions created over 5 percent lift in revenue for publishers using the Open Auction. The unified auction did not exist yet, header bidding was young, and the floor in your ad server was a number you typed by hand and revisited quarterly. The bet behind that claim still drives the tooling: a model that prices each query should beat an operator who prices each rule. What changed is that the operator now has three distinct places to run that model, each with a different contract, a different failure mode, and a different amount of evidence it can produce.
What a floor does in a first-price auction
In a first-price auction the floor is a hard reject threshold and a public signal at once. Every bid below it exits before ranking. Every bidder that receives it learns the minimum acceptable price, and shading models adjust. Buyers bid down to what their auction histories say wins, and a floor truncates those histories and pulls winning bids toward itself. The trade never disappears: a higher floor lifts the CPM on impressions that still clear, and it deletes the impressions that do not.
Run the arithmetic on one path. Say the top bid lands at $0.65 after shading: a $0.30 floor changes nothing, while a $0.70 floor turns a $0.65 sale into unsold inventory. On impressions where bidders would shade to $0.55, a $0.70 floor forces the winner up to the floor to stay in the auction, a $0.15 gain. On impressions clearing at $0.95, the floor is irrelevant. Yield work is the business of estimating how many impressions sit in each bucket, and that distribution is exactly what per-query models estimate.
Two failure modes dominate the job. A floor below the clearing price does nothing, which wastes the lever. A floor above it converts filled impressions into unsold ones, and unsold flows to the worst-paying path left in the stack. We treat expected-value ranking, first-price auctions with bid shading, and reserve prices as prerequisites for this work, and we cover them in our auction mechanics primer.
Google's optimized floor prices: pricing per query, not per rule
Ad Manager pricing rules historically took a number you typed and applied it to a segment of traffic. Google's optimized floor prices, still in Beta, replace the typed number with a machine learning model that sets the price per query, with the stated objective of maximizing long-term revenue. Per query is the whole idea: two impressions with the same format and geography can carry different floors when the model expects different buyer populations. The word to stress is long-term, because the model can accept a lower clearing price now to protect fill and repeat demand later.
Three boundaries come straight from the feature's rules. The optimized floor overrides floors from other overlapping pricing rules, so it wins conflicts against rules you built earlier, but advertiser-specific and bidder-specific floors keep precedence and stay untouched. The feature only works with the Set pricing for everything option, which rules out pairing it with a fixed floor on part of a rule. And it sets prices per query, not per rule, so you scope the rule and the model prices inside it.
Target CPM: a floor that moves both ways
Ad Manager's target CPM dynamically sets floor prices on individual bid requests, higher or lower than the indicated target, with the goal that the average CPM equals or exceeds the target. Google positions it as an alternative way of setting a floor price, one that allows for increased fill rate and yield. The contract differs from a hard floor in a single property: the mean binds, and the individual impression does not. A hard floor at $1.20 rejects every bid under $1.20. A $1.20 target lets the model clear cheap impressions as long as expensive ones pull the average up.
The use cases split cleanly. Use a hard floor when a path carries a real opportunity cost below a number, such as a sponsorship commitment that could absorb the impression. Use a target when the value sits in the aggregate, on high-volume units where each impression is worth little alone but the pool is not. Target CPM also suits paths with no better unsold destination, because the model can trade some average for fill without breaking the constraint.
The Prebid Price Floors Module: floors you can test
On the part of the stack you control directly, Prebid's Price Floors Module is the open source framework doing the same job with the knobs exposed. Floors arrive as JSON from configurable floor data providers, and the module fetches them in real time before the auction. An optional auction delay holds the auction until the floor data arrives, trading a few milliseconds of latency for current floors. Enforcement shows up in the output: all bids below the floor carry the status bids rejected, so rejected volume appears in bid analytics as rejected bids instead of vanishing into unsold.
Schema version 2 added the property that matters most to a yield team: the ability to sample multiple models by supplied weights. Weight model A at 0.7 and model B at 0.3, and roughly 70 percent of auctions use A while 30 percent use B. That turns the floors layer into an A/B style test of competing floor models, which is precisely the capability the Ad Manager options lack. If you want evidence rather than a before-and-after narrative, this is where you generate it.
A quieter advantage follows from the design: floor data is pluggable. Providers model seasonality, geography, and device differently, and swapping one costs a configuration change rather than a contract cycle.
Where the three contracts differ
Read as a set, the mechanisms answer different questions. Optimized floor prices ask what a query earns over time, per query, inside Ad Manager's auction. Target CPM asks what floor clears an average you committed to. The Prebid module asks what you can enforce and what you can prove.

The direction row deserves the most attention: only target CPM and the Prebid module can move a floor down as well as up. That asymmetry matters more than model quality, because a floor that cannot fall has a ratchet, and a ratchet only fails in one direction.
The cautions that still hold
A 2022 trade-press analysis of Google's optimized pricing raised cautions that apply to any machine-set floor. It only raises floors, never lowers them. It operates at network level, so you cannot A/B test it. And with no control group, you can only assess performance before and after, with a real risk of over-pricing.
Each caution carries an operational consequence. A floor that only rises works like a ratchet: if the model overshoots, nothing in the mechanism pulls it back, and the visible symptom is a rising cleared CPM on a shrinking filled base. Network-level scope means a before-and-after comparison absorbs every other change in the window, from layout tests to demand seasonality to a new direct deal. Over-pricing never surfaces as an error, it surfaces as impressions you never see, routed to the bottom of the stack.
None of this argues against optimized floors. It argues for instrumenting them: fixed evaluation windows, segments you hold static, and revenue per session as the north star instead of cleared CPM.
How we run floors: one auction, one enforcement point
We are an ad network, an SSP, and an agency in one company, and we run Google Ad Manager, AdX via MCM, and Prebid for header and server-side demand, alongside OpenRTB 2.6 seats for our direct integrations. At OnlyMedia, a curation layer sits in front of the auction: managed floors, demand mapping, whitelists, pre-bid brand safety filtering, and MFA filtering aligned with the IAB Content Taxonomy. The floors live in that layer because the auction lives in one place: our SSP runs one unified auction per impression across AdX via MCM, Prebid, and our OpenRTB seats, so a managed floor binds every bidder in the same auction rather than each path separately.
An OpenRTB seat changes the enforcement question. The bid request carries the floor in bidfloor, with the currency in bidfloorcur, and that is a signal rather than a guarantee: a bidder can shade against it. Enforcement belongs to whatever ranks the bids, and unifying the auction puts the ranking and the floor in one place. The classic leak, where a header bid clears under a floor the ad server applied after the fact, disappears when the floor and the ranking share the same auction.
Curation also moves the revenue-maximizing floor. Pre-bid brand safety filtering and MFA filtering remove bid population before the auction, and whitelists remove demand, so a floor tuned against last quarter's fatter bid pool is mistuned against a curated one. We re-price managed floors whenever the filters change. Demand mapping does the inverse work: it identifies which demand path each floor actually constrains, which keeps a floor from protecting one buyer while taxing another.
The economics stay legible in cash. We work with thousands of publishers, each above one million monthly pageviews, through our curated demand network, and we pay Net 30, CPM based, with no chasing and no sliding terms. A floor that lifts cleared CPM reaches the publisher within the month. A floor that overshoots arrives within the month too, as unsold volume, and ten-minute reporting exposes both well before the payment run.
Measurement: proving the floor earned its keep
Dynamic floors demand faster measurement than static ones, because the model moves while the data ages. Our reporting console refreshes every metric every ten minutes and exposes the same data through the API. That cadence fits the work: floor rejections are per-auction facts, and monthly aggregates erase them.
A floor evaluation needs four numbers, kept separate:
- Floor rejection rate per demand path, geography, and format: the share of bids the floor removed.
- The CPM distribution of rejected bids: what the floor cost, bid by bid.
- Cleared CPM against floor distance: how much uplift the floor captured on surviving impressions.
- Revenue per thousand sessions: the number that arbitrates the whole trade.
The first three describe the mechanism. The fourth decides it. A hypothetical floor that lifts cleared CPM by 12 percent while removing 18 percent of filled impressions can still win or lose on net revenue, and only the session-level figure says which.
Ten-minute data also changes how you audit the network-level tools. You cannot A/B test optimized floor prices, but you can hold a segment static, define the change window, and watch the rejection curve and the fill curve move in ten-minute steps. When rejections rise and cleared CPM rises slower, the floor is over-pricing, and the chart says so weeks before the monthly report confirms it. Agencies advising publishers should ask for exactly this view, because cleared CPM alone flatters any aggressive floor.
For Prebid model testing, shift the schema version 2 weights in steps, read revenue per session per model, and let the losing model decay toward zero weight rather than cutting it in one change. Tagged auctions make the comparison clean: model A auctions against model B auctions, on the same inventory, against the same demand.
Choosing the mechanism
The choice comes down to what you must enforce and what you must prove, not to model sophistication:
- Choose optimized floor prices when you want per-query machine learning on Ad Manager demand and accept network-level behavior. Scope the rule, use the Set pricing for everything option, and remember that advertiser-specific and bidder-specific floors keep precedence.
- Choose target CPM when you must hold an average CPM while protecting fill, and the individual impression can flex.
- Choose the Prebid Price Floors Module when you need evidence, cross-demand enforcement, or competing models: floor data providers deliver JSON, an optional auction delay protects freshness, and schema version 2 weights carry the tests.

One warning from practice covers all three tools: a floor is only as good as the inventory data underneath it. A model that prices per query still needs the query honestly described, with MFA filtered out and the IAB Content Taxonomy applied, or the floor optimizes against a mislabeled impression. Dynamic floors turned the price of an impression from a setting into a system with an owner, a test plan, and a rollback. The publishers who gain from them can answer, per query class, why the price is what it is, and what evidence would change it.