Bidder Health
A single misbehaving bidder can quietly cost you revenue: it might rarely respond, respond too slowly and time out, win little, or win at low prices while crowding out better demand. This runbook finds the culprit and tells you what to do about it. It's a good weekly habit, not just an incident tool.
The Demand tab of Dashboard → Monetization labels each bidder a Demand Seat — your account's configuration for one bidder. "Seat," "bidder," and "partner" all refer to the same thing here.
The four failure signatures
An unhealthy bidder shows up as one of these. Each has a different fix, so name the signature first:
| Signature | The bidder… | Metric to watch |
|---|---|---|
| Silent | rarely returns a bid | Response Rate low |
| Slow | responds after the auction has closed | Timeout Rate high / P90 Response Time near the timeout |
| Losing | bids but rarely wins | Win Rate low |
| Cheap | wins but at low prices | eCPM low relative to peers |
Step 1: Pull per-seat performance
Go to Dashboard → Monetization and open the Demand tab. The key charts:
| Chart | Reads out |
|---|---|
| Demand Trend by Seat | Revenue, impressions, and eCPM per bidder over time |
| Auction Competition | How many bidders respond per auction, and how often |
| P90 Response Time by Demand Seat | How slow each bidder's responses are (the 90th percentile) |
| Responses per Auction | Bid density — how contested your auctions are |
Set the date range to the window you're diagnosing. If you're chasing a drop, widen it enough to see the before-and-after.
Step 2: Rank the seats and find the outlier
Health is relative — there's no universal "good" win rate. Judge each seat two ways:
- Against its peers this period — a seat far below the others on Win Rate or eCPM, or far above on Timeout Rate, is your outlier.
- Against its own baseline — a seat that was fine last month and is now degraded points at a recent, fixable change rather than a bidder that simply doesn't value your inventory.
The metrics on the Demand tab, per seat:
| Metric | What "bad" looks like |
|---|---|
| Response Rate (%) | Well below peers → silent bidder (credentials, tag IDs, or it doesn't want your inventory) |
| Timeout Rate (%) / P90 Response Time | Timeouts high, or P90 near/over your Auction Timeout → slow bidder losing bids it actually made |
| Win Rate (%) | Bids often, wins rarely → priced out (floors) or outbid |
| eCPM | Wins but low value → cheap demand possibly displacing better bidders |
If a metric looks anomalous, decide whether it's new (a step change dated to a release or a bidder-side incident) or chronic (this bidder has always been like this). New and chronic call for different responses — fix vs. accept-or-drop.
Step 3: Check the seat's configuration
Once you've named the signature, open the seat on Demand → Prebid → click the bidder card. Match the signature to the likely cause:
| Signature | Check on the seat |
|---|---|
| Silent | Enabled on the Seat tab? Tag IDs assigned for the slots you expect bids on (Tag IDs tab)? Account / site / zone IDs correct? Was the enabling release actually shipped? |
| Slow | Nothing on the seat itself — timeout is global or per-slot, not per-bidder (Timeout settings). A consistently slow bidder forces a choice: raise the timeout (helps this bidder, costs page speed) or drop it. |
| Losing | Your floors may be pricing it out — check slot and global floors (Floors). Or it's genuinely outbid, which is fine. |
| Cheap | Consider a per-seat floor so it only wins when it clears a worthwhile price (Floors covers the Demand-Seat floor lever). |
The wrapper Auction Timeout applies to the whole auction (globally, or overridden per slot). You can't give one slow bidder more time without giving it to all of them on that slot. See Timeout settings.
Step 4: Confirm in the browser
Before changing anything, verify what the bidder is actually doing on a live page. On any page with the wrapper installed, open DevTools → Console:
pbjs.getBidResponses() // bid responses this page, keyed by ad unit
pbjs.getAllWinningBids() // bids that actually rendered
A bidder absent from getBidResponses() isn't returning bids at all — a silent signature, so re-check credentials and tag IDs. A bidder that appears in responses but never in winning bids is losing — a floor or competition issue, not a config one. Append ?pbjs_debug=true to the URL for the wrapper's AAM-prefixed logs.
Step 5: Rate and act
Close with a verdict per seat and a matching action:
| Verdict | Meaning | Action |
|---|---|---|
| Healthy | Responds, competitive win rate and eCPM | Leave it |
| Degraded | One metric off, recently changed | Fix the cause (tag IDs, credentials, floor); re-check next period |
| Critical | Silent, or timing out constantly, or winning cheaply at scale | Fix if config-caused; otherwise disable it and lean on the rest of your demand, or replace it |
Ship any config change as a release, then re-pull the Demand tab after it's had time to accumulate data. For a risky change, roll it out to a slice of traffic first with an experiment.
Let the AI Assistant run it
The Assistant has a bidder-health flow built in — "Which bidder is hurting me?", "Is Rubicon's win rate down this week?", "Rank my bidders by eCPM and flag any outliers." It compares each seat against its baseline and peers and flags the anomalies with the evidence. See the AI Assistant guide.
Related
- Configuring a Prebid seat — credentials, tag IDs, per-seat settings
- Timeout settings — the global/per-slot timeout lever
- Floors — slot, wrapper, and per-Demand-Seat floors
- Low revenue — when a bidder is one suspect among several
- Analytics: which metric answers which decision