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:
- Page loads and the initial ad request fires normally for all slots
- A timer or event listener monitors each slot
- 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 - A new creative loads in the same container
- 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
- Sticky/anchor ads (footer, sidebar): These are always in view by design. Refresh rates of 3-5 per session are common. Viewability stays above 85% even on refreshed impressions.
- In-content ads between long articles: If your average article is 2,000+ words and the ad sits in the middle third, users spend significant time with it in view.
- Sidebar ads on desktop (when sticky): Similar to anchor ads, these maintain high viewability throughout the session.
Moderate Candidates
- Leaderboard (top of content): Users scroll past relatively quickly, but the initial viewability is high. Limit to 1-2 refreshes.
- In-feed ads on infinite scroll pages: Can work but requires careful implementation to avoid refreshing ads that are no longer near the viewport.
Poor Candidates
- Below-the-fold static placements: Low initial viewability means refreshed impressions will be even worse.
- Interstitials or overlay ads: These are dismissed by the user, so there is nothing to refresh.
- High-impact takeover units: Refreshing a premium placement cheapens it for advertisers and can cause creative conflicts.
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
- Maximum refresh count: Cap refreshes at 5-8 per slot per page view. Beyond this, CPMs degrade significantly and you risk advertiser complaints.
- Tab visibility check: Use the Page Visibility API (
document.hidden) to pause all refresh timers when the tab is not active. Refreshing in a background tab is wasted inventory. - User activity check: Consider pausing refresh if there has been no mouse movement, scroll, or click for 2+ minutes. The user may have walked away.
- Minimum page session time: Do not start refresh logic until the user has been on the page for at least 15-20 seconds. This avoids refreshing on bounce visits.
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:
- Google Ad Manager: Minimum 30-second interval. Must be triggered by user action or viewability. Must not refresh in background tabs. Declare refresh in your ad unit settings.
- Google AdSense: Generally does not permit auto-refresh. Do not implement refresh on AdSense units.
- Amazon TAM/UAM: Allows refresh with proper implementation. New bids must be requested for each refresh cycle.
- Index Exchange, OpenX, Rubicon (Magnite): Most SSPs allow refresh but require proper declaration. Check with each partner.
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:
- Revenue per session (RPS): This is the primary metric. If RPS increases, refresh is working regardless of what happens to CPMs.
- CPM by refresh count: Track CPMs for refresh=0, refresh=1, refresh=2, etc. Expect declining CPMs with each refresh, but the total revenue contribution should be positive.
- Viewability rate on refreshed impressions: Should stay above 60%. If it drops below 50%, your viewability gating may not be working correctly.
- Page session duration: Watch for any decrease, which could indicate the refresh animation or blank states are driving users away.
- Fill rate on refreshed impressions: Lower fill rates on refreshed calls suggest demand partners are not bidding on your refreshed inventory. This may indicate a policy issue or that your refresh count is too high.
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
By