Ads and Core Web Vitals: Speed Without Losing RPM
How ads affect LCP, CLS and INP, the fixes that help most, and what fewer ads really costs in revenue.
5 min read · Updated
Ads pay for your site, and they are also some of the heaviest things on it. Each slot can pull in scripts, auctions, images and video from servers you do not control. Left unmanaged, that weight shows up in Core Web Vitals, the metrics Google uses to describe how a page feels to load and use.
Most of the damage comes from a few fixable habits. This guide explains how ads affect each metric, the changes that help most, how to measure the results and what the trade-off looks like in revenue, using figures from our benchmark tables.
The three metrics in brief
Core Web Vitals has three metrics at the time of writing. Google publishes the definitions and thresholds on web.dev, and each one is assessed at the 75th percentile of real visits.
| Metric | What it measures | "Good" threshold |
|---|---|---|
| Largest Contentful Paint (LCP) | How quickly the main content appears | 2.5 seconds or less |
| Cumulative Layout Shift (CLS) | How much the page jumps as it loads | 0.1 or less |
| Interaction to Next Paint (INP) | How quickly the page responds to taps and clicks | 200 milliseconds or less |
INP replaced First Input Delay in 2024. Thresholds can be revised, so check the current figures before you set targets.
How ads affect LCP
Your largest element is usually a hero image or a block of headline text, not an ad, and content inside a cross-origin ad iframe is generally not counted as the LCP element. Ads still slow LCP indirectly. Their scripts compete for bandwidth and for the browser's main thread while your own content is trying to load.
- Load ad scripts asynchronously. Standard tags from the main networks are built this way. Do not wrap them in anything that makes them block rendering.
- Put your own content first. Make sure your hero image is not lazy-loaded and appears early in the HTML.
- Trim the stack. Every extra network, wrapper, analytics tag and tracking pixel adds requests. Remove what you no longer use.
If you run header bidding, the auction adds work before ads render. Our guide to header bidding covers timeouts and how many partners to run.
How ads affect CLS
Layout shift is where ads do the most visible harm. A slot that starts at zero height and expands when an ad arrives pushes everything below it down the page. A slot that collapses when nothing fills it pulls content back up. Both count against you.
The fix is to reserve space:
- Give each slot a minimum height in your CSS that matches the most common ad size it serves, so the space exists before the ad loads.
- If a slot can serve several sizes, reserve for the most likely one and accept a small shift for the rest.
- Do not collapse an empty slot near the top of the page. A blank, labelled space is better than a jump.
- Never inject ads above content that has already rendered.
Automatic placement tools can insert ads where you did not plan for them. If you use them, test the pages they touch and use their settings to exclude areas where a shift would hurt.
How ads affect INP
INP measures how quickly the page responds when someone taps or clicks. Ad scripts that run long tasks on the main thread delay that response. Heavy video players, frequent refreshes and many simultaneous auctions are the usual culprits.
- Limit refresh. If your setup refreshes ads, refresh only slots that are in view, at a sensible interval, and follow your network's rules on refresh.
- Question the heaviest scripts. Find the third-party scripts that take the most main-thread time and check whether each one earns its place.
- Keep shared scripts lean. Consent tools and analytics run on every page, so a slow one costs you everywhere.
Lazy loading below the fold
Loading every ad when the page opens means paying for slots that many readers never reach. Lazy loading requests an ad only as its slot approaches the viewport. That cuts the work done at load time, which helps LCP and INP, and it tends to lift viewability, because ads load when someone is about to see them.
Most ad platforms offer a lazy-load setting, so check your network's documentation. Do not lazy-load the first ad above the fold, and set the trigger distance so ads arrive just before they are needed, not after the reader has scrolled past.
Sticky ads and interstitials
Sticky or anchor units sit fixed to the edge of the screen. Because they overlay content rather than pushing it, they usually cause no layout shift, as long as they are fixed in position from the start. Trouble begins when a sticky bar slides content up as it opens, or covers buttons and links, which also invites accidental clicks.
Full-page interstitials between pages do not usually affect CLS, but they add work on navigation and change how the site feels to use. Google's search guidance has long discouraged intrusive interstitials that block content on mobile, so use them sparingly and follow your network's frequency rules. Our comparison of website ad formats covers where each unit fits.
Measuring the impact
PageSpeed Insights. Run your main page templates through PageSpeed Insights. It shows field data from real Chrome users when your site has enough traffic, plus a lab test you can repeat after each change.
Search Console. The Core Web Vitals report groups your URLs into good, needs improvement and poor, based on field data. It updates slowly, so give changes a few weeks to show.
Your own comparison. Test a page with ads switched off against the same page with ads on. The difference is the cost of your ad setup, and it tells you where to start.
Measure on mobile first. A lab test on a fast desktop can hide problems that real phones reveal.
The revenue trade-off
Fewer ads usually means better vitals and less money. The question is how much less. In our benchmark tables, revenue does not rise in a straight line with ad count. It scales with the square root of ads per page relative to a reference of four, because each extra slot sits lower on the page and is less likely to be seen.
| Ads per page | Revenue factor | AdSense Tier 1 RPM | Mediavine Tier 1 RPM |
|---|---|---|---|
| 2 | 0.71x | $4.95 | $12.02 |
| 3 | 0.87x | $6.06 | $14.72 |
| 4 | 1.00x | $7.00 | $17.00 |
| 6 | 1.22x | $8.57 | $20.82 |
Going from four ads to six adds 50% more slots for about 22% more revenue, and every added slot brings more script weight and more layout risk. Going from four to three gives up about 13%.
Viewability works in your favour here. Our tables scale RPM in line with viewability against a 60% reference, so lifting it from 60% to 70% through lazy loading and better placement raises RPM by about 17%. Combine that with dropping from four ads to three, and AdSense's Tier 1 figure moves from $7.00 to about $6.06 x 1.17, or roughly $7.07. Fewer ads, a faster page and much the same income.
Choose what to cut with care. A sticky unit carries 18% of the reference RPM in our tables, more than the 13% you lose by dropping one slot from four, so trim a low in-content unit before the anchor if both perform cleanly.
Try the combinations yourself with the ads per page and viewability controls in the home calculator, or in the AdSense revenue calculator, Mediavine RPM calculator, Raptive RPM calculator and Ezoic revenue calculator. Our methodology explains how the model works, and our guides to RPM by niche and earning more from the audience you have cover the other levers.