AntiAdBlock.Core

Revenue

10 min readBy the AntiAdBlock Core team

How to improve ad fill rate and viewability

Fill rate and viewability are the two numbers publishers optimize hardest, and ad blocking quietly corrupts both. One it hides, the other it wrecks. This guide explains what each metric actually measures, what blocking does to them, and which levers are worth pulling first, with a section on gaming inventory.

What each metric measures

Fill rate is the share of your ad requests that come back with an ad: ads served divided by ad requests. A low fill rate means you are asking for ads and demand is not answering, usually because your floors are too high for the bids available, your demand partners do not want that audience or geography, or the request itself is malformed or arriving too late.

Viewability is different: it measures whether an ad that was served actually had a chance to be seen. The IAB and MRC standard for display is at least 50% of the ad's pixels in the viewport for at least one continuous second, and for video it is 50% of pixels for two continuous seconds. Buyers increasingly pay on viewable impressions, so this number moves your effective CPM directly.

The two are often confused because both look like "ad problems", but they fail at opposite ends of the chain. Fill rate is about demand not showing up. Viewability is about supply that nobody could see.

What ad blocking does to fill rate: it hides the loss

This is the part that surprises most publishers. When an ad blocker stops your ad library from loading at all, your ad server never receives a request. No request means nothing enters the fill-rate calculation, in either the numerator or the denominator.

The consequence is counterintuitive: a site losing a large share of its inventory to ad blocking can show a perfectly healthy fill rate. The metric is measuring only the traffic that got through. Your fill rate is not lying, it is answering a narrower question than you think it is.

That is why fill rate cannot be your first diagnostic. If revenue per session is falling while fill rate holds steady, the loss is happening before the request, and the only way to size it is to measure how many of your page views carry an ad blocker at all. Our ad-block statistics page covers typical rates by vertical, and the guide to measuring what adblock costs you walks through putting a number on it for your own site.

What ad blocking does to viewability: it wrecks it

Not every blocker works by cancelling the request. Cosmetic filtering is the other common mode: the request goes out, an ad comes back, and then a filter rule hides the container with display:none or collapses its height to zero.

From your ad server's point of view that impression was served and filled. From the measurement vendor's point of view it was never in the viewport, because the element has no pixels on screen. The impression counts against you as unviewable.

So a rising share of blocked traffic pushes your viewability down while fill rate stays flat, and the usual reaction is to blame layout: move the unit higher, change the template, add lazy loading. Those are reasonable levers, but if the underlying cause is filtering, none of them will move the number, and you will spend a quarter redesigning around a problem that is not there.

The tell is the shape of the data. Layout problems produce a viewability figure that varies by placement and by page template. Blocking produces a figure that varies by audience: by browser, by device type, by traffic source. If your desktop Chrome and Firefox viewability differ sharply for the same unit in the same template, look at blocking before you look at CSS.

Levers that actually move viewability

Lazy loading is the highest-leverage change for most sites. Requesting an ad only when the slot is approaching the viewport means you stop serving impressions to slots the reader never reaches. Your raw impression count falls and your viewability rises, and since buyers pay for viewable inventory, the trade is usually favourable. The detail that matters is the trigger distance: fire too close to the viewport and the ad arrives after the reader has already scrolled past, which costs you the impression entirely.

Sticky and anchor units are viewable almost by definition, because they stay in the viewport while the reader scrolls. They also carry the highest annoyance cost, so they are worth testing against your engagement metrics rather than assumed to be free revenue.

Refresh rules convert time on page into extra impressions, and they only help viewability if they are tied to the slot actually being in view. Refreshing a unit that is off screen manufactures unviewable impressions and drags the average down. Tie the timer to visibility, not to the clock.

Ad density cuts both ways. Stacking more units per page raises total requests but lowers the share of them anyone sees, and it degrades page speed, which in turn delays ad rendering and costs viewability again. Fewer, better-placed units frequently produce more viewable impressions than more units.

Levers that actually move fill rate

