Loading...
Home
Explore
Contact
Sign in
Speed Optimization & Core Web Vitals

90+ Google PageSpeed: St Kilda Retail Site Fixes That Work

Stuck under 90 on PageSpeed Insights? Learn the exact issues we fixed for a St Kilda retailer—images, render-blocking assets, TTFB, and third-party scripts—plus DIY steps and when to book Fixwebnode.

Fixwebnode Support
Fixwebnode Support
10 min read 7 views
90+ Google PageSpeed: St Kilda Retail Site Fixes That Work

If your retail site scores in the 40s–70s on Google PageSpeed Insights, shoppers feel it as slow product pages, delayed add-to-cart, and weaker mobile conversions. This guide walks through the same remote diagnostics and fixes we use at Fixwebnode when a St Kilda retailer needs a reliable path to a 90+ score—without marketplace middlemen or vague “speed tips.”

You will get concrete symptoms, copy-paste checks, and numbered DIY steps you can run on a typical WordPress or static-fronted storefront. When the stack is messy or revenue is on the line, you can book a direct remote session via our 90+ Google PageSpeed service page. We work with businesses in your area and across Australia through secure remote access—see all service areas for coverage context.

Why a 90+ PageSpeed score matters for a retail site

Google PageSpeed Insights (PSI) reports lab and field data tied to Core Web Vitals: Largest Contentful Paint (LCP), Interaction to Next Paint (INP), and Cumulative Layout Shift (CLS). For a retailer, a weak LCP usually means the hero image or first product grid loads late. A weak INP means filters, menus, or cart buttons feel sticky. High CLS makes prices and buttons jump under the finger.

A 90+ score is not a vanity metric. It is a practical signal that the critical path—HTML, CSS, fonts, hero media, and main thread work—is under control. The rest of this post stays on that path: common failures, DIY resolution, and when Fixwebnode should take over remotely.

Why is my retail site stuck below 90 on PageSpeed Insights?

Most sub-90 retail scores come from a few root causes: oversized or unmodern image formats on product and hero assets, render-blocking CSS/JS on the critical path, slow Time to First Byte from uncached PHP or a cold origin, and heavy third-party tags that block or thrash the main thread. Fix the largest offenders first, re-test mobile PSI after each change, and only then chase smaller audits.

SymptomQuick fixWhen to call Fixwebnode
LCP 2.5s+ on mobile product/homeCompress hero to WebP/AVIF, set dimensions, preloadTheme hard-codes huge assets or CDN misconfigured
PSI flags unused JS / long tasksDefer non-critical scripts; remove dead pluginsBundles minified but still huge; need code-split plan
TTFB regularly over ~600msFull-page cache, opcode cache, lean queriesHosting limits, object-cache design, or origin tuning

Common issues that keep retail sites under 90

These problems showed up repeatedly on the St Kilda retail project and on similar storefronts. Each has a different root cause—do not treat them as one “make it faster” task.

1. Hero and product images still serving multi‑megabyte JPEGs

Symptoms: PSI lists “Properly size images” and “Serve images in next-gen formats.” LCP element is a banner or first product photo. Mobile lab LCP sits above 2.5s even on a decent connection profile.

2. Render-blocking CSS and unused JavaScript on every template

Symptoms: “Eliminate render-blocking resources” and “Reduce unused JavaScript.” First Contentful Paint lags; main-thread time is high on category and product templates even when images look fine.

3. Slow Time to First Byte (TTFB) from uncached dynamic pages

Symptoms: PSI server-response warning; HTML arrives late before CSS or images matter. Cart and account pages feel acceptable, but home and PLP HTML is sluggish on first view.

4. Third-party pixels, chat, and review widgets competing with checkout UX

Symptoms: Long main-thread tasks after load; INP regressions on mobile; network waterfall packed with tag-manager children you did not author.

How to fix oversized hero and product images

Image weight is the most common LCP killer on retail sites. Fix media before you rewrite themes.

Step 1 — Identify the LCP element in PSI and DevTools

Run a mobile PSI test and note the LCP resource URL. In Chrome DevTools, open Performance or Lighthouse and confirm the same node (often img in the hero or first product card).

Step 2 — Measure current bytes on the wire

