Yesterday's Revenue Dropped and Nobody Can Agree Why: Ranked Causes to Check First

When yesterday's publisher revenue drops and nobody can agree why, check five cause classes in order: inventory and traffic (request volume), auction and yield (floors and demand), creative or policy, partner delivery, then reporting definitions and clocks. Most "mystery" drops resolve before you rewrite floors or escalate a partner. The expensive mistakes happen when the team debates the auction while pageviews fell, a creative was blocked, or two systems were never measuring the same day.

The morning usually starts the same way. A number moved. Slack wants a villain by 9:15. Someone opens the wrong tool first - a chat assistant when you needed a cause tree, a partner ticket when the clocks never matched, a floor rewrite when a key ad unit went dark. Guessing in chat is not triage.

This is the sell-side check from the Ad Ops Headaches map: what to run when the network number moved and the team cannot agree why. Google Ad Manager shows up as a common example where useful - not as the whole topic. The same order applies across ad servers, SSPs, and yield stacks.

Why ranked causes beat Slack vibes

Revenue is a product of several layers. If you start at the top of the auction every time, you will "fix" demand on days when pageviews fell, a creative never cleared, or two reports were never on the same clock.

A ranked-causes check does three jobs:

  1. Forces the team onto one shared order

  2. Produces a labeled cause class before anyone rewrites pricing

  3. Makes narrower tools useful later - including Ask Ad Manager inside Google Ad Manager, which helps when you already know which line item to interrogate, not when you still need a morning cause tree

You do not need a parallel spreadsheet language for day-two triage. Use your ad server's official reporting dimensions and metric definitions. For Google Ad Manager operators, start from Ad Manager reporting Help rather than a tribal "we always use X column" habit.

The five cause classes (check in order)

Run these in order. Stop when you have a labeled cause that explains most of the move. Do not invent a percentage impact. If a vendor has not published a number for an outage, say what you observed in your network and stop there.

Rank Cause class What you check If it explains the drop
1 Inventory / traffic / requests Ad requests, unfilled, site / app / channel mix, dark units and sizes vs prior day and same weekday Hand to analytics / eng. Do not touch floors yet
2 Auction / yield / floors / demand eCPM and fill mix, floor / pricing rule changes, deal vs open, bid density Talk yield with evidence - not as the first guess
3 Creative or policy Disapprovals, blocks, brand safety, category protections that cut eligible demand Label clearance / policy; fix status before pacing theater
4 Partner delivery SSP / bidder / deal outages, mediation path failures, known partner incidents Escalate with observed network evidence, not a vibe
5 Reporting definitions / clocks Timezone, currency, revenue type, filtered vs unfiltered, late data vs true drop Align definitions before anyone owns the fight

1. Inventory, traffic, and request volume

Pull yesterday vs the prior day and vs the same weekday last week.

  • Total ad requests and unmatched / unfilled requests

  • Site, app, and channel contribution

  • Whether impressions and revenue moved together, or revenue moved alone

  • Ad units, placements, and sizes that usually carry the day

  • Key-values or custom targeting that quietly stopped matching

  • A channel mix shift (AMP, app, CTV, newsletter wrappers) that changed the auction set

If requests fell in line with revenue, you are in a traffic story. Yield theater will not help. Annotate the day and move on unless a template outage is hiding inside the traffic drop - one dark unit or one broken size path can explain a disproportionate share of the miss without announcing itself in Slack.

When requests look stable but revenue fell, finish the inventory slice before you jump to floors. You are looking for concentration, not a network-wide story. Google's troubleshooting patterns for ads not showing are a useful checklist for inventory and delivery eligibility when you run Google Ad Manager: Troubleshoot why ads are not showing.

2. Auction, yield, floors, and demand

Only when inventory and traffic do not explain the move do you dig into yield:

  • eCPM and fill rate by demand channel (open auction, exchange bidding, SDK bidding, mediation, direct)

  • Programmatic guaranteed / preferred deal pacing surprises

  • Floor or unified pricing changes that shipped yesterday

  • Bid density drops that look like "the market" but may be a path you control

This is also where delivery rules that silently cut fill belong in the same morning pass: frequency caps that finally met volume on a heavy direct package, roadblocks and exclusive placements that reserved more inventory than sales remembered, competitive exclusion sets, day-part / geo / device restrictions, and protections edited mid-flight.

Do not rewrite every floor on hour one. Floor and pricing changes belong here - with evidence that pricing, not volume or eligibility, moved the day. If your team is also stretched across direct and programmatic as one job, that dual-load failure mode often shows up as "we changed floors because nobody had time to finish the inventory check." The two-jobs post names that pattern; this checklist keeps the morning from becoming another floor rewrite by default.

3. Creative or policy

Clearance problems wear a revenue costume. Before you treat a drop as demand weakness, check:

  • Creative disapprovals or expired assets on high-value packages

  • Brand safety, category, and advertiser blocks that narrowed eligible demand overnight

  • Policy or protection edits that look like underdelivery in the dashboard

  • Direct packages that "went live" while creative never cleared

