The Complete Web Performance Checklist
A comprehensive, printable checklist covering every aspect of web performance optimization. Each item is prioritized by impact: critical items directly affect Core Web Vitals scores and search rankings, high-priority items provide significant measurable improvement, and medium-priority items round out a fully optimized site.
Use this checklist during development, code review, or periodic performance audits. Check items off as you complete them -- your progress is saved in your browser. Click "Print Checklist" for a clean printable version.
Images
LCPCLSImages are the LCP element on 70-80% of pages. Optimizing images typically has the highest performance ROI.
loading="lazy"
Critical
Lazy loading the LCP image delays its download by 200-500ms. Use fetchpriority="high" instead. Fix guide
fetchpriority="high" attribute
Critical
Tells the browser to prioritize downloading this image above other resources.
width and height attributes
Critical
Without dimensions, the browser cannot reserve space, causing layout shifts (CLS) when images load.
AVIF is 50% smaller than JPEG at equivalent quality. Use the <picture> element for format fallbacks. Fix guide
srcset with accurate sizes
High
Without sizes, the browser downloads images sized for the full viewport width, wasting bandwidth on smaller screens.
<link rel="preload">
High
Preloading starts the download during HTML parsing instead of waiting for CSS/layout.
loading="lazy"
Medium
Defers downloading non-visible images until the user scrolls near them, saving initial bandwidth.
Reduces image delivery latency from 200-500ms (origin) to 10-50ms (edge node).
<img> elements, not CSS background-image
Medium
The browser discovers <img> elements during HTML parsing. CSS backgrounds are discovered later, after CSS is parsed.
Ensures every image is optimized without relying on individual developers. Use Sharp or similar tools.
JavaScript
INPLCPJavaScript is the primary bottleneck for INP and contributes to LCP through main thread blocking.
Sites with initial bundles under 200KB are 3x more likely to have good INP scores. Fix guide
Load only the JavaScript needed for the current page. Use React.lazy, dynamic imports, or framework-specific splitting.
defer or async
High
Analytics, chat, and tracking scripts should not block rendering. Fix guide
Charts, editors, modals, and PDF viewers should load only when the user needs them.
CommonJS (require) cannot be tree-shaken. Use import syntax and ESM-compatible packages.
scheduler.yield()
High
Tasks over 50ms block user interactions. Yield to the main thread between chunks of work.
Visual treemaps reveal oversized dependencies and duplication opportunities.
moment.js (300KB) to dayjs (2KB), lodash to lodash-es, axios to native fetch.
sideEffects configured in package.json
Medium
Tells the bundler which files can be safely tree-shaken, enabling more aggressive dead code elimination.
<script> tags in <head>
Medium
Scripts in the head without defer or async block HTML parsing and rendering.
CSS
LCPCLSRender-blocking CSS delays First Contentful Paint and LCP. Minimize CSS impact on the critical rendering path.
<head>
High
The CSS needed for above-the-fold content should be inlined to avoid an extra network round-trip.
Use <link rel="preload" as="style"> with onload for below-fold styles.
transform and opacity only
High
These properties are composited on the GPU. Animating width, height, or top triggers layout recalculations that cause CLS.
Typical projects ship 80-95% unused CSS. Purging reduces stylesheet size dramatically.
Removes whitespace, merges rules, and applies structural optimizations beyond basic minification.
@import statements in CSS files
Medium
CSS @import creates sequential request chains. Use build tools to concatenate stylesheets instead.
Avoid animating width, height, margin, padding, or top/left/right/bottom in CSS transitions.
Fonts
CLSLCPWeb fonts are a hidden source of CLS and can delay LCP when they block text rendering.
@font-face rules use font-display: swap
Critical
Ensures text is visible immediately using fallback fonts instead of showing invisible text. Fix guide
size-adjust metric overrides
High
Matches the fallback font dimensions to the custom font, eliminating visible layout shift during the swap.
Add <link rel="preload"> for above-the-fold font files to start the download early.
Eliminates extra DNS lookup and connection overhead to Google Fonts or other external origins.
Latin-only subsetting reduces font file size by 60-90% for fonts with large Unicode coverage.
One variable font file replaces multiple weight-specific files, reducing requests and total download size.
Apply all font swaps in a single class toggle to consolidate multiple layout shifts into one frame.
Server and Caching
TTFBLCPServer response time determines your TTFB floor, which directly impacts all other metrics.
Static pages: s-maxage=3600, stale-while-revalidate=86400. Assets: max-age=31536000, immutable. Fix guide
stale-while-revalidate enabled for content pages
Critical
Serves cached responses immediately while refreshing in the background. Users always get fast responses.
Missing indexes are the most common cause of slow server responses. Add indexes on frequently-queried columns.
Use eager loading (includes/joins) to fetch related data in a single query instead of one per row.
Reduces TTFB from 200-500ms (single origin) to 10-50ms (nearest edge node).
Multiplexed connections allow parallel asset loading without head-of-line blocking.
Brotli achieves 15-25% better compression than gzip for HTML, CSS, and JavaScript.
Pre-caches critical assets so repeat visits load from local cache instead of the network.
Monitor cache hit ratio and tune cache keys to minimize unnecessary origin hits.
Core Web Vitals Targets
LCPCLSINPThe thresholds Google uses for ranking signals. All metrics should be in the 'Good' range at the 75th percentile.
Largest Contentful Paint measures when the main content becomes visible. Test with field data from CrUX. LCP Guide
Cumulative Layout Shift measures visual stability. Audit with DevTools Layout Shift Regions. CLS Guide
Interaction to Next Paint measures responsiveness. Test by clicking, tapping, and typing on the page. INP Guide
Time to First Byte measures server responsiveness. While not a ranking metric directly, it affects all other metrics. TTFB Guide
First Contentful Paint measures when any content first appears. Fast FCP improves perceived performance.
Lab tests do not capture real-world network variability, device diversity, or third-party script impact. CrUX field data is authoritative.
Regressions happen silently. Continuous monitoring catches issues before they affect rankings. Monitoring guide
HTML and Technical SEO
SEOProper HTML structure and meta tags help search engines and AI systems understand and rank your content.
Search engines use heading structure to understand content organization. One h1 per page.
Compelling descriptions improve click-through rates from search results.
Controls how content appears when shared on social media, improving click-through rates.
Structured data enables rich results in search engines and improves AI citation accuracy.
Helps users and search engines understand site hierarchy. Appears in search results.
Prevents duplicate content issues when pages are accessible via multiple URLs.
Ensures search engines discover and index all pages. Include lastmod dates.
Internal links distribute authority and help search engines discover content.
Required for accessibility and provides image search optimization.
Accessibility and UX
UXAccessibility is a quality signal and legal requirement. Good UX correlates with lower bounce rates and better rankings.
Insufficient contrast makes text unreadable for users with low vision.
Users who cannot use a mouse must be able to navigate via keyboard (Tab, Enter, Escape).
Users navigating by keyboard need to see which element is currently focused.
Lets users jump past repetitive navigation to the main content.
Buttons without visible text need aria-label for screen reader users.
Content should be readable and functional across all viewport sizes without horizontal scrolling.
Small tap targets cause frustration and missed interactions on touch devices.
Related resources
50 Best Performance Tools
Comprehensive directory of tools for testing, monitoring, and optimizing web performance.
TutorialHow to Measure CWV
Step-by-step guide to measuring Core Web Vitals with field and lab tools.
ToolCWV Score Explainer
Enter your scores to get prioritized fix recommendations.
FixesAll Performance Fixes
Framework-specific and issue-specific fix guides with code examples.
Frequently asked questions
How do I use this performance checklist?
Work top-to-bottom on a single page or template at a time. Each section maps to a Core Web Vital or a diagnostic metric (LCP, INP, CLS, TTFB), and within each section the items are ordered by impact. Re-measure with PageSpeed Insights or web-vitals.js after each fix so you can attribute improvements correctly.
Which checklist items have the biggest impact on Core Web Vitals?
For LCP: preloading the hero image, eliminating render-blocking CSS, and self-hosting fonts. For INP: breaking up long tasks, deferring third-party scripts, and using passive event listeners. For CLS: setting explicit width and height on images, reserving space for ads and embeds, and avoiding inserting content above existing DOM.
Do I need to do every item on the checklist?
No. Run a baseline measurement first, identify which Core Web Vital is failing, and only work the relevant section. Most sites only fail one or two metrics; doing every item on a passing site is wasted effort and can introduce regressions in other areas.
How often should I re-run the checklist?
Quarterly for stable sites, monthly during active development, and after every major template or framework upgrade. Checklist drift is real -- a deploy that passes CI may still regress LCP if a new font or image format is shipped without coordination.