Become a partner

Blog / OpenRTB

OpenRTB price floorsdynamic floorsOpenRTBfirst priceyield

Dynamic Floor Price Optimization in an OpenRTB First-Price World

First-price auctions turned price floors into the highest-leverage control in header bidding, and a static floor now costs publishers revenue on both sides of the clearing price.

by WireAds 2023-01-06 updated 2026-03-16 9 min read
Economics-journal cover in umber and oxblood for dynamic floor price optimization in first-price OpenRTB auctions
On this page

A floor price is the only lever in header bidding that raises the clearing price without adding a single demand partner. Most open exchanges switched to first-price auctions between 2017 and 2019, and Google AdX moved its open auction to first-price in 2019, which changed the job a floor does. Under second-price rules the floor filtered junk bids and the auction itself performed price discovery. Under first-price rules the floor anchors the bid, because bidders shade their offers down toward whatever threshold they can see. Publishers still running one static number across a portfolio pay for that choice on every impression.

What a Floor Does in a First-Price Auction

Second-price auctions made floors nearly invisible. The winner paid the second-highest bid plus one cent, so a floor only excluded bids below a minimum and rarely touched the clearing price. First-price auctions removed that safety. Every bidder now submits a shaded bid, an estimate of value minus a margin the bidder expects to keep, and the highest shaded bid wins at exactly that amount.

OpenRTB carries the threshold in the open. The OpenRTB floor price fields define bidfloor and bidfloorcur, the fields that signal floors in bid requests to every demand partner on the wire. A bidder whose model values an impression at $0.80 will bid just above a visible $0.55 floor rather than bid $0.80, because bidding full value in a first-price auction means donating margin. The floor therefore sets a lower bound on the clearing price, not merely on participation.

Two forces pull against each other from there. Raising the floor lifts the clearing price on every impression that still clears, and lowering the floor lifts the clear rate. Dynamic floor optimization exists to find the peak of clear rate times clearing price, impression by impression and segment by segment.

Static Floors Lose Money in Two Directions

A static floor fails in both states. Set above the bid density for an ad unit, it turns every impression whose best bid lands underneath into unsold inventory, a fallback, or a downstream auction with weaker demand. Set below the bid density, it lets the winner keep the spread between its bid and its true value. The publisher never sees that spread, but it is real money, and it accumulates across millions of impressions.

The damage compounds because bid density moves. Advertiser budgets deplete intraday, so a floor calibrated on morning traffic misprices evening traffic. Geo mix shifts with traffic sources, and a floor tuned for US desktop prices Indonesian mobile inventory out of the market entirely. Seasonality moves CPMs by double-digit percentages between Q3 and Q4. A floor that was correct at calibration drifts out of correctness within days.

The single global floor is the worst case. It overprices the weak half of a portfolio and underprices the strong half at the same time. In accounts we onboard with one number for every placement, per-unit floors with geo and device splits typically lift net revenue by a single-digit percentage, and by more where the old floor had drifted badly.

The Inputs That Matter for Dynamic Floors

Ranked board of seven floor-input weight bars, from bid history down to the shortest weighted factor

A floor model is only as good as its feature set. The inputs below drive most of the achievable lift, roughly in order of weight.

  • Bid distribution history: the trailing distribution of bids per ad unit, not the mean alone. A placement where bids cluster between $0.30 and $0.50 behaves nothing like a placement with the same mean and a flat spread. Percentile floors read the full distribution.
  • Clear rate per candidate floor: how often bids land above each increment. This is the direct measurement of the trade the model makes, price against volume.
  • Geo and device: CPMs differ by an order of magnitude across countries and by multiples across device classes and connection types. Floors that ignore geo either starve low-CPM markets or subsidize high-CPM ones.
  • Format and size: VAST video typically clears at several times banner CPM for the same audience, and 970x250 outbids 320x50 in most markets. Floors must key off format and size.
  • Time and season: hour of day, day of week, and month capture budget pacing. Q4 advertiser spend lifts entire bid distributions, and January resets them.
  • Auction depth: the number of bidders shifts the maximum order statistic. A floor tuned for a thin auction clears too aggressively in a thick one.
  • Identity and consent context: bid density differs between matched and unmatched traffic, and Global Privacy Control and TCF consent signals change both the bid pool and the clearing price.