If status is blocked, pacing theater will not help. Label creative or policy, fix the clearance path, and only then reopen yield. The same pattern shows up on the buy-side as "spend is live but nothing is delivering" - on the sell-side it often looks like a quiet fill cliff on the packages that depended on those creatives.

4. Partner delivery

Partner blame is cheap. Partner evidence is not.

After you know the drop is not a traffic, dark-unit, floor, or creative story, check:

  • SSP, bidder, or mediation path contribution vs the prior comparable day

  • Known partner incidents (only cite what the partner or your network actually showed)

  • Deal paths that stopped responding while open auction looked fine

  • Discrepancy that belongs in a reconciliation pass - after definitions and clocks, not before

Write what you observed in your stack. Do not invent an impact percentage. Escalate with a labeled cause class and a comparable-day slice, not a screenshot and a mood. If the fight is really "two systems disagree," jump to cause class 5 before you send the accusation email.

5. Reporting definitions and clocks

Sometimes yesterday did not drop. Two teams measured different things and called it a crisis.

Align before you escalate:

  • Timezone and report day boundaries

  • Currency and revenue type (gross vs net, estimated vs finalized)

  • Filtered vs unfiltered, bots, and invalid traffic treatment

  • Late-arriving data vs a true day-over-day move

  • Whether "revenue" in chat means the same column in every system

Most discrepancy fights are definition fights that started weeks earlier. Finish this pass before finance owns the argument. Official metric definitions in your ad server Help Center beat tribal column names every time - for Google Ad Manager, see About Ad Manager reports and the reporting dimensions guide linked above.

Stop conditions and handoffs

Stop the tree when:

  • One cause class explains most of the day-over-day move, or

  • You have two competing hypotheses that need eng, analytics, or sales - not more slicing

Hand off cleanly:

  • Traffic / dark inventory → analytics and site or app eng

  • Yield / floors → yield lead, with the evidence from classes 1 and 3 already ruled in or out

  • Creative / policy → trafficking owner and creative ops

  • Partner delivery → yield lead and partner account team, with observed network slices

  • Definitions / clocks → whoever owns the report contract between systems

What you should not do on hour one: rewrite every floor, pause every deal, or paste the whole network into a chat assistant and hope it ranks your day. Ask Ad Manager (and similar helpers) get sharper after you already know which class you are in - which is why the Ask Ad Manager is reactive post and this checklist are different jobs.

Where Ads Tracker fits

The ranked-causes check is faster when yesterday's exceptions are already sorted before you open a blank report.

ProOps Ads Tracker is a read-only Chrome sidepanel daily coordinator for Google Ad Manager. It surfaces campaign, revenue, and inventory exceptions for the morning brief - $249/month per GAM network, 3 seats included, extra seats $49. 30-day trial, no credit card. Start at Ads Tracker HQ.

It does not replace the cause tree. It shortens the time to "which class am I in."

If the headache is bigger than one report - hybrid stacks, process design, or a team stretched across two jobs - book a consulting call. Most of the value after 19+ years in this layer is naming the complaint correctly before anyone buys another tool.

Frequently Asked Questions

Yesterday's revenue dropped and nobody can agree why - what should I check first?

Run five cause classes in order: inventory and traffic (request volume), auction and yield (floors and demand), creative or policy, partner delivery, then reporting definitions and clocks. Most mystery drops resolve before floors or partner blame. Label the class before anyone rewrites pricing.

Should I change floors when yesterday's revenue drops?

Not as a first move. Confirm inventory, traffic, and eligibility first. Floor and pricing changes belong in the auction / yield step, and only with evidence that pricing - not volume, creative status, or report definitions - moved the day.

What if ad requests are flat but revenue fell?

Finish the inventory slice (units, sizes, key-values, channels), then yield mix, then creative or policy, then partners. Flat requests with lower revenue is usually eligibility, eCPM mix, clearance, or a partner path - not "the internet broke."

Is this the same as asking Ask Ad Manager why revenue dropped?

No. Ask Ad Manager is useful when you already have a narrow line-item or query. This ranked-causes check is the operator tree you run first so you know which class of problem you are in. Helpers get sharper after the label exists.

Where does Prebid or SSP discrepancy fit?

After you know the drop is not a traffic, dark-unit, creative, or definition story. Align clocks and revenue types first, then reconcile partner delivery with observed network slices - not with an accusation email.

How does ProOps Ads Tracker help with this check?

It is a read-only Chrome sidepanel daily coordinator for Google Ad Manager that surfaces exceptions before you build the blank report. $249/month per network, 3 seats included, extra seats $49, with a 30-day trial and no credit card at hq.proopsadstracker.com. It does not replace the ranked-causes order.

Next
Next

Private Auction Override Blocks (Sep 17, 2026): What Changed and What to Check in Google Ad Manager