Audit Speed
Deep Core Web Vitals audit with root-cause analysis trees and resource
optimization recommendations.
Core Web Vitals Thresholds
| Metric |
Good |
Needs Improvement |
Poor |
| LCP (Largest Contentful Paint) |
< 2.5s |
2.5s - 4.0s |
> 4.0s |
| CLS (Cumulative Layout Shift) |
< 0.1 |
0.1 - 0.25 |
> 0.25 |
| INP (Interaction to Next Paint) |
< 200ms |
200ms - 500ms |
> 500ms |
| FCP (First Contentful Paint) |
< 1.8s |
1.8s - 3.0s |
> 3.0s |
| TTFB (Time to First Byte) |
< 800ms |
800ms - 1800ms |
> 1800ms |
Before You Start
Gather this context:
- Which pages? Homepage, key landing pages, or specific slow pages.
- Current scores. If the user has Lighthouse or PageSpeed Insights data, start there.
- Tech stack. CMS, framework, hosting — this determines which optimizations are available.
- Known constraints. Third-party scripts they can't remove, design requirements that limit optimization.
If no data is available, suggest running Google PageSpeed Insights on the key URLs.
LCP Root-Cause Tree
LCP measures when the largest visible element finishes rendering. Diagnose:
Is TTFB slow (> 800ms)?
- → Server response time issue
- Check: hosting quality, CDN configuration, database queries, server-side rendering time
- Fix: upgrade hosting, add CDN, optimize server-side code, enable caching
Is the LCP element an image?
- → Image optimization issue
- Check: image format (use WebP/AVIF), image size (serve responsive sizes), lazy loading on LCP image (should NOT be lazy loaded)
- Fix: convert to modern formats, add
width/height attributes, use fetchpriority="high" on LCP image, preload the LCP image
Is the LCP element text?
- → Font loading issue
- Check: custom fonts blocking render, font file size, font-display strategy
- Fix: use
font-display: swap or optional, preload critical fonts, subset fonts to used characters
Is render-blocking CSS/JS delaying the LCP?
- Check: large CSS files in
<head>, synchronous JS before content
- Fix: inline critical CSS, defer non-critical CSS, async/defer JS
CLS Root-Cause Tree
CLS measures unexpected layout shifts. Diagnose:
Do images/videos lack dimensions?
- → Browser can't reserve space before loading
- Fix: add
width and height attributes to all <img> and <video> elements, use CSS aspect-ratio
Do ads or embeds inject content?
- → Dynamic content pushing existing content down
- Fix: reserve space for ad slots with min-height, use
contain-intrinsic-size for lazy content
Do fonts cause text reflow?
- → FOUT (Flash of Unstyled Text) causes layout shift when custom font loads
- Fix: use
font-display: optional (no swap = no shift), or match fallback font metrics
Does dynamic content insert above the fold?
- → Banners, cookie notices, notifications pushing content
- Fix: use overlays instead of inline insertions, or reserve space with fixed-height containers
INP Root-Cause Tree
INP measures responsiveness to user interactions. Diagnose:
Is the main thread blocked by long tasks?
- Check: JavaScript execution time, third-party scripts, large DOM
- Fix: break long tasks with
requestIdleCallback or setTimeout, code-split heavy modules
Do event handlers do heavy synchronous work?
- Check: click handlers that trigger large DOM updates, form validation on every keystroke
- Fix: debounce inputs, use requestAnimationFrame for visual updates, offload work to web workers
Are third-party scripts competing for the main thread?
- Check: analytics, chat widgets, A/B testing tools, social embeds
- Fix: defer loading until after interaction, use
loading="lazy" for embeds, consider removing low-value scripts
Resource Analysis
Break down the total page weight:
| Resource Type |
Size |
Assessment |
Action |
| HTML |
[x] KB |
[ok/large] |
Compress, reduce inline styles/scripts |
| CSS |
[x] KB |
[ok/large] |
Remove unused CSS, minify, critical CSS extraction |
| JavaScript |
[x] KB |
[ok/large] |
Code-split, tree-shake, defer non-critical |
| Images |
[x] KB |
[ok/large] |
Modern formats, responsive sizes, lazy load below fold |
| Fonts |
[x] KB |
[ok/large] |
Subset, limit families/weights, preload critical |
| Third-party |
[x] KB |
[ok/large] |
Audit necessity, defer, self-host if possible |
Benchmarks:
- Total page weight under 1.5 MB is good
- JavaScript under 300 KB (compressed) for most sites
- CSS under 100 KB (compressed)
- First-party fonts under 100 KB
Output Format
Speed Audit: [URL or domain]
Core Web Vitals
| Metric |
Value |
Rating |
Root Cause |
| LCP |
[value] |
Good / Needs Improvement / Poor |
[identified cause] |
| CLS |
[value] |
... |
... |
| INP |
[value] |
... |
... |
| FCP |
[value] |
... |
... |
| TTFB |
[value] |
... |
... |
Resource Breakdown
[Table from Resource Analysis]
Priority Fixes
For each failing metric, ordered by impact:
[Metric]: [Root cause]
- Current: [value]
- Target: [threshold]
- Fix: [specific action]
- Estimated impact: [high/medium/low]
...
Quick Wins
List optimizations that require minimal effort:
Pro Tip: Use the free CWV Impact Calculator
to estimate the traffic impact of fixing Core Web Vitals, and the
Critical CSS Generator to extract
above-the-fold CSS. SEOJuice MCP users can run /seojuice:page-audit [domain] [url] for
instant CWV scores, Lighthouse data, and resource breakdowns.
1---2name: audit-speed3description: Deep Core Web Vitals and page speed audit. Use when the user asks about page speed, Core Web Vitals, LCP, CLS, INP, FCP, TTFB, Lighthouse scores, why a page is slow, performance optimization, or resource size analysis. For broader technical SEO issues, see diagnose-seo.4---56# Audit Speed78Deep Core Web Vitals audit with root-cause analysis trees and resource9optimization recommendations.1011## Core Web Vitals Thresholds1213| Metric | Good | Needs Improvement | Poor |14|--------|------|-------------------|------|15| LCP (Largest Contentful Paint) | < 2.5s | 2.5s - 4.0s | > 4.0s |16| CLS (Cumulative Layout Shift) | < 0.1 | 0.1 - 0.25 | > 0.25 |17| INP (Interaction to Next Paint) | < 200ms | 200ms - 500ms | > 500ms |18| FCP (First Contentful Paint) | < 1.8s | 1.8s - 3.0s | > 3.0s |19| TTFB (Time to First Byte) | < 800ms | 800ms - 1800ms | > 1800ms |2021## Before You Start2223Gather this context:24251. **Which pages?** Homepage, key landing pages, or specific slow pages.262. **Current scores.** If the user has Lighthouse or PageSpeed Insights data, start there.273. **Tech stack.** CMS, framework, hosting — this determines which optimizations are available.284. **Known constraints.** Third-party scripts they can't remove, design requirements that limit optimization.2930If no data is available, suggest running Google PageSpeed Insights on the key URLs.3132## LCP Root-Cause Tree3334LCP measures when the largest visible element finishes rendering. Diagnose:3536**Is TTFB slow (> 800ms)?**37- → Server response time issue38- Check: hosting quality, CDN configuration, database queries, server-side rendering time39- Fix: upgrade hosting, add CDN, optimize server-side code, enable caching4041**Is the LCP element an image?**42- → Image optimization issue43- Check: image format (use WebP/AVIF), image size (serve responsive sizes), lazy loading on LCP image (should NOT be lazy loaded)44- Fix: convert to modern formats, add `width`/`height` attributes, use `fetchpriority="high"` on LCP image, preload the LCP image4546**Is the LCP element text?**47- → Font loading issue48- Check: custom fonts blocking render, font file size, font-display strategy49- Fix: use `font-display: swap` or `optional`, preload critical fonts, subset fonts to used characters5051**Is render-blocking CSS/JS delaying the LCP?**52- Check: large CSS files in `<head>`, synchronous JS before content53- Fix: inline critical CSS, defer non-critical CSS, async/defer JS5455## CLS Root-Cause Tree5657CLS measures unexpected layout shifts. Diagnose:5859**Do images/videos lack dimensions?**60- → Browser can't reserve space before loading61- Fix: add `width` and `height` attributes to all `<img>` and `<video>` elements, use CSS `aspect-ratio`6263**Do ads or embeds inject content?**64- → Dynamic content pushing existing content down65- Fix: reserve space for ad slots with min-height, use `contain-intrinsic-size` for lazy content6667**Do fonts cause text reflow?**68- → FOUT (Flash of Unstyled Text) causes layout shift when custom font loads69- Fix: use `font-display: optional` (no swap = no shift), or match fallback font metrics7071**Does dynamic content insert above the fold?**72- → Banners, cookie notices, notifications pushing content73- Fix: use overlays instead of inline insertions, or reserve space with fixed-height containers7475## INP Root-Cause Tree7677INP measures responsiveness to user interactions. Diagnose:7879**Is the main thread blocked by long tasks?**80- Check: JavaScript execution time, third-party scripts, large DOM81- Fix: break long tasks with `requestIdleCallback` or `setTimeout`, code-split heavy modules8283**Do event handlers do heavy synchronous work?**84- Check: click handlers that trigger large DOM updates, form validation on every keystroke85- Fix: debounce inputs, use requestAnimationFrame for visual updates, offload work to web workers8687**Are third-party scripts competing for the main thread?**88- Check: analytics, chat widgets, A/B testing tools, social embeds89- Fix: defer loading until after interaction, use `loading="lazy"` for embeds, consider removing low-value scripts9091## Resource Analysis9293Break down the total page weight:9495| Resource Type | Size | Assessment | Action |96|---|---|---|---|97| HTML | [x] KB | [ok/large] | Compress, reduce inline styles/scripts |98| CSS | [x] KB | [ok/large] | Remove unused CSS, minify, critical CSS extraction |99| JavaScript | [x] KB | [ok/large] | Code-split, tree-shake, defer non-critical |100| Images | [x] KB | [ok/large] | Modern formats, responsive sizes, lazy load below fold |101| Fonts | [x] KB | [ok/large] | Subset, limit families/weights, preload critical |102| Third-party | [x] KB | [ok/large] | Audit necessity, defer, self-host if possible |103104**Benchmarks:**105- Total page weight under 1.5 MB is good106- JavaScript under 300 KB (compressed) for most sites107- CSS under 100 KB (compressed)108- First-party fonts under 100 KB109110## Output Format111112### Speed Audit: [URL or domain]113114**Core Web Vitals**115116| Metric | Value | Rating | Root Cause |117|--------|-------|--------|------------|118| LCP | [value] | Good / Needs Improvement / Poor | [identified cause] |119| CLS | [value] | ... | ... |120| INP | [value] | ... | ... |121| FCP | [value] | ... | ... |122| TTFB | [value] | ... | ... |123124**Resource Breakdown**125[Table from Resource Analysis]126127**Priority Fixes**128129For each failing metric, ordered by impact:1301311. **[Metric]: [Root cause]**132 - Current: [value]133 - Target: [threshold]134 - Fix: [specific action]135 - Estimated impact: [high/medium/low]1361372. ...138139**Quick Wins**140List optimizations that require minimal effort:141- [ ] Add `width`/`height` to images142- [ ] Set `fetchpriority="high"` on LCP image143- [ ] Defer non-critical JavaScript144- [ ] ...145146---147148> **Pro Tip:** Use the free [CWV Impact Calculator](https://seojuice.com/tools/cwv-impact/)149> to estimate the traffic impact of fixing Core Web Vitals, and the150> [Critical CSS Generator](https://seojuice.com/tools/critical-css-generator/) to extract151> above-the-fold CSS. SEOJuice MCP users can run `/seojuice:page-audit [domain] [url]` for152> instant CWV scores, Lighthouse data, and resource breakdowns.