Skip to main content
RapidDev - Software Development Agency
webflow-tutorials

Webflow Performance: Speed Optimization, Images, and Core Web Vitals

Webflow site speed issues are almost always caused by four things in order: oversized uncompressed images, too many external font providers, third-party script bloat, and both Classic and GSAP Interactions loaded simultaneously. Start by compressing all images to WebP/AVIF in the Asset Manager, remove unused Google Fonts weights, audit your Project Settings Head Code for unnecessary scripts, and check that you're not running both Interaction runtimes on the same site.

What you'll learn

  • Measure Webflow site performance using PageSpeed Insights and Chrome DevTools Lighthouse and identify the highest-impact issues
  • Compress and convert all images to WebP/AVIF using the Asset Manager Compress function to fix LCP (Largest Contentful Paint)
  • Reduce font loading overhead by limiting Google Fonts weights, using the font-display:swap strategy, and removing unused fonts via Style Manager
  • Audit and remove third-party scripts in Project Settings Head Code that block the main thread
  • Diagnose interaction runtime bloat from running both Classic and GSAP Interactions on the same site
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Advanced12 min read60-90 minAll Webflow plans (custom code requires Basic plan or above)March 2026RapidDev Engineering Team
TL;DR

Webflow site speed issues are almost always caused by four things in order: oversized uncompressed images, too many external font providers, third-party script bloat, and both Classic and GSAP Interactions loaded simultaneously. Start by compressing all images to WebP/AVIF in the Asset Manager, remove unused Google Fonts weights, audit your Project Settings Head Code for unnecessary scripts, and check that you're not running both Interaction runtimes on the same site.

Webflow Performance Optimization: Speed, Core Web Vitals, and a 20-Point Audit

Webflow sites can score 90+ on Google PageSpeed Insights with the right configuration, or drop to 40-60 with common mistakes. This tutorial takes a holistic approach to performance — covering images, fonts, scripts, interactions, DOM depth, and Core Web Vitals — rather than focusing on one technique. You will learn to measure your current score, identify the biggest bottlenecks using Webflow's built-in tools and external auditors, and apply fixes across every performance category. Core Web Vitals (LCP, CLS, INP) directly affect Google search rankings since 2024, making performance optimization a business priority, not just a developer preference. This tutorial is the comprehensive follow-up to individual technique guides on background images and video — it shows how all performance factors interact.

Prerequisites

  • A published Webflow site with a custom domain or Webflow.io subdomain (PageSpeed Insights requires a publicly accessible URL)
  • Access to Google PageSpeed Insights (pagespeed.web.dev) — free, no account required
  • Webflow project open in Designer with Project Settings access (Site Settings icon in top Webflow logo menu)

Step-by-step guide

1

Establish your baseline score with PageSpeed Insights

Before making any changes, measure your current performance. Go to pagespeed.web.dev, paste your published Webflow site URL, and run the analysis. Run it twice — once for Mobile and once for Desktop using the toggle at the top of the results. Note the four Core Web Vitals: LCP (Largest Contentful Paint — target under 2.5s), CLS (Cumulative Layout Shift — target under 0.1), INP (Interaction to Next Paint — target under 200ms), and FCP (First Contentful Paint). Screenshot or write down the scores before optimizing. The Diagnostics section below the scores lists specific issues ranked by impact — this is your prioritized to-do list.

Expected result: You have a baseline Mobile and Desktop score with specific diagnostics listed by impact. The biggest issues are typically 'Properly size images', 'Eliminate render-blocking resources', and 'Reduce unused CSS'.

2

Audit and compress all images using the Asset Manager

Images are almost always the #1 cause of poor LCP scores on Webflow sites. Open the Asset Manager (cloud icon, left toolbar). Select all images by clicking the first image, then Shift+click the last to select a range (or Cmd+A to select all). Click the Compress button in the top bar. Choose WebP for broad compatibility or AVIF for the smallest file sizes (AVIF supported in all modern browsers as of 2024). Click Compress — Webflow will replace the original files with compressed versions across the entire site automatically. Also check that all inline Image elements have Style Panel → Size → Loading set to 'Lazy' (Eager for hero/above-fold only). Access this via Element Settings (D) → Loading.

Expected result: Asset Manager shows smaller file sizes. PageSpeed Insights 'Properly size images' and 'Serve images in next-gen formats' diagnostics improve or disappear.

3

Reduce font loading overhead

