Page speed and Core Web Vitals, explained plainly
Speed rarely decides an AdSense application on its own, but it shapes everything else — how much of your content gets read, how well ads perform, and how a reviewer experiences the site.
8 min read · Last updated
The metrics that matter
- Largest Contentful Paint (LCP) — how long until the biggest visible element, usually a hero image or headline block, has rendered. Good is under 2.5 seconds.
- Cumulative Layout Shift (CLS) — how much the page jumps around as it loads. Good is under 0.1. This is the metric ad slots break most often.
- Interaction to Next Paint (INP) — how quickly the page responds when someone taps or clicks. Good is under 200 milliseconds. It replaced First Input Delay.
- Total Blocking Time (TBT) — a lab proxy for INP: how long the main thread was too busy to respond during load. Under 200ms is good.
- First Contentful Paint (FCP) and Speed Index — how quickly anything appears, and how quickly the page visually fills in. Useful context rather than targets in themselves.
Lab data versus field data
PageSpeed Insights shows two different things and people routinely conflate them. The top section, when present, is field data: real measurements from real Chrome users over the previous 28 days. The section below is lab data: one simulated load on a throttled mid-range device in a data centre.
Field data is the truth about your users but needs enough traffic to exist at all, so new sites usually have none. Lab data is available immediately and reproducible, which makes it good for comparing before and after a change, but it is a single synthetic run and it moves several points between identical tests. Do not read a two-point difference as a regression.
The headline performance score is a weighted composite of lab metrics. Chase the individual metrics; the score follows. Optimising for the score itself leads to strange decisions.
Fixing LCP
- Identify the LCP element — PageSpeed names it. It is almost always an image or a large text block near the top.
- If it is an image: serve it in WebP or AVIF, size it to the space it occupies rather than shipping a 3000px original, and do not lazy-load it. Lazy-loading the hero image is the most common self-inflicted LCP wound.
- Preload the LCP image, and preconnect to the origin it comes from if it is on a CDN.
- Eliminate render-blocking CSS and fonts above the fold. Inline critical CSS, and load webfonts with font-display: swap so text is visible immediately.
- Cut server response time. Anything above about 600ms to first byte puts LCP under pressure before rendering has even started; caching and a CDN usually solve it.
Fixing CLS — the ad-specific one
Layout shift is caused by content arriving after the page has drawn and pushing what is already there. On a monetised site, ad slots are the biggest culprit because their content is fetched asynchronously and its height is unknown until it arrives.
- Reserve a fixed minimum height for every ad container, matching the size you expect to serve. The space is then already there when the ad loads.
- Set explicit width and height attributes, or a CSS aspect-ratio, on every image and embed.
- Never insert content above existing content after load — cookie bars, notification banners and late-arriving headers all cause visible jumps. Overlay them instead.
- Load fonts with a matched fallback metric so text does not reflow when the webfont swaps in.
Fixing INP and TBT
- Ship less JavaScript. Audit your bundle for libraries used once, and for the analytics and widget scripts nobody remembers adding.
- Load third-party scripts with async or defer, and after your own content where possible. The AdSense loader is already async — keep it that way.
- Break long tasks up. A single 400ms function blocks every interaction while it runs.
- Avoid rendering enormous lists client-side; paginate or virtualise.
- On a content site, prefer server-rendered HTML. A page whose text only appears after a JavaScript bundle executes is slower for readers and thinner for crawlers.
Realistic expectations for an ad-supported site
Ad code is third-party JavaScript that fetches more third-party JavaScript. It will cost you performance points; a perfect 100 on a monetised page is not the target. What is achievable, and what matters, is a page whose content renders quickly and does not move once it has.
Aim for green LCP and CLS, keep TBT within reason, and accept that the composite score sits lower than an unmonetised page's. A reader does not experience a score; they experience whether the article was readable in two seconds and stayed still while they read it.
Frequently asked questions
- Does page speed affect AdSense approval?
- Not as a stated criterion. It shapes the review indirectly: a slow, shifting page makes the content harder to assess and the site look less maintained. It matters far more for revenue and rankings after approval.
- What is a good PageSpeed score?
- 90 or above is 'good', 50 to 89 needs improvement. For an ad-supported page, a mobile score in the 60s to 80s with green LCP and CLS is a realistic and healthy outcome.
- Why do my mobile and desktop scores differ so much?
- The mobile test simulates a throttled mid-range phone on a slow connection, while the desktop test assumes a fast machine and network. The gap is expected; mobile is the number to work on.
- Will ads ruin my Core Web Vitals?
- They will cost you some performance, but the damaging part — layout shift — is avoidable. Reserving fixed space for every ad slot removes most of the harm.
Check your own site
Run the free checker to see where your site stands on HTTPS, ads.txt, robots.txt, sitemap, viewport, policy pages, content depth and page speed.
Run the checker