You shipped AdSense and your PageSpeed score went from 92 to 47. LCP doubled. CLS shot up to 0.35. You’re tempted to disable ads entirely, but the actual damage is usually 3-4 fixable issues, not “ads are slow.” A well-instrumented AdSense integration costs ~5-10 points of PageSpeed, not 40. If you’re losing more, something specific is wrong with the wiring.
This guide walks through the four issues that account for most of the perceived slowdown.
Common causes
Ordered by hit rate, highest first.
1. CLS spike from un-reserved ad slots
The biggest visible problem. When an ad loads, it pushes content down. Lighthouse measures this as Cumulative Layout Shift. If you don’t reserve space for the slot ahead of time, every ad creates a layout shift event.
How to spot it: PageSpeed Insights → CLS metric. If > 0.1, this is the cause. Also visible: scroll your page while an ad loads; watch text jump.
2. AdSense script tag is render-blocking
If you wrote <script src="adsbygoogle.js"> without async, the browser stops parsing HTML until the script downloads. AdSense’s CDN can be slow in some regions, blocking your TTFB-to-LCP path for hundreds of ms.
How to spot it: View source on the page. The AdSense script tag must have async. If not, this is the issue.
3. Multiple ad units above the fold
Two display ads + an anchor + a header ad above the fold = 4 simultaneous ad requests competing with your hero image and CSS. LCP suffers because the network is saturated.
How to spot it: PageSpeed → Diagnostics → “Avoid chaining critical requests” and “Reduce the impact of third-party code.” If pagead2.googlesyndication.com shows up here, you’ve over-loaded above the fold.
4. Auto Ads density set too high
Auto Ads at maximum density loads 6-10 ad slots per page. Each is a network request and a layout reservation. Cumulatively this dominates JS execution time.
How to spot it: PageSpeed → “Third-party code blocked the main thread for X ms.” If “Google/AdSense” is > 500ms, density is the cause.
5. AdSense fetching personalized-ad signals (CMP delay)
If you use a CMP (consent management platform), AdSense waits for the user’s consent decision before requesting ads. Some CMPs themselves take 500-1000ms to load, then AdSense adds its own latency on top.
How to spot it: DevTools → Performance → record. Look for a gap between page load and adsbygoogle.js actually firing. If > 500ms, the CMP is the bottleneck.
Shortest path to fix
Step 1: Add async to the AdSense script
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXX" crossorigin="anonymous"></script>
async is mandatory. defer works too but async is what AdSense’s docs specify.
Step 2: Reserve space for every ad slot
Wrap each <ins class="adsbygoogle"> in a container with explicit dimensions:
<div style="min-height: 280px; width: 100%; display: flex; justify-content: center;">
<ins class="adsbygoogle"
style="display:block; width: 300px; height: 250px;"
data-ad-client="ca-pub-..."
data-ad-slot="..."></ins>
</div>
Match the min-height to the most likely ad size at this position. For responsive units, use the largest the slot can serve.
For Auto Ads, you can’t predict size — instead reserve a band per section:
.article-section { min-height: 100vh; } /* prevents below-fold ads from shifting visible content */
Step 3: Limit to 1-2 ads above the fold
Above the fold = first 600px on desktop, first 400px on mobile. One ad is fine; two is the max. Move other slots below the fold and add loading="lazy" to their parent.
For Auto Ads, in AdSense → Ads → Auto Ads → Page exclusions, exclude header, .hero, and the top 1/3 of your content.
Step 4: Use loading="lazy" for below-fold slots
<ins class="adsbygoogle" loading="lazy" ...></ins>
Browsers respect this for <iframe> (which AdSense uses internally), so ad fetches defer until the user scrolls near them.
Step 5: Optimize CMP load
If you use Google’s Funding Choices or another CMP:
- Load it
async(not blocking). - Set a max-wait timeout (1500ms) before showing default UX.
- If you target one region only, you may be able to skip the CMP for non-EEA traffic via server-side geo headers — check your platform.
Step 6: Measure on real devices
PageSpeed Insights uses simulated hardware. After fixes, test on:
- A mid-range Android phone over 4G
- An older iPad
- A throttled Chrome DevTools profile (Slow 4G)
If all three show LCP < 2.5s and CLS < 0.1, you’re done.
Prevention
- Measure CWV (LCP, CLS, INP) before and after enabling ads, on the same page.
- Default every new ad slot to have a reserved
min-heightmatching its largest possible size. - Cap above-the-fold ads at 1-2 across the whole site, enforce in code review.
- Add
asyncto every third-party script — it’s almost never needed sync. - Monitor Search Console → Core Web Vitals report monthly; act when a page falls into “Poor” status.