Measure before you change anything
Guessing wastes time. Start with numbers you can compare after each fix.
- PageSpeed Insights (pagespeed.web.dev) tests a page on a simulated phone and, if your site gets enough visitors, shows real data from Chrome users.
- Google Search Console, under Core Web Vitals, shows which groups of pages are slow for real visitors.
- Test your home page, a typical inner page and your heaviest page (often a shop or blog archive). They are usually slow for different reasons.
Google’s Core Web Vitals are the three numbers that matter most:
| Metric | What it measures | Good |
|---|---|---|
| Largest Contentful Paint (LCP) | How long the main content takes to appear | 2.5 seconds or less |
| Interaction to Next Paint (INP) | How quickly the page responds to a tap or click | 200 milliseconds or less |
| Cumulative Layout Shift (CLS) | How much the page jumps around as it loads | 0.1 or less |
Write down the scores, then make one change at a time.
1. Hosting that is too slow
If the server takes more than about half a second just to start sending the page, everything else is built on a slow foundation. PageSpeed Insights reports this as “Reduce initial server response time”.
Cheap shared hosting puts hundreds of sites on one server. A managed WordPress host, or a good VPS with server-side caching, often fixes more than every other change on this list combined. Make sure the server runs a current version of PHP (8.1 or newer), which is noticeably faster than old versions.
2. No page caching
Without caching, WordPress rebuilds every page from the database on every visit. A page cache saves the finished page and serves that copy instead.
- Many managed hosts include caching at the server level. Check before adding a plugin.
- Otherwise, use one well-maintained caching plugin. Two caching plugins at once often conflict and make things slower.
- Exclude pages that must stay personal, such as cart, checkout and account pages on WooCommerce.
3. Images that are far too big
Images are the heaviest part of most pages. A photo straight from a phone can be 4 MB; the same image at the size it is actually shown might be 150 KB.
- Resize images to the largest size they are displayed at before uploading.
- Serve modern formats like WebP or AVIF. Many image plugins and hosts can convert automatically.
- Let images below the first screen lazy load, but not the main image at the top, which should load straight away.
- Always set width and height on images, so the page does not jump when they arrive (this fixes most CLS problems).
4. Too many plugins, or a few heavy ones
The number of plugins matters less than what each one loads. One slider or social feed plugin can add more weight than twenty small ones.
Look for plugins that load scripts and styles on every page even when they are used on one, such as contact forms, sliders, galleries and pop-ups. Remove what you no longer use, replace heavy plugins with lighter ones, or load them only on the pages that need them.
5. A heavy theme or page builder
Multipurpose themes and page builders make sites quick to put together, but many add large amounts of code to every page, and deeply nested layouts slow down rendering.
You do not always need to rebuild. Builders like Elementor have performance settings (such as loading only the features a page uses and optimising icon fonts) that are off by default. If the theme itself is the bottleneck, a lighter theme or a custom-built one is the lasting fix.
6. Render-blocking CSS and JavaScript
When the browser must download and process large files before it can show anything, the page stays blank. PageSpeed Insights lists these as “Eliminate render-blocking resources”.
- Defer JavaScript that is not needed for the first screen.
- Remove unused CSS where your tools allow it, and test carefully afterwards.
- Combine and minify files only if your host does not use HTTP/2 or HTTP/3; with modern hosting, combining matters much less.
7. Web fonts loaded the slow way
Custom fonts often load late and cause text to flash or jump. Use as few font families and weights as you can, host the fonts on your own site rather than loading them from another server, and set font-display: swap so text shows straight away in a fallback font.
8. Third-party scripts
Chat widgets, analytics, heatmaps, embedded videos, booking widgets and ad pixels all load code from other companies’ servers, and you cannot control how fast those servers are.
Audit them every few months. Remove the ones you no longer look at, and load the rest after the page has appeared. For YouTube embeds, show a thumbnail that loads the player only when clicked.
9. A bloated database
Over the years WordPress collects post revisions, expired temporary data, spam comments and leftovers from deleted plugins. On busy sites this slows down every uncached page, including admin screens.
Clean out revisions and expired data, limit how many revisions are kept, and remove tables left by plugins you have deleted. Always take a full backup first.
10. No CDN for visitors far away
If your server is in one country and your visitors are spread across the US or the world, each request travels a long way. A content delivery network (CDN) keeps copies of your images, styles and scripts on servers close to each visitor. Many hosts include one, and a free tier is often enough for a small business site.
When a rebuild is the better answer
Sometimes a site is slow because of how it was built: a heavy builder, dozens of plugins doing small jobs, and years of patches. Each fix above helps a little, but the site never gets truly fast.
That is usually the point to rebuild the theme with clean, purpose-built code while keeping your content, URLs and rankings. Our guide to redesigning without losing SEO covers how to do that safely.
A quick checklist
- Test the home page, an inner page and your heaviest page, and note the scores.
- Check server response time, and move to better hosting if it is slow.
- Turn on one page cache.
- Resize, compress and convert images; set their width and height.
- Remove unused plugins and load heavy ones only where needed.
- Turn on your page builder’s performance settings.
- Defer non-critical JavaScript and trim unused CSS.
- Self-host fonts and use fewer weights.
- Audit third-party scripts and delay the rest.
- Clean the database and add a CDN.
Test again after each step. If the numbers will not move, the problem is probably the build itself, and that is something we can help with.