Revenue guide // for publishers who already run ads

How to increase ad revenue: find where your page RPM leaks, then fix it

Ad revenue is a chain: page views, the share that actually sends ad requests, the slots on each page, how many requests fill, and what each impression earns. To increase it, find the weakest link first. Then work on viewability, demand, refresh, layout and speed, in order of effort and risk, and measure every change in revenue per page view.

Free plan: 5,000 detections a month on one site. No payment method.

Updated · By the AntiAdBlock Core team · We make adblock detection, sold at a flat monthly price, with no share of your revenue.

Revenue // five links multiplied

page views × share that sends ad requests × slots per page × fill rate × eCPM ÷ 1,000

  1. Page views your analytics
  2. Share that sends ad requests page views where your ad code runs
  3. Ad slots per page your layout
  4. Fill rate impressions ÷ ad requests
  5. Price per impression eCPM, set by demand and viewability

Divide by page views from your own analytics and you get revenue per page view. AdSense's page RPM only counts page views where its code ran, so it starts at the slots.

Why ad revenue drops: four metrics, five questions

Google AdSense defines page RPM as estimated earnings divided by page views, times 1,000. Ad servers start counting at the ad request, so a page view whose ad code never runs is invisible to them.

Four numbers, read together
MetricHow it is calculatedWhat it hides
Page RPMestimated earnings ÷ page views × 1,000page views where the ad code never ran
eCPMrevenue ÷ impressions × 1,000unfilled requests, slots per page
Fill rateimpressions ÷ ad requestspage views that never sent a request
Viewable rateviewable ÷ measurable impressionsimpressions that could not be measured

Counted further down the chain, the same money gives a higher CPM, so eCPM can rise while revenue falls. Keep revenue per page view, with page views from your analytics, as the headline; page RPM is that figure as your ad platform sees it. AdSense's help says it is retiring session metrics from September 2025.

Diagnosis // stop at the first link that moved
  1. Did page views fall? Compare with the same week last year to separate season from loss.
  2. Did fill rate fall? Look by ad unit and size. Floors set too high and slow auctions come first. Fix it in Fill rate Header bidding
  3. Did eCPM fall while fill held? Check the calendar, then the viewable rate by placement. Fix it in Viewability
  4. Did slots per page fall? A template change, or lazy loading that never fires on short visits, removes impressions quietly. Fix it in Layout and speed
  5. Did revenue fall while all of that held? Fewer page views send ad requests: check ad code errors, consent and ads.txt, then the page views with an ad blocker. Fix it in Consent Blocked page views

Change one thing at a time, or you will not know which change did it.

Viewability: get the impressions you serve seen

Under the Media Rating Council standard, a display ad is viewable when at least 50% of its pixels are on screen, in an active tab, for one continuous second after it renders. Video needs two continuous seconds of play, and units of 242,500 pixels or more, such as a 970x250, may count at 30%. Google's Active View applies the same rules, the 30% one to large ads on desktop.

What counts as viewable // MRC

pixels on screen

continuous time

viewable

In an active tab, after the ad renders.

What moves it, in Google's own guidance:

  • Position. Just above the fold beats the very top, and content that holds attention is seen most.
  • Lazy loading with margin. Request below-the-fold ads as their slot approaches, early enough to render before the reader arrives; load above-the-fold slots first.
  • Speed and measurability. Faster pages and fewer passbacks raise viewability; an ad hidden with CSS on load, or in a cross-domain iframe, can become unmeasurable.

Viewability by format

Formats and their limits
FormatWhy it tends to be seenThe limit
Anchor or stickystays on screen; Google lists anchor as highly viewableno more than 30% of the screen under the Better Ads Standards
Vertical, such as 160x600, at the sidethe most viewable sizes in Google's data; below the fold, side beats centresidebars drop below the content on many mobile templates
Interstitial or vignetteGoogle lists vignette as highly viewablemobile prestitials fail the Better Ads Standards
Video playertwo-second barGoogle's undated help figures: 73% of video ads above the fold are viewable, 45% below

Fill rate: why requests come back empty

In Google Ad Manager, fill rate is impressions divided by ad requests; an unfilled impression is a request that came back with no eligible ad. Check two causes first. Floors above what your audience clears: misconfigured pricing rules can lower fill, Google warns, and a floor that suits your strongest country is often too high for the rest, so segment it. And thin demand: with one buyer, many requests find nobody, which is what header bidding addresses.

From page view to impression // what each ratio sees
  1. Page views
  2. requests per page view Ad requests
  3. fill rate Impressions
  4. viewable rate Viewable impressions

Page views that never send a request sit outside the fill rate.

A page view whose ad code never loads sends no request, so it sits in neither half of the fraction: a site can lose page views before the auction and still report a healthy fill rate. Late calls show up elsewhere too: bids that miss the timeout are dropped, and an ad server call held too long loses the impression rather than leaving it unfilled.

Header bidding vs waterfall: how your inventory is sold

A waterfall offers each impression to demand sources one after another, in a fixed order, until one accepts. Header bidding asks several at once, before the ad server call; in the usual setup the ad server still picks the winner. Since 2019 Google Ad Manager has run one first-price auction where header bidding line items compete with Google's demand.

Two auctions, side by side

Waterfall // one at a time

Header bidding // all at once

timeout

The waterfall stops at the third source; in header bidding the late bid misses the timeout.

Prebid.js is free, open-source software, launched in 2015: it calls bidders in parallel and drops late bids. Its documentation names two failure modes, bids lost to the timeout and impressions lost while the ad server waits, and suggests reading timeouts by bidder and region. It gives no number of partners: add them one at a time and keep those whose wins pay for the wait.

