Page speed
Lighthouse blames your fonts. It's the ads.
We fixed the fonts Lighthouse flagged. Cumulative Layout Shift stayed at 1.00. The real culprit was the one Lighthouse never named: AdSense Auto ads.
By Mario Bailey · Published
Lighthouse is good at telling you a page shifts. It is not always right about why. On three of four sites we run, it attributed a layout-shift failure to web fonts. We did the font work it asked for, and the failure did not move. The shift was coming from somewhere Lighthouse could not see it originate.
The misattribution
Lighthouse blames the element that moved during the window it was watching, and it uses timing to guess the cause. On these sites a web font was rendering right around the moment the page jumped, so it took the blame. The deterministic source was actually account-level AdSense Auto ads injecting an in-page unit that reflows the body, firing a few hundred milliseconds in, with no reader interaction. The font was a bystander with bad timing.
| What we changed | Cumulative Layout Shift |
|---|---|
| Fonts fixed (preload, metric-tuned fallbacks) | 1.00 |
| Ad library gated on first interaction | ~0 |
Doing everything Lighthouse asked about fonts left CLS at its worst possible value. The fix was the thing it never mentioned.
How to confirm the real cause
The rule is to remove one variable at a time before you believe an attribution. We isolated the ads by not loading them, and the shift vanished, which the font fixes alone never achieved. If a CLS failure survives a clean font fix, stop rewriting fonts and look at what injects content after first paint: ads, embeds, consent banners, anything that arrives late and pushes the page. The web.dev CLS guidance names ads, embeds, and iframes as primary causes of exactly this.
The fix
Two changes. In the page, gate the AdSense library itself so it does not load until the reader first scrolls or taps; the ad queue holds and flushes when interaction arrives, so the injection no longer lands in the measured load window. In the AdSense dashboard, turn off the in-page Auto ad formats and keep the anchor only, so the account stops injecting body-reflowing units you did not place. Together they took CLS to essentially zero.
There is one honest tradeoff. Gating the library on interaction means a visitor who bounces without scrolling, tapping, or touching never triggers an ad. In practice that is traffic that barely monetizes anyway; every engaged reader still sees ads. It is a deliberate trade of the least valuable impressions for a clean load, not a free win.
How we measured it
Lab Cumulative Layout Shift across four sites we run, comparing font-only fixes against gating the ad library, with the ads removed as a controlled variable to isolate the cause. The finding is a diagnostic one: the tool's stated cause was wrong, and verifying by elimination beat trusting the attribution. Lab CLS is a controlled number; field data from real users trails it by a few weeks.