You have five ad slots on a page. Traffic is steady but not growing. You want more revenue. The obvious move is to add a sixth or seventh slot, but that degrades user experience, slows the page down, and can actually lower CPMs across all your units. There is a better approach: ad refresh.

Ad refresh (sometimes called auto-refresh or ad reload) replaces the creative inside an existing ad slot with a new one after a trigger event, generating a second, third, or fourth impression from the same placement during a single page view. Done correctly, it increases impressions by 30-80% without adding a single pixel of ad space to your layout.

Done incorrectly, it tanks your CPMs, violates ad network policies, and gives advertisers a reason to blacklist your domain. This guide covers how to do it right.

How Ad Refresh Works Under the Hood

At its core, ad refresh makes a new ad request to your ad server (Google Ad Manager, header bidding wrapper, or both) for a slot that already exists on the page. The previous creative is replaced with the new one. From the ad server's perspective, this is a new impression.

The technical flow looks like this:

  1. Page loads and the initial ad request fires normally for all slots
  2. A timer or event listener monitors each slot
  3. When the refresh condition is met (time elapsed, user action, viewability confirmed), the script calls googletag.pubads().refresh([slot]) or triggers a new header bidding auction for that specific slot
  4. A new creative loads in the same container
  5. The cycle repeats for the duration of the page session

The key API call in Google Publisher Tag (GPT) is googletag.pubads().refresh(). You can pass a specific slot object to refresh only that unit, or call it without arguments to refresh all slots (which you should almost never do).

Blind Refresh vs. Viewability-Gated Refresh

This is the single most important distinction in ad refresh implementation, and getting it wrong is the most common reason publishers see CPM drops after enabling refresh.

Blind (Time-Based) Refresh

Blind refresh triggers on a fixed timer regardless of whether the ad is currently visible to the user. Every 30 seconds, the slot refreshes, whether the user scrolled past it two minutes ago or is actively looking at it.

The problem: advertisers are paying for impressions, and a significant percentage of these refreshed impressions are never seen. The ad is below the fold, in a background tab, or the user has scrolled far past it. Advertisers detect this through viewability measurement, and they respond by bidding lower on your inventory. Over time, your domain-level CPMs decline.

Typical impact of blind refresh: impressions increase 40-60%, but CPMs drop 20-40%. Net revenue change is often negative or marginal.

Viewability-Gated Refresh

Viewability-gated refresh only triggers when two conditions are met: (1) the required time interval has passed, and (2) the ad slot is currently in the user's viewport. Some advanced implementations add a third condition: the ad must have been continuously viewable for a minimum duration (usually matching the IAB's 1-second standard) before the refresh fires.

This means the refreshed impression is almost always a viewable impression. Advertisers get what they paid for. CPMs hold steady or increase slightly because the refreshed inventory has verifiably high viewability.

Typical impact of viewability-gated refresh: impressions increase 25-50%, CPMs hold steady or decrease only 5-10%. Net revenue increase of 15-40%.

The Numbers That Matter

A news publisher with 10 million monthly pageviews implemented viewability-gated refresh at 35-second intervals on their top three ad slots. Impressions on those slots increased by 38%. CPMs decreased by just 4%. Total revenue from those slots increased by 32%, translating to approximately $14,000 additional monthly revenue with zero additional traffic or ad placements.

Optimal Refresh Intervals: What the Data Says

The refresh interval is the minimum time between one ad load and the next in the same slot. Choosing the right interval is a balancing act between impression volume and CPM preservation.

Interval Impression Lift CPM Impact Net Revenue Effect Notes
15 seconds +80-120% -35-50% Negative to flat Violates GAM policy. Not recommended.
30 seconds +50-70% -15-25% +15-30% GAM minimum. Aggressive but viable with viewability gating.
45 seconds +35-50% -5-15% +20-35% Sweet spot for most publishers.
60 seconds +20-35% -2-8% +15-25% Conservative. Best for premium inventory.
90+ seconds +10-20% -0-5% +8-15% Minimal CPM impact but limited gains.

For most publishers, 45 seconds with viewability gating is the recommended starting point. You can then A/B test 30 seconds and 60 seconds against it to find your specific optimum.

Which Ad Slots Should You Refresh?

Not every slot is a good candidate for refresh. The ideal refresh candidate has two characteristics: high viewability and long time-in-view. Here is how different placement types stack up:

Best Candidates

Moderate Candidates

Poor Candidates

Implementation: Step by Step

Here is a practical implementation for Google Publisher Tag with viewability gating. This approach works whether you use Google Ad Manager alone or with a header bidding wrapper like Prebid.js.

Step 1: Set Up the Intersection Observer

Use the browser's Intersection Observer API to track which ad slots are currently in the viewport. This is more performant than scroll event listeners and gives you precise visibility data.

Create an observer that monitors each ad container. When a slot enters the viewport with at least 50% visibility (matching the IAB viewability standard), mark it as "viewable" and start the refresh timer. When it leaves the viewport, pause the timer.

Step 2: Implement the Refresh Timer

For each slot, maintain a running timer that only counts while the slot is in view. When the timer reaches your interval threshold (e.g., 45 seconds of cumulative in-view time), trigger the refresh. After refreshing, reset the timer to zero and start counting again.

Step 3: Handle the Refresh Call

When refreshing through Google Ad Manager, use googletag.pubads().refresh([slotObject]) with the specific slot. Set googletag.pubads().setTargeting('refresh', 'true') on refreshed calls so you can track performance separately in GAM reporting.