Ad refresh: when it pays and what the policies allow

Ad refresh requests a new ad for a slot already on the page. Whether you may do it depends on the platform.

AdSense and Google Ad Manager on ad refresh
RuleAdSenseGoogle Ad Manager
Timed refreshnot allowedallowed if you declare the inventory that refreshes
Minimum intervaldoes not apply30 seconds on the web, for timed or event refresh
User actiona page or element may refresh only when the user requests itbeing active, or scrolling that brings no substantially new content, is not a user action

Sources: AdSense placement policies and Ad Manager's refresh declaration. Google restricts some buyer demand on declared inventory, says longer intervals attract buyers and prefers user-action or event refresh.

One slot over a minute // 30‑second marks
  • in view
  • off screen
  • hidden tab

A mark in a hidden tab cannot count as viewable, and one off screen only counts if the reader scrolls back; Google's tag guidance is to refresh slots that are in view.

In practice, refresh only has room on long sessions. Judge it on revenue per session against a period without it, not on impressions or eCPM.

Layout, ad density and Core Web Vitals

  • Density. The Coalition for Better Ads, from research with more than 150,000 consumers, fails mobile pages where ads exceed 30% of the main content's height, sticky units included, and desktop pages above 50%. Google bans its ads on failing screens, and Chrome can filter ads on a failing site after at least 30 days' notice.
  • Layout shift. web.dev names ads among the largest sources of layout shift. Reserve each slot's space with a CSS min-height and do not collapse it when no ad fills.
  • Core Web Vitals. Targets: LCP within 2.5 seconds, INP of 200 ms or less, CLS of 0.1 or less, at the 75th percentile. Google ties them to Search, not to CPM, so treat speed as a viewability and traffic lever.
A slot with its space reserved // and one without

Reserved the text stays where it is

Not reserved the ad arrives and pushes the text down

Ad density limit // share of the main content's height

30% mobile 50% desktop

The page views that never reach the auction

Every lever above works on page views where your ad code loads. Ad blocking removes page views from that set before any ad request is sent. Blockthrough's July 2022 report measured 21% of page views with an ad blocker, across more than 10 billion page views on 9,453 sites (adblock statistics). Your share depends on your audience, so measure it.

What your reports see

Page views on your site

Page views that send an ad request blocked before the request

Your ad server only counts the second bar.

This is the part we work on. AntiAdBlock Core detects page views with a blocker and shows a wall that asks the reader to allow ads on your site; the free plan covers 5,000 detections a month, with no payment method. The dashboard estimates recovered revenue at the CPM you set (adblock revenue recovery); confirm it in your AdSense or Ad Manager impressions. More in adblock rate and recovered revenue and adblock recovery methods.

Every lever, ordered by effort and risk

Start at the top, cheap and reversible: one lever at a time, a full week each, compared on the same weekdays.

Where to start // effort × risk

Risk high

09

07

Risk medium

03 06

05

08

Risk low

01 02

04

Effort low Effort medium Effort high

Each number is a row of the table below. Start in the low-low corner.

Every lever, with what limits it and the primary source for that limit. Sources checked October 31, 2026.
LeverEffort · riskLimitSource
Check ads.txt, consent and page views without ad requestslow · lowGoogle listed in your ads.txt; server logs against ad requestsGoogle Publisher Policies
Reserve slot spacelow · lowan empty gap when nothing fillsGoogle Publisher Tag
Lazy load below the foldlow · mediumtoo tight a margin loses impressionsGoogle Publisher Tag
Move units in the contentmedium · lowad densityGoogle Ad Manager
Segment floorsmedium · mediumbad rules lower fillGoogle Ad Manager
Ask blocked readers to allow ads, with a walllow · mediumsome readers leave instead; the wall shows from the first blocked pageAntiAdBlock Core
Viewable, declared refreshmedium · highnot on AdSense; 30 s on Ad ManagerGoogle Ad Manager
Header bidding, few partnershigh · mediumlatencyPrebid.org
More slotslow · high30% of content height on mobile, 50% on desktopCoalition for Better Ads

Frequently asked questions

What is the fastest way to increase ad revenue on a website?

Find the weakest link first: compare page views, fill rate, eCPM and viewable rate with last year. Then the cheap checks: ads.txt, consent, reserved slot space, lazy loading, and server logs against ad requests.

Is header bidding worth it for a small site?

Prebid gives no minimum traffic; what weighs is upkeep and latency. Prebid.js is free, but every partner is another call that can time out: start with few and add them one at a time.

Why is my fill rate fine but my revenue down?

Fill rate only counts ad requests. If revenue per page view falls while fill holds, check eCPM and viewable rate by placement, then page views where your ad code never loads, such as blocked ones.

Do ad blockers show up as unfilled impressions?

Usually not. Ad Manager counts an unfilled impression only when an ad request comes back empty. If a blocker stops your ad code before the request, nothing is logged: the page view is missing, not unfilled.

How many ads can I put on a page?

There is no fixed count. The Better Ads Standards cap ad density, the share of the main content's height that ads take, with one limit for mobile and one for desktop (layout and density).

Measure the link your reports leave out

Your ad server only sees page views that send an ad request. Install the detection tag and see how many arrive with a blocker, how many readers allow your ads and an estimate of what that is worth at your CPM.

No payment method needed. Paid plans from $5 a month.

By the AntiAdBlock Core team · Updated

Keep reading