Demand depth is the first one. A single ad exchange leaves you dependent on one set of buyers; adding header bidding partners means more auctions have at least one interested bidder, which is exactly what fill rate measures. The cost is latency, so partners have to earn their slot in the auction.

Floor pricing is the most common self-inflicted fill problem. Floors set above what your audience actually clears leave inventory unsold, and the fix is to segment them: a floor that makes sense for your best geography and placement is often far too high for the rest.

Latency matters more than it looks. Requests that arrive after the reader has left, or after the auction timeout, do not get filled. Anything that speeds up your page speeds up your auction: fewer blocking scripts, earlier tag placement, a lighter consent flow.

Finally, recovering blocked traffic raises fill rate in the only way that also raises revenue: by turning page views that were making no requests at all into page views that do. That is the product we build, and it is worth being precise about the mechanism. The point is not to trick a blocker into loading an ad; it is to detect the block and ask the reader to allow ads on your site, so their next page view behaves like an ordinary one.

Gaming inventory specifically

Gaming sites sit at the difficult end of both metrics, for reasons that are structural rather than fixable by layout alone.

The audience skews young, technical and desktop-heavy, which is the profile most likely to run an ad blocker. That means a larger share of your inventory is affected by the two failure modes above, and it means your reported metrics describe a smaller and less representative slice of your real traffic than they do on, say, a recipe site.

Session behaviour cuts the other way and is an advantage worth using. Guides, wikis, patch notes and tier lists hold readers on the page far longer than a news article, which makes visibility-triggered refresh genuinely productive rather than a way to manufacture unviewable impressions. Long sessions are also why sticky units perform better here than the annoyance cost would suggest.

Layout is the third factor. Gaming content is image and video heavy, so slots often sit below large media blocks that push them out of view on mobile, and the same media weight delays rendering. Lazy loading with a generous trigger distance tends to be worth more on a gaming page than on a text-first one.

If you are working on gaming inventory specifically, our anti-adblock guidance for gaming publishers covers the recovery side in more detail.

The order to work in

Measure the block rate first. Until you know what share of your page views never reach the ad server, every other number is describing a subset of your traffic and you cannot tell whether a change helped or simply shifted the mix.

Then fix viewability, because it is mostly under your control: lazy loading, visibility-triggered refresh, placement and density are all decisions you make, and they move a metric buyers pay against.

Then work on fill: demand partners, floors by segment, latency. These involve other parties and move more slowly.

And treat recovered traffic as its own line. Page views you win back from ad blocking behave like normal inventory and improve both metrics at once, which is why it is worth separating in reporting rather than letting it blend into the totals.

Viewability varies enormously by unit, and the ranking is not the one most publishers assume: ad viewability by format compares them side by side.

Frequently asked questions

Does ad blocking lower my fill rate?

Usually not in the way you would expect. When a blocker prevents the ad library from loading, no request reaches your ad server, so nothing enters the fill-rate calculation at all. Fill rate can look healthy while a large share of your inventory is being lost. Blocking that works by hiding the container after the ad loads is the case that hurts, and it shows up in viewability rather than fill.

What is a good viewability rate?

It depends on format and placement, so a single target is misleading. What is more useful is comparing the same unit across audiences: if one browser or device shows markedly worse viewability for an identical placement, that gap points at blocking or rendering rather than at layout.

Will lazy loading reduce my revenue?

It reduces your impression count and usually raises your viewable impression count. Since buyers increasingly pay against viewable inventory, the net effect is typically positive, but it depends on the trigger distance: firing too late means the ad arrives after the reader has scrolled past and you lose the impression outright.

Does refreshing ads help or hurt viewability?

It helps only when the refresh is triggered by the slot being in view. A timer that fires regardless of visibility produces impressions nobody could see and lowers your average.

Are gaming audiences really harder for ad monetization?

They are harder on the blocking dimension, because the audience skews toward the profile most likely to run a blocker, which means a bigger share of inventory never reaches the ad server. They are easier on the engagement dimension: long sessions make visibility-triggered refresh and sticky placements more productive than on short-visit content.

Put the best adblock killer script to the test.

Free up to 10,000 detections per month. 60-second install.

Keep reading

Explore more