Not every input belongs in every model. Most managed accounts get most of their lift from bid distribution, geo, device, and format, with time of day as a second-layer refinement. Inputs beyond that usually cost more in data sparsity than they return in precision, because thin segments produce noisy floors.

How Dynamic Floor Models Compute a Number

Rule-based tiers are the entry point. Someone defines floor values per ad unit, geo, device, and format, then updates them on a schedule. Rules stay auditable, and a human can read exactly why a floor took a given value. The cost is reaction speed: rules cannot answer a distribution shift that starts mid-week.

Percentile models automate the same idea. The system computes the trailing distribution of winning bids per segment, then sets the floor at a chosen quantile, for example the 40th percentile of clearing prices over seven days. Lower quantiles trade price for safety, higher quantiles chase price, and the quantile itself becomes the single tunable parameter, which is far easier to reason about than raw floor values.

Expected revenue models optimize the correct objective directly. For each candidate floor, the model estimates the probability of clearing from the bid distribution, multiplies it by the expected clearing price, and picks the floor that maximizes the product. Net revenue per impression is what the publisher banks, not CPM in isolation. The same math absorbs fallback value: an unsold impression worth $0.05 downstream softens the case for an aggressive floor by exactly that amount.

Segmentation granularity is its own control. Floors keyed to ad unit and geo capture most of the variance, but each additional key halves the data per cell, and thin cells produce unstable quantiles. The practical pattern is a hierarchy: a global default floor, overrides per ad unit, then overrides for high-volume geo and device splits only where the cell clears enough impressions to estimate a distribution.

Window length matters as much as model class. A 24-hour window tracks intraday patterns but inherits yesterday's anomalies, and a 30-day window smooths weekly cycles but misses the present. Most implementations layer a short window over a long baseline and blend the two.

Where Floors Live in the Bid Stream

Client-side enforcement runs inside Prebid.js. The Prebid price floors module is an open-source framework to configure and enforce floors in any currency, with schema keys for ad unit code, media type, size, country, and device, plus a fetch mode that pulls floor data from a remote endpoint. The module rejects bids below the floor before the auction resolves, so enforcement is exact and observable in the client.

Server-side enforcement moves the same logic off the page. Prebid Server price floors is the server-side floor configuration framework, and it matters for app and CTV/OTT inventory where a full client wrapper is impractical or where the latency budget rules out extra client logic. Server-side floors also keep floor data off the page, which some publishers prefer for competitive reasons.

On the wire, the floor travels in the bid request as bidfloor, with bidfloorcur declaring the currency, and bidfloorcur defaults to USD. A floor expressed in another currency must declare it, and a mismatch between floor currency and reporting currency is among the most common errors we audit. Enforcement and signaling remain separate decisions: passing the floor raises bid rates on marginal impressions but lets bidders anchor just above it, while withholding the floor preserves bid density and forces rejection downstream.

Trust moves bids as well. Buyers that can verify the reseller path through sellers.json and the SupplyChain object discount opaque supply less, so a publisher's transparency posture shows up in the same bid distributions the floor model reads. Floors inherit whatever bid density the supply path earns.

Measuring Floor Lift Correctly

A before-and-after comparison does not measure floor lift. Seasonality, traffic mix, cookie loss, and demand-side budget shifts move revenue by more than a good floor change does, and a naive diff attributes all of it to the floor. The only clean read comes from a randomized split.

Split users rather than impressions, so each session sees exactly one floor regime. Route half of traffic to the old static floor and half to the dynamic model, run for at least two full weeks to cover day-of-week cycles, and compare net revenue per session rather than CPM alone. Dynamic floors deliberately trade clear rate for clearing price, so a rising CPM beside a falling fill can still be a net loss. Track revenue per mille, clear rate, technical fill, viewable eCPM, and fallback value together, because any one of them alone can flatter a bad change.

Significance discipline decides whether the result means anything. Run the split until the confidence intervals on net revenue per session separate, not until the dashboard looks good. First dynamic deployments typically land in the low single digits on net revenue, which sits inside the noise band of a short test. If the arms disagree on direction after two weeks, the test was underpowered rather than inconclusive.

Guardrails matter as much as the headline number. Latency can rise if floor data fetches serialize with the auction. Viewability can shift if unsold impressions fall into lazy-loaded fallbacks. The two arms can drift out of balance on cookie match rate or geo mix by chance, so check arm populations for balance before trusting the revenue delta.