Every Google Font weight you use (Regular, Bold, Italic, SemiBold, etc.) is a separate HTTP request that can block page rendering. Audit your fonts: in the Style Panel (S), check all classes for the fonts and weights used. In Project Settings (Webflow logo menu → Site Settings → Fonts → Google Fonts), remove any font weights that are not actively applied to any element. As a rule: use maximum 2 font families and 2-3 weights per family. If you need a font that is not on Google Fonts, upload it as a custom web font (WOFF2 format) via Project Settings → Fonts → Upload custom fonts — self-hosted fonts avoid the Google Fonts network request entirely. For Google Fonts, add a Preconnect link in Project Settings → Custom Code → Head Code to eliminate the DNS lookup delay.

typescript
1<!-- Add to Project Settings Custom Code Head Code -->
2<!-- Preconnect to Google Fonts for faster DNS resolution -->
3<link rel="preconnect" href="https://fonts.googleapis.com">
4<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
5
6<!-- Optional: Preload your primary font file for even faster LCP -->
7<!-- Replace the URL with your actual Google Font URL from the network tab -->
8<link rel="preload" as="font" type="font/woff2"
9 href="https://fonts.gstatic.com/s/inter/v18/[your-font-hash].woff2"
10 crossorigin>

Expected result: Fewer font weight requests visible in Chrome DevTools Network tab (F12 → Network → filter by Font). PageSpeed 'Eliminate render-blocking resources' diagnostic shrinks.

4

Audit and remove third-party scripts

Third-party scripts injected in Project Settings → Custom Code → Head Code or Before </body> Code are the #1 cause of poor INP and blocked main thread scores. Go to Webflow logo menu → Site Settings → Custom Code. Review every script tag. For each script, ask: Is this actively used on the live site? Can it be loaded with async or defer? Can it be loaded only on specific pages (use Page Settings Head Code instead of Project Head Code)? Common offenders: abandoned analytics snippets, multiple chat widget scripts, A/B testing platforms, and social media embed SDKs loaded site-wide. Remove any script not actively used. For remaining scripts, add async or defer attributes.

typescript
1<!-- BEFORE: Render-blocking script -->
2<script src="https://third-party.com/widget.js"></script>
3
4<!-- AFTER: Non-blocking with defer (executes after HTML is parsed) -->
5<script src="https://third-party.com/widget.js" defer></script>
6
7<!-- AFTER: Non-blocking with async (executes as soon as downloaded) -->
8<!-- Use async for scripts that don't depend on DOM order -->
9<script src="https://analytics.example.com/script.js" async></script>

Expected result: PageSpeed 'Reduce JavaScript execution time' and 'Minimize main-thread work' diagnostics improve. INP score decreases.

5

Check for dual Interaction runtimes (Classic + GSAP)

Loading both Webflow's Classic Interactions (Interactions 2.0) and the GSAP Interactions runtime on the same site loads two separate JavaScript runtimes. This happens when a site has some Classic interactions (created before Summer 2025) and some GSAP interactions (created after Summer 2025). To check: Interactions panel (H) → scroll through all page and element triggers. If you see a mix of Classic and GSAP animation types, you are loading both runtimes. The fix is to migrate all interactions to one system — either convert all to GSAP (recommended for new sites) or keep all as Classic. For sites that cannot migrate, at minimum limit GSAP interactions to only pages that need them.

Expected result: Pages that previously loaded both runtimes now load only one, reducing JavaScript payload by 40-80KB (GSAP runtime size).

6

Fix Cumulative Layout Shift (CLS) issues

CLS measures how much the page layout shifts during load — a target of under 0.1 is needed for a 'Good' score. Common CLS causes in Webflow: images without explicit width/height (causing reflow when they load), fonts swapping (FOUT — Flash of Unstyled Text), and elements whose size is determined by loaded content. Fix image CLS: Set explicit Width and Height (or use the Ratio setting) on all Image elements so the browser reserves space before the image loads. Fix font CLS: In Project Settings Head Code, add font-display:swap CSS for custom fonts, or rely on Google Fonts (which uses swap by default). Fix interaction CLS: Avoid animating Width, Height, Margin, or Padding properties in Webflow Interactions — use Transform (Move/Scale) and Opacity instead.

typescript
1/* Add to Project Settings → Custom Code → Head Code in a <style> tag */
2/* Forces font-display:swap for all custom @font-face rules */
3<style>
4 @font-face {
5 font-family: 'YourCustomFont';
6 font-display: swap;
7 src: url('/fonts/your-font.woff2') format('woff2');
8 }
9</style>

