How to speed up a slow website
What makes a small-business site slow, how to fix each cause on WordPress, shared hosting, Cloudflare and site builders, and how to read Google's Core Web Vitals.
Short answer: a slow small-business site is usually a slow server response, too much code in the page, or scripts that hold the page back. Turn on page caching, remove plugins and apps you don't use, add defer to scripts in the page head, and stop video or audio from playing by itself.
Google judges speed by three Core Web Vitals measured on real visitors: the main content should appear within 2.5 seconds (LCP), the page should react to a tap within 200 milliseconds (INP), and the layout shouldn't jump (CLS of 0.1 or less).
The checker's Speed tab reads your homepage's HTML (the code the server sends), then shows Google's Lighthouse numbers; both are covered below. Images have their own guide.
The page is slow to start arriving
Fix soon Shown in the checker's Speed tab as “Slow to load (…s)”.
The checker times one visit to your homepage, from the first request to the last byte of HTML: domain lookup, connection, redirects and the page code, but not images or scripts. Over 4 seconds triggers this finding. For comparison, Google's guidance is that the server's first response (Time to First Byte) should come within 0.8 seconds; over 1.8 seconds is poor (web.dev: TTFB).
Why it matters
Nothing else can load until the HTML arrives, so every second here is a second of blank screen, and on mobile data people give up and go back to the search results. It is one measurement from our server, so run the check again before acting on it.
How to fix it
WordPress and other PHP sites
- Turn on page caching, so the server sends a ready-made copy instead of building the page on every visit. Many hosts have it built in; otherwise use one caching plugin, not several.
- Delete plugins you don't use. Each active plugin can add work to every page load.
- Check your PHP version: old releases are slower and no longer get security fixes. See what PHP version your site runs and how to update it.
Shared hosting and cPanel
If caching doesn't help, ask your host whether your account is hitting its resource limits (cPanel often shows them under Resource Usage) and whether a different plan or server would fix it.
Cloudflare and redirects
Cloudflare doesn't cache HTML by default, only files such as images and scripts (Cloudflare docs). Caching pages needs a Cache Rule that excludes logged-in, cart and checkout pages. Also make each redirect go straight to the final address: http:// to https:// to www is two round trips.
Wix, Squarespace and Shopify
The servers are theirs. Remove apps and embeds you don't use, and contact support if a plain page is still slow.
How to check it's fixed
Run the website checker two or three times. In a terminal, curl -o /dev/null -s -w '%{time_starttransfer}\n' https://yourbusiness.com prints the time to first byte in seconds.
The page's HTML is very large
Minor Shown in the checker's Speed tab as “…KB of markup”.
The checker flags homepage HTML over about 400 KB (400,000 characters), not counting images. Pages get this big when code is pasted into the HTML instead of linked: page-builder styles, images embedded as text (strings starting data:image), inline SVG icons and plugin data.
Why it matters
The browser must download and process all of it before the page settles. Compression (gzip or Brotli) shrinks the download, not the work. Lighthouse flags a related problem as “Avoid an excessive DOM size”.
How to fix it
- Choose View page source and scroll. Long unreadable blocks are usually embedded images or data; long
<style>blocks are usually a builder or theme. - Remove unused plugins, sliders, popups and widgets, and replace embedded images with ordinary image files.
- Many page builders can load their CSS as a separate file; look in the builder's performance settings. If the bulk is the theme itself, trimming it is developer work.
How to check it's fixed
Run the checker again. Chrome DevTools' Network tab, filtered by Doc, shows the HTML's size.
Scripts hold up the page
Minor Shown in the checker's Speed tab as “… of … scripts in the head block rendering”.
The checker flags the page when two or more <script src="…"> tags in its <head> have neither defer nor async (type="module" scripts are deferred automatically and aren't counted). Lighthouse flags the same scripts as render-blocking (Chrome docs).
Why it matters
At each of these scripts, the browser stops reading the page until the script has downloaded and run, so nothing below it can appear. Two or three of them, often from different servers, mean a longer blank screen.
How to fix it
Add defer to each script that isn't needed to draw the page. Deferred scripts download in the background and run, in order, once the page has been read (MDN: the script element). async also stops the blocking, but async scripts run in whatever order they arrive, so keep it for independent scripts such as analytics.
<!-- before -->
<script src="/js/slider.js"></script>
<!-- after -->
<script src="/js/slider.js" defer></script>
WordPress
Most performance plugins have an option to defer JavaScript. Since WordPress 6.3, developers can also register scripts with a defer or async strategy (WordPress 6.3 dev note). Deferring jQuery can break code in the page that expects it, so test menus, sliders and forms afterwards.
Cloudflare
Rocket Loader defers all JavaScript on the page, including inline scripts, while keeping their order (Cloudflare docs). It is one switch, but test forms and checkout afterwards.
Wix, Squarespace and Shopify
The flagged scripts are usually code you pasted in (chat widgets, tracking pixels); add defer or remove what you don't use.
How to check it's fixed
Read the <script> tags in the head of the page source, or run the checker again.
Video or audio plays by itself
Minor Shown in the checker's Speed tab as “Media autoplays”.
The checker flags a <video> or <audio> tag with the autoplay attribute. Autoplaying YouTube or Vimeo embeds aren't detected, but the advice is the same.
Why it matters
A background video can be several megabytes, downloaded before the visitor has decided to stay. Sound is worse: Chrome allows muted autoplay but usually blocks autoplay with sound until the visitor has interacted with the site, so it often fails anyway (Chrome autoplay policy). Accessibility rules require a way to pause audio that plays automatically for more than 3 seconds (WCAG 1.4.2) and moving content that lasts more than five seconds (WCAG 2.2.2).
How to fix it
- Best: remove
autoplay, addcontrolsand aposterimage, and setpreload="none"so nothing downloads until someone presses play. - If a background video is part of the design, keep it short, silent and small:
autoplay muted loop playsinline, a pause button, and a still image for phones. - Site builders and WordPress video blocks have an Autoplay toggle in the block's settings.
<video controls preload="none" poster="/img/tour.jpg" width="1280" height="720">
<source src="/video/tour.mp4" type="video/mp4">
</video>
How to check it's fixed
In a private window, nothing should move or make sound until you press play.
Core Web Vitals: what Google measures
Core Web Vitals are three measurements of how a page feels to real visitors. A page passes when 75% of visits meet all three “good” targets, on mobile and desktop separately (web.dev: Web Vitals). Google says good scores align with what its ranking systems reward (Google Search Central), but relevance comes first; a good experience helps most where many pages answer the same search (Google: page experience).
| Metric | What it measures | Good |
|---|---|---|
| LCP, Largest Contentful Paint | How long until the biggest image or text block appears | 2.5 seconds or less |
| INP, Interaction to Next Paint | How quickly the page responds to taps, clicks and typing, across the whole visit | 200 milliseconds or less |
| CLS, Cumulative Layout Shift | How much the layout jumps while it loads | 0.1 or less |
INP replaced First Input Delay, which only measured the first tap (web.dev: INP). A slow server and blocking scripts delay LCP, heavy scripts hurt INP, and images without sizes cause CLS.
How to read the checker's Lighthouse block
The checker asks Google's PageSpeed Insights to run Lighthouse on your homepage as a simulated phone. You get four scores out of 100 (Performance, Accessibility, Best practices, SEO), coloured as Lighthouse does: 90–100 good, 50–89 needs improvement, 0–49 poor (Lighthouse scoring).
The Source line under LCP, CLS and INP matters. Real visitors (CrUX) means Google had enough data from real Chrome users, from the Chrome UX Report (CrUX); that is the data Google Search uses. Lab run means the figures come from the one simulated visit, where nobody taps anything, so the INP box then shows Total Blocking Time, the lab stand-in Google suggests for INP.
Below that come up to five Lighthouse suggestions that would each save at least 150 milliseconds, and a link to the full report on pagespeed.web.dev. Lab scores vary a few points between runs, so watch the trend. For real-visitor data across your whole site, use the Core Web Vitals report in Google Search Console.
Sources
- web.dev: Web Vitals (LCP, INP and CLS thresholds, 75th percentile)
- Google Search Central: Core Web Vitals and Google search results
- web.dev: Time to First Byte
- Chrome for Developers: Eliminate render-blocking resources
- MDN: the script element (defer and async)
- Chrome autoplay policy
- W3C WCAG 2.2: Audio Control
- Chrome for Developers: Lighthouse performance scoring
Common questions
What are good Core Web Vitals scores?
Largest Contentful Paint of 2.5 seconds or less, Interaction to Next Paint of 200 milliseconds or less, and Cumulative Layout Shift of 0.1 or less, met by at least 75% of visits. Google checks mobile and desktop separately.
Does website speed affect Google rankings?
Yes, but less than relevance. Google uses Core Web Vitals as part of page experience, and a fast site helps most when several pages answer a search equally well. Slow sites also lose visitors before they ever reach the content.
Why is my WordPress site so slow?
Usually no page caching, too many plugins, an old PHP version or an overcrowded shared server. Turn on caching, remove plugins you don't use and update PHP before paying for a bigger plan.
Why does my PageSpeed score change every time I test?
Lab scores come from one simulated visit, and network and server timing vary between runs, so a few points either way is normal. The field data from real Chrome users is steadier and is what Google Search uses.
What does render-blocking mean?
A script or stylesheet the browser must download before it can show the page. Adding defer to scripts that aren't needed straight away lets the page appear first and the scripts run afterwards.
See where your site stands. The website checker times your homepage, reads its code for the problems on this page, and shows Google's Lighthouse numbers beside them. If you'd rather hand the speed work over, Remidiy can look after it or talk it through with you.