Floor Prices
Set minimum bids to filter low-quality ads and capture more value from your inventory.
What is a floor price?
A floor price is the minimum bid you'll accept for an ad impression. Bids below the floor are rejected.
Example — with a floor of $1.00:
| Bid | Result |
|---|---|
| Bid A — $1.50 | Accepted |
| Bid B — $0.80 | Rejected (below floor) |
| Bid C — $1.10 | Accepted |
Why floors matter
1. Filter low-quality ads
Very low bids often come from low-quality advertisers. Floors create a quality baseline.
2. Capture hidden value
In first-price auctions, buyers use bid shading. Floors force them to bid closer to their true value.
Without floor:
Buyer values at $3.00, bids $1.50 (shaded)
You earn: $1.50
With $2.00 floor:
Buyer values at $3.00, bids $2.20 (can't shade below floor)
You earn: $2.20 (+47%)
3. Signal inventory value
High floors signal premium inventory to buyers. This can attract premium demand.
The floor trade-off
Higher floors → Higher CPM, but lower fill rate
Lower floors → Higher fill rate, but lower CPM
Revenue = Impressions × Fill Rate × CPM
You need to find the sweet spot.
| Floor strategy | CPM impact | Fill rate impact | Best for |
|---|---|---|---|
| High floors | ↑ Higher | ↓ Lower | Premium inventory, high-demand |
| Low floors | ↓ Lower | ↑ Higher | Scale, backfill inventory |
| No floors | Lowest | Highest | Maximum fill (not recommended) |
Setting your first floors
Start conservative
Begin with floors you're confident you can fill:
| Inventory type | Starting floor | Adjust based on |
|---|---|---|
| Premium above-fold | $1.50 - $2.50 | If fill rate > 90%, raise |
| Standard display | $0.50 - $1.00 | If fill rate > 85%, raise |
| Below-fold / lazy | $0.25 - $0.50 | If fill rate > 80%, raise |
| Mobile | $0.30 - $0.75 | If fill rate > 85%, raise |
The 80% rule
A good starting target: set floors so fill rate stays above 80%.
Below 80% fill rate: You're leaving impressions unsold (lost revenue). Above 95% fill rate: You might be setting floors too low.
Floor strategies
Strategy 1: Global floors
One floor for all inventory. Simple but not optimal.
All ad slots: $0.75 floor
Pros: Easy to manage Cons: Doesn't account for inventory differences
Strategy 2: Position-based floors
Different floors by ad position.
Above-fold: $2.00
Sidebar: $1.00
In-content: $0.75
Below-fold: $0.50
Pros: Matches inventory value Cons: Requires more management
Strategy 3: Device-based floors
Different floors by device type.
Desktop: $1.00
Mobile: $0.60
Tablet: $0.80
Pros: Accounts for device CPM differences Cons: May miss geo/content variations
Strategy 4: Dynamic floors (floor provider)
Instead of static numbers, point the wrapper at an external floor provider — a Prebid-compatible endpoint that returns floor rules at auction time. Configure it in Wrapper → Configs (the Floor Provider field):
- Endpoint URL — where the wrapper fetches the floor rules
- Auction Delay — how long the auction waits for that fetch (a bounded timeout)
- Skip Rate — the share of auctions that bypass the provider, for holdout measurement
Anima doesn't itself compute time-of-day / day-of-week / historical floors — that logic lives in the endpoint you (or a vendor) supply. When a floor provider is active it takes over floor control; keep a global Price Floor set as the fallback if the fetch fails or times out.
Pros: Real-time, data-driven pricing Cons: Requires a floor-provider endpoint
Begin with position-based floors. Add a floor provider only once you have an endpoint worth delegating to.
Optimizing floors over time
Week 1-2: Observe
Set conservative floors and monitor:
- Fill rate by slot
- CPM by slot
- Revenue trends
Week 3-4: Adjust
For each slot, evaluate:
| Fill rate | CPM trend | Action |
|---|---|---|
| > 95% | Stable | Raise floor 10-20% |
| 80-95% | Stable | Floor is optimal |
| < 80% | Any | Lower floor 10-20% |
| Any | Dropping | Investigate demand |
Monthly: Review
- Compare revenue to baseline
- Check for seasonal patterns
- Adjust for market conditions
Common floor mistakes
Setting floors too high
Symptom: Low fill rate (< 70%) Problem: Rejecting too many bids Solution: Lower floors until fill rate improves
Setting floors too low
Symptom: High fill rate (> 95%) with low CPM Problem: Not capturing full value Solution: Gradually raise floors
One floor for everything
Symptom: Some slots unfilled, others too cheap Problem: Inventory has different values Solution: Use position or device-based floors
Never adjusting
Symptom: Flat or declining revenue despite traffic growth Problem: Market changes, your floors don't Solution: Review floors monthly
Floors in Anima
Floors exist at three levels. When more than one could apply, Prebid enforces the most specific floor — the precedence, highest to lowest, is:
- Demand-seat floor — a per-bidder minimum set on a demand seat
- Ad-slot floor — the per-placement default set on the slot
- Global (config) floor — the wrapper-wide default, used by any slot without its own
Floors are enforced at the gross level: a $2.00 floor needs a $2.50 gross bid at an 80% revenue share.
Per-slot floors
The everyday place to set floors is the ad slot itself:
- Go to Inventory → Ad Slots
- Open the slot
- On the Auction tab, set the Floor value
- Save
Slot floors are the most flexible — tune them per placement based on fill-rate and CPM data.
Global floors
Set a wrapper-wide default (and optional per-device overrides) in Wrapper → Configs: Price Floor, plus Mobile Price Floor / Desktop Price Floor. Any slot without its own floor inherits this — so there is a single global floor, contrary to earlier docs.
Per-demand-seat floors
To hold one partner to a higher minimum than the rest, set a Floor on its demand seat (Demand → Prebid). It overrides the slot and global floors for that bidder only — a useful lever when a specific SSP consistently underbids while you don't want to raise the floor on everyone.
Dynamic floors via a floor provider
For auction-time pricing from an external endpoint, configure a Floor Provider in Wrapper → Configs — see Strategy 4 above. When active, it takes over floor control; a global Price Floor is its fetch-failure fallback.
Bulk floor updates
To change floors across many slots without opening each one individually:
- Use the AI Assistant: "Set floor price to $1.00 for all sidebar slots"
- Or edit slot-by-slot, then ship a single release once the set is done
Viewing floor performance
Go to Dashboard → Monetization and break down by ad slot to see fill rate, CPM, and revenue. Comparing before/after a floor change on the same slots is the cleanest read.
Common questions
What's a good starting floor?
For most publishers: $0.50 – $1.00 on standard placements, set on each ad slot's Auction tab. Premium above-fold slots can start higher ($1.50–$2.50); below-fold / lazy-loaded slots can start lower ($0.25–$0.50).
Set a wrapper-wide Price Floor in Wrapper → Configs as a baseline, then override per slot where inventory value differs. This filters obvious low-quality demand while maintaining good fill rate. Adjust after 2 weeks of data.
Should I have a $0 floor?
Generally no. Even a $0.10 floor filters the lowest-quality demand. Zero floors invite bad ads.
Exception: If you're prioritizing fill rate for specific testing.
Do floors apply to all demand partners?
The slot and global floors apply to all prebid partners. You can also set a per-demand-seat floor to hold one partner to a higher minimum than the rest (Demand → Prebid). GAM may have separate floor configurations for AdX.
How do floors interact with experiments?
You can test floor changes using experiments:
- Control: Current floor
- Variation: New floor
- Measure: Revenue impact
This is the safest way to change floors.
Related concepts
- Auction Types → — Why floors matter more in first-price
- Revenue vs. Latency → — Balancing optimization
- Demand Partners → — Who's bidding on your inventory