Next.js speed statistics: 529 websites measured
By Christian Schreiber · Updated
Next.js is the framework behind many large brand sites and headless shops. It can render pages on the server and ship very little JavaScript, but many sites still hydrate large client-side bundles on every page, and that cost shows up in the field data.
Causes and fixes: Core Web Vitals for Next.js.
By Core Web Vitals pass rate, Next.js ranks fourth of six platforms with their own page, behind WordPress, ahead of Contentful. Clearest advantage over all measured websites: Page weight (median), 4.1 MB against 4.3 MB. Largest gap: JavaScript (median), 2.0 MB against 1.6 MB.
Core Web Vitals on Next.js
41% of the 529 measured Next.js websites pass all three Core Web Vitals with real-user data. Across all measured websites the figure is 49%.
| Metric | Good | Median | Middle half | Threshold |
|---|---|---|---|---|
| LCP | 70% | 2027 ms | 1598 ms – 2690 ms | 2500 ms |
| INP | 62% | 177 ms | 129 ms – 247 ms | 200 ms |
| CLS | 72% | 0.06 | 0.01 – 0.12 | 0.10 |
Median mobile Lighthouse score: 37. Why lab score and field data diverge is explained in the Website Speed Statistics.
Who runs Next.js in this sample
Next.js sites in this sample are mostly brand sites, headless shops and software companies, often run by in-house teams and hosted on platforms such as Vercel or behind a CDN. The framework allows very different architectures, from static pages to fully client-rendered apps, and the field data mix all of them.
How to read your own Next.js values
On Next.js, INP tells you most about your own build, because it reflects how much JavaScript is hydrated on the page. Compare it with the faster quarter of this sample rather than the median. LCP and time to first byte depend more on hosting and caching choices, so compare them with sites that render the same way, static or on demand.
Next.js by region
Field data of Next.js websites per region.
| Region | Websites | Pass all three | LCP p50 | INP p50 | CLS p50 |
|---|---|---|---|---|---|
| Worldwide | 529 | 41% | 2027 ms | 177 ms | 0.06 |
| DACH | 43 | 65% | 1598 ms | 180 ms | 0.04 |
| United Kingdom | 44 | 39% | 1835 ms | 186 ms | 0.05 |
From 30 websites per region.
More metrics: TTFB, FCP, TBT and Speed Index
Thresholds and sources: Website Speed Statistics.
| Metric | Source | Good | Next.js median | All websites median | Threshold |
|---|---|---|---|---|---|
| Time to First Byte | Field data | 58% | 707 ms | 684 ms | 800 ms |
| First Contentful Paint | Field data | 66% | 1491 ms | 1536 ms | 1800 ms |
| Total Blocking Time | Lab | 9% | 1357 ms | 771 ms | 200 ms |
| Speed Index | Lab | 4% | 8906 ms | 8631 ms | 3400 ms |
Page weight and third-party code
A Next.js home page transfers 4.1 MB at the median, of which 2.0 MB is JavaScript. 96% load third-party code, from a median of five providers.
| Provider | Share | Main thread (median) |
|---|---|---|
| Google Tag Manager | 66% | 522 ms |
| Meta (Facebook) | 32% | 299 ms |
| OneTrust (Optanon) | 24% | 109 ms |
| Google Ads (DoubleClick) | 17% | 167 ms |
| TikTok | 13% | 176 ms |
| Other Google APIs and SDKs | 8% | 39 ms |
Most common lab findings
| Finding | Share | Saving (median) |
|---|---|---|
| Render-blocking resources | 90% | 2853 ms |
| Unused JavaScript | 83% | 1560 ms |
| Images not properly sized | 74% | 1102 ms |
| Unused CSS | 47% | 300 ms |
| Images not in next-gen formats | 31% | 1336 ms |
Typical Next.js performance bottlenecks
Hydration of big React trees is the typical reason for a slow INP on Next.js sites. LCP suffers when the hero image is rendered on the client or loaded without priority. Server components, smaller client bundles and the built-in image component with priority on the LCP image address most of it.
Related guides: Interaction to Next Paint (INP) · Largest Contentful Paint (LCP) · Reduce unused JavaScript
Next.js by industry in this sample
- Online retail: 28%
- Media and publishing: 12%
- Finance and insurance: 11%
- Entertainment and leisure: 7%
Other platforms
How does your Next.js site compare?
Run a free test and put your values next to the Next.js median.
Test your website