curl -sI "https://YOUR-DOMAIN/wp-content/uploads/hero-home.jpg" | grep -iE 'HTTP/|content-type|content-length'
curl -s -o /dev/null -w "ttfb=%{time_starttransfer}s total=%{time_total}s size=%{size_download}\n" "https://YOUR-DOMAIN/wp-content/uploads/hero-home.jpg"

If Content-Length is hundreds of kilobytes (or more) for a mobile hero, you have a clear win.

Step 3 — Create properly sized modern derivatives

# Requires ImageMagick; adjust widths to your theme breakpoints
convert hero-home.jpg -resize 1600x -quality 82 -strip hero-home-1600.jpg
convert hero-home.jpg -resize 1600x -quality 75 -define webp:method=6 hero-home-1600.webp
convert product-main.jpg -resize 800x -quality 75 -define webp:method=6 product-main-800.webp

Step 4 — Serve responsive sources and stop layout shift

In the theme or page builder, set explicit width and height (or CSS aspect-ratio), use srcset/sizes for product grids, and lazy-load below-the-fold cards only—not the LCP image. Preload the true LCP image in <head> when the URL is stable:

<link rel="preload" as="image" href="/media/hero-home-1600.webp" type="image/webp" imagesrcset="/media/hero-home-800.webp 800w, /media/hero-home-1600.webp 1600w" imagesizes="100vw">

Step 5 — Verify

Hard-refresh, re-run mobile PSI, and confirm the LCP resource is the WebP (or AVIF) derivative at a sensible byte size. Check CLS stays stable after dimension fixes.

When to call Fixwebnode: theme builders inject uncompressed originals, a CDN ignores Vary/format negotiation, or product feeds re-upload full-resolution files nightly.

How to fix render-blocking CSS and unused JavaScript

Retail themes often enqueue slider, icon, and page-builder bundles globally. That hurts every template.

Step 1 — Inventory what blocks first paint

# Optional local audit if Node is available
npx --yes lighthouse https://YOUR-DOMAIN/ --only-categories=performance --form-factor=mobile --output=json --output-path=./psi-local.json
node -e "const r=require('./psi-local.json'); console.log('score', r.categories.performance.score); (r.audits['render-blocking-resources'].details||{}).items&&console.log(r.audits['render-blocking-resources'].details.items);"

In the browser, DevTools → Network → disable cache → reload; sort by type and note CSS/JS started before first paint.

Step 2 — Defer non-critical scripts safely

For WordPress-style stacks, ensure analytics and non-checkout widgets use defer (or load after interaction). Avoid blanketing async on scripts that depend on order. Remove plugins you do not use on storefront templates (unused sliders, pop-up builders, duplicate SEO packs).

Step 3 — Split critical CSS from bulk theme CSS where practical

Inline a small critical subset for above-the-fold header/nav/hero, and load the full stylesheet with media tricks or deferred non-critical sheets only after measuring. Do not delete the main stylesheet without a fallback—broken CSS destroys CLS and conversion.

Step 4 — Trim unused JS at the plugin/app layer first

# Example: list heavy enqueued assets from a server shell if you have SSH
# (paths vary; adjust to your app root)
find public/wp-content/plugins -iname '*.min.js' -size +150k -print 2>/dev/null | head -n 40

Disable or replace the largest unused bundles. Re-test add-to-cart and checkout after every removal.

Step 5 — Verify main-thread relief

Re-run PSI mobile. Unused JavaScript bytes and bootup time should drop. Manually tap menu, filters, and add-to-cart on a real phone—lab scores mean little if INP feels worse.

When to call Fixwebnode: minified bundles are still multi‑hundred KB with no plugin left to remove, or the storefront is a custom React/Vue layer that needs proper code splitting and route-level imports.

How to fix slow TTFB on cacheable retail pages

If HTML is late, image work cannot save LCP. Diagnose origin timing before buying a new theme.

Step 1 — Measure TTFB from your network

curl -s -o /dev/null -w "dns=%{time_namelookup} connect=%{time_connect} tls=%{time_appconnect} ttfb=%{time_starttransfer} total=%{time_total}\n" https://YOUR-DOMAIN/
for i in 1 2 3 4 5; do curl -s -o /dev/null -w "%{time_starttransfer}\n" https://YOUR-DOMAIN/shop/; done

Consistent TTFB well above ~0.6s on public catalog pages usually means missing full-page cache, cold PHP, or heavy uncached queries—not “the internet.”

