{"id":"6munnmdh9f27kv8","title":"Lab vs Field Data in PageSpeed Insights: When a 100 Score Still Fails Core Web Vitals","slug":"lab-vs-field-data-pagespeed","summary":"A PageSpeed 100 score can still fail Core Web Vitals. I explain lab vs field data in PSI, when CrUX beats Lighthouse, and what to fix first.","imageUrl":"https://briancrabtree.me/images/journal-lab-vs-field-data-pagespeed.webp","category":"Performance","date":"2026-06-13T18:00:00.000Z","featured":false,"likes":7,"author":"Brian Crabtree","content":"<h2>The Scoreboard Lie</h2>\n\n<p>For years, I've watched teams optimize for a green PageSpeed Insights score, feeling good about hitting 90+ in Lighthouse. It's a clean, quantifiable win. But often, that celebration is premature, even misleading, when real users are still having a terrible experience.</p>\n\n<p>This disconnect highlights a critical point in web development: lab vs field data pagespeed isn't just an academic distinction; it's the difference between simulated perfection and real-world struggle. We can engineer a site to look fast in a controlled environment. The challenge is making it genuinely fast for everyone, everywhere.</p>\n\n<p>My own experience building high-traffic applications taught me this the hard way. A flawless Lighthouse audit on my dev machine didn't mean anything if users in rural areas on older phones were stuck staring at a blank screen. The numbers looked good, but the user experience was often broken.</p>\n\n<pre><code>// Lab: Lighthouse throttled single run\n// Field: CrUX p75 LCP / INP / CLS for real Chrome users\n// Low traffic → \"No Data\" in PSI field section is normal</code></pre>\n\n<p><figure>\n  <img src=\"/images/journal-inline-lab-vs-field-pagespeed.webp\" alt=\"Split comparison of lab Lighthouse scores versus field CrUX real user data\" width=\"1200\" height=\"675\" loading=\"lazy\" />\n  <figcaption>Lab scores move every run; field CrUX is what ranking signals actually use.</figcaption>\n</figure></p>\n\n<h2>Lighthouse is a Robot Not a User</h2>\n\n<p>Lighthouse, by design, runs in a sterile environment. It simulates a single page load on a mid-range mobile device with a consistent network connection, usually from a Google data center. This consistency is valuable for isolated testing and catching regressions in your build process.</p>\n\n<p>The problem starts when teams treat this synthetic benchmark as the final word on performance. It doesn't account for network fluctuations, device fragmentation, or the presence of numerous third-party scripts loaded over time. A robot can't click around, interact, or get frustrated the way a human does.</p>\n\n<p>I use Lighthouse regularly, but I know its place. It's a diagnostic tool for specific, repeatable tests. It helps identify low-hanging fruit in the build or rendering path. It is not, and was never meant to be, a stand-in for actual user behavior or experience.</p>\n\n<h2>The Crux of the Matter</h2>\n\n<p>This is where CrUX data comes into play, specifically Core Web Vitals. Google's Chrome User Experience Report (CrUX) aggregates anonymized real-user data from opted-in Chrome browsers. It captures what users actually experience, not what a controlled lab test predicts.</p>\n\n<p>I've seen countless sites with a PageSpeed Lighthouse score of 95, yet their LCP (Largest Contentful Paint) or FID (First Input Delay) in CrUX data is squarely in the \"poor\" category. This discrepancy is a flashing red light. It tells me that while the initial render might be fast in the lab, something else is causing real-world pain.</p>\n\n<p>CrUX data is messy because real life is messy. It includes all the variables: slow networks, old devices, background tabs, and user interaction delays. When your CrUX numbers are bad, it means a significant portion of your real user base is having a bad time, regardless of what Lighthouse says.</p>\n\n<h2>What Lab Data Does Well</h2>\n\n<p>Despite its limitations for overall performance, lab data shines in certain scenarios. It's excellent for catching performance regressions in a continuous integration pipeline. A script that suddenly adds 200ms to your LCP can be caught immediately before it hits production, even if overall field data remains \"good\" for now.</p>\n\n<p>Isolated component testing is another strong suit. If I'm refactoring a critical rendering path or optimizing an image loading strategy, Lighthouse provides a stable baseline for comparison. I can iterate on code changes and see their immediate, measurable impact without waiting for field data to aggregate.</p>\n\n<p>Lab data also forces us to address fundamental best practices: image optimization, proper caching headers, efficient CSS delivery, and JavaScript bundling. These are non-negotiables, and Lighthouse provides a good checklist. Just don't confuse ticking the boxes with solving the whole problem.</p>\n\n<h2>Real Users Real Pain Points</h2>\n\n<p>Field data exposes the performance bottlenecks that synthetic tests often miss entirely. Think about a third-party chat widget that randomly hangs the main thread for several seconds, or an A/B testing script that introduces layout shifts only on specific device models. Lighthouse probably won't flag these nuanced issues consistently.</p>\n\n<p>I once had a client whose PageSpeed score was 98, but their actual conversion rates were dropping, and bounce rates were through the roof. Digging into their field data revealed a massive Cumulative Layout Shift (CLS) on iOS devices due to a poorly implemented ad network. Lab data showed none of this because the simulated environment didn't fetch the problematic ad.</p>\n\n<p>This is why I preach a \"field-first\" approach. Real user data gives you a map of what's broken for your actual audience. If you want to know how your site is truly performing, look at what your users are experiencing, not just what a bot reports. You can read more about how performance metrics fluctuate in lab tests at <a href=\"/journal/why-pagespeed-scores-change-every-run/\">Why PageSpeed Scores Change Every Run (And What to Fix First)</a>.</p>\n\n<h2>The Why Behind the Discrepancy</h2>\n\n<p>The underlying reasons for the lab-field mismatch are complex but understandable. Lighthouse runs with a cold cache, meaning every asset is downloaded fresh. Real users, however, often have warm caches, which can make subsequent visits much faster, or sometimes slower if caching headers are wrong.</p>\n\n<p>Network conditions are also a huge factor. Lighthouse simulates a consistent 3G or 4G connection. In reality, users navigate patchy Wi-Fi, congested cellular networks, or enterprise proxies. These real-world variables significantly impact load times and interactivity, often in ways a synthetic test can't fully replicate.</p>\n\n<p>Device heterogeneity also plays a role. Lighthouse uses a fixed set of CPU and memory throttles. Your users, however, could be on anything from a brand new flagship phone to a five-year-old budget tablet with limited processing power. JavaScript execution, especially, suffers drastically on lower-end hardware, causing long task times and input delays not always apparent in lab tests.</p>\n\n<h2>What I Do Next</h2>\n\n<p>So, how do I approach performance measurement? I always start with field data, specifically Core Web Vitals from CrUX. These are the metrics that directly impact user experience and Google search rankings. If those are in the green, then I know my users are generally having a good time.</p>\n\n<p>Lab data, like Lighthouse, then becomes a powerful debugging and diagnostic tool. If field data shows a problem, I use Lighthouse to pinpoint the specific code-level issues on a consistent baseline. It helps me validate that my fixes are actually working in a controlled environment before shipping them to real users.</p>\n\n<p>Don't chase a perfect PageSpeed Insights score for its own sake. Focus on what matters: making your site fast and responsive for your actual users. If you're curious why your PageSpeed scores sometimes seem to jump around unpredictably, I cover that in depth at <a href=\"/journal/why-pagespeed-scores-change-every-run/\">Why PageSpeed Scores Change Every Run (And What to Fix First)</a>.</p>","tags":["pagespeed-insights","crux","lab-data"],"views":42}