NNicheStackTutorials
← All tutorials
Ad Monetization

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.

·11 min read·Ad Monetization
Delay Ad Loading to Protect Core Web Vitals (Without Killing Fill Rate) cover

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

StrategyLCP impactFill rate impact
Sync in headWorst100%
async in headBad99%
After load eventGood96%
requestIdleCallback 2.5sBest94%
Scroll-trigger onlyGood CWV88% (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.

Tags: Ad LoadingCore Web VitalsLCPAdSense