[{"data":1,"prerenderedAt":686},["ShallowReactive",2],{"content:\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree":3,"surroundings:\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree":677},{"id":4,"title":5,"body":6,"description":657,"extension":658,"meta":659,"navigation":671,"path":672,"seo":673,"stem":675,"__hash__":676},"content\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002Findex.md","Why Lab and Field LCP Disagree",{"type":7,"value":8,"toc":649},"minimark",[9,14,42,45,50,84,204,208,214,220,226,232,238,244,248,253,335,338,344,463,469,511,517,521,524,527,540,544,560,569,578,587,596,609,613,634,639,642,645],[10,11,13],"h1",{"id":12},"why-your-lab-lcp-says-18s-and-your-field-p75-says-34s","Why Your Lab LCP Says 1.8s and Your Field p75 Says 3.4s",[15,16,17,18,23,24,28,29,33,34,37,38,41],"p",{},"This page extends ",[19,20,22],"a",{"href":21},"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002F","Understanding Core Web Vitals Thresholds"," within ",[19,25,27],{"href":26},"\u002Fcore-web-vitals-measurement\u002F","Core Web Vitals & Measurement",". A synthetic run reports a comfortable ",[30,31,32],"code",{},"1.8s",", well inside the ",[30,35,36],{},"2.5s"," boundary. Field data reports a p75 of ",[30,39,40],{},"3.4s",". The instinct is to distrust one of them, and that is the wrong move — a lab run is a single sample from a distribution, taken under conditions you chose. The p75 is a property of the distribution.",[15,43,44],{},"Understanding the six differences turns a contradiction into a diagnostic.",[46,47,49],"h2",{"id":48},"rapid-diagnosis-which-difference-dominates","Rapid Diagnosis: Which Difference Dominates?",[51,52,53,61,67,78],"ul",{},[54,55,56,60],"li",{},[57,58,59],"strong",{},"Look at the device split."," If your field mix is 70% mobile and your lab profile is a desktop, the CPU difference alone can double render delay.",[54,62,63,66],{},[57,64,65],{},"Check the LCP element per segment."," Field data may show a different element winning on mobile than the one Lighthouse reported on desktop — different element, different bottleneck.",[54,68,69,72,73,77],{},[57,70,71],{},"Compare cache states."," Lab runs are cold by default; a large share of real visits are warm. This usually pushes the field number ",[74,75,76],"em",{},"down",", so if field is still worse, the cold-visit tail is severe.",[54,79,80,83],{},[57,81,82],{},"Check the network shape, not just the speed."," Lighthouse's simulated throttling models a clean link; real mobile connections have variable latency, packet loss and radio wake-up delays that no simulation reproduces.",[85,86,93,94,101,102,101,106,101,110,101,119,101,126,101,133,101,140,101,149,101,155,101,161,101,166,101,174,101,179,101,185,101,190,101,194,101,199,101],"svg",{"xmlns":87,"viewBox":88,"width":89,"role":90,"ariaLabel":91,"style":92},"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg","0 0 760 258","100%","img","A distribution curve of real user LCP values with the lab result marked near the fast end at 1.8 seconds, the median at 2.4 and the 75th percentile at 3.4 seconds","height:auto;max-width:760px;display:block;margin:1.75rem auto;font-family:inherit;color:var(--fp-svg-ink)","\n  ",[95,96],"rect",{"className":97,"x":99,"y":99,"width":89,"height":89,"fill":100},[98],"svg-canvas","0","#ffffff"," ",[103,104,105],"title",{},"One lab sample against the real distribution",[107,108,109],"desc",{},"The field distribution of LCP is skewed right; the lab measurement sits near the fast end at 1.8 seconds while the 75th percentile that decides the assessment sits at 3.4 seconds.",[95,111],{"x":112,"y":112,"width":113,"height":114,"rx":115,"fill":116,"stroke":117,"style":118},"1","758","256","10","none","currentColor","stroke-opacity:0.18",[120,121,125],"text",{"x":122,"y":123,"fill":117,"style":124},"24","32","font-size:16px;font-weight:700","The lab run is one sample from this curve",[127,128],"path",{"d":129,"fill":116,"stroke":130,"strokeWidth":131,"style":132},"M60 190 C 140 190, 160 80, 230 80 C 300 80, 330 120, 400 145 C 470 168, 560 182, 700 188","#0466c8","2.5","stroke-opacity:0.85",[134,135],"line",{"x1":136,"y1":137,"x2":138,"y2":137,"stroke":117,"style":139},"60","190","710","stroke-opacity:0.4",[134,141],{"x1":142,"y1":143,"x2":142,"y2":144,"stroke":130,"strokeDashArray":145,"style":148},"180","70","196",[146,147],"4","3","stroke-opacity:0.8",[120,150,154],{"x":142,"y":151,"fill":130,"style":152,"textAnchor":153},"62","font-size:11px;font-weight:700;","middle","lab 1.8s",[134,156],{"x1":157,"y1":158,"x2":157,"y2":144,"stroke":117,"strokeDashArray":159,"style":160},"250","90",[146,147],"stroke-opacity:0.5",[120,162,165],{"x":157,"y":163,"fill":117,"style":164,"textAnchor":153},"82","font-size:11px;","p50 2.4s",[134,167],{"x1":168,"y1":169,"x2":168,"y2":144,"stroke":170,"strokeDashArray":171,"style":173},"430","120","#b8860b",[172,146],"5","stroke-opacity:0.95",[120,175,178],{"x":168,"y":176,"fill":170,"style":177,"textAnchor":153},"112","font-size:11.5px;font-weight:700;","p75 3.4s — the number that ships",[134,180],{"x1":181,"y1":182,"x2":181,"y2":144,"stroke":117,"strokeDashArray":183,"style":184},"330","100",[147,147],"stroke-opacity:0.35",[120,186,189],{"x":181,"y":187,"fill":117,"style":188,"textAnchor":153},"212","font-size:10.5px;","2.5s threshold",[120,191,193],{"x":143,"y":187,"fill":117,"style":192},"font-size:10.5px","fast",[120,195,198],{"x":196,"y":187,"fill":117,"style":188,"textAnchor":197},"690","end","slow",[120,200,203],{"x":122,"y":201,"fill":117,"style":202},"242","font-size:11.5px;fill-opacity:0.85","Improving the lab number moves the whole curve only if the lab profile resembles the slow quartile.",[46,205,207],{"id":206},"root-cause-analysis-the-six-differences","Root Cause Analysis: The Six Differences",[15,209,210,213],{},[57,211,212],{},"1. Device CPU."," A lab run on a development machine has several times the single-core performance of a mid-tier Android phone. Since render delay is CPU-bound, that difference alone can add a second on the same page.",[15,215,216,219],{},[57,217,218],{},"2. Cache state."," Synthetic runs start cold. Real traffic is a mixture, and the two populations behave so differently that a single aggregate hides both. Always segment field LCP by cache state before comparing.",[15,221,222,225],{},[57,223,224],{},"3. A different LCP element."," The largest element in a 1350px-wide desktop viewport is often not the largest in a 390px mobile one. If the element differs, the two numbers are measuring different resources entirely.",[15,227,228,231],{},[57,229,230],{},"4. Network model."," Simulated throttling applies a fixed round-trip time and bandwidth cap to a clean connection. Real mobile links have variable latency, occasional loss and radio state transitions, which are consistently worse than the model.",[15,233,234,237],{},[57,235,236],{},"5. Viewport and above-the-fold content."," A tall desktop viewport can include an image that is below the fold on mobile — and off-screen elements never become LCP candidates.",[15,239,240,243],{},[57,241,242],{},"6. Third parties that behave differently."," Consent managers, personalisation and A\u002FB tools frequently short-circuit for a headless run or a lab user agent, so the synthetic page is simply not the page users get.",[46,245,247],{"id":246},"step-by-step-resolution-make-the-two-numbers-comparable","Step-by-Step Resolution: Make the Two Numbers Comparable",[15,249,250],{},[57,251,252],{},"1. Match the lab profile to the slow quartile, not to the average.",[254,255,260],"pre",{"className":256,"code":257,"language":258,"meta":259,"style":259},"language-bash shiki shiki-themes github-light-high-contrast github-dark-high-contrast github-light-high-contrast","npx lighthouse https:\u002F\u002Fexample.com --quiet --output=json \\\n  --form-factor=mobile --screenEmulation.mobile \\\n  --throttling.cpuSlowdownMultiplier=4 \\\n  --throttling.rttMs=170 --throttling.throughputKbps=1600\n# trade-off: a harsher profile makes every run look worse and can demoralise a\n# team. It is still the right default — a profile that only reproduces your\n# fastest users cannot predict the metric that is actually assessed.\n","bash","",[30,261,262,288,299,307,316,323,329],{"__ignoreMap":259},[263,264,266,270,274,277,281,284],"span",{"class":134,"line":265},1,[263,267,269],{"class":268},"sQw3B","npx",[263,271,273],{"class":272},"sZ8jY"," lighthouse",[263,275,276],{"class":272}," https:\u002F\u002Fexample.com",[263,278,280],{"class":279},"sPXB4"," --quiet",[263,282,283],{"class":279}," --output=json",[263,285,287],{"class":286},"sPARh"," \\\n",[263,289,291,294,297],{"class":134,"line":290},2,[263,292,293],{"class":279},"  --form-factor=mobile",[263,295,296],{"class":279}," --screenEmulation.mobile",[263,298,287],{"class":286},[263,300,302,305],{"class":134,"line":301},3,[263,303,304],{"class":279},"  --throttling.cpuSlowdownMultiplier=4",[263,306,287],{"class":286},[263,308,310,313],{"class":134,"line":309},4,[263,311,312],{"class":279},"  --throttling.rttMs=170",[263,314,315],{"class":279}," --throttling.throughputKbps=1600\n",[263,317,319],{"class":134,"line":318},5,[263,320,322],{"class":321},"sjfSM","# trade-off: a harsher profile makes every run look worse and can demoralise a\n",[263,324,326],{"class":134,"line":325},6,[263,327,328],{"class":321},"# team. It is still the right default — a profile that only reproduces your\n",[263,330,332],{"class":134,"line":331},7,[263,333,334],{"class":321},"# fastest users cannot predict the metric that is actually assessed.\n",[15,336,337],{},"Expected outcome: the lab number moves toward the field p75, usually closing half the gap immediately.",[15,339,340,343],{},[57,341,342],{},"2. Confirm the LCP element matches."," Read the element from field attribution and from the lab run; if they differ, fix the comparison before fixing the page.",[254,345,349],{"className":346,"code":347,"language":348,"meta":259,"style":259},"language-javascript shiki shiki-themes github-light-high-contrast github-dark-high-contrast github-light-high-contrast","new PerformanceObserver((l) => {\n  const e = l.getEntries().at(-1);\n  console.log('LCP element', e.element?.tagName, e.element?.className,\n    'at', Math.round(e.startTime));\n}).observe({ type: 'largest-contentful-paint', buffered: true });\n","javascript",[30,350,351,376,410,426,440],{"__ignoreMap":259},[263,352,353,356,360,364,367,370,373],{"class":134,"line":265},[263,354,355],{"class":286},"new",[263,357,359],{"class":358},"smZ65"," PerformanceObserver",[263,361,363],{"class":362},"saISM","((",[263,365,366],{"class":268},"l",[263,368,369],{"class":362},") ",[263,371,372],{"class":286},"=>",[263,374,375],{"class":362}," {\n",[263,377,378,381,384,387,390,393,396,399,402,405,407],{"class":134,"line":290},[263,379,380],{"class":286},"  const",[263,382,383],{"class":279}," e",[263,385,386],{"class":286}," =",[263,388,389],{"class":362}," l.",[263,391,392],{"class":358},"getEntries",[263,394,395],{"class":362},"().",[263,397,398],{"class":358},"at",[263,400,401],{"class":362},"(",[263,403,404],{"class":286},"-",[263,406,112],{"class":279},[263,408,409],{"class":362},");\n",[263,411,412,415,418,420,423],{"class":134,"line":301},[263,413,414],{"class":362},"  console.",[263,416,417],{"class":358},"log",[263,419,401],{"class":362},[263,421,422],{"class":272},"'LCP element'",[263,424,425],{"class":362},", e.element?.tagName, e.element?.className,\n",[263,427,428,431,434,437],{"class":134,"line":309},[263,429,430],{"class":272},"    'at'",[263,432,433],{"class":362},", Math.",[263,435,436],{"class":358},"round",[263,438,439],{"class":362},"(e.startTime));\n",[263,441,442,445,448,451,454,457,460],{"class":134,"line":318},[263,443,444],{"class":362},"}).",[263,446,447],{"class":358},"observe",[263,449,450],{"class":362},"({ type: ",[263,452,453],{"class":272},"'largest-contentful-paint'",[263,455,456],{"class":362},", buffered: ",[263,458,459],{"class":279},"true",[263,461,462],{"class":362}," });\n",[15,464,465,468],{},[57,466,467],{},"3. Segment the field number before drawing conclusions."," Split by device class, cache state and connection type. A single p75 that fails often decomposes into three passing segments and one badly failing one — and that one is the work.",[254,470,474],{"className":471,"code":472,"language":473,"meta":259,"style":259},"language-sql shiki shiki-themes github-light-high-contrast github-dark-high-contrast github-light-high-contrast","SELECT device_class, cache_state,\n       approx_quantile(value, 0.75) AS p75, count(*) AS n\nFROM rum_events WHERE name = 'LCP' AND ts > now() - interval '7 days'\nGROUP BY 1, 2 ORDER BY p75 DESC;\n-- trade-off: more dimensions means smaller groups and noisier percentiles.\n-- Keep segments above roughly a thousand samples a day or the ranking will\n-- reorder itself daily for no real reason.\n","sql",[30,475,476,481,486,491,496,501,506],{"__ignoreMap":259},[263,477,478],{"class":134,"line":265},[263,479,480],{},"SELECT device_class, cache_state,\n",[263,482,483],{"class":134,"line":290},[263,484,485],{},"       approx_quantile(value, 0.75) AS p75, count(*) AS n\n",[263,487,488],{"class":134,"line":301},[263,489,490],{},"FROM rum_events WHERE name = 'LCP' AND ts > now() - interval '7 days'\n",[263,492,493],{"class":134,"line":309},[263,494,495],{},"GROUP BY 1, 2 ORDER BY p75 DESC;\n",[263,497,498],{"class":134,"line":318},[263,499,500],{},"-- trade-off: more dimensions means smaller groups and noisier percentiles.\n",[263,502,503],{"class":134,"line":325},[263,504,505],{},"-- Keep segments above roughly a thousand samples a day or the ranking will\n",[263,507,508],{"class":134,"line":331},[263,509,510],{},"-- reorder itself daily for no real reason.\n",[15,512,513,516],{},[57,514,515],{},"4. Fix for the failing segment, then re-verify in both places."," A change that improves the lab number but not the failing segment's field number was the wrong change, and only the segmentation would have told you.",[46,518,520],{"id":519},"verification","Verification",[15,522,523],{},"After a fix, expect the two measurements to move differently and in a predictable way: the lab number moves immediately and by a known amount; the field p75 moves over days, by less, and only in proportion to how much of your traffic resembles the profile you fixed.",[15,525,526],{},"That asymmetry is the signal to watch. If the lab improves and the field does not move at all after a full reporting window, the change addressed a condition your users do not experience — a common outcome of optimising against a fast desktop profile.",[15,528,529,530,534,535,539],{},"Keep both signals in CI and in the dashboard, with the relationship documented. The pairing to use: lab assertions as a pre-merge gate, described in ",[19,531,533],{"href":532},"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines\u002F","the best Lighthouse CI setup for frontend pipelines",", and a field alert on relative regression per route from ",[19,536,538],{"href":537},"\u002Fcore-web-vitals-measurement\u002Frum-beacons-and-field-data-collection\u002F","your RUM pipeline",".",[46,541,543],{"id":542},"faq","FAQ",[545,546,549,553],"details",{"className":547},[548],"faq-item",[550,551,552],"summary",{},"Which number should I optimise against?",[15,554,555,556,559],{},"The field p75, always — it is what the assessment uses and what users experience. The lab is for diagnosis: it tells you ",[74,557,558],{},"why"," a page is slow with a repeatable trace you can profile. Use the field number to choose what to work on and to confirm the result; use the lab to find the mechanism in between.",[545,561,563,566],{"className":562},[548],[550,564,565],{},"Why is my field LCP better than my lab LCP?",[15,567,568],{},"Usually cache warmth. Repeat visitors skip most of the load entirely, so a field aggregate dominated by returning users can beat a cold synthetic run comfortably. That is not necessarily good news: the first-visit segment may still be failing badly and is being averaged away. Segment by cache state before celebrating.",[545,570,572,575],{"className":571},[548],[550,573,574],{},"Does Lighthouse's simulated throttling understate real-world slowness?",[15,576,577],{},"Generally yes. Simulation applies a clean latency and bandwidth model, while real mobile networks add variable latency, retransmissions and radio wake-up costs. Using applied throttling — actually slowing the connection rather than modelling it — reproduces field conditions more closely at the cost of longer, noisier runs. Simulated is the right default for CI; applied is better for a one-off investigation of a stubborn gap.",[545,579,581,584],{"className":580},[548],[550,582,583],{},"How many synthetic runs do I need for a stable number?",[15,585,586],{},"At least three, and take the median rather than the mean. A single Lighthouse run varies by a few hundred milliseconds on the same page and machine, which is enough to make an unchanged deploy look like a regression. Three runs and a median is the usual compromise between stability and CI time; five is worth it for a release gate. Never compare a one-run number against a one-run number and treat the difference as signal.",[545,588,590,593],{"className":589},[548],[550,591,592],{},"Should CI fail on the lab number if the field number is what matters?",[15,594,595],{},"Yes, because the lab number is the only one available before the code ships. Treat it as a pre-merge guard against known-bad patterns — a render-blocking resource appearing, a bundle crossing a budget — rather than as a prediction of the field p75. The field alert is the outcome measure; the lab assertion is the mechanism that stops obvious regressions from reaching it.",[545,597,599,602],{"className":598},[548],[550,600,601],{},"Why did my field p75 move without any deploy?",[15,603,604,605,608],{},"Because the population changed, not the page. A marketing campaign that brings in slower devices, a seasonal shift in geography, a change in the mix of new versus returning visitors, or a third-party tag updating itself will all move the number with your code untouched. Before investigating the page, check whether the ",[74,606,607],{},"distribution"," of device class, country and cache state changed over the same window — that comparison usually answers it in a minute.",[46,610,612],{"id":611},"related","Related",[51,614,615,620,627],{},[54,616,617,619],{},[19,618,22],{"href":21}," — what the p75 boundary means and why it is assessed that way.",[54,621,622,626],{},[19,623,625],{"href":624},"\u002Fcore-web-vitals-measurement\u002Frum-beacons-and-field-data-collection\u002Fcrux-vs-your-own-rum-why-the-numbers-differ\u002F","CrUX vs your own RUM"," — the same reconciliation between two field sources.",[54,628,629,633],{},[19,630,632],{"href":631},"\u002Fcore-web-vitals-measurement\u002Fmeasuring-lcp-with-chrome-devtools\u002F","Measuring LCP with Chrome DevTools"," — the phase breakdown that explains which part of the gap is CPU and which is network.",[635,636,638],"script",{"type":637},"application\u002Fld+json","\n{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"HowTo\",\n  \"name\": \"Reconcile lab and field LCP\",\n  \"description\": \"Match the synthetic profile to the slow quartile, confirm the LCP element is the same in both, segment field data by device and cache state, and verify fixes in both signals.\",\n  \"step\": [\n    { \"@type\": \"HowToStep\", \"position\": 1, \"name\": \"Harden the lab profile\", \"text\": \"Run synthetic tests with mobile emulation, CPU slowdown and realistic latency instead of default desktop conditions.\", \"url\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F#step-by-step-resolution-make-the-two-numbers-comparable\" },\n    { \"@type\": \"HowToStep\", \"position\": 2, \"name\": \"Confirm the LCP element\", \"text\": \"Compare the element reported in field attribution against the one the lab run reports.\", \"url\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F#step-by-step-resolution-make-the-two-numbers-comparable\" },\n    { \"@type\": \"HowToStep\", \"position\": 3, \"name\": \"Segment the field p75\", \"text\": \"Split field LCP by device class, cache state and connection to find the failing population.\", \"url\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F#step-by-step-resolution-make-the-two-numbers-comparable\" },\n    { \"@type\": \"HowToStep\", \"position\": 4, \"name\": \"Verify in both signals\", \"text\": \"Expect the lab to move immediately and the field to move over days, in proportion to affected traffic.\", \"url\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F#verification\" }\n  ]\n}\n",[635,640,641],{"type":637},"\n{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"TechArticle\",\n  \"headline\": \"Why Your Lab LCP Says 1.8s and Your Field p75 Says 3.4s\",\n  \"description\": \"The six structural differences between synthetic and real-user LCP, and how to turn the contradiction into a diagnostic.\",\n  \"datePublished\": \"2026-08-01\",\n  \"dateModified\": \"2026-08-01\",\n  \"author\": { \"@type\": \"Organization\", \"name\": \"frontend-performance.com\" },\n  \"publisher\": { \"@type\": \"Organization\", \"name\": \"frontend-performance.com\" },\n  \"mainEntityOfPage\": { \"@type\": \"WebPage\", \"@id\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F\" }\n}\n",[635,643,644],{"type":637},"\n{\n  \"@context\": \"https:\u002F\u002Fschema.org\",\n  \"@type\": \"BreadcrumbList\",\n  \"itemListElement\": [\n    { \"@type\": \"ListItem\", \"position\": 1, \"name\": \"Home\", \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002F\" },\n    { \"@type\": \"ListItem\", \"position\": 2, \"name\": \"Core Web Vitals & Measurement\", \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002F\" },\n    { \"@type\": \"ListItem\", \"position\": 3, \"name\": \"Understanding Core Web Vitals Thresholds\", \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002F\" },\n    { \"@type\": \"ListItem\", \"position\": 4, \"name\": \"Why Lab and Field LCP Disagree\", \"item\": \"https:\u002F\u002Ffrontend-performance.com\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F\" }\n  ]\n}\n",[646,647,648],"style",{},"html pre.shiki code .sQw3B, html code.shiki .sQw3B{--shiki-default:#702C00;--shiki-dark:#FFB757;--shiki-light:#702C00}html pre.shiki code .sZ8jY, html code.shiki .sZ8jY{--shiki-default:#032563;--shiki-dark:#ADDCFF;--shiki-light:#032563}html pre.shiki code .sPXB4, html code.shiki .sPXB4{--shiki-default:#023B95;--shiki-dark:#91CBFF;--shiki-light:#023B95}html pre.shiki code .sPARh, html code.shiki .sPARh{--shiki-default:#A0111F;--shiki-dark:#FF9492;--shiki-light:#A0111F}html pre.shiki code .sjfSM, html code.shiki .sjfSM{--shiki-default:#66707B;--shiki-dark:#BDC4CC;--shiki-light:#66707B}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .smZ65, html code.shiki .smZ65{--shiki-default:#622CBC;--shiki-dark:#DBB7FF;--shiki-light:#622CBC}html pre.shiki code .saISM, html code.shiki .saISM{--shiki-default:#0E1116;--shiki-dark:#F0F3F6;--shiki-light:#0E1116}",{"title":259,"searchDepth":290,"depth":290,"links":650},[651,652,653,654,655,656],{"id":48,"depth":290,"text":49},{"id":206,"depth":290,"text":207},{"id":246,"depth":290,"text":247},{"id":519,"depth":290,"text":520},{"id":542,"depth":290,"text":543},{"id":611,"depth":290,"text":612},"Synthetic runs measure one device on one connection with an empty cache. Field data measures everyone. Here is how to make the two numbers explain each other.","md",{"slug":660,"type":661,"breadcrumb":662,"datePublished":670,"dateModified":670},"why-lab-and-field-lcp-disagree","article",[663,666,667,668],{"name":664,"url":665},"Home","\u002F",{"name":27,"url":26},{"name":22,"url":21},{"name":5,"url":669},"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002F","2026-08-01",true,"\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree",{"title":5,"description":674},"A 1.8s Lighthouse LCP and a 3.4s field p75 are usually both correct. The six differences — device mix, cache state, LCP element, network shape, viewport and throttling model.","core-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fwhy-lab-and-field-lcp-disagree\u002Findex","ZeY1td26pmD3MzNZFQCd9GF1URUgYJRZpm1oFd1MiWE",[678,682],{"title":679,"path":680,"stem":681,"children":-1},"Best Lighthouse CI Setup for Frontend Pipelines","\u002Fcore-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines","core-web-vitals-measurement\u002Funderstanding-core-web-vitals-thresholds\u002Fbest-lighthouse-ci-setup-for-frontend-pipelines\u002Findex",{"title":683,"path":684,"stem":685,"children":-1},"Image & Media Optimization","\u002Fimage-media-optimization","image-media-optimization\u002Findex",1785622406404]