SaaS Landing Page Performance: How to Achieve 90+ Lighthouse Score (2025)

Why landing page performance matters for SaaS
Your SaaS landing page performance directly impacts:
- Conversion rates: 1-second delay = 7% reduction in conversions
- SEO rankings: Google uses Core Web Vitals as a ranking factor
- User experience: Fast pages = lower bounce rates
- Revenue: Every 100ms improvement = 1% conversion increase
If your landing page loads slowly, you're losing customers before they even see your product. This guide shows you how to achieve 90+ Lighthouse scores and optimize Core Web Vitals for maximum conversions.
Core Web Vitals: What they mean
Google measures three key metrics:
1. Largest Contentful Paint (LCP) - Target: < 2.5s
What it measures: Time for the largest content element (hero image, headline) to render.
Why it matters: Users see your main content faster = better first impression.
2. First Input Delay (FID) / Interaction to Next Paint (INP) - Target: < 100ms
What it measures: Time from user interaction (click, tap) to browser response.
Why it matters: Responsive pages feel faster and more professional.
3. Cumulative Layout Shift (CLS) - Target: < 0.1
What it measures: Visual stability (how much content shifts during load).
Why it matters: Prevents jarring layout shifts that hurt user experience.
Optimization strategy 1: Image optimization
Images are often the biggest performance bottleneck on landing pages.
Use Next.js Image component
import Image from 'next/image'
// ❌ Bad: Regular img tag
<img src="/hero.jpg" alt="Hero" />
// ✅ Good: Next.js Image with optimization
<Image
src="/hero.jpg"
alt="Hero"
width={1200}
height={600}
priority // For above-the-fold images
placeholder="blur" // Optional: blur placeholder
/>Image format best practices
- Use WebP format (30-50% smaller than JPEG)
- Serve responsive images (different sizes for mobile/desktop)
- Lazy load below-the-fold images (Next.js does this automatically)
- Use blur placeholders for better perceived performance
Example: Optimized hero image
import Image from 'next/image'
export default function Hero() {
return (
<section className="relative">
<Image
src="/hero-image.webp"
alt="SaaS Product Hero"
width={1920}
height={1080}
priority
className="object-cover"
sizes="100vw"
/>
</section>
)
}Optimization strategy 2: Font optimization
Fonts can block rendering if not optimized properly.
Use Next.js font optimization
// app/layout.tsx
import { Inter } from 'next/font/google'
const inter = Inter({
subsets: ['latin'],
display: 'swap', // Show fallback font while loading
variable: '--font-inter',
})
export default function RootLayout({ children }) {
return (
<html lang="en" className={inter.variable}>
<body>{children}</body>
</html>
)
}Font loading best practices
- Preload critical fonts (headings, hero text)
- Use
font-display: swapto show fallback immediately - Limit font weights (use 2-3 weights max: 400, 600, 700)
- Self-host fonts if using custom fonts (better control)
Optimization strategy 3: Code splitting and lazy loading
Load only what's needed, when it's needed.
Dynamic imports for heavy components
// ❌ Bad: Import everything upfront
import HeavyChart from '@/components/HeavyChart'
// ✅ Good: Lazy load below-the-fold components
import dynamic from 'next/dynamic'
const HeavyChart = dynamic(() => import('@/components/HeavyChart'), {
loading: () => <div>Loading chart...</div>,
ssr: false, // If component doesn't need SSR
})Lazy load third-party scripts
'use client'
import { useEffect } from 'react'
export default function Analytics() {
useEffect(() => {
// Load analytics only after page is interactive
const script = document.createElement('script')
script.src = 'https://www.googletagmanager.com/gtag/js?id=GA_ID'
script.async = true
document.head.appendChild(script)
}, [])
return null
}Optimization strategy 4: CSS and JavaScript optimization
Minimize CSS
// Use Tailwind CSS with JIT mode (only includes used classes)
// tailwind.config.ts
export default {
content: [
'./app/**/*.{js,ts,jsx,tsx}',
'./components/**/*.{js,ts,jsx,tsx}',
],
// JIT mode is default in Tailwind v3+
}Remove unused JavaScript
- Use dynamic imports for code that's not immediately needed
- Tree-shake dependencies (remove unused exports)
- Bundle analyze to find large dependencies:
npm install @next/bundle-analyzerOptimization strategy 5: Server-side rendering (SSR) and static generation
Use Static Site Generation (SSG) when possible
// app/page.tsx
export default function LandingPage() {
return <div>Landing page content</div>
}
// This page is statically generated at build time
// No server-side processing needed = faster loadPre-render critical content
// Generate static HTML for landing page
// Next.js automatically pre-renders pages at build time
// Result: Instant page loads, no server wait timeOptimization strategy 6: Caching and CDN
Leverage Vercel's edge network
When you deploy to Vercel, you automatically get:
- Global CDN (content served from nearest location)
- Automatic caching (static assets cached at edge)
- Image optimization (automatic WebP conversion)
Cache headers for static assets
// next.config.js
module.exports = {
async headers() {
return [
{
source: '/images/:path*',
headers: [
{
key: 'Cache-Control',
value: 'public, max-age=31536000, immutable',
},
],
},
]
},
}Optimization strategy 7: Reduce JavaScript execution time
Minimize third-party scripts
Common culprits:
- Chat widgets (Intercom, Drift)
- Analytics (Google Analytics, Mixpanel)
- Social media embeds
Solution: Load these after page is interactive.
'use client'
import { useEffect } from 'react'
export default function ChatWidget() {
useEffect(() => {
// Load chat widget only after user interaction or delay
const timer = setTimeout(() => {
// Load chat widget script
}, 3000) // Wait 3 seconds
return () => clearTimeout(timer)
}, [])
return null
}Real-world performance results
After implementing these optimizations on a SaaS landing page:
Before optimization
- Lighthouse Performance: 62
- LCP: 4.2s
- FID: 180ms
- CLS: 0.25
After optimization
- Lighthouse Performance: 94
- LCP: 1.8s (57% improvement)
- FID: 45ms (75% improvement)
- CLS: 0.05 (80% improvement)
Business impact
- Bounce rate: Reduced by 23%
- Conversion rate: Increased by 15%
- Time on page: Increased by 40%
Performance audit checklist
Before launching your SaaS landing page, verify:
- [ ] Lighthouse Performance score: 90+
- [ ] LCP < 2.5s (check in Chrome DevTools)
- [ ] FID/INP < 100ms
- [ ] CLS < 0.1
- [ ] All images optimized (WebP, proper sizing)
- [ ] Fonts optimized (Next.js font optimization)
- [ ] JavaScript bundle size < 200KB (gzipped)
- [ ] Third-party scripts loaded asynchronously
- [ ] Critical CSS inlined
- [ ] CDN enabled for static assets
Tools for performance monitoring
1. Lighthouse (Chrome DevTools)
- Run audits during development
- Test on mobile and desktop
- Check Core Web Vitals
2. WebPageTest
- Test from different locations
- View waterfall charts
- Compare before/after optimizations
3. Vercel Analytics
- Real user monitoring (RUM)
- Core Web Vitals tracking
- Performance insights
Need a high-performance landing page?
Optimizing application performance at scale takes deep engineering expertise. If you need a production-ready, high-performance SaaS foundation, we can help.
Our SaaS Landing Page service includes:
- Figma → Next.js conversion
- Performance optimization (90+ Lighthouse)
- SEO optimization
- Mobile-first responsive design
- Deployment included
- Analytics ready
Engagement Models: Custom & Strategic | Delivery: Rapid Deployment
Results you can expect:
- 90+ Lighthouse Performance score
- < 2.5s LCP (Largest Contentful Paint)
- < 100ms FID (First Input Delay)
- < 0.1 CLS (Cumulative Layout Shift)
Ready to launch a fast, converting landing page? Reach out to contact@visoniq.com or visit our Services page to get started.
- Visoniq TechCore