A practical guide to setting per-request floor prices in Prebid + GAM without collapsing fill rate: where the trade-off actually lives, why static floors burn demand, and how session-aware FPO lifts revenue per request.
Static floors leave money on the table.Aggressive floors burn the relationship.The right number is per-request,session-aware,and trained on your own bid data.

Floor pricing is the lever publishers reach for first when they want to lift CPM, and it's the lever that costs them the most when used wrong. Push reserve prices too aggressively and win rate, fill rate, and demand-partner trust all move in the wrong direction. Leave them too low and revenue leaks on every request. The hard part is that there is no single right answer — the right floor depends on the request, the user, the bidder, and the auction history.
This guide walks the question every publisher and SSP has to answer: how do you set floors that lift revenue per request without collapsing win rate? We cover where the trade-off actually lives, why a Prebid + Google Ad Manager (GAM) hybrid is the safest place to test higher floors, why demand partners push back when you over-floor, and the session-aware approach published in the TensorOps paper Recapturing the English Auction. For the conceptual primer that sits underneath this playbook, see What Is Floor Price Optimization in Programmatic Advertising?.
In the waterfall era, floors were a per-network static decision and the cost of getting one wrong was small — a network either filled or it didn't, and the next one in line picked up the slack. Header bidding (Prebid) and first-price auctions collapsed that into a single sealed-bid round per impression. Every request now needs its own reserve price, computed in real time, with no second chance.
Two failure modes follow directly from that change. Set the floor above the highest bid and the impression goes unfilled — you lose revenue you would have captured at any positive price. Set the floor below the bidder's true willingness-to-pay and you accept a bid that undervalues the inventory. Both happen on every mis-priced request, and at scale the gap between them is the entire revenue surface you can optimize.
Floor Price Optimization (FPO) exists because the answer is no longer a static rule — it's a model. The job of a floor pricing system is to put a number on each request that's high enough to extract competitive bids and low enough that it doesn't drive bidders out of the auction.
Higher floors raise CPM on the impressions you fill and lower the count of impressions you fill. Lower floors do the inverse. The optimization target is neither number in isolation — it's revenue per request (RPR), which is CPM multiplied by win rate. RPR is what actually lands in the publisher's account.
A few rules of thumb that hold across most publisher inventory:
Aggressive static floors push you off the efficient frontier — a few cents of CPM gain costs more in unfilled impressions than it earns in the cleared ones. Dynamic floors raise the floor only when the live signal supports it and relax it when competition is thin.
Most publishers run floors through GAM Unified Pricing Rules (UPR). UPR is fine for broad rule-based pricing — geo, device, ad unit, advertiser bucket — but it cannot run a per-request model with session state. For real dynamic floors, the floor decision has to move into Prebid.
The hybrid that works in production:
imp.bidfloor in OpenRTB.That hybrid is what makes higher floors safe to test — the worst case is a fallback to GAM's pricing logic. The Prebid Price Floors Module is the supported entry point; for true session-aware per-request floors, an integration like the TensorOps Prebid Adapter replaces the static module with a model that updates as the session unfolds.
Demand partners measure their side of the relationship on CPA, ROAS, installs, registrations, first-time deposits — outcomes, not the CPM they paid. Push the floor above the price at which their model breaks even on those outcomes and the response is predictable: budgets shift to cheaper supply, bid shading gets more aggressive, your inventory gets throttled.
The endgame of over-flooring is the worst combination of all three problems at once: high floors, low fill rate, and a reputation as expensive supply for the quality. Walking that back takes months and sometimes never fully recovers — bidders carry memory of how a publisher has priced them in the past, and that memory shows up in future bid shading. The same pressure shows up on the buy side: see What Is Supply Path Optimization in Programmatic Advertising? for the mirror dynamic where DSPs consolidate spend on the cleanest, cheapest paths to the same impression.
The publishers who win at floor pricing rarely win by being more aggressive — they win by making the inventory worth more before any floor is applied. The mechanism is data: richer first-party signals about the user, surfaced in a structured way to demand partners.
Done well, this lifts the bid distribution itself. The floor stays where it was; the bids it filters against are higher. Worth pairing with budget pacing on the buyer side — pacing-constrained bidders are more sensitive to floor moves than steady spenders, so the floor model and the pacing model interact in ways aggregate dashboards hide. The information-asymmetry angle is covered in the TensorOps paper Toward Information Symmetry: A Bilateral Disclosure Framework for First-Price Ad Auctions.
The most concrete public work on session-aware floors is the TensorOps paper Recapturing the English Auction: Sequential Floor Optimization Within User Sessions in Programmatic Advertising. The framing is straightforward — a single user session is structurally an iterative English-style auction across many requests, not a series of independent sealed-bid rounds. Treat it that way and information from earlier requests becomes input to pricing the later ones.
The model has two phases:
Reported simulation results from the paper:
What makes modern floor pricing work is treating the floor as the output of a model trained on your specific traffic, your specific bidders, and the live state of the current session — not as a number in a config file. Done that way, floors lift CPM and protect fill at the same time. Done the old way, they buy short-term CPM at the cost of long-term demand.
TensorOps builds floor optimization systems for publishers, SSPs, and resellers — including the Prebid-integrated, session-aware FPO behind the English-auction framework. If your floors still live in GAM UPR or in a static daily file, that's where the next 5–10% of yield is. The full research catalogue is at TensorOps Labs, and the team is at tensorops.ai/contact.