Why Performance Is Non-Negotiable in 2025
Google made it official: Core Web Vitals are a ranking signal. But beyond SEO, performance is a direct driver of conversion rate. Amazon famously found that every 100ms of latency costs 1% in revenue. For a $1M ARR business, that's $10,000 per 100ms.
Performance isn't a nice-to-have. It's a product requirement.
The Three Metrics That Matter
LCP — Largest Contentful Paint
What it is: The time until the largest visible element (usually a hero image or headline) is rendered.
Good score: Under 2.5 seconds
The most common culprit: Unoptimized hero images.
The fix:
// ❌ Bad: regular img tag, no optimization
<img src="/hero.jpg" alt="Hero" />
// ✅ Good: Next.js Image with priority flag
import Image from "next/image";
<Image
src="/hero.jpg"
alt="Hero"
width={1200}
height={630}
priority // preloads the image — critical for above-the-fold content
placeholder="blur"
blurDataURL="data:image/jpeg;base64,..."
/>
INP — Interaction to Next Paint
What it is: How quickly the page responds to user interactions (clicks, taps, key presses). This replaced FID in March 2024.
Good score: Under 200 milliseconds
The most common culprit: Heavy JavaScript blocking the main thread.
The fix: Defer non-critical JS, use React.lazy() for heavy components, and break up long tasks.
// Lazy load heavy components
const HeavyChart = React.lazy(() => import("./HeavyChart"));
function Dashboard() {
return (
<Suspense fallback={<ChartSkeleton />}>
<HeavyChart />
</Suspense>
);
}
CLS — Cumulative Layout Shift
What it is: How much the layout jumps around unexpectedly while the page loads.
Good score: Under 0.1
The most common culprits:
- Images without explicit
widthandheightattributes - Dynamically injected content above existing content
- Web fonts causing FOUT (Flash of Unstyled Text)
The fix:
// Always set width and height on images
<Image
src="/product.jpg"
width={400}
height={300} // Reserves space, prevents layout shift
alt="Product"
/>
// Use next/font to prevent FOUT
import { GeistSans } from "geist/font/sans";
// Fonts are preloaded and swapped atomically
A Quick Performance Audit Checklist
Use this before every launch:
- All images use
next/imagewith explicit dimensions - Hero images have
priorityprop - Fonts loaded via
next/font - No render-blocking resources in
<head> - Third-party scripts use
next/scriptwithstrategy="lazyOnload" - Lighthouse score > 90 on mobile
- Core Web Vitals passing in PageSpeed Insights
Tools We Use
| Tool | What It's For |
|---|---|
| Lighthouse (Chrome DevTools) | Overall performance audit |
| PageSpeed Insights | Real-world CWV data |
| WebPageTest | Detailed waterfall analysis |
| Vercel Analytics | Production CWV monitoring |
| Bundle Analyzer | JavaScript bundle breakdown |
The Bottom Line
Performance optimization sounds complex, but 80% of wins come from three things:
- Use
next/imagecorrectly for every image - Use
next/fontfor all fonts - Don't load JavaScript you don't need
Start there. Then measure. Then optimize.
Questions about your site's performance? We do performance audits as part of our onboarding for new clients.
Working on something like this? See how we approach web development and e-commerce development.
