Why Your Website Scores Low on Speed — and How to Fix It
Your site loads instantly on your laptop, but Google PageSpeed shows an angry red 38. Usually nothing's broken — here's what the score really measures and how to fix it.
You paid for a modern website. On your laptop it loads instantly. Then you run it through Google PageSpeed Insights and the score comes back an angry 38, in red. What went wrong?
Usually nothing. The number you're staring at is a worst-case lab test, and most of what drags it down isn't your page — it's the third-party tools every small business relies on: a booking widget, a reservation system, an embedded map, a chat button. Here's why the score is low and the fixes that genuinely help, whether you run a taxi service, a restaurant, a hair salon or a neighbourhood bar.
First, what the score actually measures
Google's PageSpeed / Lighthouse score is not "how fast your site feels". It's a simulation run under deliberately harsh conditions:
- A cheap Android phone — a mid-range model, not your iPhone.
- A slow 4G connection with added latency.
- The phone's processor artificially slowed 4×.
That's the hardest environment on purpose — Google wants to know how your site behaves for someone on an old phone with bad signal. Your real visitors, on a modern phone or a desktop with Wi-Fi, get something far faster.
The three numbers that matter (Core Web Vitals)
Forget the single score for a moment. These three metrics are what Google actually uses for ranking:
| Metric | What it means | Good target |
|---|---|---|
| LCP (Largest Contentful Paint) | When the biggest thing on screen — headline or hero image — appears | Under 2.5 s |
| CLS (Cumulative Layout Shift) | How much the page jumps around while loading | Under 0.1 |
| INP (responsiveness) | How quickly the page reacts to a tap | Under 200 ms |
If your layout doesn't jump (CLS near 0) and your headline appears quickly (good LCP), you're already winning where it counts — even if the overall number looks scary.
The real culprit: third-party widgets
Almost every small business site embeds someone else's tool:
- Restaurants — reservation widgets like OpenTable or TheFork.
- Salons and barbers — booking systems like Fresha, Treatwell or Booksy.
- Taxis and transfers — fare and booking widgets.
- Bars and cafés — Google Maps, Instagram feeds, event calendars.
- Everyone — cookie banners, live chat, WhatsApp buttons.
Each of these loads its own JavaScript from another company's servers. You don't control that code, and it's often the single biggest reason your score is low. In Lighthouse it shows up as "Reduce third-party impact" and "Reduce JavaScript execution time".
Here's the tension: that widget is also how you get bookings. Hiding it to win points would be a terrible trade. The goal isn't to remove it — it's to make it hurt less.
Fix 1 — "Preconnect" to the widget's server
A one-line hint in your site's <head> tells the browser to open the connection to the booking or map server straight away, instead of discovering it late. The widget then appears sooner — good for your customer and your score:
<link rel="preconnect" href="https://your-booking-provider.com" crossorigin>
<link rel="dns-prefetch" href="https://your-booking-provider.com">
Fix 2 — Don't let the widget be the "main content"
Make sure your headline and hero appear first, rendered by your own site, so the page feels alive before the third-party tool finishes loading. The widget can arrive a moment later without holding up the whole page.
Fix 3 — Defer what isn't critical
The cookie banner, the chat bubble, the WhatsApp button — none of these need to load in the first second. Load them after the page is ready, when the browser is idle. Your booking tool stays front and centre; the "nice to have" extras stop competing for resources.
Fonts: a silent speed killer
A surprising number of small business sites load fonts the slow way — with an @import buried inside a CSS file. That creates a waterfall: the browser downloads your CSS, then discovers it needs a font, then goes to fetch it — while your text waits.
Two easy wins:
- Load fonts with a
<link>in the page head, not via CSS@import, so they start downloading right away. - Add
&display=swapso text shows instantly in a fallback font and swaps when the custom one arrives — no invisible text.
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=YourFont&display=swap" rel="stylesheet">
Faster still: self-host the font files. But the change above alone clears the most common font warning.
Caching: stop making returning visitors re-download everything
Lighthouse often flags "Serve static assets with an efficient cache policy" — sometimes more than a megabyte of savings. It means your images, fonts and scripts aren't told to stick around in the visitor's browser, so every visit re-downloads them.
The fix lives on the server, not in your design, and needs no redesign. On most hosts (Apache), a few lines telling the browser to cache static files for a long time are enough:
<IfModule mod_headers.c>
SetEnvIf Request_URI "\.(js|css|woff2?|png|jpe?g|webp|svg|ico)$" LONG_CACHE
Header set Cache-Control "public, max-age=31536000, immutable" env=LONG_CACHE
</IfModule>
Returning visitors — the loyal customers checking your menu or opening hours again — get an almost instant load. Ask your developer or host to apply the right version for your setup.
Images: the easy 80%
You don't need to be technical to fix most image problems:
- Right size — don't upload a 4000px photo to show it at 400px. Resize before uploading.
- Modern formats — use WebP or AVIF instead of heavy JPEGs and PNGs.
- Lazy-load below the fold — images further down should load only as the visitor scrolls (
loading="lazy"). - Always set width and height — this stops the page from jumping and protects your CLS.
For a restaurant's gallery or a salon's before-and-after shots, this alone can transform load time.
Beyond speed: the SEO basics that quietly matter more
A fast site nobody can find is pointless. While you're in there, check these:
- No orphan pages. Every important page should be linked from your menu or footer. A page Google can only reach through the sitemap ranks poorly.
- Fix old 404s. If Google has an old URL indexed and it now returns "Not Found", add a 301 redirect to the closest live page. Don't waste ranking you already earned.
- One clear title and description per page — unique, descriptive, written for humans.
- A sitemap referenced in
robots.txt, submitted in Google Search Console. - Local structured data — your business name, address, phone and opening hours. This powers the rich results and map listings customers actually click.
- Don't duplicate content. If you have five location pages, give each a genuinely different angle.
The honest truth about "perfect" scores
If your homepage has a live booking widget at the top, you'll probably never hit 100 on the harshest mobile test — and that's fine. That widget is your cash register. A great real-world experience with a booking tool that converts beats a perfect score on an empty page every time.
Aim for:
- CLS near 0 — no jumping. Very achievable.
- LCP under ~2.5 s on desktop and a decent mobile — achievable with the fixes above.
- Green field data in Search Console over time — the number that actually influences ranking.
Your quick checklist
- Check the desktop score and field data, not just the red mobile number.
- Preconnect to your booking, reservation or map provider.
- Make sure your headline loads first, not the third-party widget.
- Defer the cookie banner, chat and social buttons.
- Load fonts via
<link>+display=swap, not CSS@import. - Add a long cache policy for static files on the server.
- Resize and convert images to WebP/AVIF and lazy-load below the fold.
- Link every important page from your menu or footer.
- 301-redirect any old indexed URLs that now 404.
- Submit a sitemap and add local business structured data.
A modern site for your business, ready in 5 days. Domain, hosting and SEO — all included.