If you use Prebid.js, you need to run a new header bidding auction before the GAM refresh. Call pbjs.requestBids() for the specific ad unit, set targeting from the response, then refresh the GAM slot. This ensures your refreshed impression gets competitive header bidding demand.

Step 4: Add Safeguards

Ad Refresh and Header Bidding

If you run header bidding (Prebid.js, Amazon TAM, or a managed solution), ad refresh adds complexity. Each refresh should ideally trigger a new header bidding auction, not just a GAM refresh. Here is why:

A GAM-only refresh uses the line items and targeting from the initial page load. Header bidding bids from the first auction have already been used. Without a new auction, the refreshed impression only competes among GAM's own demand, which typically yields 20-30% lower CPMs than a competitive header bidding auction.

Running a fresh Prebid auction for each refresh ensures full demand competition on every impression. The trade-off is slightly higher latency on the refresh (200-500ms for the auction to complete), but since the user is already viewing other content, this delay is invisible.

Pro Tip

Set different Prebid timeouts for initial load vs. refresh. Your initial page load might use a 1,500ms timeout to balance speed and competition, but refresh auctions can use a shorter 800ms timeout since they are not blocking page render and most bidders respond quickly on subsequent calls.

Revenue Impact: What to Expect

Here are realistic revenue expectations based on different site types and implementations:

Content sites with 3+ minute average session duration: Expect 25-40% revenue increase from viewability-gated refresh at 45-second intervals on 2-3 high-viewability slots.

News sites with shorter sessions (1-2 minutes): Expect 10-20% revenue increase. Shorter sessions mean fewer refresh cycles, but the per-session impact is still meaningful at scale.

Single-page applications or infinite scroll: Expect 30-50% revenue increase because users stay on a single "page" for extended periods, allowing many refresh cycles.

Forum/community sites: Expect 35-60% revenue increase. Users reading threads often spend 5-10+ minutes on a single page, and sidebar sticky ads can refresh 6-8 times per session.

Common Mistakes That Kill Ad Refresh Performance

Mistake 1: Refreshing All Slots Simultaneously

Calling googletag.pubads().refresh() without specifying slots refreshes every ad on the page at once. This creates a spike in ad requests that can slow the page, causes all ads to go blank simultaneously (jarring for users), and concentrates all your demand into a single auction moment rather than spreading it out.

Instead, stagger refreshes. Each slot should have its own independent timer based on when it first became viewable.

Mistake 2: Not Tracking Refresh Performance Separately

If you cannot distinguish between initial impressions and refreshed impressions in your reporting, you cannot optimize. Use key-value targeting in GAM (e.g., refresh=0, refresh=1, refresh=2) to track CPMs and fill rates by refresh count. You will typically see CPMs decline with each subsequent refresh, and knowing where the drop-off becomes unacceptable tells you where to set your maximum refresh cap.

Mistake 3: Ignoring Mobile Behavior

Mobile users scroll faster and spend less time with any single viewport position. An ad that gets 45 seconds of viewability on desktop might only get 15 seconds on mobile. Consider using longer refresh intervals on mobile (60 seconds instead of 45) or lower maximum refresh counts. Also ensure your refresh logic accounts for the mobile browser's aggressive tab suspension behavior.

Mistake 4: Refreshing Without Clearing Previous Bids

In a Prebid setup, failing to clear previous bid targeting before setting new bids can cause stale bids to win on refreshed impressions. Always call pbjs.setTargetingForGPTAsync() or manually clear targeting before each refresh auction.

Policy Compliance

Ad refresh is permitted by most programmatic platforms, but each has specific requirements:

Platforms like WeForAds handle refresh policy compliance automatically, managing intervals, viewability gating, and bid management so you do not have to worry about violating individual partner policies.

Measuring Success

After implementing ad refresh, track these metrics weekly for at least 30 days before making permanent decisions:

Frequently Asked Questions

What is ad refresh and how does it work?

Ad refresh is a technique that automatically reloads new ad creatives into existing ad slots after a set interval or triggered event, without requiring a full page reload. This generates additional impressions from the same page view, increasing revenue per session without adding more ad placements to your layout.

What is the best ad refresh interval?

Most publishers find the optimal refresh interval is between 30 and 60 seconds. Google Ad Manager requires a minimum of 30 seconds between refreshes. Intervals shorter than 30 seconds typically tank CPMs and violate most ad network policies. For content-heavy sites with long session durations, 45-60 seconds tends to maximize total revenue per session.

Does ad refresh hurt CPMs?

Blind (time-based) refresh without viewability gating typically reduces CPMs by 20-40% because many refreshed impressions occur on ads that are not in view. Viewability-gated refresh, which only triggers when the ad is actually visible to the user, maintains or even improves CPMs because advertisers value verified viewable impressions.

Is ad refresh allowed by Google AdSense and Google Ad Manager?

Google Ad Manager allows ad refresh with a minimum 30-second interval and requires that the user is actively engaged with the page. Google AdSense has stricter policies and generally does not allow auto-refresh of ad units. If you use AdSense, you should not implement refresh on those units. Always check the latest policy documentation before implementation.

Want Smarter Ad Refresh Without the Complexity?

WeForAds implements viewability-gated refresh with automatic interval optimization, header bidding integration, and full policy compliance built in.

Get Started Free
Weekly newsletter

Get these insights in your inbox

One tactical ad monetization tip per week. No fluff. Unsubscribe anytime.

Free forever. No spam. Learn more