Dynamic Floor Pricing: What It Is, How It Works, and When It Actually Helps

Dynamic floors adjust your minimum CPM per auction using signals like geo, device, time of day, and historical bid data. The mechanism works in theory. In practice, most implementations train on filled-impression CPM only, so the model can't see the bids it suppressed. The result: dashboards show CPM up while net RPM is flat or down. This article walks through how to tell if your floors are actually paying off and what to fix when they're not.

Static vs dynamic floors: what changes

You already know how floors work. The shift to dynamic adds segmentation per auction, driven by signals you couldn't manually tune at scale:

  • User geography tier. US impression and Vietnam impression have different bid ranges. A static floor tuned for Tier 3 leaves Tier 1 money on the table. Tuned for Tier 1, it kills Tier 3 fill.
  • Device type. Tablet vs phone vs desktop, all materially different demand pools.
  • Time of day. 2pm Tuesday demand isn't 11pm Saturday demand.
  • Content category. Finance and legal verticals attract higher-CPM advertisers. Generic content doesn't. Section-level floor segmentation captures the variance.

Most newer dynamic floor systems use ML trained on historical bid data. Older ones use rules. Both produce a per-auction floor instead of a single placement-level number.

How the mechanics work, and what the model is actually seeing

A dynamic floor system has three layers.

Data inputs. Bid history, user signals (geo, device, time, OS, browser), and page context (URL, vertical, ad format). Some systems also pull DSP-side signals through the SSP integration.

Model output. A floor price for the specific auction about to run. The model predicts what the highest expected bid will be for this impression and sets the floor close to that prediction.

Feedback loop. The system observes whether the floor was met or not, what the winning bid actually was, and whether the impression filled. The next iteration of the model retrains on this data.

Here's what most vendor pages don't say. Most ML-based dynamic floor systems train on the CPM of filled impressions only. They are optimizing blind to unsold inventory and suppressed bids. If the floor was set above the highest bid, the auction is recorded as "no fill at this floor" but not as "the highest bidder would have paid X if the floor had been Y." This creates a survivor-bias loop: the model learns from the auctions it won, not from the auctions it lost.

The implication is real. A dynamic floor that consistently sits 5% above optimal can produce reports showing CPM is up while net revenue is flat or down. The floor model thinks it's winning. The publisher's ledger says otherwise.

Real-world lift numbers: what publishers actually report

The published case studies for dynamic floors look impressive. The honest interpretation is more measured.

Vendor and case study reports:

  • AdExchanger case studies: 76% RPM lift on a sports media site (March Madness context, atypical demand spike), 40% RPM lift on a casual gaming site
  • Mile.tech published numbers: 22% Prebid revenue increase, 31% RPM increase
  • Industry general claims: 15-25% RPM improvement on Tier 1 inventory with well-configured dynamic floors

These are real numbers but they're not representative. The 76% sports number is a one-off context. The 22-31% range comes from vendor-published case studies, which select for success. The 15-25% industry claim has no independent audit behind it.

What I see across stacks is more boring. Publishers with high-traffic Tier 1 inventory and a well-configured wrapper see 5 to 15 percent net RPM gain after fill rate effects. Publishers below that bar see lift in the noise range or flat. Publishers with poor wrapper configurations sometimes see negative net RPM despite the dashboard showing CPM up.

The format unlocks demand that was previously gated by mismatched floors. How much demand was previously gated determines your specific lift. Same pattern as every other yield optimization. There's no universal number.

When dynamic floors help, and when they don't

Help when:

  • You have high-traffic Tier 1 inventory where bid variance by segment is significant
  • You're already running a header bidding wrapper (Prebid, OpenRTB-based)
  • Your geography mix has clear tier separation (US/UK plus other markets)
  • You have ad format diversity (display + video + native) where each commands different price ranges
  • You have data infrastructure to monitor RPM, not just CPM

Don't help (or actively hurt) when:

  • Your traffic is low and the model has too little data to train. Dynamic floors need volume to learn.
  • Your inventory is monolithic. If everything is generic display in one geo, segmentation has nothing to work with.
  • You don't have wrapper integration. Floors at the SSP level only see SSP-side bid data. They miss what other bidders would have paid.
  • You stack floors. SSP-level dynamic floors plus GAM Unified Pricing Rules plus wrapper-level floors create invisible interactions where the highest floor wins and you don't know which one fired.
  • You measure in CPM only. If your reporting can't isolate net RPM with a holdout, you can't tell whether the floor is actually helping.

How to tell if your dynamic floors are actually working

This is the test most publishers skip.

Vendors show CPM lift. CPM lift can mean revenue lift, or it can mean fill rate dropped while CPM rose, with net RPM flat or down. The right metric is RPM (revenue per mille of impressions), not CPM (revenue per mille of filled impressions).

