Page Speed Optimization: The Complete Guide for 2026
By Rome Thorndike
Why Page Speed Matters More Than Ever
Page speed is not a vanity metric. It is a ranking factor, a conversion factor, and a user experience factor. In 2026, Google's Core Web Vitals are established ranking signals. Sites that pass all three thresholds get a measurable boost in competitive search categories. Sites that fail lose positions to faster competitors.
The data is clear. Google's research shows that 53% of mobile visits are abandoned if a page takes longer than 3 seconds to load. Every additional second costs roughly 7% in conversions. For an e-commerce site doing $1 million in annual revenue, a 1-second improvement in load time is worth $70,000 per year.
For service businesses, the math is different but the direction is the same. A law firm generating 50 leads per month from organic search loses 3-4 leads per month if their site loads in 4 seconds instead of 2. At $5,000 per client, that is $15,000-20,000 in lost annual revenue from slow page loads alone.
Speed also compounds through SEO. Faster sites get better Core Web Vitals scores, which contribute to higher rankings, which drive more traffic, which generates more conversions. Slower sites enter a negative cycle: poor vitals, lower rankings, less traffic, fewer conversions.
This guide covers everything: what to measure, what to fix, which fixes have the highest impact, and when optimization is not enough and a rebuild is the right answer.
Understanding Core Web Vitals
Google uses three Core Web Vitals metrics as ranking signals. Understanding what each measures is the foundation of any speed optimization effort.
Largest Contentful Paint (LCP)
LCP measures how long it takes for the largest visible element on the page to render. This is usually a hero image, a large heading, or a video poster image. Google's threshold: under 2.5 seconds is "good," 2.5-4 seconds "needs improvement," over 4 seconds is "poor."
LCP is the metric most sites fail on mobile. The typical causes: large unoptimized images, slow server response times (high TTFB), render-blocking CSS and JavaScript, and client-side rendering that delays content visibility.
To check your LCP: open PageSpeed Insights, enter your URL, and look at the LCP value in the mobile results. If it is over 2.5 seconds, you have work to do.
Interaction to Next Paint (INP)
INP replaced First Input Delay (FID) in March 2024. It measures the responsiveness of the page to user interactions (clicks, taps, key presses). Specifically, it tracks the delay between the user's interaction and the next visual update on screen.
Google's threshold: under 200ms is "good," 200-500ms "needs improvement," over 500ms is "poor."
INP failures are caused by heavy JavaScript execution that blocks the main thread. If the browser is busy parsing and executing JavaScript when the user taps a button, the response is delayed. This is why sites with large JavaScript frameworks (React, Angular, Vue) often fail INP on mobile devices with slower processors.
Cumulative Layout Shift (CLS)
CLS measures visual stability. It tracks how much the page layout shifts unexpectedly during loading. A CLS score of 0 means nothing moves. A score of 0.25 means elements shifted significantly.
Google's threshold: under 0.1 is "good," 0.1-0.25 "needs improvement," over 0.25 is "poor."
CLS problems come from: images without explicit width/height attributes (the browser does not know how much space to reserve), dynamically injected content (ads, embeds, cookie banners), and web fonts that cause text to reflow when they load (FOUT/FOIT).
How Vitals Affect Rankings
Core Web Vitals are not the most important ranking factor. Content relevance, backlinks, and search intent still dominate. But vitals are a tiebreaker. When two pages are equally relevant for a query, the one with better vitals ranks higher.
In competitive niches (local services, e-commerce, SaaS) where multiple sites have similar content and authority, the speed advantage is measurable. We have seen clients gain 5-15 ranking positions within 6 weeks of improving their Core Web Vitals from "poor" to "good." Read more about vitals in our Core Web Vitals explainer.
How to Measure Page Speed
Before optimizing, you need accurate measurements. Different tools measure different things. Here is what to use and when.
Google PageSpeed Insights
PageSpeed Insights is the primary tool. It runs a Lighthouse audit on your page and returns a performance score (0-100) plus detailed metrics. The mobile test simulates a mid-range phone on a 4G connection, which is the environment Google uses for ranking signals.
Key numbers to record: Performance score, LCP, TBT (Total Blocking Time, which correlates with INP), CLS, Speed Index, and First Contentful Paint (FCP). Run the test 3 times and average the results, as scores fluctuate by 3-5 points between runs.
Google Search Console
Search Console shows your Core Web Vitals as Google's crawler experiences them in the real world (field data from Chrome users). This is the data Google actually uses for rankings, not the lab data from PageSpeed Insights. Check the Core Web Vitals report to see which pages pass and fail.
Chrome DevTools
For diagnosing specific issues, open Chrome DevTools (F12), go to the Performance tab, and record a page load. The waterfall chart shows exactly what loads, when, and how long each resource takes. The Network tab shows every HTTP request with file sizes and timing. This is where you find the specific resources that slow your page.
WebPageTest
WebPageTest provides the most detailed analysis. It shows filmstrip views (visual progression of page load), waterfall charts, and connection-level timing. It can test from multiple locations and device types. Use it for deep diagnosis of complex performance problems.
For a comparison of these tools, read our PageSpeed Insights vs GTmetrix vs WebPageTest comparison.
Image Optimization: The Highest-Impact Fix
Images are the single largest contributor to slow page loads on most websites. Fixing images alone can improve your PageSpeed score by 15-30 points. Start here.
Use Modern Formats (WebP and AVIF)
WebP is 25-35% smaller than JPEG at the same visual quality. AVIF is 30-50% smaller. Both are supported by all modern browsers (Chrome, Firefox, Safari, Edge). If your images are still in JPEG or PNG, converting to WebP is the single highest-impact change you can make.
Implementation: use the <picture> element with WebP as the primary source and JPEG as the fallback:
<picture>
<source srcset="hero.webp" type="image/webp">
<img src="hero.jpg" alt="Description" width="1200" height="600">
</picture>
For build systems, tools like Sharp (Node.js) or Pillow (Python) can batch-convert images during the build process. We convert all images at build time for our client sites.
Responsive Images with srcset
A hero image displayed at 1200px wide on desktop does not need to be 1200px wide on a 375px mobile screen. The srcset attribute tells the browser which image size to download based on the device screen:
<img
srcset="hero-400.webp 400w, hero-800.webp 800w, hero-1200.webp 1200w"
sizes="(max-width: 600px) 400px, (max-width: 1000px) 800px, 1200px"
src="hero-1200.webp"
alt="Description"
width="1200" height="600">
This reduces mobile image payloads by 50-75%. A 1200px image at 150KB becomes a 400px image at 30KB on mobile. The visual quality is identical because the image matches the display resolution.
Lazy Loading Below-the-Fold Images
Images below the visible viewport should not load until the user scrolls near them. Native lazy loading is one attribute:
<img src="photo.webp" alt="Description" loading="lazy" width="600" height="400">
Do NOT lazy-load the hero image or any image visible in the initial viewport. Those need to load immediately for a fast LCP. Only lazy-load images that are below the fold.
Explicit Width and Height
Always include width and height attributes on every <img> tag. Without them, the browser does not know how much space to reserve, causing layout shift (CLS) when the image loads and pushes content down.
This is the most common cause of CLS failures and the easiest to fix. Add the actual dimensions of the image. CSS can still make it responsive with max-width: 100%; height: auto;.
Image Compression
After format conversion and resizing, compress images to the minimum quality that looks good. For WebP, quality 75-80 is visually identical to JPEG quality 85-90 at a smaller file size. For hero images, quality 80 is sufficient. For thumbnails, quality 70 works.
Target file sizes: hero images under 100KB, content images under 50KB, thumbnails under 20KB. If any single image exceeds 200KB, it needs attention.
Eliminating Render-Blocking Resources
Render-blocking resources are CSS and JavaScript files that prevent the browser from displaying any content until they finish loading. They are the second highest-impact fix after images.
Identify Render-Blocking Resources
In PageSpeed Insights, look for the "Eliminate render-blocking resources" opportunity. It lists every CSS and JavaScript file that blocks rendering. In Chrome DevTools, the Performance tab shows these as long blue (CSS) and yellow (JavaScript) bars at the top of the waterfall.
Inline Critical CSS
Critical CSS is the CSS needed to render the visible viewport (above-the-fold content). Inlining it directly in the <head> eliminates the round trip to fetch an external CSS file. The browser can start rendering immediately.
For small sites (under 50KB of total CSS), inlining all CSS in the HTML is practical and eliminates the render-blocking request entirely. For larger sites, tools like Critical (npm package) can extract above-the-fold CSS automatically.
Defer Non-Critical CSS
CSS for below-the-fold content, print styles, and component-specific styles can be loaded asynchronously:
<link rel="preload" href="styles.css" as="style" onload="this.onload=null;this.rel='stylesheet'">
<noscript><link rel="stylesheet" href="styles.css"></noscript>
This lets the browser download the CSS without blocking rendering. The page displays with critical CSS first, then applies the full stylesheet when it arrives.
Defer JavaScript
Most JavaScript on a marketing site is not needed for initial render. Add the defer attribute to script tags:
<script src="main.js" defer></script>
defer tells the browser to download the script in parallel but execute it after the HTML is parsed. This eliminates JavaScript as a render-blocking resource while maintaining execution order.
For third-party scripts (analytics, chat widgets, tracking pixels), use async or load them after the page's DOMContentLoaded event. These scripts do not need to block anything.
Reduce Total JavaScript
The best JavaScript is no JavaScript. Audit every script on your page:
- Do you still use that jQuery library? Modern CSS and vanilla JavaScript replace most jQuery use cases.
- Is the chat widget loaded on every page or just the pages where users need it?
- Are you loading the full Bootstrap framework for a single component?
- Does your analytics setup load multiple tracking scripts that could be consolidated?
Every KB of JavaScript has a cost: download time, parse time, compile time, and execution time. On a mid-range mobile phone, 100KB of JavaScript takes 200-400ms to parse and execute. A site with 500KB of JavaScript spends 1-2 seconds just processing scripts before the page becomes interactive.
Server Response Time (TTFB)
Time to First Byte (TTFB) measures how long it takes for the server to respond to a request. It is the starting point of every page load. If your server takes 800ms to respond, nothing else can start until that 800ms passes.
What Causes Slow TTFB
- Shared hosting: Your site shares CPU and memory with hundreds of other sites. When other sites get traffic spikes, your server response slows down. TTFB on shared hosting: 200-1,000ms.
- Database queries: CMS platforms (WordPress, Drupal) query a database on every page load. Complex queries, unindexed tables, and large databases slow response times. TTFB with database overhead: 200-800ms.
- Server-side processing: PHP execution (WordPress), template rendering, and middleware processing add time before the response is ready. TTFB with heavy processing: 300-1,200ms.
- Geographic distance: If your server is in Virginia and your visitor is in California, the data travels 2,500 miles each way. At the speed of light through fiber, that is 25ms of latency per round trip. Multiply by 3-5 round trips for a typical page load.
How to Improve TTFB
Upgrade hosting. Move from shared to managed or VPS hosting. Expected improvement: 200-500ms.
Add server-side caching. Cache the fully rendered HTML so the server skips database queries and processing on repeat requests. WordPress caching plugins (WP Rocket, LiteSpeed Cache) do this. Expected improvement: 300-700ms.
Use a CDN. A Content Delivery Network caches your pages on servers worldwide. The visitor gets the page from the nearest server instead of your origin. Cloudflare (free tier) reduces TTFB to 20-50ms for cached pages.
Go static. Static HTML sites served from a CDN have a TTFB of 10-30ms. There is no database, no server processing, and no server-side code. The CDN serves a pre-built file from the nearest edge location. This is the fastest possible TTFB.
Target TTFB: under 200ms. Under 100ms is excellent. Over 600ms needs immediate attention.
Font Optimization
Web fonts are a common source of performance problems. A poorly loaded font can add 500ms to your page load and cause visible text flash (FOUT) or invisible text (FOIT).
Use font-display: swap
The font-display: swap CSS property tells the browser to show text immediately in a fallback font, then swap to the custom font when it loads. This prevents invisible text during font loading:
@font-face {
font-family: 'Inter';
src: url('inter.woff2') format('woff2');
font-display: swap;
}
Self-Host Fonts
Loading fonts from Google Fonts requires a DNS lookup to fonts.googleapis.com, a CSS file download, and then the font file download. That is 3 round trips. Self-hosting the font file eliminates 2 of those round trips.
Download the WOFF2 file from Google Webfonts Helper, host it on your domain, and reference it directly in your CSS. One round trip instead of three.
Preload Key Fonts
For the primary body or heading font, use preload to tell the browser to start downloading it immediately:
<link rel="preload" href="/fonts/inter.woff2" as="font" type="font/woff2" crossorigin>
This moves font loading earlier in the waterfall, reducing the time before the font is available for rendering.
Limit Font Variations
Each font weight and style is a separate file. Loading Inter Regular, Bold, and Italic is 3 files (60-90KB total). Loading Regular, Medium, SemiBold, Bold, and Italic is 5 files (100-150KB). Use only the weights your design actually requires. Two to three weights cover most designs.
Use Variable Fonts
Variable fonts contain all weights in a single file. Inter Variable is one 100KB file that replaces multiple static files. The total download is often smaller than loading 3-4 individual weight files, and you get access to every weight value (not just 400, 700).
Caching Strategy
Caching tells browsers and CDNs to reuse previously downloaded resources instead of requesting them again. Proper caching can make subsequent page loads nearly instant.
Browser Caching (Cache-Control Headers)
Set Cache-Control headers on your static assets (CSS, JavaScript, images, fonts) with a long max-age:
Cache-Control: public, max-age=31536000, immutable
This tells the browser to cache the file for 1 year and never revalidate it. When the visitor returns or navigates to another page, the browser uses the cached file instantly.
For HTML pages, use shorter cache times or no caching to ensure visitors always get the latest content:
Cache-Control: public, max-age=3600
To bust the cache when CSS or JavaScript changes, use versioned filenames (styles.css?v=9) or content hashes (styles.a1b2c3.css). When the filename changes, the browser treats it as a new file.
CDN Caching
A CDN (Cloudflare, Fastly, AWS CloudFront) caches your pages at edge servers worldwide. The first visitor triggers a cache miss (the CDN fetches from your origin server). Every subsequent visitor in the same region gets the cached version instantly.
For static sites, the CDN is the only infrastructure you need. GitHub Pages, Cloudflare Pages, and Netlify all include global CDN distribution for free. TTFB from a CDN edge: 10-30ms regardless of where the visitor is located.
Service Worker Caching
For sites that need offline capability or ultra-fast repeat visits, a service worker can cache pages and assets locally. The service worker intercepts network requests and serves cached responses when available. This makes repeat page loads nearly instant (under 50ms).
Service workers add complexity and are not necessary for most marketing sites. They are most valuable for web apps, documentation sites, and content-heavy sites where users browse multiple pages per session.
The Platform Problem: WordPress, Webflow, and Squarespace
The optimization techniques above work on any platform. But the platform itself sets a performance ceiling that no amount of optimization can exceed. Understanding these ceilings helps you decide whether to optimize or rebuild.
WordPress: Ceiling of 75-85
A fully optimized WordPress site (lightweight theme, minimal plugins, server-side caching, CDN, optimized images) can reach 75-85 on mobile PageSpeed. Getting above 85 requires removing most plugins and using a developer-grade theme, which negates the ease-of-use benefit that justified choosing WordPress.
The floor is set by: PHP execution (50-200ms), database queries (50-400ms), and plugin JavaScript/CSS that loads globally. Even with caching, the browser-side overhead from plugins cannot be eliminated without removing the plugins.
Read our deep dive on why WordPress is slow for the full technical breakdown.
Webflow: Ceiling of 80-85
Webflow's ceiling is slightly higher than WordPress because it produces cleaner code. But the webflow.js runtime (70-120KB), platform CSS (150-400KB), and Webflow analytics load on every page regardless of optimization.
A fully optimized Webflow site (compressed images, minimal interactions, no CMS) can reach 80-85 on mobile. Most Webflow sites land at 55-75. See why Webflow sites score low.
Squarespace: Ceiling of 65-70
Squarespace has the lowest ceiling because you cannot control the rendering pipeline. The platform loads its full JavaScript framework, font system, and analytics on every page. Even a single-page site carries the overhead of the entire Squarespace platform. Optimization options are limited to image compression and content reduction.
Static HTML: No Ceiling
Static HTML sites have no platform overhead. The performance ceiling is 100 (we consistently hit 95-99 on mobile). There is no CMS, no framework, no runtime. The only factors affecting score are your CSS size, JavaScript size, and image optimization, all of which you control completely.
If your WordPress site is at 65 and you need 90+, optimization can get you to 75-80 but not further. The gap from 80 to 90+ requires changing the architecture, not tweaking the existing one. Our migration service starts at $2,500 for WordPress and $3,000 for Webflow.
Advanced Optimization: Preloading, Prefetching, and Resource Hints
Once the basics are covered (images, render-blocking resources, caching, TTFB), resource hints provide incremental improvements.
Preload Critical Resources
<link rel="preload"> tells the browser to start downloading a resource immediately, before it discovers it in the HTML. Use for: the primary font file, the hero image, and critical CSS if loaded externally.
<link rel="preload" href="/fonts/inter-var.woff2" as="font" type="font/woff2" crossorigin>
<link rel="preload" href="/images/hero.webp" as="image">
Do not preload everything. Preloading too many resources competes for bandwidth and can slow down the critical rendering path. Limit preloads to 2-3 critical resources.
DNS Prefetch for Third-Party Domains
If your page loads resources from third-party domains (Google Analytics, fonts, CDN), DNS prefetch resolves the domain name early:
<link rel="dns-prefetch" href="https://www.googletagmanager.com">
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
This saves 50-100ms per third-party domain by resolving DNS before the resource is requested.
Preconnect to Critical Third Parties
preconnect goes further than DNS prefetch by also establishing the TCP connection and TLS handshake early:
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
This saves 100-200ms for the first request to that domain. Use for domains that deliver critical resources (fonts, CDN). Limit to 2-3 preconnects to avoid consuming connection slots.
Fetchpriority for the Hero Image
The fetchpriority attribute tells the browser to prioritize downloading a specific resource:
<img src="hero.webp" alt="Description" fetchpriority="high" width="1200" height="600">
This is especially useful for LCP optimization. The hero image is usually the LCP element. Giving it high fetch priority ensures the browser downloads it before less important resources.
Third-Party Script Management
Third-party scripts (analytics, tracking, chat widgets, social embeds, A/B testing tools) are the silent performance killers on most websites. They run code you do not control on your domain.
Audit Your Third-Party Scripts
Open Chrome DevTools, go to the Network tab, and filter by "Third-party." Count the requests and measure the total download size. Common offenders:
| Script | Typical Size | Impact |
|---|---|---|
| Google Tag Manager | 30-80KB + tags | Loads additional scripts dynamically |
| Google Analytics (GA4) | 40-50KB | Low impact if loaded correctly |
| Facebook Pixel | 60-80KB | Moderate impact, loads additional resources |
| Intercom / Drift / HubSpot chat | 200-400KB | High impact, loads on every page |
| Hotjar / FullStory | 50-100KB | Records sessions, adds CPU overhead |
| Optimizely / VWO | 80-150KB | Render-blocking for A/B tests |
A site with Google Tag Manager, GA4, Facebook Pixel, Intercom, and Hotjar loads 380-660KB of third-party JavaScript. That is more than most entire static websites.
Load Third-Party Scripts After Page Load
Most third-party scripts do not need to run during initial page load. Load them after the DOMContentLoaded event or on user interaction (first scroll, first click):
document.addEventListener('DOMContentLoaded', function() {
// Load analytics after page renders
var script = document.createElement('script');
script.src = 'https://www.googletagmanager.com/gtag/js?id=G-XXXXX';
script.async = true;
document.head.appendChild(script);
});
Remove What You Do Not Use
Audit every third-party script quarterly. Ask: "Are we looking at this data? Is this tool still active? When was the last time someone checked this dashboard?" If the answer is "never" or "I do not know," remove the script. Every removed script improves page speed with zero effort.
The most impactful removal is usually the chat widget. If fewer than 1% of visitors use it, replacing it with a contact page link saves 200-400KB on every page load for the 99% who do not use it.
CSS Optimization
CSS optimization has less impact than images and JavaScript but still matters, especially for LCP and FCP (First Contentful Paint).
Remove Unused CSS
Most websites load CSS for components that do not appear on the current page. A WordPress site with a page builder typically loads 200-500KB of CSS, of which 60-80% is unused on any given page.
Tools like PurgeCSS or UnCSS scan your HTML and remove CSS rules that are not referenced. For static sites, this can be run during the build process. For WordPress, this is harder because plugins generate HTML dynamically.
Our static sites ship 25-40KB of total CSS because every rule is intentional. There is no framework CSS, no component library, and no unused styles.
Minify CSS
Minification removes whitespace, comments, and redundant syntax from CSS. Tools like cssnano (PostCSS), CleanCSS, or Lightning CSS reduce file size by 15-30%. This is a quick win with no visual impact.
Avoid CSS @import
@import in CSS creates sequential loading. The browser downloads the first CSS file, parses it, discovers the @import, then downloads the imported file. Two round trips instead of one. Use <link> tags in HTML instead, which the browser downloads in parallel.
Use Modern CSS Instead of JavaScript
Many effects that previously required JavaScript can now be done in CSS:
- Smooth scroll:
scroll-behavior: smooth;replaces JavaScript smooth scroll libraries. - Scroll-driven animations: CSS
animation-timeline: scroll()replaces scroll-triggered JavaScript animations (in supported browsers). - Hover/focus interactions: CSS
:hover,:focus-within, and:has()replace many JavaScript interaction handlers. - Accordions: The
<details>/<summary>HTML elements replace JavaScript accordion components.
HTML Optimization
HTML optimization is often overlooked but matters for sites with bloated markup (page builders, frameworks).
Reduce DOM Size
Google recommends keeping the DOM under 1,500 elements. Page builders like Elementor and Divi generate DOM trees of 3,000-5,000+ elements for a typical page. Each element takes memory, slows style recalculation, and increases layout computation time.
Hand-written HTML for the same design typically uses 200-500 elements. The 10x reduction in DOM size directly improves rendering performance, especially on mobile devices with limited memory and processing power.
Semantic HTML
Use semantic elements (<header>, <nav>, <main>, <section>, <article>, <footer>) instead of generic <div> wrappers. Semantic HTML is not faster per se, but it is cleaner, more accessible, and produces less markup than the nested <div> structures that page builders generate.
Minify HTML
HTML minification removes whitespace and comments. For a 50KB HTML file, minification saves 5-10KB. Less impactful than CSS or JavaScript minification but still a free improvement during the build process.
Mobile-Specific Optimization
Google uses mobile performance for ranking signals. Mobile optimization is not optional. It is the primary target.
Why Mobile Is Harder
Mobile devices have slower processors, less memory, and higher-latency connections than desktops. A mid-range phone (the PageSpeed Insights simulation target) processes JavaScript 3-5x slower than a laptop. A 4G connection adds 50-150ms of latency per request compared to broadband.
This means every KB of JavaScript costs more on mobile. Every HTTP request costs more. Every unoptimized image costs more. Optimizations that seem minor on desktop can be significant on mobile.
Mobile-First CSS
Write CSS for mobile first, then add desktop styles in media queries. This ensures mobile devices download only the CSS they need and desktop enhancements are additive. The reverse (desktop-first with mobile overrides) forces mobile devices to download and process styles they immediately override.
Touch Target Sizing
Not a speed metric, but Google flags small touch targets as a mobile usability issue. Buttons and links should be at least 48x48px with 8px of spacing between them. This affects your Core Web Vitals report in Search Console even though it does not affect the PageSpeed score directly.
Viewport Meta Tag
Ensure your page has the viewport meta tag:
<meta name="viewport" content="width=device-width, initial-scale=1">
Without it, mobile browsers render the page at desktop width and zoom out, triggering CLS and failing mobile usability checks.
When to Optimize vs When to Rebuild
Optimization has diminishing returns. At some point, the cost of squeezing more performance from a slow platform exceeds the cost of rebuilding on a fast one.
Optimize If:
- Your site scores 70+ and you need to reach 80-85
- The main issues are images and third-party scripts (fixable without changing platform)
- You recently invested in a redesign and cannot justify rebuilding
- Your content team depends on the CMS editing interface daily
Rebuild If:
- Your site scores below 60 on mobile
- You need 90+ to compete in your search category
- Your platform (WordPress, Webflow, Squarespace) is the bottleneck, not your content
- You are paying $100+/month in hosting and maintenance for a 10-page site
- You want to eliminate recurring costs and own your code
The Cost of Each Approach
Optimization project: $500-3,000 depending on scope. Expected improvement: 10-20 points. Gets a 60 to 75 or a 70 to 85. Does not change the platform ceiling.
Rebuild to static HTML: $2,500-6,000 from WordPress, $3,000-8,000 from Webflow. Expected score: 90-98. Eliminates hosting costs ($0/month). Zero ongoing maintenance. No performance ceiling.
For most sites scoring below 70, the rebuild pays for itself within 1-2 years through eliminated hosting and maintenance costs, while delivering a permanent 90+ score that optimization cannot achieve.
Start with a free site audit to see where you stand. We will tell you whether optimization or a rebuild is the right path for your specific situation. See our pricing for all options.
Page Speed Optimization Checklist
Use this checklist to audit and improve any website. Items are ordered by typical impact.
High Impact (do first)
- Convert all images to WebP or AVIF format
- Add responsive srcset to all images with multiple size variants
- Lazy-load all below-the-fold images
- Add explicit width and height to every img tag
- Defer all non-critical JavaScript with the defer attribute
- Remove unused JavaScript libraries and plugins
- Enable server-side caching or use a CDN
- Remove or defer chat widgets and heavy third-party scripts
Medium Impact
- Inline critical CSS or reduce CSS to a single small file
- Self-host fonts and use font-display: swap
- Preload the primary font file and hero image
- Minify CSS, JavaScript, and HTML
- Remove unused CSS rules
- Add Cache-Control headers with long max-age for static assets
- Use preconnect for critical third-party domains
Lower Impact (polish)
- Use variable fonts instead of multiple static font files
- Add fetchpriority="high" to the hero image
- DNS prefetch third-party domains
- Replace JavaScript interactions with CSS where possible
- Reduce DOM size (aim for under 1,500 elements)
- Compress HTML through minification
- Audit and remove unused third-party scripts quarterly
Platform-Level (if above items are not enough)
- Evaluate whether your CMS platform is the bottleneck
- Consider migrating to static HTML if you need 90+ and your platform caps at 75-85
- Compare the cost of ongoing optimization vs one-time rebuild
Frequently Asked Questions
What is a good PageSpeed score?
90-100 is good (green). 50-89 needs improvement (orange). Below 50 is poor (red). For competitive SEO, aim for 90+ on mobile. Most WordPress sites score 55-75, Webflow sites 55-85, and static HTML sites 90-99.
How long does page speed optimization take?
Basic optimization (images, caching, defer scripts) takes 1-2 days and improves scores by 10-20 points. Advanced optimization (critical CSS, font optimization, third-party script management) takes 3-5 days. A full rebuild to static HTML takes 2-4 weeks but delivers 90+ scores permanently.
Does page speed affect SEO rankings?
Yes. Google confirmed Core Web Vitals (LCP, INP, CLS) as ranking signals. Sites that pass all three thresholds get a ranking boost in competitive categories. The impact is most visible when competing against sites with similar content and backlink profiles.
Can I improve PageSpeed without changing my CMS?
Yes, up to a point. Image optimization, script deferral, caching, and third-party script management work on any platform. But each CMS has a performance ceiling: WordPress tops out at 75-85, Webflow at 80-85, Squarespace at 65-70. To exceed those ceilings, you need to change the platform.
What is the fastest website platform?
Static HTML served from a CDN. No database, no server-side processing, no framework overhead. Typical mobile PageSpeed: 90-99. TTFB: 10-30ms. Total page weight: 100-350KB. Followed by static site generators (Astro, Hugo, Eleventy) which produce static HTML during the build process.
How much does page speed optimization cost?
Optimization-only projects: $500-3,000 depending on scope. A full rebuild to static HTML: $2,500-6,000 from WordPress, $3,000-8,000 from Webflow. New static builds: $3,000-6,000. The rebuild eliminates ongoing hosting and maintenance costs.
Ready to Fill Your Next Event?
We build the page, set up the pixels, and run the ads. You run the event.