Step 2 — Confirm cache headers on anonymous catalog HTML

curl -sI https://YOUR-DOMAIN/ | grep -iE 'HTTP/|cache-control|age|x-cache|cf-cache|x-drupal-cache|x-magento|x-varnish'

Logged-out home and category pages should be cacheable at the edge or full-page layer. Cart, checkout, and account must stay dynamic.

Step 3 — Warm PHP and restart services carefully (VPS / dedicated)

# Debian/Ubuntu-style examples — use your actual unit names
sudo systemctl status php8.2-fpm nginx
sudo tail -n 100 /var/log/nginx/error.log
sudo tail -n 100 /var/log/php8.2-fpm.log
# After config changes only:
sudo systemctl reload php8.2-fpm
sudo systemctl reload nginx

Enable OPcache in production PHP and verify it is not disabled. For WordPress, pair a proven page cache with an object cache only when object cache is correctly sized and monitored.

Step 4 — Cut obvious dynamic work on catalog templates

Remove synchronous remote API calls from header/footer, stop running heavy related-product queries uncached, and ensure cron storms are not overlapping traffic peaks.

Step 5 — Verify

curl -s -o /dev/null -w "ttfb=%{time_starttransfer}\n" https://YOUR-DOMAIN/
curl -sI https://YOUR-DOMAIN/ | grep -iE 'cache-control|age|x-cache'

TTFB should fall on repeat anonymous hits; PSI’s server-response audit should clear or improve before you chase micro-optimisations.

When to call Fixwebnode: shared hosting caps CPU, object cache is miswired, or checkout-safe cache exclusions are wrong and you risk serving personalised HTML publicly.

How to fix third-party script drag on INP and LCP

Chat bubbles, review carousels, heatmaps, and stacked tag managers often cost more than they earn on mobile.

Step 1 — Map third-party weight

In PSI, open the third-party summary. In DevTools Network, filter by third-party domains and note blocking or long-running scripts on first load.

Step 2 — Load on interaction or after idle where policy allows

Delay non-essential chat and review widgets until first tap or after requestIdleCallback/timeout. Keep payment and consent-critical scripts correct and lawful—never “optimise” away required checkout security scripts.

Step 3 — Collapse duplicate tags

One tag manager container beats three hard-coded pixels plus a duplicate manager. Remove retired pixels still firing on thank-you and product pages.

Step 4 — Re-test field-sensitive flows

Exercise search, variant pickers, and add-to-cart on a mid-tier Android phone. Watch INP-style sluggishness, not only the PSI performance number.

When to call Fixwebnode: marketing owns a fragile GTM web of tags, or third parties inject document.write / heavy iframe patterns you cannot gate from the theme alone.

When DIY is enough vs when to book Fixwebnode

DIY is enough when you control hosting and theme settings, can deploy image derivatives, disable a handful of plugins, and PSI improves steadily after each controlled change. Keep a backup, change one variable at a time, and re-test mobile PSI plus real checkout.

Book Fixwebnode when scores bounce between deploys, LCP is stuck on a framework bundle you cannot split safely, cache rules threaten personalised pages, or you need a coordinated remote pass across CDN, origin, and theme without downtime during trading hours. We operate as a direct specialist provider—remote-first for this work—supporting retailers in St Kilda and other locations listed on our service areas page.

Skip DIY experiments on production if you lack staging, cannot roll back quickly, or the site is mid-campaign. A clean remote session is cheaper than a broken Friday peak.

Talk with Fixwebnode about your 90+ PageSpeed path

A 90+ Google PageSpeed score for a retail site is a sequence: measure LCP and TTFB, fix media, clear critical-path CSS/JS, cache anonymous HTML correctly, then tame third parties—re-testing after each stage. If you want that sequence handled end-to-end on your stack, start a conversation with Fixwebnode through the landing page: 90+ Score on Google PageSpeed — book a remote review.

Bring your PSI mobile report links and staging access if you have them. We will focus on the failures that actually block 90+, not a generic checklist, and keep changes reversible for your storefront.

Share this article
Fixwebnode Support
Fixwebnode Support

Hey there!
I am your assistant for Fixwebnode. Ask about our services, quotes, packages, orders, or how to get support.
While you wait
What’s your name and best email? We’ll reply even if you leave.