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.

Critical Directly impacts CWV scores
High Significant measurable improvement
Medium Recommended best practice
Progress 0 / 66

Images

LCPCLS

Images are the LCP element on 70-80% of pages. Optimizing images typically has the highest performance ROI.

LCP image does NOT have loading="lazy" Critical

Lazy loading the LCP image delays its download by 200-500ms. Use fetchpriority="high" instead. Fix guide

at">
LCP image has fetchpriority="high" attribute Critical

Tells the browser to prioritize downloading this image above other resources.

All images have explicit width and height attributes Critical

Without dimensions, the browser cannot reserve space, causing layout shifts (CLS) when images load.

Images served in AVIF with WebP and JPEG fallbacks High

AVIF is 50% smaller than JPEG at equivalent quality. Use the <picture> element for format fallbacks. Fix guide

Responsive images use srcset with accurate sizes High

Without sizes, the browser downloads images sized for the full viewport width, wasting bandwidth on smaller screens.

LCP image is preloaded with <link rel="preload"> High

Preloading starts the download during HTML parsing instead of waiting for CSS/layout.

">
Below-fold images use loading="lazy" Medium

Defers downloading non-visible images until the user scrolls near them, saving initial bandwidth.

Images served from an edge CDN Medium

Reduces image delivery latency from 200-500ms (origin) to 10-50ms (edge node).

Hero images use <img> elements, not CSS background-image Medium

The browser discovers <img> elements during HTML parsing. CSS backgrounds are discovered later, after CSS is parsed.

Automated image optimization in build pipeline Medium

Ensures every image is optimized without relying on individual developers. Use Sharp or similar tools.

JavaScript

INPLCP

JavaScript is the primary bottleneck for INP and contributes to LCP through main thread blocking.

Initial JavaScript bundle under 200KB compressed Critical

Sites with initial bundles under 200KB are 3x more likely to have good INP scores. Fix guide

Route-based code splitting implemented Critical

Load only the JavaScript needed for the current page. Use React.lazy, dynamic imports, or framework-specific splitting.

Third-party scripts deferred with defer or async High

Analytics, chat, and tracking scripts should not block rendering. Fix guide

Heavy components lazy-loaded behind user interaction High

Charts, editors, modals, and PDF viewers should load only when the user needs them.

ES module imports used for tree-shakeable dependencies High

CommonJS (require) cannot be tree-shaken. Use import syntax and ESM-compatible packages.

Long tasks broken up with scheduler.yield() High

Tasks over 50ms block user interactions. Yield to the main thread between chunks of work.

Bundle analyzed with webpack-bundle-analyzer or source-map-explorer Medium

Visual treemaps reveal oversized dependencies and duplication opportunities.

Oversized dependencies replaced with lightweight alternatives Medium

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.

No render-blocking <script> tags in <head> Medium

Scripts in the head without defer or async block HTML parsing and rendering.

CSS

LCPCLS

Render-blocking CSS delays First Contentful Paint and LCP. Minimize CSS impact on the critical rendering path.

Critical CSS inlined in <head> High

The CSS needed for above-the-fold content should be inlined to avoid an extra network round-trip.

Non-critical CSS loaded asynchronously High

Use <link rel="preload" as="style"> with onload for below-fold styles.

CSS animations use transform and opacity only High

These properties are composited on the GPU. Animating width, height, or top triggers layout recalculations that cause CLS.

Unused CSS removed with PurgeCSS or framework equivalent Medium

Typical projects ship 80-95% unused CSS. Purging reduces stylesheet size dramatically.

CSS minified with cssnano or equivalent Medium

Removes whitespace, merges rules, and applies structural optimizations beyond basic minification.

No @import statements in CSS files Medium

CSS @import creates sequential request chains. Use build tools to concatenate stylesheets instead.

No layout-triggering CSS properties on animated elements Medium

Avoid animating width, height, margin, padding, or top/left/right/bottom in CSS transitions.

Fonts

CLSLCP

Web fonts are a hidden source of CLS and can delay LCP when they block text rendering.

All @font-face rules use font-display: swap Critical

Ensures text is visible immediately using fallback fonts instead of showing invisible text. Fix guide

Fallback fonts have size-adjust metric overrides High

Matches the fallback font dimensions to the custom font, eliminating visible layout shift during the swap.

Critical fonts preloaded (1-2 files max) High

Add <link rel="preload"> for above-the-fold font files to start the download early.

Fonts self-hosted instead of loaded from external CDN High

Eliminates extra DNS lookup and connection overhead to Google Fonts or other external origins.

Font files subsetted to include only needed characters Medium

Latin-only subsetting reduces font file size by 60-90% for fonts with large Unicode coverage.