Expected result: CLS score in PageSpeed Insights drops below 0.1 (the 'Good' threshold). The 'Avoid large layout shifts' diagnostic disappears or shrinks.

7

Reduce DOM depth and unused CSS classes

Overly deep DOM nesting (elements nested 10+ levels deep) slows browser rendering. In Webflow, this often happens through nested sections inside containers inside divs inside more divs. Open the Navigator (Z) and collapse the tree — check for unnecessary wrapper divs. Remove any Div Blocks used purely for styling that can be replaced by applying the class directly to the parent element. For unused CSS: go to the Style Selectors panel (G) and click the broom/Clean Up icon — this shows classes with no elements using them. Delete unused classes to reduce the total CSS file size. Finally, check Project Settings → Custom Code for any site-wide CSS that might have grown with overrides across multiple iterations.

Expected result: The Style Selectors panel shows no unused classes. Navigator shows flatter element hierarchy. PageSpeed 'Reduce unused CSS' diagnostic improves.

8

Preload LCP hero images for faster Largest Contentful Paint

The LCP element is usually the hero image or background image visible in the initial viewport. Preloading it tells the browser to fetch it as a high-priority resource before the HTML is fully parsed. For inline hero images: select the Image element → Element Settings (D) → Loading → Eager (this prevents lazy loading on above-fold images). For background images set via Style Panel (which cannot be lazy-loaded natively), add a preload link tag in Project Settings Head Code or Page Settings Head Code. Use Chrome DevTools (F12 → Performance → LCP element) to identify the exact element triggering LCP before writing the preload tag.

typescript
1<!-- Add to Page Settings Head Code for pages with a background image hero -->
2<!-- Replace URL with your actual asset URL from Asset Manager -->
3<link
4 rel="preload"
5 as="image"
6 href="https://uploads-ssl.webflow.com/[your-site-id]/[image-filename].webp"
7 type="image/webp"
8>

Expected result: LCP time in PageSpeed Insights decreases. The 'Preload Largest Contentful Paint image' diagnostic disappears from the Opportunities section.

Complete working example

performance-head-code.html
1<!-- ============================================================
2 WEBFLOW PERFORMANCE: Project Settings Custom Code Head Code
3 Add the relevant sections to your site
4 ============================================================ -->
5
6<!-- 1. PRECONNECT TO GOOGLE FONTS (reduces DNS lookup time) -->
7<link rel="preconnect" href="https://fonts.googleapis.com">
8<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
9
10<!-- 2. PRELOAD LCP IMAGE (replace with your actual hero image URL) -->
11<!-- Only add this to the specific page with the hero image (Page Settings, not Project) -->
12<link
13 rel="preload"
14 as="image"
15 href="https://uploads-ssl.webflow.com/YOUR-SITE-ID/YOUR-HERO-IMAGE.webp"
16 type="image/webp"
17>
18
19<!-- 3. FONT DISPLAY SWAP for custom self-hosted fonts -->
20<style>
21 /* Prevents invisible text during font swap (FOIT) */
22 @font-face {
23 font-family: 'YourFont';
24 font-display: swap;
25 src: url('/fonts/yourfont.woff2') format('woff2');
26 font-weight: 400;
27 }
28 @font-face {
29 font-family: 'YourFont';
30 font-display: swap;
31 src: url('/fonts/yourfont-bold.woff2') format('woff2');
32 font-weight: 700;
33 }
34</style>
35
36<!-- 4. DEFER THIRD-PARTY SCRIPTS (move from Head to Before </body> when possible) -->
37<!-- Or add defer/async attribute to existing script tags -->
38<!-- <script src="https://third-party.com/widget.js" defer></script> -->
39
40<!-- 5. IMAGE ASPECT RATIO RESERVATION (prevents CLS from image reflow) -->
41<!-- Apply via Style Panel Size Ratio on each Image element -->
42<!-- This is a reminder note, not deployable code -->

Common mistakes

Why it's a problem: Hero image is set to Loading: Lazy, causing slow LCP

How to avoid: Above-fold images should never be lazy-loaded. Select the hero image element → Element Settings (D) → Loading → Eager. Lazy loading delays the LCP element, which is the primary metric Google uses for ranking pages with large images.

Why it's a problem: Multiple Google Font families and 5+ weights are loaded site-wide

How to avoid: Each font weight is a separate blocking HTTP request. Go to Site Settings → Fonts → Google Fonts and remove unused weights. Limit to 2 font families and 2-3 weights each. Consider uploading fonts as WOFF2 files (Site Settings → Fonts → Upload) to self-host and eliminate the Google Fonts network request entirely.