Model the trade before shipping it. Our CPM calculator converts a candidate clear rate and clearing price into projected net revenue, which keeps the argument anchored in arithmetic. After the test closes, our revenue analytics break the result out by ad unit, geo, device, and format so the lift stays attributable instead of averaging away. Hold a control segment permanently, because every later floor change deserves the same clean comparison.

Failure Modes We Audit First

Five defects account for most of the floor problems we find in audits. Each one is cheap to fix and expensive to ignore.

  • Currency confusion: a floor entered in cents against a system expecting dollars, or a bidfloorcur declaration that does not match the floor's actual currency, produces either total unsold inventory or a floor of effectively zero. Check this before anything else.
  • Deal collisions: direct deals negotiate a fixed price outside the open auction, and an aggressive open-market floor that also applies to deal traffic can block a deal that would have paid more. A deal price should sit above the open-market floor for the same placement, otherwise the deal has no reason to exist.
  • Stale distributions: a model trained on last month's bid density misprices this month's. Weekly retraining sets the minimum bar, and daily retraining works better on high-volume placements.
  • Missing fallbacks: a raised floor with no fallback plan converts unsold impressions into zero-revenue impressions. Define the waterfall below the floor before raising it.
  • Fetch latency: floor endpoints add a network call. Cache the floor payload, serve it close to users, and set timeouts so a slow fetch never delays the auction.

None of the five requires new machinery, only the discipline to check each one on a schedule. We run that check weekly, and it catches most regressions before the revenue report does.

WireAds Floor Guidance in Managed Service

We run floors as part of managed service rather than as a self-serve toggle. Our demand stack combines Prebid, OpenRTB, Google MCM with Google AdX through Google Ad Manager, and Authorized Buyers, plus direct deals from global and local brand agencies, and all of that demand bids into one auction. Floor policy has to stay coherent across the whole stack, because a floor that makes sense for open market demand can be wrong for a direct deal that bids highest on the same space.

Our working method: we segment floors by ad unit, geo, device, and format, retrain them on trailing bid distributions, and pass them through the bid request so demand partners shade against a real threshold. We enforce hard on bids that ignore the floor. We keep deal traffic on separate logic so agency inventory clears at its negotiated price, and our Preferred Deals flow documents that split.

We work CPM-based and pay Net 30, globally, across web, app, and CTV/OTT, in every country with Google monetization. Our ad sources hold strict quality standards and heavy filtering of unwanted ads, so the bid density behind a floor reflects premium brands rather than whatever cleared elsewhere. That matters for floors specifically: a floor is only as meaningful as the demand distribution it sits on top of.

Onboarding starts with an audit. We pull current floor values, actual bid distributions per segment, clear rates at candidate floors, and the fallback chain underneath. We then stage changes as a measured split rather than a flip, and we hold the control segment permanently. We review floor performance weekly against clear rate and net revenue per impression, and we retrain a segment when its clearing price drifts beyond tolerance. A floor change that cannot survive a measured comparison does not ship.

Publishers who run their own stack can take the sections above as a checklist. Publishers who hand us the inventory get a team that maintains the loop for them.

Related

Keep reading.

Chalkboard cover in coral and yellow chalk for a deep dive into why bid responses fail with error codes
OpenRTB

Why Bid Responses Fail: A Deep Dive into Programmatic Error Codes

Most lost programmatic revenue traces back to a handful of recurring bid response errors, ...

2026-08-21 · 9 min
Transit-map cover in forest green and rust for an article on how supply path optimization impacts OpenRTB revenue
OpenRTB

How Supply Path Optimization (SPO) Impacts Your OpenRTB Revenue

Buyers now prune the reseller chains between their DSPs and your inventory, and publishers...

2026-01-12 · 9 min
Petrol-teal broadcast cover with terracotta and brass for OpenRTB 2.6 video and CTV monetization features
OpenRTB

Understanding OpenRTB 2.6: New Features for Video and CTV Monetization

OpenRTB 2.6 replaced numeric video placement codes with named types, added ad pod fields, ...

2025-07-14 · 10 min

The WireAds market brief

Monthly CPM trends and monetization tactics for publishers. No spam, one email a month.