Back to Blog
Revenue 7 min readMay 2026

Ad Refresh & Lazy Loading: How to Increase Revenue Without Hurting UX

Ad refresh and lazy loading can boost revenue by 20-40% when implemented correctly. Here's how to do it right.

Ad refresh and lazy loading are two of the most effective levers for increasing ad revenue without adding more ad slots to your page. Done right, they can boost revenue by 20-40%. Done wrong, they tank viewability, violate network policies, and annoy your users.

What Is Ad Refresh?

Ad refresh (or ad reload) replaces the creative in an existing ad slot with a new one after a set interval, generating additional impressions from the same placement. It's essentially showing multiple ads in the same slot over the course of a user's session.

There are three main approaches: time-based refresh (every 30-60 seconds), viewability-based refresh (only when the ad is in view), and event-based refresh (triggered by user actions like scrolling or clicking). Viewability-based refresh is the gold standard because it ensures the new ad has a chance to actually be seen.

Ad Refresh Best Practices

Set a minimum interval of 30 seconds. Google Ad Manager requires at least 30 seconds between refreshes, and most exchanges prefer 45-60 seconds. Shorter intervals risk policy violations and lower CPMs as buyers recognize the pattern.

Only refresh ads that are in the viewport. This is critical. Never refresh an ad the user can't see. The refresh timer should pause when the ad scrolls out of view and resume when it scrolls back in. This keeps viewability high and CPMs premium.

Exclude high-value placements from refresh. Your top-of-page leaderboard that loads with the page is likely earning premium CPMs from direct deals and PMPs. Refreshing it can hurt those relationships. Focus refresh on mid-page and sticky placements instead.

Monitor the impact on CPMs. Refreshed impressions typically earn 20-40% less than the initial impression in a slot. This is expected. The total revenue should still be higher because you're generating 2-3x more impressions from the same slot.

What Is Lazy Loading for Ads?

Lazy loading defers the fetching and rendering of ads until the ad slot is about to enter the user's viewport. Instead of requesting all ads on page load (which slows down the page and hurts Core Web Vitals), you only request ads as the user scrolls toward them.

Lazy Loading Best Practices

Set a loading offset of 200-400 pixels. Start loading the ad when it's 200-400 pixels below the visible viewport. This gives the ad enough time to render before the user scrolls to it. Too close (50px) and the ad won't be ready; too far (1000px) and you lose the performance benefit.

Never lazy load above-the-fold ads. Your first viewport of ads should load immediately with the page. Lazy loading them creates blank ad slots that hurt viewability and user perception. Only lazy load ads that require scrolling to reach.

Use Intersection Observer API. The modern way to implement lazy loading is with the browser's Intersection Observer API, which is efficient and doesn't block the main thread. Avoid scroll-event listeners, which cause jank.

Reserve ad slot dimensions. Always set explicit width and height on your ad containers to prevent Cumulative Layout Shift (CLS). When the ad loads asynchronously, the space should already be reserved.

Combining Refresh and Lazy Loading

The best implementations use both: lazy load the ad when the user scrolls near it, then start the viewability-based refresh timer once the ad renders and is confirmed in view. This creates a natural flow: the initial ad loads only when needed, and refreshes only happen when the user can see them.

Sticky Ads: The Viewability Multiplier

Sticky (or anchor) ads that remain fixed on screen as the user scrolls have inherently high viewability, making them ideal candidates for refresh. A sticky sidebar ad with 60-second viewability-based refresh can generate 5-10x the impressions of a standard ad slot, all with premium viewability scores.

Key rules for sticky ads: limit to one vertical sticky per viewport, add a close button for user control, don't cover content, and follow Google's policies on sticky ad placement. A poorly implemented sticky ad will get you flagged by the Better Ads Standards coalition.

How to Measure Success

Track these metrics before and after implementing refresh and lazy loading: total revenue per session, eCPM (expect a slight decrease per impression but an increase in total revenue), viewability rate (should improve with lazy loading), Core Web Vitals (LCP and CLS should improve), and user engagement metrics (bounce rate, pages per session). Run a RevenueRx audit to get a baseline score across all these metrics before making changes.

Check your setup with RevenueRx

Run a free audit to see how your site scores across 80+ ad monetization checks. Results in under 2 minutes.

Start Free Audit

Related articles