Why it's a problem: Third-party chat, analytics, and A/B testing scripts all load in the Head, blocking render

How to avoid: Move all non-critical scripts from Project Settings Head Code to the Before </body> Code section, or add defer or async attributes to the script tags. Critical analytics (Google Analytics) can stay in Head with async; everything else should be deferred.

Why it's a problem: CLS score is high due to images without reserved dimensions

How to avoid: Use Style Panel → Size → Ratio on all images in Collection Lists and hero sections. The browser reserves space for the image before it loads when an aspect ratio is set, eliminating layout shift. Also check for any interactions that animate Width, Height, Margin, or Padding — replace with Transform (Move, Scale) and Opacity which are layout-safe.

Best practices

  • Always run PageSpeed Insights on both Mobile and Desktop before and after making performance changes — Mobile scores reflect real-world user experience more accurately.
  • Compress all images to WebP or AVIF using Asset Manager → Select All → Compress before doing anything else — images are almost always the highest-impact optimization.
  • Set all below-fold images to Loading: Lazy in Element Settings (D), and hero/above-fold images to Loading: Eager — Webflow's default is Lazy for most elements, which is correct, but hero images need Eager.
  • Never run both Classic Interactions and GSAP Interactions on the same page unnecessarily — each runtime adds ~40-80KB of JavaScript.
  • Use the Style Panel Ratio setting (Style Panel → Size → Ratio) on all image elements in Collection Lists to reserve space before images load, preventing Cumulative Layout Shift.
  • Add async or defer attributes to all non-critical third-party scripts in Project Settings → Custom Code. Move analytics and chat scripts to the Before </body> section instead of the Head.
  • Run Chrome DevTools Lighthouse (F12 → Lighthouse → Analyze Page Load) monthly to catch new performance regressions as the site grows.

Still stuck?

Copy one of these prompts to get a personalized, step-by-step explanation.

ChatGPT Prompt

My Webflow site is scoring 45 on Mobile PageSpeed Insights. The diagnostics show: 'Properly size images', 'Eliminate render-blocking resources', and 'Reduce unused JavaScript'. I use Google Fonts with 4 weights, have a Google Analytics script and a chat widget in the Head Code, and my hero section has a 2MB background image. Give me a prioritized step-by-step optimization plan targeting Webflow's specific UI and settings panels.

Webflow Prompt

I'm optimizing a Webflow site that uses both Classic Interactions and the new GSAP Interactions on different pages. My PageSpeed scores are low on pages with animations. How do I check which interaction runtime is loading on which pages, and what's the safest way to migrate existing Classic interactions to GSAP without breaking the animations? Reference the Webflow Interactions panel paths.

Frequently asked questions

Why does my Webflow site score low on PageSpeed despite having few images?

Images are only one factor. Check for: third-party scripts in Project Settings Head Code (each external script is a blocking request), Google Fonts loaded with many weights, both Classic and GSAP Interaction runtimes loading on the same pages, and deep DOM nesting. Run Chrome DevTools Lighthouse (F12 → Lighthouse) for a detailed breakdown — it shows the exact bytes and milliseconds each resource contributes.

Does Webflow automatically optimize images for performance?

Webflow auto-generates responsive srcset variants (up to 7 sizes) for inline JPG, PNG, and WebP images uploaded above 3200px. It does NOT compress images automatically at upload or apply WebP conversion automatically. You must manually select images in the Asset Manager and click Compress → WebP/AVIF. Background images (set via Style Panel → Backgrounds) do not get srcset treatment at all.

What is the difference between LCP, CLS, and INP in Webflow terms?

LCP (Largest Contentful Paint) is how long until the biggest visible element loads — usually your hero image or heading. Fix by compressing images and setting hero images to Loading: Eager. CLS (Cumulative Layout Shift) measures page layout stability during load — fix by setting image Ratio values in Style Panel so the browser reserves space. INP (Interaction to Next Paint) measures responsiveness to user clicks — fix by deferring third-party scripts and minimizing Interaction JS payload.

Can I use a CDN with Webflow to improve global page load speeds?

Webflow's hosting infrastructure uses Fastly CDN globally for all published sites on paid plans — this is already built in. You do not need to set up a separate CDN. However, third-party scripts (analytics, chat, etc.) load from their providers' servers, which may not be as geographically distributed. For those scripts, use providers with their own global CDNs (e.g., Cloudflare for your custom JavaScript).

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.