The straightforward diagnostic:

  1. Run a holdout segment at your previous static floor. 10 to 20 percent of traffic kept on the old setup. Two weeks minimum.
  2. Compare net RPM, not CPM. RPM accounts for fill rate. If RPM is up on the dynamic floor segment, the floor is working. If CPM is up but RPM is flat, the floor is winning the auctions it serves but losing more impressions than it gains.
  3. Ask your vendor specific questions. What percentage of impressions does the model actually cover? What's the floor's impact on fill rate, not just on CPM? Does the model train on bid request data or only on filled impression data? If they can't answer or won't answer, that's signal.
  4. Check for floor stacking. If you're running SSP-level dynamic floors, GAM Unified Pricing Rules, and wrapper-level floors at the same time, audit which one is actually firing on each impression. The highest floor wins. You may be paying for a dynamic floor service that's being overridden by a UPR you forgot you set.

The honest version is that most dynamic floor implementations look better in vendor reports than in net RPM reports. The gap is the measurement gap. Close it before you renew the contract.

Prebid-specific considerations

If you're running Prebid, dynamic floors interact with two other settings that publishers often misconfigure.

Price granularity. Prebid groups bids into price buckets ($0.01, $0.10, $0.50 increments depending on your config). If your buckets are coarse, you're losing floor precision regardless of how dynamic your floor is. A dynamic floor that calculates $1.42 gets quantized to $1.50 or $1.00 depending on bucket size. Check your priceGranularity config before you tune your floor model.

Unified Pricing Rules in GAM. UPRs are GAM's floor layer. They apply on top of whatever your wrapper or SSP is doing. If you have a UPR set at $1.50 and your dynamic floor wants $1.20, the UPR wins. The dynamic floor is suppressed for that impression. Most publishers don't audit their UPRs after setup. They sit there for years overriding optimization layers below them.

Order of operations. Wrapper floors fire first, then SSP-level floors, then GAM floors. If you have all three, the highest one wins per impression. If you don't know what each layer is doing, you have invisible revenue loss.

The fix isn't always to change the dynamic floor. Sometimes it's to remove the layer above it that's overriding it.

What to do this week

If you're considering adding dynamic floors, or you have them and you're not sure they're working:

  1. Confirm your traffic volume is high enough for the model to train. Below 1M monthly impressions per segment is usually too thin.
  2. Audit your existing floor stack. List every layer (SSP, wrapper, GAM UPR) and figure out which one is actually firing on a sample of impressions.
  3. If you have dynamic floors running, set up a 10-20% holdout at the static floor for two weeks. Compare net RPM. Not CPM.
  4. Ask your dynamic floor vendor the four questions in the section above. The answer to "does the model train on bid requests or only on filled impressions" is the most important one.
  5. If the holdout shows net RPM flat or down, dynamic floors aren't the problem alone. Look at your wrapper price granularity and your GAM UPRs. Something above is overriding the layer you're paying for.

If your floor reports show CPM up but revenue feels flat, something is usually off in the measurement setup, not in the model. The model is doing what models do. The dashboards just aren't showing you the number that matters.

If you're not sure whether your current floor setup is helping or hurting, book a 30-minute call. I'll look at your numbers and tell you whether to renew the contract, change the configuration, or rip it out.

Frequently asked questions

What is the difference between a static floor and a dynamic floor in programmatic advertising?

A static floor is one minimum CPM applied to every impression in a placement. Dynamic floors adjust per auction based on signals like geography, device, time of day, and content category. Static floors are simple but leave money on the table when impression value varies by segment. Dynamic floors capture that variance, but only if the model has enough data to train and if the floor isn't being overridden by another layer in the stack.

Do dynamic floors hurt fill rate?

They can. Any floor mechanism trades fill for CPM. A well-tuned dynamic floor minimizes the fill loss by setting floors close to the actual highest expected bid, but the tradeoff is real. The way to measure: compare net RPM (revenue per thousand impressions, including unfilled) before and after, not CPM. If CPM is up but RPM is flat, the floor is rejecting more impressions than it's winning at higher prices.

How do I know if my dynamic floor setup is actually increasing revenue?

Run a holdout segment. Keep 10 to 20 percent of your traffic on the old static floor for at least two weeks. Compare net RPM (revenue divided by total impressions, including unfilled) on the dynamic segment vs the holdout. If RPM is up on dynamic, the floor is working. If CPM is up but RPM is flat or down, the floor is winning the auctions it serves but losing more than it gains. Most vendor reports show CPM, not RPM. CPM is the wrong metric for this question.

What traffic volume do I need before dynamic floors make sense?

Most ML-based dynamic floor systems need at least 1 million monthly impressions per segment to train a useful model. Below that, the model has too little data to learn segment-specific patterns and tends to either set floors too conservatively (no lift) or too aggressively (fill rate drops). Static floors with manual segmentation by geo and device often outperform dynamic systems on low-volume inventory.

Can dynamic floors work with Prebid, or do I need a separate tool?

Both. Prebid has its own price floor module and supports floor data from external providers. You can run dynamic floors via your SSP, via a third-party service that integrates with Prebid, or via Prebid's own price floor system fed by your data. The key is making sure floors at different layers (wrapper, SSP, GAM UPR) don't conflict. If you stack floors without auditing the order of operations, the highest one wins per impression and you may be paying for a service that's being overridden.