How We Cut a US Startup's Page Load Time by 60%
A slow website costs you customers. Here's exactly how we diagnosed and fixed a real performance problem.
The Brief
A US-based SaaS startup came to us with a problem: their marketing site was taking 6.2 seconds to load on mobile. Their bounce rate was over 70%, and their Google Ads quality score was suffering because of it.
They'd already tried switching themes and compressing images. Nothing moved the needle. Here's exactly what we found — and how we fixed it.
Step 1: Diagnose Before You Fix
We ran the site through Lighthouse, WebPageTest, and Chrome DevTools. The waterfall chart told the story immediately.
The main culprits:
- –4.1MB of unoptimised images (PNG files served at full resolution)
- –3 third-party scripts loading synchronously in the
<head> - –A Google Fonts
@importinside a CSS file (worst possible loading pattern) - –An unused animation library (GSAP) loaded on every page
- –No caching headers on static assets
Step 2: Images First — Biggest Win
Images accounted for 67% of the page weight. We:
- –Converted all PNGs to WebP (average 65% size reduction)
- –Implemented responsive images with
srcsetso mobile gets smaller files - –Added
loading="lazy"to all below-fold images - –Used Next.js
<Image>component which handles optimisation automatically
Result: Page weight dropped from 4.1MB to 890KB.
Step 3: Fix the Font Loading
The @import inside CSS blocks rendering until the stylesheet is fully parsed. We replaced it with next/font which self-hosts fonts, eliminates the Google Fonts network request entirely, and inlines the font-face declarations.
Result: ~300ms saved on first paint.
Step 4: Defer Non-Critical Scripts
The analytics script, chat widget, and A/B testing tool were all loading synchronously. We moved them to load after the page was interactive using strategy="lazyOnload" in Next.js.
Result: TBT (Total Blocking Time) dropped from 890ms to 120ms.
Step 5: Code Splitting
The GSAP library was imported globally but only used on one page. We moved it to a dynamic import so it only loads when needed.
The Final Numbers
| Metric | Before | After | |--------|--------|-------| | Page Weight | 4.1MB | 890KB | | Load Time (mobile) | 6.2s | 2.4s | | LCP | 5.8s | 1.9s | | TBT | 890ms | 120ms | | Bounce Rate | 71% | 43% |
A 60% improvement in load time. The client saw a measurable drop in bounce rate within the first week after deployment.
The Lesson
Performance problems are almost always diagnosable with the right tools. Before rebuilding anything, run a Lighthouse audit and read the waterfall. The biggest wins are usually images, fonts, and third-party scripts — not the framework or the code architecture.