Page speed

We hold the ads until the reader moves

Why we load ads on the first interaction instead of the first paint on some sites we run, what it does to Core Web Vitals, and the impression it costs.

By Mario Bailey · Published

The fastest ad is the one that has not loaded yet. On the sites where approval safety and speed matter most, we do not request a single ad until the reader scrolls, taps, or presses a key. It is not a free win. It is a deliberate trade: a faster, steadier page in exchange for the impressions a visitor who bounces never triggers.

What "interaction-gated" means

The ad code is on the page, but it does not fire until the first real signal that the reader is engaged: a scroll, a tap, a key press. Until then the page is just content. Google's own web.dev guidance on loading ads without hurting page speed points the same way, defer the ad script off the critical path so it is not competing with your content for the main thread while the page is trying to become usable.

Interaction-gated ad loading what this site runs
Interaction-gated ad loading: no ad request until the reader's first scroll, tap, or key press The page loads The ad code is on the page. No ad request has fired. faster LCP · no launch shift · clear main thread The first real signal of engagement a scroll · a tap · a key press the reader moves The ad library loads only now Queued units request and render. Ads render, with the reader there the right ad, at the moment the reader is actually there the reader bounces No ad is ever requested A visitor who reads nothing and leaves never scrolls or taps. the impressions left on the table
The right column is the honest cost: a bouncing visitor never triggers an ad. Source: src/components/AdSense.astro, this site

What it does to Core Web Vitals

Ads are among the heaviest things a page loads, and they touch all three Core Web Vitals: Largest Contentful Paint (the 2.5-second target), Cumulative Layout Shift (the 0.1 target, the one an ad that reflows content wrecks), and Interaction to Next Paint (the 200ms target, hurt by ad scripts blocking the main thread). Hold the ad until after the reader is engaged, and the initial load carries none of that weight: faster LCP, no launch-time layout shift, a clearer main thread for the first interaction. Core Web Vitals are a Google ranking signal, so this is a search decision as much as a speed one.

The catch, stated plainly

A visitor who lands, reads nothing, and leaves never scrolls or taps, so they never trigger an ad. On a page with a high bounce rate, interaction-gating leaves impressions on the table. web.dev says it in one line: the technique "might impact your AdSense revenue." That is the honest cost, and it is why this is a per-site decision, not a rule. We take the trade where a clean, fast page is the priority; we would not take it on a page whose readers are already deeply engaged and whose layout is already stable, because there we would be giving up real impressions for a metric we already pass.

Where it earns its keep

  • A new or thin-traffic site chasing AdSense approval, where a fast, low-shift page is the whole game.
  • Any page where an ad would otherwise be the LCP element, or the thing that shifts the layout under a reader's thumb.
  • Mobile, where the main thread is slowest and a layout shift is most likely to cause a mis-tap.

How this fits the rest of what we have measured

It is the same lesson as our viewability and fill-rate work, from the angle of timing. There we found that a unit earns its place by being seen, not by existing, and that a higher fill rate did not mean more money. An ad request the reader never engaged with was not going to earn much anyway, so on the right page you spend it on speed instead. More requests, sooner, is not the goal. The right ad, at the moment the reader is actually there, is.

Scan your own site Read the test