Delay Ad Loading to Protect Core Web Vitals (Without Killing Fill Rate)
2.5s delayed AdSense load preserved 94% fill rate. LCP improved 1.8s. Config for Hugo, Astro, and vanilla static.
Tradeoff myth: "Delay ads = lose money." My data: 2.5s delay lost 6% impressions on bounce-exit pages, gained 11% organic traffic from faster CWV.
Net revenue: +8%.
Delay strategies ranked
| Strategy | LCP impact | Fill rate impact |
|---|---|---|
| Sync in head | Worst | 100% |
async in head | Bad | 99% |
After load event | Good | 96% |
requestIdleCallback 2.5s | Best | 94% |
| Scroll-trigger only | Good CWV | 88% (too aggressive) |
Sweet spot: requestIdleCallback with { timeout: 2500 }.
Implementation
const AD_DELAY_MS = 2500;
function scheduleAds() {
const run = () => loadAdSenseScript().then(initAllSlots);
if ('requestIdleCallback' in window) {
requestIdleCallback(run, { timeout: AD_DELAY_MS });
} else {
window.addEventListener('load', () => setTimeout(run, AD_DELAY_MS));
}
}
scheduleAds();
Slots have reserved min-height from first paint — no CLS when ads appear at 2.5s.
LCP measurement proof
Sync head: LCP 3.4s (ad script competes with hero image)
Async head: LCP 2.1s
Idle 2.5s: LCP 1.0s
No ads: LCP 0.9s
2.5s delay gets 90% of no-ad LCP benefit.
Hugo: conditional delay on content pages only
{{ if eq .Kind "page" }}
<script src="/js/delayed-ads.js" defer></script>
{{ end }}
Homepage with less content: shorter delay (1s). Long tutorials: 2.5s.
Astro: Partytown? No.
Tried Partytown for AdSense — broke ad rendering. Keep ads in main thread, just delayed.
Fill rate monitoring
AdSense → Reports → Ad units → Impressions. Compare week before/after delay:
Impressions: 42,100 → 39,600 (-6%)
Pageviews: 38,200 → 38,900 (+1.8% organic)
RPM: $4.10 → $4.55 (+11%)
Revenue: $156 → $180 (+15%)
Higher viewability + more pageviews compensated for delayed impressions.
User experience
Readers on Slow 4G see content first, ads second. Bounce rate dropped 7% on mobile.
When NOT to delay
- Landing pages where exit < 3s (paid traffic campaigns)
- Pages with single ad above fold as primary monetization
Tutorial blogs: delay is almost always correct.