Variable fonts used where possible Medium

One variable font file replaces multiple weight-specific files, reducing requests and total download size.

Font swaps batched using CSS Font Loading API Medium

Apply all font swaps in a single class toggle to consolidate multiple layout shifts into one frame.

Server and Caching

TTFBLCP

Server response time determines your TTFB floor, which directly impacts all other metrics.

Cache-Control headers set on all page types Critical

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.

Database queries optimized with indexes High

Missing indexes are the most common cause of slow server responses. Add indexes on frequently-queried columns.

N+1 query patterns eliminated High

Use eager loading (includes/joins) to fetch related data in a single query instead of one per row.

HTML served from edge CDN High

Reduces TTFB from 200-500ms (single origin) to 10-50ms (nearest edge node).

HTTP/2 or HTTP/3 enabled Medium

Multiplexed connections allow parallel asset loading without head-of-line blocking.

Gzip or Brotli compression enabled for text assets Medium

Brotli achieves 15-25% better compression than gzip for HTML, CSS, and JavaScript.

Service worker caching for repeat visits Medium

Pre-caches critical assets so repeat visits load from local cache instead of the network.

CDN cache hit rate above 90% Medium

Monitor cache hit ratio and tune cache keys to minimize unnecessary origin hits.

Core Web Vitals Targets

LCPCLSINP

The thresholds Google uses for ranking signals. All metrics should be in the 'Good' range at the 75th percentile.

LCP under 2.5 seconds (75th percentile) Critical

Largest Contentful Paint measures when the main content becomes visible. Test with field data from CrUX. LCP Guide

CLS under 0.1 (75th percentile) Critical

Cumulative Layout Shift measures visual stability. Audit with DevTools Layout Shift Regions. CLS Guide

INP under 200 milliseconds (75th percentile) Critical

Interaction to Next Paint measures responsiveness. Test by clicking, tapping, and typing on the page. INP Guide

TTFB under 800 milliseconds (75th percentile) High

Time to First Byte measures server responsiveness. While not a ranking metric directly, it affects all other metrics. TTFB Guide

FCP under 1.8 seconds High

First Contentful Paint measures when any content first appears. Fast FCP improves perceived performance.

All CWV metrics verified in field data (not just lab) Medium

Lab tests do not capture real-world network variability, device diversity, or third-party script impact. CrUX field data is authoritative.

Performance monitoring set up for ongoing tracking Medium

Regressions happen silently. Continuous monitoring catches issues before they affect rankings. Monitoring guide

HTML and Technical SEO

SEO

Proper HTML structure and meta tags help search engines and AI systems understand and rank your content.

Semantic HTML with proper heading hierarchy (h1 > h2 > h3) High

Search engines use heading structure to understand content organization. One h1 per page.

Meta description under 160 characters, unique per page High

Compelling descriptions improve click-through rates from search results.

Open Graph and Twitter Card meta tags on all pages High

Controls how content appears when shared on social media, improving click-through rates.

JSON-LD structured data (Article, HowTo, FAQ, etc.) High

Structured data enables rich results in search engines and improves AI citation accuracy.

Breadcrumb navigation with BreadcrumbList schema Medium

Helps users and search engines understand site hierarchy. Appears in search results.

Canonical URLs set on all pages Medium

Prevents duplicate content issues when pages are accessible via multiple URLs.

XML sitemap updated and submitted to Search Console Medium

Ensures search engines discover and index all pages. Include lastmod dates.

Internal links: minimum 3 per page to related content Medium

Internal links distribute authority and help search engines discover content.

All images have descriptive alt text Medium

Required for accessibility and provides image search optimization.

Accessibility and UX

UX

Accessibility is a quality signal and legal requirement. Good UX correlates with lower bounce rates and better rankings.

Color contrast ratios meet WCAG AA (4.5:1 for text) High

Insufficient contrast makes text unreadable for users with low vision.

All interactive elements are keyboard accessible High

Users who cannot use a mouse must be able to navigate via keyboard (Tab, Enter, Escape).

Focus styles visible on all interactive elements High

Users navigating by keyboard need to see which element is currently focused.

Skip navigation link for screen reader users Medium

Lets users jump past repetitive navigation to the main content.

ARIA labels on icon-only buttons Medium

Buttons without visible text need aria-label for screen reader users.

Responsive design works from 320px to 2560px+ Medium

Content should be readable and functional across all viewport sizes without horizontal scrolling.

Touch targets at least 44x44px on mobile Medium

Small tap targets cause frustration and missed interactions on touch devices.

Related resources

WebVitals.tools Editorial Team

This checklist is maintained by the WebVitals.tools team and updated monthly to reflect the latest best practices and browser capabilities. Last reviewed April 2026.

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.