[{"data":1,"prerenderedAt":3755},["ShallowReactive",2],{"article-alternates":3,"article-\u002Fen\u002Ftech\u002Fweb-performance-budgets-linking-to-decision-making":13},{"i18nKey":4,"paths":5},"tech-004-2026-05",{"de":6,"en":7,"es":8,"fr":9,"it":10,"ru":11,"tr":12},"\u002Fde\u002Ftech\u002Fweb-performance-budgets-entscheidungsfindung","\u002Fen\u002Ftech\u002Fweb-performance-budgets-linking-to-decision-making","\u002Fes\u002Ftech\u002Fpresupuestos-de-rendimiento-web-mecanismo-de-decision","\u002Ffr\u002Ftech\u002Fbudgets-de-performance-web-mecanismes-de-decision","\u002Fit\u002Ftech\u002Fweb-performance-budget-decisioni","\u002Fru\u002Ftech\u002Fweb-performance-budgets-decision-framework","\u002Ftr\u002Ftech\u002Fweb-performance-budgetlari-karar-mekanizmasina-baglamak",{"_path":7,"_dir":14,"_draft":15,"_partial":15,"_locale":16,"title":17,"description":18,"publishedAt":19,"modifiedAt":19,"category":14,"i18nKey":4,"tags":20,"readingTime":26,"author":27,"body":28,"_type":3749,"_id":3750,"_source":3751,"_file":3752,"_stem":3753,"_extension":3754},"tech",false,"","Web Performance Budgets: Linking Speed to Business Decisions","Convert speed metrics into measurable business goals using Lighthouse CI, RUM, and performance regression alerts—with practical architecture and code examples.","2026-05-14",[21,22,23,24,25],"web-performance","lighthouse-ci","rum","performance-budget","devops",8,"Roibase",{"type":29,"children":30,"toc":3737},"root",[31,39,46,51,56,374,387,619,624,630,635,951,956,1347,1352,1527,1532,1539,1544,1560,1566,1571,1728,1733,2315,2320,2326,2331,2926,2931,2988,2993,2999,3004,3326,3347,3353,3358,3477,3482,3490,3495,3500,3701,3706,3712,3726,3731],{"type":32,"tag":33,"props":34,"children":35},"element","p",{},[36],{"type":37,"value":38},"text","The cost of website slowness is now a quantifiable metric. Amazon's 2006 study showed that every 100ms delay caused a 1% drop in sales—a ratio even sharper for e-commerce sites. Development teams working without performance budgets discover speed regressions only after deployment, when business impact has already occurred. This article shows how to link speed metrics to decision-making using Lighthouse CI and Real User Monitoring (RUM) combinations—with code examples.",{"type":32,"tag":40,"props":41,"children":43},"h2",{"id":42},"translating-performance-budget-into-business-decisions",[44],{"type":37,"value":45},"Translating Performance Budget into Business Decisions",{"type":32,"tag":33,"props":47,"children":48},{},[49],{"type":37,"value":50},"A performance budget is a numerical threshold: \"LCP must not exceed 2.5 seconds,\" \"First Input Delay (FID) should stay below 100ms,\" \"total JavaScript bundle must not exceed 350KB.\" Yet without automatic validation in your CI pipeline, these metrics remain wishful thinking in documentation. Lighthouse CI is the tooling layer that tests these thresholds on every commit, blocking deployments or triggering alarms when they're exceeded.",{"type":32,"tag":33,"props":52,"children":53},{},[54],{"type":37,"value":55},"A simple Lighthouse CI workflow with GitHub Actions looks like this:",{"type":32,"tag":57,"props":58,"children":62},"pre",{"code":59,"language":60,"meta":16,"className":61,"style":16},"# .github\u002Fworkflows\u002Flighthouse-ci.yml\nname: Lighthouse CI\non: [pull_request]\njobs:\n  lhci:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v3\n      - uses: actions\u002Fsetup-node@v3\n        with:\n          node-version: 18\n      - run: npm ci\n      - run: npm run build\n      - run: npm install -g @lhci\u002Fcli\n      - run: lhci autorun --upload.target=temporary-public-storage\n        env:\n          LHCI_GITHUB_APP_TOKEN: ${{ secrets.LHCI_GITHUB_APP_TOKEN }}\n","yaml","language-yaml shiki shiki-themes github-dark",[63],{"type":32,"tag":64,"props":65,"children":66},"code",{"__ignoreMap":16},[67,79,101,126,140,153,171,184,206,227,240,258,280,301,322,343,356],{"type":32,"tag":68,"props":69,"children":72},"span",{"class":70,"line":71},"line",1,[73],{"type":32,"tag":68,"props":74,"children":76},{"style":75},"--shiki-default:#6A737D",[77],{"type":37,"value":78},"# .github\u002Fworkflows\u002Flighthouse-ci.yml\n",{"type":32,"tag":68,"props":80,"children":82},{"class":70,"line":81},2,[83,89,95],{"type":32,"tag":68,"props":84,"children":86},{"style":85},"--shiki-default:#85E89D",[87],{"type":37,"value":88},"name",{"type":32,"tag":68,"props":90,"children":92},{"style":91},"--shiki-default:#E1E4E8",[93],{"type":37,"value":94},": ",{"type":32,"tag":68,"props":96,"children":98},{"style":97},"--shiki-default:#9ECBFF",[99],{"type":37,"value":100},"Lighthouse CI\n",{"type":32,"tag":68,"props":102,"children":104},{"class":70,"line":103},3,[105,111,116,121],{"type":32,"tag":68,"props":106,"children":108},{"style":107},"--shiki-default:#79B8FF",[109],{"type":37,"value":110},"on",{"type":32,"tag":68,"props":112,"children":113},{"style":91},[114],{"type":37,"value":115},": [",{"type":32,"tag":68,"props":117,"children":118},{"style":97},[119],{"type":37,"value":120},"pull_request",{"type":32,"tag":68,"props":122,"children":123},{"style":91},[124],{"type":37,"value":125},"]\n",{"type":32,"tag":68,"props":127,"children":129},{"class":70,"line":128},4,[130,135],{"type":32,"tag":68,"props":131,"children":132},{"style":85},[133],{"type":37,"value":134},"jobs",{"type":32,"tag":68,"props":136,"children":137},{"style":91},[138],{"type":37,"value":139},":\n",{"type":32,"tag":68,"props":141,"children":143},{"class":70,"line":142},5,[144,149],{"type":32,"tag":68,"props":145,"children":146},{"style":85},[147],{"type":37,"value":148},"  lhci",{"type":32,"tag":68,"props":150,"children":151},{"style":91},[152],{"type":37,"value":139},{"type":32,"tag":68,"props":154,"children":156},{"class":70,"line":155},6,[157,162,166],{"type":32,"tag":68,"props":158,"children":159},{"style":85},[160],{"type":37,"value":161},"    runs-on",{"type":32,"tag":68,"props":163,"children":164},{"style":91},[165],{"type":37,"value":94},{"type":32,"tag":68,"props":167,"children":168},{"style":97},[169],{"type":37,"value":170},"ubuntu-latest\n",{"type":32,"tag":68,"props":172,"children":174},{"class":70,"line":173},7,[175,180],{"type":32,"tag":68,"props":176,"children":177},{"style":85},[178],{"type":37,"value":179},"    steps",{"type":32,"tag":68,"props":181,"children":182},{"style":91},[183],{"type":37,"value":139},{"type":32,"tag":68,"props":185,"children":186},{"class":70,"line":26},[187,192,197,201],{"type":32,"tag":68,"props":188,"children":189},{"style":91},[190],{"type":37,"value":191},"      - ",{"type":32,"tag":68,"props":193,"children":194},{"style":85},[195],{"type":37,"value":196},"uses",{"type":32,"tag":68,"props":198,"children":199},{"style":91},[200],{"type":37,"value":94},{"type":32,"tag":68,"props":202,"children":203},{"style":97},[204],{"type":37,"value":205},"actions\u002Fcheckout@v3\n",{"type":32,"tag":68,"props":207,"children":209},{"class":70,"line":208},9,[210,214,218,222],{"type":32,"tag":68,"props":211,"children":212},{"style":91},[213],{"type":37,"value":191},{"type":32,"tag":68,"props":215,"children":216},{"style":85},[217],{"type":37,"value":196},{"type":32,"tag":68,"props":219,"children":220},{"style":91},[221],{"type":37,"value":94},{"type":32,"tag":68,"props":223,"children":224},{"style":97},[225],{"type":37,"value":226},"actions\u002Fsetup-node@v3\n",{"type":32,"tag":68,"props":228,"children":230},{"class":70,"line":229},10,[231,236],{"type":32,"tag":68,"props":232,"children":233},{"style":85},[234],{"type":37,"value":235},"        with",{"type":32,"tag":68,"props":237,"children":238},{"style":91},[239],{"type":37,"value":139},{"type":32,"tag":68,"props":241,"children":243},{"class":70,"line":242},11,[244,249,253],{"type":32,"tag":68,"props":245,"children":246},{"style":85},[247],{"type":37,"value":248},"          node-version",{"type":32,"tag":68,"props":250,"children":251},{"style":91},[252],{"type":37,"value":94},{"type":32,"tag":68,"props":254,"children":255},{"style":107},[256],{"type":37,"value":257},"18\n",{"type":32,"tag":68,"props":259,"children":261},{"class":70,"line":260},12,[262,266,271,275],{"type":32,"tag":68,"props":263,"children":264},{"style":91},[265],{"type":37,"value":191},{"type":32,"tag":68,"props":267,"children":268},{"style":85},[269],{"type":37,"value":270},"run",{"type":32,"tag":68,"props":272,"children":273},{"style":91},[274],{"type":37,"value":94},{"type":32,"tag":68,"props":276,"children":277},{"style":97},[278],{"type":37,"value":279},"npm ci\n",{"type":32,"tag":68,"props":281,"children":283},{"class":70,"line":282},13,[284,288,292,296],{"type":32,"tag":68,"props":285,"children":286},{"style":91},[287],{"type":37,"value":191},{"type":32,"tag":68,"props":289,"children":290},{"style":85},[291],{"type":37,"value":270},{"type":32,"tag":68,"props":293,"children":294},{"style":91},[295],{"type":37,"value":94},{"type":32,"tag":68,"props":297,"children":298},{"style":97},[299],{"type":37,"value":300},"npm run build\n",{"type":32,"tag":68,"props":302,"children":304},{"class":70,"line":303},14,[305,309,313,317],{"type":32,"tag":68,"props":306,"children":307},{"style":91},[308],{"type":37,"value":191},{"type":32,"tag":68,"props":310,"children":311},{"style":85},[312],{"type":37,"value":270},{"type":32,"tag":68,"props":314,"children":315},{"style":91},[316],{"type":37,"value":94},{"type":32,"tag":68,"props":318,"children":319},{"style":97},[320],{"type":37,"value":321},"npm install -g @lhci\u002Fcli\n",{"type":32,"tag":68,"props":323,"children":325},{"class":70,"line":324},15,[326,330,334,338],{"type":32,"tag":68,"props":327,"children":328},{"style":91},[329],{"type":37,"value":191},{"type":32,"tag":68,"props":331,"children":332},{"style":85},[333],{"type":37,"value":270},{"type":32,"tag":68,"props":335,"children":336},{"style":91},[337],{"type":37,"value":94},{"type":32,"tag":68,"props":339,"children":340},{"style":97},[341],{"type":37,"value":342},"lhci autorun --upload.target=temporary-public-storage\n",{"type":32,"tag":68,"props":344,"children":346},{"class":70,"line":345},16,[347,352],{"type":32,"tag":68,"props":348,"children":349},{"style":85},[350],{"type":37,"value":351},"        env",{"type":32,"tag":68,"props":353,"children":354},{"style":91},[355],{"type":37,"value":139},{"type":32,"tag":68,"props":357,"children":359},{"class":70,"line":358},17,[360,365,369],{"type":32,"tag":68,"props":361,"children":362},{"style":85},[363],{"type":37,"value":364},"          LHCI_GITHUB_APP_TOKEN",{"type":32,"tag":68,"props":366,"children":367},{"style":91},[368],{"type":37,"value":94},{"type":32,"tag":68,"props":370,"children":371},{"style":97},[372],{"type":37,"value":373},"${{ secrets.LHCI_GITHUB_APP_TOKEN }}\n",{"type":32,"tag":33,"props":375,"children":376},{},[377,379,385],{"type":37,"value":378},"This pipeline audits your staging environment on every PR, measuring Core Web Vitals. Hard limits can be set via ",{"type":32,"tag":64,"props":380,"children":382},{"className":381},[],[383],{"type":37,"value":384},"assert",{"type":37,"value":386}," configuration:",{"type":32,"tag":57,"props":388,"children":392},{"code":389,"language":390,"meta":16,"className":391,"style":16},"\u002F\u002F lighthouserc.json\n{\n  \"ci\": {\n    \"assert\": {\n      \"preset\": \"lighthouse:recommended\",\n      \"assertions\": {\n        \"largest-contentful-paint\": [\"error\", { \"maxNumericValue\": 2500 }],\n        \"total-blocking-time\": [\"error\", { \"maxNumericValue\": 300 }],\n        \"cumulative-layout-shift\": [\"error\", { \"maxNumericValue\": 0.1 }]\n      }\n    }\n  }\n}\n","json","language-json shiki shiki-themes github-dark",[393],{"type":32,"tag":64,"props":394,"children":395},{"__ignoreMap":16},[396,404,412,425,437,459,471,512,549,587,595,603,611],{"type":32,"tag":68,"props":397,"children":398},{"class":70,"line":71},[399],{"type":32,"tag":68,"props":400,"children":401},{"style":75},[402],{"type":37,"value":403},"\u002F\u002F lighthouserc.json\n",{"type":32,"tag":68,"props":405,"children":406},{"class":70,"line":81},[407],{"type":32,"tag":68,"props":408,"children":409},{"style":91},[410],{"type":37,"value":411},"{\n",{"type":32,"tag":68,"props":413,"children":414},{"class":70,"line":103},[415,420],{"type":32,"tag":68,"props":416,"children":417},{"style":107},[418],{"type":37,"value":419},"  \"ci\"",{"type":32,"tag":68,"props":421,"children":422},{"style":91},[423],{"type":37,"value":424},": {\n",{"type":32,"tag":68,"props":426,"children":427},{"class":70,"line":128},[428,433],{"type":32,"tag":68,"props":429,"children":430},{"style":107},[431],{"type":37,"value":432},"    \"assert\"",{"type":32,"tag":68,"props":434,"children":435},{"style":91},[436],{"type":37,"value":424},{"type":32,"tag":68,"props":438,"children":439},{"class":70,"line":142},[440,445,449,454],{"type":32,"tag":68,"props":441,"children":442},{"style":107},[443],{"type":37,"value":444},"      \"preset\"",{"type":32,"tag":68,"props":446,"children":447},{"style":91},[448],{"type":37,"value":94},{"type":32,"tag":68,"props":450,"children":451},{"style":97},[452],{"type":37,"value":453},"\"lighthouse:recommended\"",{"type":32,"tag":68,"props":455,"children":456},{"style":91},[457],{"type":37,"value":458},",\n",{"type":32,"tag":68,"props":460,"children":461},{"class":70,"line":155},[462,467],{"type":32,"tag":68,"props":463,"children":464},{"style":107},[465],{"type":37,"value":466},"      \"assertions\"",{"type":32,"tag":68,"props":468,"children":469},{"style":91},[470],{"type":37,"value":424},{"type":32,"tag":68,"props":472,"children":473},{"class":70,"line":173},[474,479,483,488,493,498,502,507],{"type":32,"tag":68,"props":475,"children":476},{"style":107},[477],{"type":37,"value":478},"        \"largest-contentful-paint\"",{"type":32,"tag":68,"props":480,"children":481},{"style":91},[482],{"type":37,"value":115},{"type":32,"tag":68,"props":484,"children":485},{"style":97},[486],{"type":37,"value":487},"\"error\"",{"type":32,"tag":68,"props":489,"children":490},{"style":91},[491],{"type":37,"value":492},", { ",{"type":32,"tag":68,"props":494,"children":495},{"style":107},[496],{"type":37,"value":497},"\"maxNumericValue\"",{"type":32,"tag":68,"props":499,"children":500},{"style":91},[501],{"type":37,"value":94},{"type":32,"tag":68,"props":503,"children":504},{"style":107},[505],{"type":37,"value":506},"2500",{"type":32,"tag":68,"props":508,"children":509},{"style":91},[510],{"type":37,"value":511}," }],\n",{"type":32,"tag":68,"props":513,"children":514},{"class":70,"line":26},[515,520,524,528,532,536,540,545],{"type":32,"tag":68,"props":516,"children":517},{"style":107},[518],{"type":37,"value":519},"        \"total-blocking-time\"",{"type":32,"tag":68,"props":521,"children":522},{"style":91},[523],{"type":37,"value":115},{"type":32,"tag":68,"props":525,"children":526},{"style":97},[527],{"type":37,"value":487},{"type":32,"tag":68,"props":529,"children":530},{"style":91},[531],{"type":37,"value":492},{"type":32,"tag":68,"props":533,"children":534},{"style":107},[535],{"type":37,"value":497},{"type":32,"tag":68,"props":537,"children":538},{"style":91},[539],{"type":37,"value":94},{"type":32,"tag":68,"props":541,"children":542},{"style":107},[543],{"type":37,"value":544},"300",{"type":32,"tag":68,"props":546,"children":547},{"style":91},[548],{"type":37,"value":511},{"type":32,"tag":68,"props":550,"children":551},{"class":70,"line":208},[552,557,561,565,569,573,577,582],{"type":32,"tag":68,"props":553,"children":554},{"style":107},[555],{"type":37,"value":556},"        \"cumulative-layout-shift\"",{"type":32,"tag":68,"props":558,"children":559},{"style":91},[560],{"type":37,"value":115},{"type":32,"tag":68,"props":562,"children":563},{"style":97},[564],{"type":37,"value":487},{"type":32,"tag":68,"props":566,"children":567},{"style":91},[568],{"type":37,"value":492},{"type":32,"tag":68,"props":570,"children":571},{"style":107},[572],{"type":37,"value":497},{"type":32,"tag":68,"props":574,"children":575},{"style":91},[576],{"type":37,"value":94},{"type":32,"tag":68,"props":578,"children":579},{"style":107},[580],{"type":37,"value":581},"0.1",{"type":32,"tag":68,"props":583,"children":584},{"style":91},[585],{"type":37,"value":586}," }]\n",{"type":32,"tag":68,"props":588,"children":589},{"class":70,"line":229},[590],{"type":32,"tag":68,"props":591,"children":592},{"style":91},[593],{"type":37,"value":594},"      }\n",{"type":32,"tag":68,"props":596,"children":597},{"class":70,"line":242},[598],{"type":32,"tag":68,"props":599,"children":600},{"style":91},[601],{"type":37,"value":602},"    }\n",{"type":32,"tag":68,"props":604,"children":605},{"class":70,"line":260},[606],{"type":32,"tag":68,"props":607,"children":608},{"style":91},[609],{"type":37,"value":610},"  }\n",{"type":32,"tag":68,"props":612,"children":613},{"class":70,"line":282},[614],{"type":32,"tag":68,"props":615,"children":616},{"style":91},[617],{"type":37,"value":618},"}\n",{"type":32,"tag":33,"props":620,"children":621},{},[622],{"type":37,"value":623},"If LCP exceeds 2.5 seconds, the merge is blocked. While this may seem to slow development velocity in the short term, it reduces production performance regressions by 80%—measured data from Roibase's Shopify Hydrogen projects. A bug caught before production is 10 times cheaper to fix. Lighthouse CI runs in a lab environment (a single Chrome instance), so it misses real-world device diversity and network conditions. This is where RUM enters.",{"type":32,"tag":40,"props":625,"children":627},{"id":626},"measuring-real-user-experience-with-rum",[628],{"type":37,"value":629},"Measuring Real User Experience with RUM",{"type":32,"tag":33,"props":631,"children":632},{},[633],{"type":37,"value":634},"Real User Monitoring collects metrics from JavaScript running in browsers across every user's session. The Web Vitals library simplifies this:",{"type":32,"tag":57,"props":636,"children":640},{"code":637,"language":638,"meta":16,"className":639,"style":16},"\u002F\u002F analytics\u002FwebVitals.js\nimport { onCLS, onFID, onLCP, onTTFB } from 'web-vitals';\n\nfunction sendToAnalytics(metric) {\n  fetch('\u002Fapi\u002Fweb-vitals', {\n    method: 'POST',\n    body: JSON.stringify({\n      name: metric.name,\n      value: metric.value,\n      id: metric.id,\n      rating: metric.rating,\n      navigationType: metric.navigationType\n    }),\n    headers: { 'Content-Type': 'application\u002Fjson' },\n    keepalive: true\n  });\n}\n\nonCLS(sendToAnalytics);\nonFID(sendToAnalytics);\nonLCP(sendToAnalytics);\nonTTFB(sendToAnalytics);\n","javascript","language-javascript shiki shiki-themes github-dark",[641],{"type":32,"tag":64,"props":642,"children":643},{"__ignoreMap":16},[644,652,681,690,720,742,759,787,795,803,811,819,827,835,862,875,883,890,898,912,925,938],{"type":32,"tag":68,"props":645,"children":646},{"class":70,"line":71},[647],{"type":32,"tag":68,"props":648,"children":649},{"style":75},[650],{"type":37,"value":651},"\u002F\u002F analytics\u002FwebVitals.js\n",{"type":32,"tag":68,"props":653,"children":654},{"class":70,"line":81},[655,661,666,671,676],{"type":32,"tag":68,"props":656,"children":658},{"style":657},"--shiki-default:#F97583",[659],{"type":37,"value":660},"import",{"type":32,"tag":68,"props":662,"children":663},{"style":91},[664],{"type":37,"value":665}," { onCLS, onFID, onLCP, onTTFB } ",{"type":32,"tag":68,"props":667,"children":668},{"style":657},[669],{"type":37,"value":670},"from",{"type":32,"tag":68,"props":672,"children":673},{"style":97},[674],{"type":37,"value":675}," 'web-vitals'",{"type":32,"tag":68,"props":677,"children":678},{"style":91},[679],{"type":37,"value":680},";\n",{"type":32,"tag":68,"props":682,"children":683},{"class":70,"line":103},[684],{"type":32,"tag":68,"props":685,"children":687},{"emptyLinePlaceholder":686},true,[688],{"type":37,"value":689},"\n",{"type":32,"tag":68,"props":691,"children":692},{"class":70,"line":128},[693,698,704,709,715],{"type":32,"tag":68,"props":694,"children":695},{"style":657},[696],{"type":37,"value":697},"function",{"type":32,"tag":68,"props":699,"children":701},{"style":700},"--shiki-default:#B392F0",[702],{"type":37,"value":703}," sendToAnalytics",{"type":32,"tag":68,"props":705,"children":706},{"style":91},[707],{"type":37,"value":708},"(",{"type":32,"tag":68,"props":710,"children":712},{"style":711},"--shiki-default:#FFAB70",[713],{"type":37,"value":714},"metric",{"type":32,"tag":68,"props":716,"children":717},{"style":91},[718],{"type":37,"value":719},") {\n",{"type":32,"tag":68,"props":721,"children":722},{"class":70,"line":142},[723,728,732,737],{"type":32,"tag":68,"props":724,"children":725},{"style":700},[726],{"type":37,"value":727},"  fetch",{"type":32,"tag":68,"props":729,"children":730},{"style":91},[731],{"type":37,"value":708},{"type":32,"tag":68,"props":733,"children":734},{"style":97},[735],{"type":37,"value":736},"'\u002Fapi\u002Fweb-vitals'",{"type":32,"tag":68,"props":738,"children":739},{"style":91},[740],{"type":37,"value":741},", {\n",{"type":32,"tag":68,"props":743,"children":744},{"class":70,"line":155},[745,750,755],{"type":32,"tag":68,"props":746,"children":747},{"style":91},[748],{"type":37,"value":749},"    method: ",{"type":32,"tag":68,"props":751,"children":752},{"style":97},[753],{"type":37,"value":754},"'POST'",{"type":32,"tag":68,"props":756,"children":757},{"style":91},[758],{"type":37,"value":458},{"type":32,"tag":68,"props":760,"children":761},{"class":70,"line":173},[762,767,772,777,782],{"type":32,"tag":68,"props":763,"children":764},{"style":91},[765],{"type":37,"value":766},"    body: ",{"type":32,"tag":68,"props":768,"children":769},{"style":107},[770],{"type":37,"value":771},"JSON",{"type":32,"tag":68,"props":773,"children":774},{"style":91},[775],{"type":37,"value":776},".",{"type":32,"tag":68,"props":778,"children":779},{"style":700},[780],{"type":37,"value":781},"stringify",{"type":32,"tag":68,"props":783,"children":784},{"style":91},[785],{"type":37,"value":786},"({\n",{"type":32,"tag":68,"props":788,"children":789},{"class":70,"line":26},[790],{"type":32,"tag":68,"props":791,"children":792},{"style":91},[793],{"type":37,"value":794},"      name: metric.name,\n",{"type":32,"tag":68,"props":796,"children":797},{"class":70,"line":208},[798],{"type":32,"tag":68,"props":799,"children":800},{"style":91},[801],{"type":37,"value":802},"      value: metric.value,\n",{"type":32,"tag":68,"props":804,"children":805},{"class":70,"line":229},[806],{"type":32,"tag":68,"props":807,"children":808},{"style":91},[809],{"type":37,"value":810},"      id: metric.id,\n",{"type":32,"tag":68,"props":812,"children":813},{"class":70,"line":242},[814],{"type":32,"tag":68,"props":815,"children":816},{"style":91},[817],{"type":37,"value":818},"      rating: metric.rating,\n",{"type":32,"tag":68,"props":820,"children":821},{"class":70,"line":260},[822],{"type":32,"tag":68,"props":823,"children":824},{"style":91},[825],{"type":37,"value":826},"      navigationType: metric.navigationType\n",{"type":32,"tag":68,"props":828,"children":829},{"class":70,"line":282},[830],{"type":32,"tag":68,"props":831,"children":832},{"style":91},[833],{"type":37,"value":834},"    }),\n",{"type":32,"tag":68,"props":836,"children":837},{"class":70,"line":303},[838,843,848,852,857],{"type":32,"tag":68,"props":839,"children":840},{"style":91},[841],{"type":37,"value":842},"    headers: { ",{"type":32,"tag":68,"props":844,"children":845},{"style":97},[846],{"type":37,"value":847},"'Content-Type'",{"type":32,"tag":68,"props":849,"children":850},{"style":91},[851],{"type":37,"value":94},{"type":32,"tag":68,"props":853,"children":854},{"style":97},[855],{"type":37,"value":856},"'application\u002Fjson'",{"type":32,"tag":68,"props":858,"children":859},{"style":91},[860],{"type":37,"value":861}," },\n",{"type":32,"tag":68,"props":863,"children":864},{"class":70,"line":324},[865,870],{"type":32,"tag":68,"props":866,"children":867},{"style":91},[868],{"type":37,"value":869},"    keepalive: ",{"type":32,"tag":68,"props":871,"children":872},{"style":107},[873],{"type":37,"value":874},"true\n",{"type":32,"tag":68,"props":876,"children":877},{"class":70,"line":345},[878],{"type":32,"tag":68,"props":879,"children":880},{"style":91},[881],{"type":37,"value":882},"  });\n",{"type":32,"tag":68,"props":884,"children":885},{"class":70,"line":358},[886],{"type":32,"tag":68,"props":887,"children":888},{"style":91},[889],{"type":37,"value":618},{"type":32,"tag":68,"props":891,"children":893},{"class":70,"line":892},18,[894],{"type":32,"tag":68,"props":895,"children":896},{"emptyLinePlaceholder":686},[897],{"type":37,"value":689},{"type":32,"tag":68,"props":899,"children":901},{"class":70,"line":900},19,[902,907],{"type":32,"tag":68,"props":903,"children":904},{"style":700},[905],{"type":37,"value":906},"onCLS",{"type":32,"tag":68,"props":908,"children":909},{"style":91},[910],{"type":37,"value":911},"(sendToAnalytics);\n",{"type":32,"tag":68,"props":913,"children":915},{"class":70,"line":914},20,[916,921],{"type":32,"tag":68,"props":917,"children":918},{"style":700},[919],{"type":37,"value":920},"onFID",{"type":32,"tag":68,"props":922,"children":923},{"style":91},[924],{"type":37,"value":911},{"type":32,"tag":68,"props":926,"children":928},{"class":70,"line":927},21,[929,934],{"type":32,"tag":68,"props":930,"children":931},{"style":700},[932],{"type":37,"value":933},"onLCP",{"type":32,"tag":68,"props":935,"children":936},{"style":91},[937],{"type":37,"value":911},{"type":32,"tag":68,"props":939,"children":941},{"class":70,"line":940},22,[942,947],{"type":32,"tag":68,"props":943,"children":944},{"style":700},[945],{"type":37,"value":946},"onTTFB",{"type":32,"tag":68,"props":948,"children":949},{"style":91},[950],{"type":37,"value":911},{"type":32,"tag":33,"props":952,"children":953},{},[954],{"type":37,"value":955},"This code sends Core Web Vitals to your backend on every page load. A backend service (Cloudflare Workers, for example) can write this data to BigQuery:",{"type":32,"tag":57,"props":957,"children":959},{"code":958,"language":638,"meta":16,"className":639,"style":16},"\u002F\u002F workers\u002FwebVitalsCollector.js\nexport default {\n  async fetch(request, env) {\n    if (request.method !== 'POST') return new Response('Method not allowed', { status: 405 });\n\n    const data = await request.json();\n    const row = {\n      timestamp: Date.now(),\n      metric: data.name,\n      value: data.value,\n      rating: data.rating,\n      userAgent: request.headers.get('User-Agent'),\n      country: request.cf.country\n    };\n\n    await env.BQ.insert('web_vitals', row); \u002F\u002F BigQuery binding\n    return new Response('OK', { status: 200 });\n  }\n};\n",[960],{"type":32,"tag":64,"props":961,"children":962},{"__ignoreMap":16},[963,971,989,1025,1092,1099,1136,1156,1174,1182,1190,1198,1225,1233,1241,1248,1294,1332,1339],{"type":32,"tag":68,"props":964,"children":965},{"class":70,"line":71},[966],{"type":32,"tag":68,"props":967,"children":968},{"style":75},[969],{"type":37,"value":970},"\u002F\u002F workers\u002FwebVitalsCollector.js\n",{"type":32,"tag":68,"props":972,"children":973},{"class":70,"line":81},[974,979,984],{"type":32,"tag":68,"props":975,"children":976},{"style":657},[977],{"type":37,"value":978},"export",{"type":32,"tag":68,"props":980,"children":981},{"style":657},[982],{"type":37,"value":983}," default",{"type":32,"tag":68,"props":985,"children":986},{"style":91},[987],{"type":37,"value":988}," {\n",{"type":32,"tag":68,"props":990,"children":991},{"class":70,"line":103},[992,997,1002,1006,1011,1016,1021],{"type":32,"tag":68,"props":993,"children":994},{"style":657},[995],{"type":37,"value":996},"  async",{"type":32,"tag":68,"props":998,"children":999},{"style":700},[1000],{"type":37,"value":1001}," fetch",{"type":32,"tag":68,"props":1003,"children":1004},{"style":91},[1005],{"type":37,"value":708},{"type":32,"tag":68,"props":1007,"children":1008},{"style":711},[1009],{"type":37,"value":1010},"request",{"type":32,"tag":68,"props":1012,"children":1013},{"style":91},[1014],{"type":37,"value":1015},", ",{"type":32,"tag":68,"props":1017,"children":1018},{"style":711},[1019],{"type":37,"value":1020},"env",{"type":32,"tag":68,"props":1022,"children":1023},{"style":91},[1024],{"type":37,"value":719},{"type":32,"tag":68,"props":1026,"children":1027},{"class":70,"line":128},[1028,1033,1038,1043,1048,1053,1058,1063,1068,1072,1077,1082,1087],{"type":32,"tag":68,"props":1029,"children":1030},{"style":657},[1031],{"type":37,"value":1032},"    if",{"type":32,"tag":68,"props":1034,"children":1035},{"style":91},[1036],{"type":37,"value":1037}," (request.method ",{"type":32,"tag":68,"props":1039,"children":1040},{"style":657},[1041],{"type":37,"value":1042},"!==",{"type":32,"tag":68,"props":1044,"children":1045},{"style":97},[1046],{"type":37,"value":1047}," 'POST'",{"type":32,"tag":68,"props":1049,"children":1050},{"style":91},[1051],{"type":37,"value":1052},") ",{"type":32,"tag":68,"props":1054,"children":1055},{"style":657},[1056],{"type":37,"value":1057},"return",{"type":32,"tag":68,"props":1059,"children":1060},{"style":657},[1061],{"type":37,"value":1062}," new",{"type":32,"tag":68,"props":1064,"children":1065},{"style":700},[1066],{"type":37,"value":1067}," Response",{"type":32,"tag":68,"props":1069,"children":1070},{"style":91},[1071],{"type":37,"value":708},{"type":32,"tag":68,"props":1073,"children":1074},{"style":97},[1075],{"type":37,"value":1076},"'Method not allowed'",{"type":32,"tag":68,"props":1078,"children":1079},{"style":91},[1080],{"type":37,"value":1081},", { status: ",{"type":32,"tag":68,"props":1083,"children":1084},{"style":107},[1085],{"type":37,"value":1086},"405",{"type":32,"tag":68,"props":1088,"children":1089},{"style":91},[1090],{"type":37,"value":1091}," });\n",{"type":32,"tag":68,"props":1093,"children":1094},{"class":70,"line":142},[1095],{"type":32,"tag":68,"props":1096,"children":1097},{"emptyLinePlaceholder":686},[1098],{"type":37,"value":689},{"type":32,"tag":68,"props":1100,"children":1101},{"class":70,"line":155},[1102,1107,1112,1117,1122,1127,1131],{"type":32,"tag":68,"props":1103,"children":1104},{"style":657},[1105],{"type":37,"value":1106},"    const",{"type":32,"tag":68,"props":1108,"children":1109},{"style":107},[1110],{"type":37,"value":1111}," data",{"type":32,"tag":68,"props":1113,"children":1114},{"style":657},[1115],{"type":37,"value":1116}," =",{"type":32,"tag":68,"props":1118,"children":1119},{"style":657},[1120],{"type":37,"value":1121}," await",{"type":32,"tag":68,"props":1123,"children":1124},{"style":91},[1125],{"type":37,"value":1126}," request.",{"type":32,"tag":68,"props":1128,"children":1129},{"style":700},[1130],{"type":37,"value":390},{"type":32,"tag":68,"props":1132,"children":1133},{"style":91},[1134],{"type":37,"value":1135},"();\n",{"type":32,"tag":68,"props":1137,"children":1138},{"class":70,"line":173},[1139,1143,1148,1152],{"type":32,"tag":68,"props":1140,"children":1141},{"style":657},[1142],{"type":37,"value":1106},{"type":32,"tag":68,"props":1144,"children":1145},{"style":107},[1146],{"type":37,"value":1147}," row",{"type":32,"tag":68,"props":1149,"children":1150},{"style":657},[1151],{"type":37,"value":1116},{"type":32,"tag":68,"props":1153,"children":1154},{"style":91},[1155],{"type":37,"value":988},{"type":32,"tag":68,"props":1157,"children":1158},{"class":70,"line":26},[1159,1164,1169],{"type":32,"tag":68,"props":1160,"children":1161},{"style":91},[1162],{"type":37,"value":1163},"      timestamp: Date.",{"type":32,"tag":68,"props":1165,"children":1166},{"style":700},[1167],{"type":37,"value":1168},"now",{"type":32,"tag":68,"props":1170,"children":1171},{"style":91},[1172],{"type":37,"value":1173},"(),\n",{"type":32,"tag":68,"props":1175,"children":1176},{"class":70,"line":208},[1177],{"type":32,"tag":68,"props":1178,"children":1179},{"style":91},[1180],{"type":37,"value":1181},"      metric: data.name,\n",{"type":32,"tag":68,"props":1183,"children":1184},{"class":70,"line":229},[1185],{"type":32,"tag":68,"props":1186,"children":1187},{"style":91},[1188],{"type":37,"value":1189},"      value: data.value,\n",{"type":32,"tag":68,"props":1191,"children":1192},{"class":70,"line":242},[1193],{"type":32,"tag":68,"props":1194,"children":1195},{"style":91},[1196],{"type":37,"value":1197},"      rating: data.rating,\n",{"type":32,"tag":68,"props":1199,"children":1200},{"class":70,"line":260},[1201,1206,1211,1215,1220],{"type":32,"tag":68,"props":1202,"children":1203},{"style":91},[1204],{"type":37,"value":1205},"      userAgent: request.headers.",{"type":32,"tag":68,"props":1207,"children":1208},{"style":700},[1209],{"type":37,"value":1210},"get",{"type":32,"tag":68,"props":1212,"children":1213},{"style":91},[1214],{"type":37,"value":708},{"type":32,"tag":68,"props":1216,"children":1217},{"style":97},[1218],{"type":37,"value":1219},"'User-Agent'",{"type":32,"tag":68,"props":1221,"children":1222},{"style":91},[1223],{"type":37,"value":1224},"),\n",{"type":32,"tag":68,"props":1226,"children":1227},{"class":70,"line":282},[1228],{"type":32,"tag":68,"props":1229,"children":1230},{"style":91},[1231],{"type":37,"value":1232},"      country: request.cf.country\n",{"type":32,"tag":68,"props":1234,"children":1235},{"class":70,"line":303},[1236],{"type":32,"tag":68,"props":1237,"children":1238},{"style":91},[1239],{"type":37,"value":1240},"    };\n",{"type":32,"tag":68,"props":1242,"children":1243},{"class":70,"line":324},[1244],{"type":32,"tag":68,"props":1245,"children":1246},{"emptyLinePlaceholder":686},[1247],{"type":37,"value":689},{"type":32,"tag":68,"props":1249,"children":1250},{"class":70,"line":345},[1251,1256,1261,1266,1270,1275,1279,1284,1289],{"type":32,"tag":68,"props":1252,"children":1253},{"style":657},[1254],{"type":37,"value":1255},"    await",{"type":32,"tag":68,"props":1257,"children":1258},{"style":91},[1259],{"type":37,"value":1260}," env.",{"type":32,"tag":68,"props":1262,"children":1263},{"style":107},[1264],{"type":37,"value":1265},"BQ",{"type":32,"tag":68,"props":1267,"children":1268},{"style":91},[1269],{"type":37,"value":776},{"type":32,"tag":68,"props":1271,"children":1272},{"style":700},[1273],{"type":37,"value":1274},"insert",{"type":32,"tag":68,"props":1276,"children":1277},{"style":91},[1278],{"type":37,"value":708},{"type":32,"tag":68,"props":1280,"children":1281},{"style":97},[1282],{"type":37,"value":1283},"'web_vitals'",{"type":32,"tag":68,"props":1285,"children":1286},{"style":91},[1287],{"type":37,"value":1288},", row); ",{"type":32,"tag":68,"props":1290,"children":1291},{"style":75},[1292],{"type":37,"value":1293},"\u002F\u002F BigQuery binding\n",{"type":32,"tag":68,"props":1295,"children":1296},{"class":70,"line":358},[1297,1302,1306,1310,1314,1319,1323,1328],{"type":32,"tag":68,"props":1298,"children":1299},{"style":657},[1300],{"type":37,"value":1301},"    return",{"type":32,"tag":68,"props":1303,"children":1304},{"style":657},[1305],{"type":37,"value":1062},{"type":32,"tag":68,"props":1307,"children":1308},{"style":700},[1309],{"type":37,"value":1067},{"type":32,"tag":68,"props":1311,"children":1312},{"style":91},[1313],{"type":37,"value":708},{"type":32,"tag":68,"props":1315,"children":1316},{"style":97},[1317],{"type":37,"value":1318},"'OK'",{"type":32,"tag":68,"props":1320,"children":1321},{"style":91},[1322],{"type":37,"value":1081},{"type":32,"tag":68,"props":1324,"children":1325},{"style":107},[1326],{"type":37,"value":1327},"200",{"type":32,"tag":68,"props":1329,"children":1330},{"style":91},[1331],{"type":37,"value":1091},{"type":32,"tag":68,"props":1333,"children":1334},{"class":70,"line":892},[1335],{"type":32,"tag":68,"props":1336,"children":1337},{"style":91},[1338],{"type":37,"value":610},{"type":32,"tag":68,"props":1340,"children":1341},{"class":70,"line":900},[1342],{"type":32,"tag":68,"props":1343,"children":1344},{"style":91},[1345],{"type":37,"value":1346},"};\n",{"type":32,"tag":33,"props":1348,"children":1349},{},[1350],{"type":37,"value":1351},"This data in BigQuery can be queried like:",{"type":32,"tag":57,"props":1353,"children":1357},{"code":1354,"language":1355,"meta":16,"className":1356,"style":16},"SELECT\n  metric,\n  APPROX_QUANTILES(value, 100)[OFFSET(75)] AS p75,\n  COUNT(*) AS sample_count\nFROM web_vitals.raw_metrics\nWHERE timestamp >= UNIX_MILLIS(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY))\nGROUP BY metric;\n","sql","language-sql shiki shiki-themes github-dark",[1358],{"type":32,"tag":64,"props":1359,"children":1360},{"__ignoreMap":16},[1361,1369,1377,1414,1444,1466,1514],{"type":32,"tag":68,"props":1362,"children":1363},{"class":70,"line":71},[1364],{"type":32,"tag":68,"props":1365,"children":1366},{"style":657},[1367],{"type":37,"value":1368},"SELECT\n",{"type":32,"tag":68,"props":1370,"children":1371},{"class":70,"line":81},[1372],{"type":32,"tag":68,"props":1373,"children":1374},{"style":91},[1375],{"type":37,"value":1376},"  metric,\n",{"type":32,"tag":68,"props":1378,"children":1379},{"class":70,"line":103},[1380,1385,1390,1394,1399,1404,1409],{"type":32,"tag":68,"props":1381,"children":1382},{"style":91},[1383],{"type":37,"value":1384},"  APPROX_QUANTILES(",{"type":32,"tag":68,"props":1386,"children":1387},{"style":657},[1388],{"type":37,"value":1389},"value",{"type":32,"tag":68,"props":1391,"children":1392},{"style":91},[1393],{"type":37,"value":1015},{"type":32,"tag":68,"props":1395,"children":1396},{"style":107},[1397],{"type":37,"value":1398},"100",{"type":32,"tag":68,"props":1400,"children":1401},{"style":91},[1402],{"type":37,"value":1403},")[OFFSET(75)] ",{"type":32,"tag":68,"props":1405,"children":1406},{"style":657},[1407],{"type":37,"value":1408},"AS",{"type":32,"tag":68,"props":1410,"children":1411},{"style":91},[1412],{"type":37,"value":1413}," p75,\n",{"type":32,"tag":68,"props":1415,"children":1416},{"class":70,"line":128},[1417,1422,1426,1431,1435,1439],{"type":32,"tag":68,"props":1418,"children":1419},{"style":107},[1420],{"type":37,"value":1421},"  COUNT",{"type":32,"tag":68,"props":1423,"children":1424},{"style":91},[1425],{"type":37,"value":708},{"type":32,"tag":68,"props":1427,"children":1428},{"style":657},[1429],{"type":37,"value":1430},"*",{"type":32,"tag":68,"props":1432,"children":1433},{"style":91},[1434],{"type":37,"value":1052},{"type":32,"tag":68,"props":1436,"children":1437},{"style":657},[1438],{"type":37,"value":1408},{"type":32,"tag":68,"props":1440,"children":1441},{"style":91},[1442],{"type":37,"value":1443}," sample_count\n",{"type":32,"tag":68,"props":1445,"children":1446},{"class":70,"line":142},[1447,1452,1457,1461],{"type":32,"tag":68,"props":1448,"children":1449},{"style":657},[1450],{"type":37,"value":1451},"FROM",{"type":32,"tag":68,"props":1453,"children":1454},{"style":107},[1455],{"type":37,"value":1456}," web_vitals",{"type":32,"tag":68,"props":1458,"children":1459},{"style":91},[1460],{"type":37,"value":776},{"type":32,"tag":68,"props":1462,"children":1463},{"style":107},[1464],{"type":37,"value":1465},"raw_metrics\n",{"type":32,"tag":68,"props":1467,"children":1468},{"class":70,"line":155},[1469,1474,1479,1484,1489,1494,1499,1504,1509],{"type":32,"tag":68,"props":1470,"children":1471},{"style":657},[1472],{"type":37,"value":1473},"WHERE",{"type":32,"tag":68,"props":1475,"children":1476},{"style":657},[1477],{"type":37,"value":1478}," timestamp",{"type":32,"tag":68,"props":1480,"children":1481},{"style":657},[1482],{"type":37,"value":1483}," >=",{"type":32,"tag":68,"props":1485,"children":1486},{"style":91},[1487],{"type":37,"value":1488}," UNIX_MILLIS(TIMESTAMP_SUB(",{"type":32,"tag":68,"props":1490,"children":1491},{"style":107},[1492],{"type":37,"value":1493},"CURRENT_TIMESTAMP",{"type":32,"tag":68,"props":1495,"children":1496},{"style":91},[1497],{"type":37,"value":1498},"(), INTERVAL ",{"type":32,"tag":68,"props":1500,"children":1501},{"style":107},[1502],{"type":37,"value":1503},"7",{"type":32,"tag":68,"props":1505,"children":1506},{"style":657},[1507],{"type":37,"value":1508}," DAY",{"type":32,"tag":68,"props":1510,"children":1511},{"style":91},[1512],{"type":37,"value":1513},"))\n",{"type":32,"tag":68,"props":1515,"children":1516},{"class":70,"line":173},[1517,1522],{"type":32,"tag":68,"props":1518,"children":1519},{"style":657},[1520],{"type":37,"value":1521},"GROUP BY",{"type":32,"tag":68,"props":1523,"children":1524},{"style":91},[1525],{"type":37,"value":1526}," metric;\n",{"type":32,"tag":33,"props":1528,"children":1529},{},[1530],{"type":37,"value":1531},"The P75 (75th percentile) is Google's official Core Web Vitals threshold—they score based on this percentile. This query returns live production data, not lab measurements from Lighthouse CI.",{"type":32,"tag":1533,"props":1534,"children":1536},"h3",{"id":1535},"the-tradeoff-between-rum-and-lighthouse-ci",[1537],{"type":37,"value":1538},"The Tradeoff Between RUM and Lighthouse CI",{"type":32,"tag":33,"props":1540,"children":1541},{},[1542],{"type":37,"value":1543},"Lighthouse CI is deterministic and repeatable—auditing the same code yields the same results. RUM is noisy—5% of users on 3G connections, 10% on older Android devices, so metrics show variance. But RUM reflects the real world while CI doesn't. Using both together is critical: CI prevents regression, RUM measures business impact.",{"type":32,"tag":33,"props":1545,"children":1546},{},[1547,1549,1558],{"type":37,"value":1548},"For example, Lighthouse CI might show LCP at 2.1 seconds, while production RUM shows P75 at 3.2 seconds—because 30% of real users arrive on mobile data while the lab uses fiber. This gap is especially pronounced in ",{"type":32,"tag":1550,"props":1551,"children":1555},"a",{"href":1552,"rel":1553},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fheadless",[1554],"nofollow",[1556],{"type":37,"value":1557},"headless commerce",{"type":37,"value":1559}," projects: edge-rendered LCP measures 1.8 seconds in the lab but can spike to 4 seconds in production during CDN cache misses.",{"type":32,"tag":40,"props":1561,"children":1563},{"id":1562},"regression-alarms-which-metric-triggers-at-which-threshold",[1564],{"type":37,"value":1565},"Regression Alarms: Which Metric Triggers at Which Threshold",{"type":32,"tag":33,"props":1567,"children":1568},{},[1569],{"type":37,"value":1570},"To detect performance regression, you need a baseline metric. A baseline could be the P75 average of the last 7 days:",{"type":32,"tag":57,"props":1572,"children":1574},{"code":1573,"language":1355,"meta":16,"className":1356,"style":16},"-- BigQuery scheduled query: updates baseline table daily\nCREATE OR REPLACE TABLE web_vitals.baseline AS\nSELECT\n  metric,\n  APPROX_QUANTILES(value, 100)[OFFSET(75)] AS baseline_p75\nFROM web_vitals.raw_metrics\nWHERE timestamp >= UNIX_MILLIS(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 7 DAY))\nGROUP BY metric;\n",[1575],{"type":32,"tag":64,"props":1576,"children":1577},{"__ignoreMap":16},[1578,1586,1613,1620,1627,1659,1678,1717],{"type":32,"tag":68,"props":1579,"children":1580},{"class":70,"line":71},[1581],{"type":32,"tag":68,"props":1582,"children":1583},{"style":75},[1584],{"type":37,"value":1585},"-- BigQuery scheduled query: updates baseline table daily\n",{"type":32,"tag":68,"props":1587,"children":1588},{"class":70,"line":81},[1589,1594,1599,1603,1608],{"type":32,"tag":68,"props":1590,"children":1591},{"style":657},[1592],{"type":37,"value":1593},"CREATE OR REPLACE",{"type":32,"tag":68,"props":1595,"children":1596},{"style":657},[1597],{"type":37,"value":1598}," TABLE",{"type":32,"tag":68,"props":1600,"children":1601},{"style":700},[1602],{"type":37,"value":1456},{"type":32,"tag":68,"props":1604,"children":1605},{"style":91},[1606],{"type":37,"value":1607},".baseline ",{"type":32,"tag":68,"props":1609,"children":1610},{"style":657},[1611],{"type":37,"value":1612},"AS\n",{"type":32,"tag":68,"props":1614,"children":1615},{"class":70,"line":103},[1616],{"type":32,"tag":68,"props":1617,"children":1618},{"style":657},[1619],{"type":37,"value":1368},{"type":32,"tag":68,"props":1621,"children":1622},{"class":70,"line":128},[1623],{"type":32,"tag":68,"props":1624,"children":1625},{"style":91},[1626],{"type":37,"value":1376},{"type":32,"tag":68,"props":1628,"children":1629},{"class":70,"line":142},[1630,1634,1638,1642,1646,1650,1654],{"type":32,"tag":68,"props":1631,"children":1632},{"style":91},[1633],{"type":37,"value":1384},{"type":32,"tag":68,"props":1635,"children":1636},{"style":657},[1637],{"type":37,"value":1389},{"type":32,"tag":68,"props":1639,"children":1640},{"style":91},[1641],{"type":37,"value":1015},{"type":32,"tag":68,"props":1643,"children":1644},{"style":107},[1645],{"type":37,"value":1398},{"type":32,"tag":68,"props":1647,"children":1648},{"style":91},[1649],{"type":37,"value":1403},{"type":32,"tag":68,"props":1651,"children":1652},{"style":657},[1653],{"type":37,"value":1408},{"type":32,"tag":68,"props":1655,"children":1656},{"style":91},[1657],{"type":37,"value":1658}," baseline_p75\n",{"type":32,"tag":68,"props":1660,"children":1661},{"class":70,"line":155},[1662,1666,1670,1674],{"type":32,"tag":68,"props":1663,"children":1664},{"style":657},[1665],{"type":37,"value":1451},{"type":32,"tag":68,"props":1667,"children":1668},{"style":107},[1669],{"type":37,"value":1456},{"type":32,"tag":68,"props":1671,"children":1672},{"style":91},[1673],{"type":37,"value":776},{"type":32,"tag":68,"props":1675,"children":1676},{"style":107},[1677],{"type":37,"value":1465},{"type":32,"tag":68,"props":1679,"children":1680},{"class":70,"line":173},[1681,1685,1689,1693,1697,1701,1705,1709,1713],{"type":32,"tag":68,"props":1682,"children":1683},{"style":657},[1684],{"type":37,"value":1473},{"type":32,"tag":68,"props":1686,"children":1687},{"style":657},[1688],{"type":37,"value":1478},{"type":32,"tag":68,"props":1690,"children":1691},{"style":657},[1692],{"type":37,"value":1483},{"type":32,"tag":68,"props":1694,"children":1695},{"style":91},[1696],{"type":37,"value":1488},{"type":32,"tag":68,"props":1698,"children":1699},{"style":107},[1700],{"type":37,"value":1493},{"type":32,"tag":68,"props":1702,"children":1703},{"style":91},[1704],{"type":37,"value":1498},{"type":32,"tag":68,"props":1706,"children":1707},{"style":107},[1708],{"type":37,"value":1503},{"type":32,"tag":68,"props":1710,"children":1711},{"style":657},[1712],{"type":37,"value":1508},{"type":32,"tag":68,"props":1714,"children":1715},{"style":91},[1716],{"type":37,"value":1513},{"type":32,"tag":68,"props":1718,"children":1719},{"class":70,"line":26},[1720,1724],{"type":32,"tag":68,"props":1721,"children":1722},{"style":657},[1723],{"type":37,"value":1521},{"type":32,"tag":68,"props":1725,"children":1726},{"style":91},[1727],{"type":37,"value":1526},{"type":32,"tag":33,"props":1729,"children":1730},{},[1731],{"type":37,"value":1732},"Then process a real-time stream, triggering alarms on 10% deviation:",{"type":32,"tag":57,"props":1734,"children":1736},{"code":1735,"language":638,"meta":16,"className":639,"style":16},"\u002F\u002F Cloudflare Durable Objects: stateful alarm handler\nexport class PerfAlarmState {\n  constructor(state, env) {\n    this.state = state;\n    this.env = env;\n  }\n\n  async fetch(request) {\n    const { metric, currentP75 } = await request.json();\n    const baseline = await this.env.BQ.query(`SELECT baseline_p75 FROM baseline WHERE metric='${metric}'`);\n    \n    const threshold = baseline * 1.10; \u002F\u002F 10% regression\n    if (currentP75 > threshold) {\n      await fetch(this.env.SLACK_WEBHOOK_URL, {\n        method: 'POST',\n        body: JSON.stringify({\n          text: `🚨 Performance regression: ${metric} P75 ${currentP75}ms (baseline ${baseline}ms, +${((currentP75\u002Fbaseline - 1)*100).toFixed(1)}%)`\n        })\n      });\n    }\n    return new Response('Checked');\n  }\n}\n",[1737],{"type":32,"tag":64,"props":1738,"children":1739},{"__ignoreMap":16},[1740,1748,1769,1798,1821,1842,1849,1856,1879,1929,1995,2003,2043,2065,2099,2115,2139,2249,2257,2265,2272,2300,2307],{"type":32,"tag":68,"props":1741,"children":1742},{"class":70,"line":71},[1743],{"type":32,"tag":68,"props":1744,"children":1745},{"style":75},[1746],{"type":37,"value":1747},"\u002F\u002F Cloudflare Durable Objects: stateful alarm handler\n",{"type":32,"tag":68,"props":1749,"children":1750},{"class":70,"line":81},[1751,1755,1760,1765],{"type":32,"tag":68,"props":1752,"children":1753},{"style":657},[1754],{"type":37,"value":978},{"type":32,"tag":68,"props":1756,"children":1757},{"style":657},[1758],{"type":37,"value":1759}," class",{"type":32,"tag":68,"props":1761,"children":1762},{"style":700},[1763],{"type":37,"value":1764}," PerfAlarmState",{"type":32,"tag":68,"props":1766,"children":1767},{"style":91},[1768],{"type":37,"value":988},{"type":32,"tag":68,"props":1770,"children":1771},{"class":70,"line":103},[1772,1777,1781,1786,1790,1794],{"type":32,"tag":68,"props":1773,"children":1774},{"style":657},[1775],{"type":37,"value":1776},"  constructor",{"type":32,"tag":68,"props":1778,"children":1779},{"style":91},[1780],{"type":37,"value":708},{"type":32,"tag":68,"props":1782,"children":1783},{"style":711},[1784],{"type":37,"value":1785},"state",{"type":32,"tag":68,"props":1787,"children":1788},{"style":91},[1789],{"type":37,"value":1015},{"type":32,"tag":68,"props":1791,"children":1792},{"style":711},[1793],{"type":37,"value":1020},{"type":32,"tag":68,"props":1795,"children":1796},{"style":91},[1797],{"type":37,"value":719},{"type":32,"tag":68,"props":1799,"children":1800},{"class":70,"line":128},[1801,1806,1811,1816],{"type":32,"tag":68,"props":1802,"children":1803},{"style":107},[1804],{"type":37,"value":1805},"    this",{"type":32,"tag":68,"props":1807,"children":1808},{"style":91},[1809],{"type":37,"value":1810},".state ",{"type":32,"tag":68,"props":1812,"children":1813},{"style":657},[1814],{"type":37,"value":1815},"=",{"type":32,"tag":68,"props":1817,"children":1818},{"style":91},[1819],{"type":37,"value":1820}," state;\n",{"type":32,"tag":68,"props":1822,"children":1823},{"class":70,"line":142},[1824,1828,1833,1837],{"type":32,"tag":68,"props":1825,"children":1826},{"style":107},[1827],{"type":37,"value":1805},{"type":32,"tag":68,"props":1829,"children":1830},{"style":91},[1831],{"type":37,"value":1832},".env ",{"type":32,"tag":68,"props":1834,"children":1835},{"style":657},[1836],{"type":37,"value":1815},{"type":32,"tag":68,"props":1838,"children":1839},{"style":91},[1840],{"type":37,"value":1841}," env;\n",{"type":32,"tag":68,"props":1843,"children":1844},{"class":70,"line":155},[1845],{"type":32,"tag":68,"props":1846,"children":1847},{"style":91},[1848],{"type":37,"value":610},{"type":32,"tag":68,"props":1850,"children":1851},{"class":70,"line":173},[1852],{"type":32,"tag":68,"props":1853,"children":1854},{"emptyLinePlaceholder":686},[1855],{"type":37,"value":689},{"type":32,"tag":68,"props":1857,"children":1858},{"class":70,"line":26},[1859,1863,1867,1871,1875],{"type":32,"tag":68,"props":1860,"children":1861},{"style":657},[1862],{"type":37,"value":996},{"type":32,"tag":68,"props":1864,"children":1865},{"style":700},[1866],{"type":37,"value":1001},{"type":32,"tag":68,"props":1868,"children":1869},{"style":91},[1870],{"type":37,"value":708},{"type":32,"tag":68,"props":1872,"children":1873},{"style":711},[1874],{"type":37,"value":1010},{"type":32,"tag":68,"props":1876,"children":1877},{"style":91},[1878],{"type":37,"value":719},{"type":32,"tag":68,"props":1880,"children":1881},{"class":70,"line":208},[1882,1886,1891,1895,1899,1904,1909,1913,1917,1921,1925],{"type":32,"tag":68,"props":1883,"children":1884},{"style":657},[1885],{"type":37,"value":1106},{"type":32,"tag":68,"props":1887,"children":1888},{"style":91},[1889],{"type":37,"value":1890}," { ",{"type":32,"tag":68,"props":1892,"children":1893},{"style":107},[1894],{"type":37,"value":714},{"type":32,"tag":68,"props":1896,"children":1897},{"style":91},[1898],{"type":37,"value":1015},{"type":32,"tag":68,"props":1900,"children":1901},{"style":107},[1902],{"type":37,"value":1903},"currentP75",{"type":32,"tag":68,"props":1905,"children":1906},{"style":91},[1907],{"type":37,"value":1908}," } ",{"type":32,"tag":68,"props":1910,"children":1911},{"style":657},[1912],{"type":37,"value":1815},{"type":32,"tag":68,"props":1914,"children":1915},{"style":657},[1916],{"type":37,"value":1121},{"type":32,"tag":68,"props":1918,"children":1919},{"style":91},[1920],{"type":37,"value":1126},{"type":32,"tag":68,"props":1922,"children":1923},{"style":700},[1924],{"type":37,"value":390},{"type":32,"tag":68,"props":1926,"children":1927},{"style":91},[1928],{"type":37,"value":1135},{"type":32,"tag":68,"props":1930,"children":1931},{"class":70,"line":229},[1932,1936,1941,1945,1949,1954,1959,1963,1967,1972,1976,1981,1985,1990],{"type":32,"tag":68,"props":1933,"children":1934},{"style":657},[1935],{"type":37,"value":1106},{"type":32,"tag":68,"props":1937,"children":1938},{"style":107},[1939],{"type":37,"value":1940}," baseline",{"type":32,"tag":68,"props":1942,"children":1943},{"style":657},[1944],{"type":37,"value":1116},{"type":32,"tag":68,"props":1946,"children":1947},{"style":657},[1948],{"type":37,"value":1121},{"type":32,"tag":68,"props":1950,"children":1951},{"style":107},[1952],{"type":37,"value":1953}," this",{"type":32,"tag":68,"props":1955,"children":1956},{"style":91},[1957],{"type":37,"value":1958},".env.",{"type":32,"tag":68,"props":1960,"children":1961},{"style":107},[1962],{"type":37,"value":1265},{"type":32,"tag":68,"props":1964,"children":1965},{"style":91},[1966],{"type":37,"value":776},{"type":32,"tag":68,"props":1968,"children":1969},{"style":700},[1970],{"type":37,"value":1971},"query",{"type":32,"tag":68,"props":1973,"children":1974},{"style":91},[1975],{"type":37,"value":708},{"type":32,"tag":68,"props":1977,"children":1978},{"style":97},[1979],{"type":37,"value":1980},"`SELECT baseline_p75 FROM baseline WHERE metric='${",{"type":32,"tag":68,"props":1982,"children":1983},{"style":91},[1984],{"type":37,"value":714},{"type":32,"tag":68,"props":1986,"children":1987},{"style":97},[1988],{"type":37,"value":1989},"}'`",{"type":32,"tag":68,"props":1991,"children":1992},{"style":91},[1993],{"type":37,"value":1994},");\n",{"type":32,"tag":68,"props":1996,"children":1997},{"class":70,"line":242},[1998],{"type":32,"tag":68,"props":1999,"children":2000},{"style":91},[2001],{"type":37,"value":2002},"    \n",{"type":32,"tag":68,"props":2004,"children":2005},{"class":70,"line":260},[2006,2010,2015,2019,2024,2028,2033,2038],{"type":32,"tag":68,"props":2007,"children":2008},{"style":657},[2009],{"type":37,"value":1106},{"type":32,"tag":68,"props":2011,"children":2012},{"style":107},[2013],{"type":37,"value":2014}," threshold",{"type":32,"tag":68,"props":2016,"children":2017},{"style":657},[2018],{"type":37,"value":1116},{"type":32,"tag":68,"props":2020,"children":2021},{"style":91},[2022],{"type":37,"value":2023}," baseline ",{"type":32,"tag":68,"props":2025,"children":2026},{"style":657},[2027],{"type":37,"value":1430},{"type":32,"tag":68,"props":2029,"children":2030},{"style":107},[2031],{"type":37,"value":2032}," 1.10",{"type":32,"tag":68,"props":2034,"children":2035},{"style":91},[2036],{"type":37,"value":2037},"; ",{"type":32,"tag":68,"props":2039,"children":2040},{"style":75},[2041],{"type":37,"value":2042},"\u002F\u002F 10% regression\n",{"type":32,"tag":68,"props":2044,"children":2045},{"class":70,"line":282},[2046,2050,2055,2060],{"type":32,"tag":68,"props":2047,"children":2048},{"style":657},[2049],{"type":37,"value":1032},{"type":32,"tag":68,"props":2051,"children":2052},{"style":91},[2053],{"type":37,"value":2054}," (currentP75 ",{"type":32,"tag":68,"props":2056,"children":2057},{"style":657},[2058],{"type":37,"value":2059},">",{"type":32,"tag":68,"props":2061,"children":2062},{"style":91},[2063],{"type":37,"value":2064}," threshold) {\n",{"type":32,"tag":68,"props":2066,"children":2067},{"class":70,"line":303},[2068,2073,2077,2081,2086,2090,2095],{"type":32,"tag":68,"props":2069,"children":2070},{"style":657},[2071],{"type":37,"value":2072},"      await",{"type":32,"tag":68,"props":2074,"children":2075},{"style":700},[2076],{"type":37,"value":1001},{"type":32,"tag":68,"props":2078,"children":2079},{"style":91},[2080],{"type":37,"value":708},{"type":32,"tag":68,"props":2082,"children":2083},{"style":107},[2084],{"type":37,"value":2085},"this",{"type":32,"tag":68,"props":2087,"children":2088},{"style":91},[2089],{"type":37,"value":1958},{"type":32,"tag":68,"props":2091,"children":2092},{"style":107},[2093],{"type":37,"value":2094},"SLACK_WEBHOOK_URL",{"type":32,"tag":68,"props":2096,"children":2097},{"style":91},[2098],{"type":37,"value":741},{"type":32,"tag":68,"props":2100,"children":2101},{"class":70,"line":324},[2102,2107,2111],{"type":32,"tag":68,"props":2103,"children":2104},{"style":91},[2105],{"type":37,"value":2106},"        method: ",{"type":32,"tag":68,"props":2108,"children":2109},{"style":97},[2110],{"type":37,"value":754},{"type":32,"tag":68,"props":2112,"children":2113},{"style":91},[2114],{"type":37,"value":458},{"type":32,"tag":68,"props":2116,"children":2117},{"class":70,"line":345},[2118,2123,2127,2131,2135],{"type":32,"tag":68,"props":2119,"children":2120},{"style":91},[2121],{"type":37,"value":2122},"        body: ",{"type":32,"tag":68,"props":2124,"children":2125},{"style":107},[2126],{"type":37,"value":771},{"type":32,"tag":68,"props":2128,"children":2129},{"style":91},[2130],{"type":37,"value":776},{"type":32,"tag":68,"props":2132,"children":2133},{"style":700},[2134],{"type":37,"value":781},{"type":32,"tag":68,"props":2136,"children":2137},{"style":91},[2138],{"type":37,"value":786},{"type":32,"tag":68,"props":2140,"children":2141},{"class":70,"line":358},[2142,2147,2152,2156,2161,2165,2170,2175,2180,2185,2189,2194,2198,2203,2208,2213,2217,2221,2226,2231,2235,2240,2244],{"type":32,"tag":68,"props":2143,"children":2144},{"style":91},[2145],{"type":37,"value":2146},"          text: ",{"type":32,"tag":68,"props":2148,"children":2149},{"style":97},[2150],{"type":37,"value":2151},"`🚨 Performance regression: ${",{"type":32,"tag":68,"props":2153,"children":2154},{"style":91},[2155],{"type":37,"value":714},{"type":32,"tag":68,"props":2157,"children":2158},{"style":97},[2159],{"type":37,"value":2160},"} P75 ${",{"type":32,"tag":68,"props":2162,"children":2163},{"style":91},[2164],{"type":37,"value":1903},{"type":32,"tag":68,"props":2166,"children":2167},{"style":97},[2168],{"type":37,"value":2169},"}ms (baseline ${",{"type":32,"tag":68,"props":2171,"children":2172},{"style":91},[2173],{"type":37,"value":2174},"baseline",{"type":32,"tag":68,"props":2176,"children":2177},{"style":97},[2178],{"type":37,"value":2179},"}ms, +${",{"type":32,"tag":68,"props":2181,"children":2182},{"style":97},[2183],{"type":37,"value":2184},"((",{"type":32,"tag":68,"props":2186,"children":2187},{"style":91},[2188],{"type":37,"value":1903},{"type":32,"tag":68,"props":2190,"children":2191},{"style":657},[2192],{"type":37,"value":2193},"\u002F",{"type":32,"tag":68,"props":2195,"children":2196},{"style":91},[2197],{"type":37,"value":2174},{"type":32,"tag":68,"props":2199,"children":2200},{"style":657},[2201],{"type":37,"value":2202}," -",{"type":32,"tag":68,"props":2204,"children":2205},{"style":107},[2206],{"type":37,"value":2207}," 1",{"type":32,"tag":68,"props":2209,"children":2210},{"style":97},[2211],{"type":37,"value":2212},")",{"type":32,"tag":68,"props":2214,"children":2215},{"style":657},[2216],{"type":37,"value":1430},{"type":32,"tag":68,"props":2218,"children":2219},{"style":107},[2220],{"type":37,"value":1398},{"type":32,"tag":68,"props":2222,"children":2223},{"style":97},[2224],{"type":37,"value":2225},").",{"type":32,"tag":68,"props":2227,"children":2228},{"style":700},[2229],{"type":37,"value":2230},"toFixed",{"type":32,"tag":68,"props":2232,"children":2233},{"style":97},[2234],{"type":37,"value":708},{"type":32,"tag":68,"props":2236,"children":2237},{"style":107},[2238],{"type":37,"value":2239},"1",{"type":32,"tag":68,"props":2241,"children":2242},{"style":97},[2243],{"type":37,"value":2212},{"type":32,"tag":68,"props":2245,"children":2246},{"style":97},[2247],{"type":37,"value":2248},"}%)`\n",{"type":32,"tag":68,"props":2250,"children":2251},{"class":70,"line":892},[2252],{"type":32,"tag":68,"props":2253,"children":2254},{"style":91},[2255],{"type":37,"value":2256},"        })\n",{"type":32,"tag":68,"props":2258,"children":2259},{"class":70,"line":900},[2260],{"type":32,"tag":68,"props":2261,"children":2262},{"style":91},[2263],{"type":37,"value":2264},"      });\n",{"type":32,"tag":68,"props":2266,"children":2267},{"class":70,"line":914},[2268],{"type":32,"tag":68,"props":2269,"children":2270},{"style":91},[2271],{"type":37,"value":602},{"type":32,"tag":68,"props":2273,"children":2274},{"class":70,"line":927},[2275,2279,2283,2287,2291,2296],{"type":32,"tag":68,"props":2276,"children":2277},{"style":657},[2278],{"type":37,"value":1301},{"type":32,"tag":68,"props":2280,"children":2281},{"style":657},[2282],{"type":37,"value":1062},{"type":32,"tag":68,"props":2284,"children":2285},{"style":700},[2286],{"type":37,"value":1067},{"type":32,"tag":68,"props":2288,"children":2289},{"style":91},[2290],{"type":37,"value":708},{"type":32,"tag":68,"props":2292,"children":2293},{"style":97},[2294],{"type":37,"value":2295},"'Checked'",{"type":32,"tag":68,"props":2297,"children":2298},{"style":91},[2299],{"type":37,"value":1994},{"type":32,"tag":68,"props":2301,"children":2302},{"class":70,"line":940},[2303],{"type":32,"tag":68,"props":2304,"children":2305},{"style":91},[2306],{"type":37,"value":610},{"type":32,"tag":68,"props":2308,"children":2310},{"class":70,"line":2309},23,[2311],{"type":32,"tag":68,"props":2312,"children":2313},{"style":91},[2314],{"type":37,"value":618},{"type":32,"tag":33,"props":2316,"children":2317},{},[2318],{"type":37,"value":2319},"This architecture delivers real-time alerts—regression can be detected within 5 minutes of deployment. Rollback decisions can be made instantly. Example scenario: a JavaScript bundle optimization drops LCP by 200ms in the lab, but increases Total Blocking Time (TBT) by 400ms in production because parse costs rise. RUM alarms catch the TBT regression in 8 minutes, and deployment is rolled back—only 2% of users are affected, 98% never see the problematic code. Without alarms, all users would experience 2 hours of slower performance.",{"type":32,"tag":40,"props":2321,"children":2323},{"id":2322},"linking-budget-overruns-to-business-impact-revenue-attribution",[2324],{"type":37,"value":2325},"Linking Budget Overruns to Business Impact: Revenue Attribution",{"type":32,"tag":33,"props":2327,"children":2328},{},[2329],{"type":37,"value":2330},"Connecting performance metrics to revenue requires A\u002FB testing or cohort analysis. A simple approach: segment users by LCP speed.",{"type":32,"tag":57,"props":2332,"children":2334},{"code":2333,"language":1355,"meta":16,"className":1356,"style":16},"-- BigQuery: conversion rate by LCP speed\nWITH metrics_with_sessions AS (\n  SELECT\n    session_id,\n    APPROX_QUANTILES(value, 100)[OFFSET(75)] AS lcp_p75\n  FROM web_vitals.raw_metrics\n  WHERE metric = 'LCP'\n  GROUP BY session_id\n),\nconversions AS (\n  SELECT\n    session_id,\n    SUM(revenue) AS revenue\n  FROM ecommerce.transactions\n  GROUP BY session_id\n)\nSELECT\n  CASE\n    WHEN lcp_p75 \u003C 2000 THEN 'fast'\n    WHEN lcp_p75 \u003C 3000 THEN 'moderate'\n    ELSE 'slow'\n  END AS speed_bucket,\n  COUNT(DISTINCT m.session_id) AS sessions,\n  COUNT(c.session_id) AS conversions,\n  SAFE_DIVIDE(COUNT(c.session_id), COUNT(DISTINCT m.session_id)) AS conversion_rate,\n  AVG(c.revenue) AS avg_order_value\nFROM metrics_with_sessions m\nLEFT JOIN conversions c USING(session_id)\nGROUP BY speed_bucket;\n",[2335],{"type":32,"tag":64,"props":2336,"children":2337},{"__ignoreMap":16},[2338,2346,2368,2376,2384,2417,2437,2459,2472,2479,2495,2502,2509,2531,2552,2563,2571,2578,2586,2619,2648,2661,2679,2726,2764,2837,2876,2889,2913],{"type":32,"tag":68,"props":2339,"children":2340},{"class":70,"line":71},[2341],{"type":32,"tag":68,"props":2342,"children":2343},{"style":75},[2344],{"type":37,"value":2345},"-- BigQuery: conversion rate by LCP speed\n",{"type":32,"tag":68,"props":2347,"children":2348},{"class":70,"line":81},[2349,2354,2359,2363],{"type":32,"tag":68,"props":2350,"children":2351},{"style":657},[2352],{"type":37,"value":2353},"WITH",{"type":32,"tag":68,"props":2355,"children":2356},{"style":91},[2357],{"type":37,"value":2358}," metrics_with_sessions ",{"type":32,"tag":68,"props":2360,"children":2361},{"style":657},[2362],{"type":37,"value":1408},{"type":32,"tag":68,"props":2364,"children":2365},{"style":91},[2366],{"type":37,"value":2367}," (\n",{"type":32,"tag":68,"props":2369,"children":2370},{"class":70,"line":103},[2371],{"type":32,"tag":68,"props":2372,"children":2373},{"style":657},[2374],{"type":37,"value":2375},"  SELECT\n",{"type":32,"tag":68,"props":2377,"children":2378},{"class":70,"line":128},[2379],{"type":32,"tag":68,"props":2380,"children":2381},{"style":91},[2382],{"type":37,"value":2383},"    session_id,\n",{"type":32,"tag":68,"props":2385,"children":2386},{"class":70,"line":142},[2387,2392,2396,2400,2404,2408,2412],{"type":32,"tag":68,"props":2388,"children":2389},{"style":91},[2390],{"type":37,"value":2391},"    APPROX_QUANTILES(",{"type":32,"tag":68,"props":2393,"children":2394},{"style":657},[2395],{"type":37,"value":1389},{"type":32,"tag":68,"props":2397,"children":2398},{"style":91},[2399],{"type":37,"value":1015},{"type":32,"tag":68,"props":2401,"children":2402},{"style":107},[2403],{"type":37,"value":1398},{"type":32,"tag":68,"props":2405,"children":2406},{"style":91},[2407],{"type":37,"value":1403},{"type":32,"tag":68,"props":2409,"children":2410},{"style":657},[2411],{"type":37,"value":1408},{"type":32,"tag":68,"props":2413,"children":2414},{"style":91},[2415],{"type":37,"value":2416}," lcp_p75\n",{"type":32,"tag":68,"props":2418,"children":2419},{"class":70,"line":155},[2420,2425,2429,2433],{"type":32,"tag":68,"props":2421,"children":2422},{"style":657},[2423],{"type":37,"value":2424},"  FROM",{"type":32,"tag":68,"props":2426,"children":2427},{"style":107},[2428],{"type":37,"value":1456},{"type":32,"tag":68,"props":2430,"children":2431},{"style":91},[2432],{"type":37,"value":776},{"type":32,"tag":68,"props":2434,"children":2435},{"style":107},[2436],{"type":37,"value":1465},{"type":32,"tag":68,"props":2438,"children":2439},{"class":70,"line":173},[2440,2445,2450,2454],{"type":32,"tag":68,"props":2441,"children":2442},{"style":657},[2443],{"type":37,"value":2444},"  WHERE",{"type":32,"tag":68,"props":2446,"children":2447},{"style":91},[2448],{"type":37,"value":2449}," metric ",{"type":32,"tag":68,"props":2451,"children":2452},{"style":657},[2453],{"type":37,"value":1815},{"type":32,"tag":68,"props":2455,"children":2456},{"style":97},[2457],{"type":37,"value":2458}," 'LCP'\n",{"type":32,"tag":68,"props":2460,"children":2461},{"class":70,"line":26},[2462,2467],{"type":32,"tag":68,"props":2463,"children":2464},{"style":657},[2465],{"type":37,"value":2466},"  GROUP BY",{"type":32,"tag":68,"props":2468,"children":2469},{"style":91},[2470],{"type":37,"value":2471}," session_id\n",{"type":32,"tag":68,"props":2473,"children":2474},{"class":70,"line":208},[2475],{"type":32,"tag":68,"props":2476,"children":2477},{"style":91},[2478],{"type":37,"value":1224},{"type":32,"tag":68,"props":2480,"children":2481},{"class":70,"line":229},[2482,2487,2491],{"type":32,"tag":68,"props":2483,"children":2484},{"style":91},[2485],{"type":37,"value":2486},"conversions ",{"type":32,"tag":68,"props":2488,"children":2489},{"style":657},[2490],{"type":37,"value":1408},{"type":32,"tag":68,"props":2492,"children":2493},{"style":91},[2494],{"type":37,"value":2367},{"type":32,"tag":68,"props":2496,"children":2497},{"class":70,"line":242},[2498],{"type":32,"tag":68,"props":2499,"children":2500},{"style":657},[2501],{"type":37,"value":2375},{"type":32,"tag":68,"props":2503,"children":2504},{"class":70,"line":260},[2505],{"type":32,"tag":68,"props":2506,"children":2507},{"style":91},[2508],{"type":37,"value":2383},{"type":32,"tag":68,"props":2510,"children":2511},{"class":70,"line":282},[2512,2517,2522,2526],{"type":32,"tag":68,"props":2513,"children":2514},{"style":107},[2515],{"type":37,"value":2516},"    SUM",{"type":32,"tag":68,"props":2518,"children":2519},{"style":91},[2520],{"type":37,"value":2521},"(revenue) ",{"type":32,"tag":68,"props":2523,"children":2524},{"style":657},[2525],{"type":37,"value":1408},{"type":32,"tag":68,"props":2527,"children":2528},{"style":91},[2529],{"type":37,"value":2530}," revenue\n",{"type":32,"tag":68,"props":2532,"children":2533},{"class":70,"line":303},[2534,2538,2543,2547],{"type":32,"tag":68,"props":2535,"children":2536},{"style":657},[2537],{"type":37,"value":2424},{"type":32,"tag":68,"props":2539,"children":2540},{"style":107},[2541],{"type":37,"value":2542}," ecommerce",{"type":32,"tag":68,"props":2544,"children":2545},{"style":91},[2546],{"type":37,"value":776},{"type":32,"tag":68,"props":2548,"children":2549},{"style":107},[2550],{"type":37,"value":2551},"transactions\n",{"type":32,"tag":68,"props":2553,"children":2554},{"class":70,"line":324},[2555,2559],{"type":32,"tag":68,"props":2556,"children":2557},{"style":657},[2558],{"type":37,"value":2466},{"type":32,"tag":68,"props":2560,"children":2561},{"style":91},[2562],{"type":37,"value":2471},{"type":32,"tag":68,"props":2564,"children":2565},{"class":70,"line":345},[2566],{"type":32,"tag":68,"props":2567,"children":2568},{"style":91},[2569],{"type":37,"value":2570},")\n",{"type":32,"tag":68,"props":2572,"children":2573},{"class":70,"line":358},[2574],{"type":32,"tag":68,"props":2575,"children":2576},{"style":657},[2577],{"type":37,"value":1368},{"type":32,"tag":68,"props":2579,"children":2580},{"class":70,"line":892},[2581],{"type":32,"tag":68,"props":2582,"children":2583},{"style":657},[2584],{"type":37,"value":2585},"  CASE\n",{"type":32,"tag":68,"props":2587,"children":2588},{"class":70,"line":900},[2589,2594,2599,2604,2609,2614],{"type":32,"tag":68,"props":2590,"children":2591},{"style":657},[2592],{"type":37,"value":2593},"    WHEN",{"type":32,"tag":68,"props":2595,"children":2596},{"style":91},[2597],{"type":37,"value":2598}," lcp_p75 ",{"type":32,"tag":68,"props":2600,"children":2601},{"style":657},[2602],{"type":37,"value":2603},"\u003C",{"type":32,"tag":68,"props":2605,"children":2606},{"style":107},[2607],{"type":37,"value":2608}," 2000",{"type":32,"tag":68,"props":2610,"children":2611},{"style":657},[2612],{"type":37,"value":2613}," THEN",{"type":32,"tag":68,"props":2615,"children":2616},{"style":97},[2617],{"type":37,"value":2618}," 'fast'\n",{"type":32,"tag":68,"props":2620,"children":2621},{"class":70,"line":914},[2622,2626,2630,2634,2639,2643],{"type":32,"tag":68,"props":2623,"children":2624},{"style":657},[2625],{"type":37,"value":2593},{"type":32,"tag":68,"props":2627,"children":2628},{"style":91},[2629],{"type":37,"value":2598},{"type":32,"tag":68,"props":2631,"children":2632},{"style":657},[2633],{"type":37,"value":2603},{"type":32,"tag":68,"props":2635,"children":2636},{"style":107},[2637],{"type":37,"value":2638}," 3000",{"type":32,"tag":68,"props":2640,"children":2641},{"style":657},[2642],{"type":37,"value":2613},{"type":32,"tag":68,"props":2644,"children":2645},{"style":97},[2646],{"type":37,"value":2647}," 'moderate'\n",{"type":32,"tag":68,"props":2649,"children":2650},{"class":70,"line":927},[2651,2656],{"type":32,"tag":68,"props":2652,"children":2653},{"style":657},[2654],{"type":37,"value":2655},"    ELSE",{"type":32,"tag":68,"props":2657,"children":2658},{"style":97},[2659],{"type":37,"value":2660}," 'slow'\n",{"type":32,"tag":68,"props":2662,"children":2663},{"class":70,"line":940},[2664,2669,2674],{"type":32,"tag":68,"props":2665,"children":2666},{"style":657},[2667],{"type":37,"value":2668},"  END",{"type":32,"tag":68,"props":2670,"children":2671},{"style":657},[2672],{"type":37,"value":2673}," AS",{"type":32,"tag":68,"props":2675,"children":2676},{"style":91},[2677],{"type":37,"value":2678}," speed_bucket,\n",{"type":32,"tag":68,"props":2680,"children":2681},{"class":70,"line":2309},[2682,2686,2690,2695,2700,2704,2709,2713,2717,2722],{"type":32,"tag":68,"props":2683,"children":2684},{"style":107},[2685],{"type":37,"value":1421},{"type":32,"tag":68,"props":2687,"children":2688},{"style":91},[2689],{"type":37,"value":708},{"type":32,"tag":68,"props":2691,"children":2692},{"style":657},[2693],{"type":37,"value":2694},"DISTINCT",{"type":32,"tag":68,"props":2696,"children":2697},{"style":107},[2698],{"type":37,"value":2699}," m",{"type":32,"tag":68,"props":2701,"children":2702},{"style":91},[2703],{"type":37,"value":776},{"type":32,"tag":68,"props":2705,"children":2706},{"style":107},[2707],{"type":37,"value":2708},"session_id",{"type":32,"tag":68,"props":2710,"children":2711},{"style":91},[2712],{"type":37,"value":1052},{"type":32,"tag":68,"props":2714,"children":2715},{"style":657},[2716],{"type":37,"value":1408},{"type":32,"tag":68,"props":2718,"children":2719},{"style":657},[2720],{"type":37,"value":2721}," sessions",{"type":32,"tag":68,"props":2723,"children":2724},{"style":91},[2725],{"type":37,"value":458},{"type":32,"tag":68,"props":2727,"children":2729},{"class":70,"line":2728},24,[2730,2734,2738,2743,2747,2751,2755,2759],{"type":32,"tag":68,"props":2731,"children":2732},{"style":107},[2733],{"type":37,"value":1421},{"type":32,"tag":68,"props":2735,"children":2736},{"style":91},[2737],{"type":37,"value":708},{"type":32,"tag":68,"props":2739,"children":2740},{"style":107},[2741],{"type":37,"value":2742},"c",{"type":32,"tag":68,"props":2744,"children":2745},{"style":91},[2746],{"type":37,"value":776},{"type":32,"tag":68,"props":2748,"children":2749},{"style":107},[2750],{"type":37,"value":2708},{"type":32,"tag":68,"props":2752,"children":2753},{"style":91},[2754],{"type":37,"value":1052},{"type":32,"tag":68,"props":2756,"children":2757},{"style":657},[2758],{"type":37,"value":1408},{"type":32,"tag":68,"props":2760,"children":2761},{"style":91},[2762],{"type":37,"value":2763}," conversions,\n",{"type":32,"tag":68,"props":2765,"children":2767},{"class":70,"line":2766},25,[2768,2773,2778,2782,2786,2790,2794,2799,2803,2807,2811,2815,2819,2823,2828,2832],{"type":32,"tag":68,"props":2769,"children":2770},{"style":91},[2771],{"type":37,"value":2772},"  SAFE_DIVIDE(",{"type":32,"tag":68,"props":2774,"children":2775},{"style":107},[2776],{"type":37,"value":2777},"COUNT",{"type":32,"tag":68,"props":2779,"children":2780},{"style":91},[2781],{"type":37,"value":708},{"type":32,"tag":68,"props":2783,"children":2784},{"style":107},[2785],{"type":37,"value":2742},{"type":32,"tag":68,"props":2787,"children":2788},{"style":91},[2789],{"type":37,"value":776},{"type":32,"tag":68,"props":2791,"children":2792},{"style":107},[2793],{"type":37,"value":2708},{"type":32,"tag":68,"props":2795,"children":2796},{"style":91},[2797],{"type":37,"value":2798},"), ",{"type":32,"tag":68,"props":2800,"children":2801},{"style":107},[2802],{"type":37,"value":2777},{"type":32,"tag":68,"props":2804,"children":2805},{"style":91},[2806],{"type":37,"value":708},{"type":32,"tag":68,"props":2808,"children":2809},{"style":657},[2810],{"type":37,"value":2694},{"type":32,"tag":68,"props":2812,"children":2813},{"style":107},[2814],{"type":37,"value":2699},{"type":32,"tag":68,"props":2816,"children":2817},{"style":91},[2818],{"type":37,"value":776},{"type":32,"tag":68,"props":2820,"children":2821},{"style":107},[2822],{"type":37,"value":2708},{"type":32,"tag":68,"props":2824,"children":2825},{"style":91},[2826],{"type":37,"value":2827},")) ",{"type":32,"tag":68,"props":2829,"children":2830},{"style":657},[2831],{"type":37,"value":1408},{"type":32,"tag":68,"props":2833,"children":2834},{"style":91},[2835],{"type":37,"value":2836}," conversion_rate,\n",{"type":32,"tag":68,"props":2838,"children":2840},{"class":70,"line":2839},26,[2841,2846,2850,2854,2858,2863,2867,2871],{"type":32,"tag":68,"props":2842,"children":2843},{"style":107},[2844],{"type":37,"value":2845},"  AVG",{"type":32,"tag":68,"props":2847,"children":2848},{"style":91},[2849],{"type":37,"value":708},{"type":32,"tag":68,"props":2851,"children":2852},{"style":107},[2853],{"type":37,"value":2742},{"type":32,"tag":68,"props":2855,"children":2856},{"style":91},[2857],{"type":37,"value":776},{"type":32,"tag":68,"props":2859,"children":2860},{"style":107},[2861],{"type":37,"value":2862},"revenue",{"type":32,"tag":68,"props":2864,"children":2865},{"style":91},[2866],{"type":37,"value":1052},{"type":32,"tag":68,"props":2868,"children":2869},{"style":657},[2870],{"type":37,"value":1408},{"type":32,"tag":68,"props":2872,"children":2873},{"style":91},[2874],{"type":37,"value":2875}," avg_order_value\n",{"type":32,"tag":68,"props":2877,"children":2879},{"class":70,"line":2878},27,[2880,2884],{"type":32,"tag":68,"props":2881,"children":2882},{"style":657},[2883],{"type":37,"value":1451},{"type":32,"tag":68,"props":2885,"children":2886},{"style":91},[2887],{"type":37,"value":2888}," metrics_with_sessions m\n",{"type":32,"tag":68,"props":2890,"children":2892},{"class":70,"line":2891},28,[2893,2898,2903,2908],{"type":32,"tag":68,"props":2894,"children":2895},{"style":657},[2896],{"type":37,"value":2897},"LEFT JOIN",{"type":32,"tag":68,"props":2899,"children":2900},{"style":91},[2901],{"type":37,"value":2902}," conversions c ",{"type":32,"tag":68,"props":2904,"children":2905},{"style":657},[2906],{"type":37,"value":2907},"USING",{"type":32,"tag":68,"props":2909,"children":2910},{"style":91},[2911],{"type":37,"value":2912},"(session_id)\n",{"type":32,"tag":68,"props":2914,"children":2916},{"class":70,"line":2915},29,[2917,2921],{"type":32,"tag":68,"props":2918,"children":2919},{"style":657},[2920],{"type":37,"value":1521},{"type":32,"tag":68,"props":2922,"children":2923},{"style":91},[2924],{"type":37,"value":2925}," speed_bucket;\n",{"type":32,"tag":33,"props":2927,"children":2928},{},[2929],{"type":37,"value":2930},"Sample output:",{"type":32,"tag":2932,"props":2933,"children":2934},"ul",{},[2935,2954,2971],{"type":32,"tag":2936,"props":2937,"children":2938},"li",{},[2939,2945,2947,2952],{"type":32,"tag":2940,"props":2941,"children":2942},"strong",{},[2943],{"type":37,"value":2944},"fast (LCP \u003C 2s):",{"type":37,"value":2946}," 15,240 sessions, 1,829 conversions → ",{"type":32,"tag":2940,"props":2948,"children":2949},{},[2950],{"type":37,"value":2951},"12.0% CR",{"type":37,"value":2953},", $87 AOV",{"type":32,"tag":2936,"props":2955,"children":2956},{},[2957,2962,2964,2969],{"type":32,"tag":2940,"props":2958,"children":2959},{},[2960],{"type":37,"value":2961},"moderate (2-3s):",{"type":37,"value":2963}," 8,910 sessions, 934 conversions → ",{"type":32,"tag":2940,"props":2965,"children":2966},{},[2967],{"type":37,"value":2968},"10.5% CR",{"type":37,"value":2970},", $83 AOV",{"type":32,"tag":2936,"props":2972,"children":2973},{},[2974,2979,2981,2986],{"type":32,"tag":2940,"props":2975,"children":2976},{},[2977],{"type":37,"value":2978},"slow (>3s):",{"type":37,"value":2980}," 3,200 sessions, 256 conversions → ",{"type":32,"tag":2940,"props":2982,"children":2983},{},[2984],{"type":37,"value":2985},"8.0% CR",{"type":37,"value":2987},", $78 AOV",{"type":32,"tag":33,"props":2989,"children":2990},{},[2991],{"type":37,"value":2992},"This data shows that reducing LCP from 3s to 2s would lift conversion rate from 8% to 12%—a 4-point gain. For a site with 10,000 monthly visitors, that's 400 extra conversions. At $80 AOV, that's $32,000 in additional monthly revenue. When you cite this number in performance budget discussions, decision-making shifts—\"LCP optimization\" moves to the top of the backlog.",{"type":32,"tag":1533,"props":2994,"children":2996},{"id":2995},"making-budget-definitions-dynamic",[2997],{"type":37,"value":2998},"Making Budget Definitions Dynamic",{"type":32,"tag":33,"props":3000,"children":3001},{},[3002],{"type":37,"value":3003},"A static \"LCP \u003C 2.5s\" budget may not fit all pages equally. Product listing pages and checkout pages have different criticality. A 100ms delay at checkout directly loses revenue; the same delay on a listing is less critical. Segment budgets by page type:",{"type":32,"tag":57,"props":3005,"children":3007},{"code":3006,"language":390,"meta":16,"className":391,"style":16},"\u002F\u002F lighthouserc.json — different assertions per page type\n{\n  \"ci\": {\n    \"collect\": {\n      \"url\": [\n        \"https:\u002F\u002Fstaging.example.com\u002F\",\n        \"https:\u002F\u002Fstaging.example.com\u002Fproducts\",\n        \"https:\u002F\u002Fstaging.example.com\u002Fcheckout\"\n      ]\n    },\n    \"assert\": {\n      \"assertions\": {\n        \"largest-contentful-paint\": [\n          \"error\",\n          {\n            \"maxNumericValue\": 2000,\n            \"matchingUrlPattern\": \".*\u002Fcheckout\"\n          }\n        ],\n        \"largest-contentful-paint\": [\n          \"warn\",\n          {\n            \"maxNumericValue\": 2500,\n            \"matchingUrlPattern\": \".*\u002F(products|)\"\n          }\n        ]\n      }\n    }\n  }\n}\n",[3008],{"type":32,"tag":64,"props":3009,"children":3010},{"__ignoreMap":16},[3011,3019,3026,3037,3049,3062,3074,3086,3094,3102,3110,3121,3132,3143,3155,3163,3184,3201,3209,3217,3228,3240,3247,3266,3282,3289,3297,3304,3311,3318],{"type":32,"tag":68,"props":3012,"children":3013},{"class":70,"line":71},[3014],{"type":32,"tag":68,"props":3015,"children":3016},{"style":75},[3017],{"type":37,"value":3018},"\u002F\u002F lighthouserc.json — different assertions per page type\n",{"type":32,"tag":68,"props":3020,"children":3021},{"class":70,"line":81},[3022],{"type":32,"tag":68,"props":3023,"children":3024},{"style":91},[3025],{"type":37,"value":411},{"type":32,"tag":68,"props":3027,"children":3028},{"class":70,"line":103},[3029,3033],{"type":32,"tag":68,"props":3030,"children":3031},{"style":107},[3032],{"type":37,"value":419},{"type":32,"tag":68,"props":3034,"children":3035},{"style":91},[3036],{"type":37,"value":424},{"type":32,"tag":68,"props":3038,"children":3039},{"class":70,"line":128},[3040,3045],{"type":32,"tag":68,"props":3041,"children":3042},{"style":107},[3043],{"type":37,"value":3044},"    \"collect\"",{"type":32,"tag":68,"props":3046,"children":3047},{"style":91},[3048],{"type":37,"value":424},{"type":32,"tag":68,"props":3050,"children":3051},{"class":70,"line":142},[3052,3057],{"type":32,"tag":68,"props":3053,"children":3054},{"style":107},[3055],{"type":37,"value":3056},"      \"url\"",{"type":32,"tag":68,"props":3058,"children":3059},{"style":91},[3060],{"type":37,"value":3061},": [\n",{"type":32,"tag":68,"props":3063,"children":3064},{"class":70,"line":155},[3065,3070],{"type":32,"tag":68,"props":3066,"children":3067},{"style":97},[3068],{"type":37,"value":3069},"        \"https:\u002F\u002Fstaging.example.com\u002F\"",{"type":32,"tag":68,"props":3071,"children":3072},{"style":91},[3073],{"type":37,"value":458},{"type":32,"tag":68,"props":3075,"children":3076},{"class":70,"line":173},[3077,3082],{"type":32,"tag":68,"props":3078,"children":3079},{"style":97},[3080],{"type":37,"value":3081},"        \"https:\u002F\u002Fstaging.example.com\u002Fproducts\"",{"type":32,"tag":68,"props":3083,"children":3084},{"style":91},[3085],{"type":37,"value":458},{"type":32,"tag":68,"props":3087,"children":3088},{"class":70,"line":26},[3089],{"type":32,"tag":68,"props":3090,"children":3091},{"style":97},[3092],{"type":37,"value":3093},"        \"https:\u002F\u002Fstaging.example.com\u002Fcheckout\"\n",{"type":32,"tag":68,"props":3095,"children":3096},{"class":70,"line":208},[3097],{"type":32,"tag":68,"props":3098,"children":3099},{"style":91},[3100],{"type":37,"value":3101},"      ]\n",{"type":32,"tag":68,"props":3103,"children":3104},{"class":70,"line":229},[3105],{"type":32,"tag":68,"props":3106,"children":3107},{"style":91},[3108],{"type":37,"value":3109},"    },\n",{"type":32,"tag":68,"props":3111,"children":3112},{"class":70,"line":242},[3113,3117],{"type":32,"tag":68,"props":3114,"children":3115},{"style":107},[3116],{"type":37,"value":432},{"type":32,"tag":68,"props":3118,"children":3119},{"style":91},[3120],{"type":37,"value":424},{"type":32,"tag":68,"props":3122,"children":3123},{"class":70,"line":260},[3124,3128],{"type":32,"tag":68,"props":3125,"children":3126},{"style":107},[3127],{"type":37,"value":466},{"type":32,"tag":68,"props":3129,"children":3130},{"style":91},[3131],{"type":37,"value":424},{"type":32,"tag":68,"props":3133,"children":3134},{"class":70,"line":282},[3135,3139],{"type":32,"tag":68,"props":3136,"children":3137},{"style":107},[3138],{"type":37,"value":478},{"type":32,"tag":68,"props":3140,"children":3141},{"style":91},[3142],{"type":37,"value":3061},{"type":32,"tag":68,"props":3144,"children":3145},{"class":70,"line":303},[3146,3151],{"type":32,"tag":68,"props":3147,"children":3148},{"style":97},[3149],{"type":37,"value":3150},"          \"error\"",{"type":32,"tag":68,"props":3152,"children":3153},{"style":91},[3154],{"type":37,"value":458},{"type":32,"tag":68,"props":3156,"children":3157},{"class":70,"line":324},[3158],{"type":32,"tag":68,"props":3159,"children":3160},{"style":91},[3161],{"type":37,"value":3162},"          {\n",{"type":32,"tag":68,"props":3164,"children":3165},{"class":70,"line":345},[3166,3171,3175,3180],{"type":32,"tag":68,"props":3167,"children":3168},{"style":107},[3169],{"type":37,"value":3170},"            \"maxNumericValue\"",{"type":32,"tag":68,"props":3172,"children":3173},{"style":91},[3174],{"type":37,"value":94},{"type":32,"tag":68,"props":3176,"children":3177},{"style":107},[3178],{"type":37,"value":3179},"2000",{"type":32,"tag":68,"props":3181,"children":3182},{"style":91},[3183],{"type":37,"value":458},{"type":32,"tag":68,"props":3185,"children":3186},{"class":70,"line":358},[3187,3192,3196],{"type":32,"tag":68,"props":3188,"children":3189},{"style":107},[3190],{"type":37,"value":3191},"            \"matchingUrlPattern\"",{"type":32,"tag":68,"props":3193,"children":3194},{"style":91},[3195],{"type":37,"value":94},{"type":32,"tag":68,"props":3197,"children":3198},{"style":97},[3199],{"type":37,"value":3200},"\".*\u002Fcheckout\"\n",{"type":32,"tag":68,"props":3202,"children":3203},{"class":70,"line":892},[3204],{"type":32,"tag":68,"props":3205,"children":3206},{"style":91},[3207],{"type":37,"value":3208},"          }\n",{"type":32,"tag":68,"props":3210,"children":3211},{"class":70,"line":900},[3212],{"type":32,"tag":68,"props":3213,"children":3214},{"style":91},[3215],{"type":37,"value":3216},"        ],\n",{"type":32,"tag":68,"props":3218,"children":3219},{"class":70,"line":914},[3220,3224],{"type":32,"tag":68,"props":3221,"children":3222},{"style":107},[3223],{"type":37,"value":478},{"type":32,"tag":68,"props":3225,"children":3226},{"style":91},[3227],{"type":37,"value":3061},{"type":32,"tag":68,"props":3229,"children":3230},{"class":70,"line":927},[3231,3236],{"type":32,"tag":68,"props":3232,"children":3233},{"style":97},[3234],{"type":37,"value":3235},"          \"warn\"",{"type":32,"tag":68,"props":3237,"children":3238},{"style":91},[3239],{"type":37,"value":458},{"type":32,"tag":68,"props":3241,"children":3242},{"class":70,"line":940},[3243],{"type":32,"tag":68,"props":3244,"children":3245},{"style":91},[3246],{"type":37,"value":3162},{"type":32,"tag":68,"props":3248,"children":3249},{"class":70,"line":2309},[3250,3254,3258,3262],{"type":32,"tag":68,"props":3251,"children":3252},{"style":107},[3253],{"type":37,"value":3170},{"type":32,"tag":68,"props":3255,"children":3256},{"style":91},[3257],{"type":37,"value":94},{"type":32,"tag":68,"props":3259,"children":3260},{"style":107},[3261],{"type":37,"value":506},{"type":32,"tag":68,"props":3263,"children":3264},{"style":91},[3265],{"type":37,"value":458},{"type":32,"tag":68,"props":3267,"children":3268},{"class":70,"line":2728},[3269,3273,3277],{"type":32,"tag":68,"props":3270,"children":3271},{"style":107},[3272],{"type":37,"value":3191},{"type":32,"tag":68,"props":3274,"children":3275},{"style":91},[3276],{"type":37,"value":94},{"type":32,"tag":68,"props":3278,"children":3279},{"style":97},[3280],{"type":37,"value":3281},"\".*\u002F(products|)\"\n",{"type":32,"tag":68,"props":3283,"children":3284},{"class":70,"line":2766},[3285],{"type":32,"tag":68,"props":3286,"children":3287},{"style":91},[3288],{"type":37,"value":3208},{"type":32,"tag":68,"props":3290,"children":3291},{"class":70,"line":2839},[3292],{"type":32,"tag":68,"props":3293,"children":3294},{"style":91},[3295],{"type":37,"value":3296},"        ]\n",{"type":32,"tag":68,"props":3298,"children":3299},{"class":70,"line":2878},[3300],{"type":32,"tag":68,"props":3301,"children":3302},{"style":91},[3303],{"type":37,"value":594},{"type":32,"tag":68,"props":3305,"children":3306},{"class":70,"line":2891},[3307],{"type":32,"tag":68,"props":3308,"children":3309},{"style":91},[3310],{"type":37,"value":602},{"type":32,"tag":68,"props":3312,"children":3313},{"class":70,"line":2915},[3314],{"type":32,"tag":68,"props":3315,"children":3316},{"style":91},[3317],{"type":37,"value":610},{"type":32,"tag":68,"props":3319,"children":3321},{"class":70,"line":3320},30,[3322],{"type":32,"tag":68,"props":3323,"children":3324},{"style":91},[3325],{"type":37,"value":618},{"type":32,"tag":33,"props":3327,"children":3328},{},[3329,3331,3337,3339,3345],{"type":37,"value":3330},"Checkout LCP exceeding 2 seconds blocks the merge (",{"type":32,"tag":64,"props":3332,"children":3334},{"className":3333},[],[3335],{"type":37,"value":3336},"error",{"type":37,"value":3338},"); homepage exceeding 2.5 seconds only warns (",{"type":32,"tag":64,"props":3340,"children":3342},{"className":3341},[],[3343],{"type":37,"value":3344},"warn",{"type":37,"value":3346},"). Apply the same granularity in RUM—different alarm thresholds per page type.",{"type":32,"tag":40,"props":3348,"children":3350},{"id":3349},"integrating-the-ci-pipeline-into-business-workflows",[3351],{"type":37,"value":3352},"Integrating the CI Pipeline into Business Workflows",{"type":32,"tag":33,"props":3354,"children":3355},{},[3356],{"type":37,"value":3357},"Rather than using Lighthouse CI only as a test tool, posting results as PR comments improves team visibility:",{"type":32,"tag":57,"props":3359,"children":3361},{"code":3360,"language":60,"meta":16,"className":61,"style":16},"# .github\u002Fworkflows\u002Flighthouse-comment.yml\n- name: Comment PR with Lighthouse results\n  uses: treosh\u002Flighthouse-ci-action@v9\n  with:\n    uploadArtifacts: true\n    temporaryPublicStorage: true\n    runs: 3 # run 3 times, use average\n",[3362],{"type":32,"tag":64,"props":3363,"children":3364},{"__ignoreMap":16},[3365,3373,3394,3411,3423,3439,3455],{"type":32,"tag":68,"props":3366,"children":3367},{"class":70,"line":71},[3368],{"type":32,"tag":68,"props":3369,"children":3370},{"style":75},[3371],{"type":37,"value":3372},"# .github\u002Fworkflows\u002Flighthouse-comment.yml\n",{"type":32,"tag":68,"props":3374,"children":3375},{"class":70,"line":81},[3376,3381,3385,3389],{"type":32,"tag":68,"props":3377,"children":3378},{"style":91},[3379],{"type":37,"value":3380},"- ",{"type":32,"tag":68,"props":3382,"children":3383},{"style":85},[3384],{"type":37,"value":88},{"type":32,"tag":68,"props":3386,"children":3387},{"style":91},[3388],{"type":37,"value":94},{"type":32,"tag":68,"props":3390,"children":3391},{"style":97},[3392],{"type":37,"value":3393},"Comment PR with Lighthouse results\n",{"type":32,"tag":68,"props":3395,"children":3396},{"class":70,"line":103},[3397,3402,3406],{"type":32,"tag":68,"props":3398,"children":3399},{"style":85},[3400],{"type":37,"value":3401},"  uses",{"type":32,"tag":68,"props":3403,"children":3404},{"style":91},[3405],{"type":37,"value":94},{"type":32,"tag":68,"props":3407,"children":3408},{"style":97},[3409],{"type":37,"value":3410},"treosh\u002Flighthouse-ci-action@v9\n",{"type":32,"tag":68,"props":3412,"children":3413},{"class":70,"line":128},[3414,3419],{"type":32,"tag":68,"props":3415,"children":3416},{"style":85},[3417],{"type":37,"value":3418},"  with",{"type":32,"tag":68,"props":3420,"children":3421},{"style":91},[3422],{"type":37,"value":139},{"type":32,"tag":68,"props":3424,"children":3425},{"class":70,"line":142},[3426,3431,3435],{"type":32,"tag":68,"props":3427,"children":3428},{"style":85},[3429],{"type":37,"value":3430},"    uploadArtifacts",{"type":32,"tag":68,"props":3432,"children":3433},{"style":91},[3434],{"type":37,"value":94},{"type":32,"tag":68,"props":3436,"children":3437},{"style":107},[3438],{"type":37,"value":874},{"type":32,"tag":68,"props":3440,"children":3441},{"class":70,"line":155},[3442,3447,3451],{"type":32,"tag":68,"props":3443,"children":3444},{"style":85},[3445],{"type":37,"value":3446},"    temporaryPublicStorage",{"type":32,"tag":68,"props":3448,"children":3449},{"style":91},[3450],{"type":37,"value":94},{"type":32,"tag":68,"props":3452,"children":3453},{"style":107},[3454],{"type":37,"value":874},{"type":32,"tag":68,"props":3456,"children":3457},{"class":70,"line":173},[3458,3463,3467,3472],{"type":32,"tag":68,"props":3459,"children":3460},{"style":85},[3461],{"type":37,"value":3462},"    runs",{"type":32,"tag":68,"props":3464,"children":3465},{"style":91},[3466],{"type":37,"value":94},{"type":32,"tag":68,"props":3468,"children":3469},{"style":107},[3470],{"type":37,"value":3471},"3",{"type":32,"tag":68,"props":3473,"children":3474},{"style":75},[3475],{"type":37,"value":3476}," # run 3 times, use average\n",{"type":32,"tag":33,"props":3478,"children":3479},{},[3480],{"type":37,"value":3481},"This action appends a comment to the PR like:",{"type":32,"tag":57,"props":3483,"children":3485},{"code":3484},"Lighthouse CI Report\n\n| Metric | Before | After | Diff |\n|--------|--------|-------|------|\n| LCP    | 2.8s   | 2.1s  | -700ms ✅ |\n| TBT    | 420ms  | 310ms | -110ms ✅ |\n| CLS    | 0.08   | 0.12  | +0.04 ⚠️ |\n",[3486],{"type":32,"tag":64,"props":3487,"children":3488},{"__ignoreMap":16},[3489],{"type":37,"value":3484},{"type":32,"tag":33,"props":3491,"children":3492},{},[3493],{"type":37,"value":3494},"CLS (Cumulative Layout Shift) has regressed—the team notices immediately and can fix it before deployment. Closing this feedback loop is essential; performance culture can't develop without it.",{"type":32,"tag":33,"props":3496,"children":3497},{},[3498],{"type":37,"value":3499},"Moving RUM data to dashboards is equally critical. Grafana + BigQuery is straightforward:",{"type":32,"tag":57,"props":3501,"children":3503},{"code":3502,"language":1355,"meta":16,"className":1356,"style":16},"-- Grafana panel query: LCP trend for last 24 hours\nSELECT\n  TIMESTAMP_SECONDS(DIV(timestamp, 1000)) AS time,\n  APPROX_QUANTILES(value, 100)[OFFSET(75)] AS p75_lcp\nFROM web_vitals.raw_metrics\nWHERE metric = 'LCP'\n  AND timestamp >= UNIX_MILLIS(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 24 HOUR))\nGROUP BY time\nORDER BY time;\n",[3504],{"type":32,"tag":64,"props":3505,"children":3506},{"__ignoreMap":16},[3507,3515,3522,3561,3593,3612,3631,3673,3685],{"type":32,"tag":68,"props":3508,"children":3509},{"class":70,"line":71},[3510],{"type":32,"tag":68,"props":3511,"children":3512},{"style":75},[3513],{"type":37,"value":3514},"-- Grafana panel query: LCP trend for last 24 hours\n",{"type":32,"tag":68,"props":3516,"children":3517},{"class":70,"line":81},[3518],{"type":32,"tag":68,"props":3519,"children":3520},{"style":657},[3521],{"type":37,"value":1368},{"type":32,"tag":68,"props":3523,"children":3524},{"class":70,"line":103},[3525,3530,3535,3539,3544,3548,3552,3557],{"type":32,"tag":68,"props":3526,"children":3527},{"style":91},[3528],{"type":37,"value":3529},"  TIMESTAMP_SECONDS(DIV(",{"type":32,"tag":68,"props":3531,"children":3532},{"style":657},[3533],{"type":37,"value":3534},"timestamp",{"type":32,"tag":68,"props":3536,"children":3537},{"style":91},[3538],{"type":37,"value":1015},{"type":32,"tag":68,"props":3540,"children":3541},{"style":107},[3542],{"type":37,"value":3543},"1000",{"type":32,"tag":68,"props":3545,"children":3546},{"style":91},[3547],{"type":37,"value":2827},{"type":32,"tag":68,"props":3549,"children":3550},{"style":657},[3551],{"type":37,"value":1408},{"type":32,"tag":68,"props":3553,"children":3554},{"style":657},[3555],{"type":37,"value":3556}," time",{"type":32,"tag":68,"props":3558,"children":3559},{"style":91},[3560],{"type":37,"value":458},{"type":32,"tag":68,"props":3562,"children":3563},{"class":70,"line":128},[3564,3568,3572,3576,3580,3584,3588],{"type":32,"tag":68,"props":3565,"children":3566},{"style":91},[3567],{"type":37,"value":1384},{"type":32,"tag":68,"props":3569,"children":3570},{"style":657},[3571],{"type":37,"value":1389},{"type":32,"tag":68,"props":3573,"children":3574},{"style":91},[3575],{"type":37,"value":1015},{"type":32,"tag":68,"props":3577,"children":3578},{"style":107},[3579],{"type":37,"value":1398},{"type":32,"tag":68,"props":3581,"children":3582},{"style":91},[3583],{"type":37,"value":1403},{"type":32,"tag":68,"props":3585,"children":3586},{"style":657},[3587],{"type":37,"value":1408},{"type":32,"tag":68,"props":3589,"children":3590},{"style":91},[3591],{"type":37,"value":3592}," p75_lcp\n",{"type":32,"tag":68,"props":3594,"children":3595},{"class":70,"line":142},[3596,3600,3604,3608],{"type":32,"tag":68,"props":3597,"children":3598},{"style":657},[3599],{"type":37,"value":1451},{"type":32,"tag":68,"props":3601,"children":3602},{"style":107},[3603],{"type":37,"value":1456},{"type":32,"tag":68,"props":3605,"children":3606},{"style":91},[3607],{"type":37,"value":776},{"type":32,"tag":68,"props":3609,"children":3610},{"style":107},[3611],{"type":37,"value":1465},{"type":32,"tag":68,"props":3613,"children":3614},{"class":70,"line":155},[3615,3619,3623,3627],{"type":32,"tag":68,"props":3616,"children":3617},{"style":657},[3618],{"type":37,"value":1473},{"type":32,"tag":68,"props":3620,"children":3621},{"style":91},[3622],{"type":37,"value":2449},{"type":32,"tag":68,"props":3624,"children":3625},{"style":657},[3626],{"type":37,"value":1815},{"type":32,"tag":68,"props":3628,"children":3629},{"style":97},[3630],{"type":37,"value":2458},{"type":32,"tag":68,"props":3632,"children":3633},{"class":70,"line":173},[3634,3639,3643,3647,3651,3655,3659,3664,3669],{"type":32,"tag":68,"props":3635,"children":3636},{"style":657},[3637],{"type":37,"value":3638},"  AND",{"type":32,"tag":68,"props":3640,"children":3641},{"style":657},[3642],{"type":37,"value":1478},{"type":32,"tag":68,"props":3644,"children":3645},{"style":657},[3646],{"type":37,"value":1483},{"type":32,"tag":68,"props":3648,"children":3649},{"style":91},[3650],{"type":37,"value":1488},{"type":32,"tag":68,"props":3652,"children":3653},{"style":107},[3654],{"type":37,"value":1493},{"type":32,"tag":68,"props":3656,"children":3657},{"style":91},[3658],{"type":37,"value":1498},{"type":32,"tag":68,"props":3660,"children":3661},{"style":107},[3662],{"type":37,"value":3663},"24",{"type":32,"tag":68,"props":3665,"children":3666},{"style":657},[3667],{"type":37,"value":3668}," HOUR",{"type":32,"tag":68,"props":3670,"children":3671},{"style":91},[3672],{"type":37,"value":1513},{"type":32,"tag":68,"props":3674,"children":3675},{"class":70,"line":26},[3676,3680],{"type":32,"tag":68,"props":3677,"children":3678},{"style":657},[3679],{"type":37,"value":1521},{"type":32,"tag":68,"props":3681,"children":3682},{"style":657},[3683],{"type":37,"value":3684}," time\n",{"type":32,"tag":68,"props":3686,"children":3687},{"class":70,"line":208},[3688,3693,3697],{"type":32,"tag":68,"props":3689,"children":3690},{"style":657},[3691],{"type":37,"value":3692},"ORDER BY",{"type":32,"tag":68,"props":3694,"children":3695},{"style":657},[3696],{"type":37,"value":3556},{"type":32,"tag":68,"props":3698,"children":3699},{"style":91},[3700],{"type":37,"value":680},{"type":32,"tag":33,"props":3702,"children":3703},{},[3704],{"type":37,"value":3705},"Add deployment annotations to your dashboard so you can see which release caused which impact. For example, an image lazy-loading change reduced LCP by 18%—annotate this deployment ID so future optimizations can be prioritized similarly.",{"type":32,"tag":40,"props":3707,"children":3709},{"id":3708},"performance-culture-from-metrics-to-behavior",[3710],{"type":37,"value":3711},"Performance Culture: From Metrics to Behavior",{"type":32,"tag":33,"props":3713,"children":3714},{},[3715,3717,3724],{"type":37,"value":3716},"The real power of performance budgets is cultural. When teams see Lighthouse reports on every PR, speed awareness develops—before adding a 200KB npm package, they ask \"will this exceed our bundle size budget?\" Without this question, regression is inevitable. In Roibase's Shopify work (part of our ",{"type":32,"tag":1550,"props":3718,"children":3721},{"href":3719,"rel":3720},"https:\u002F\u002Fwww.roibase.com.tr\u002Fen\u002Fshopify",[1554],[3722],{"type":37,"value":3723},"Shopify Partner Services",{"type":37,"value":3725},"), teams resist budgets the first three months—\"it slows development.\" By month six, 80% of the team owns the budget; alarm count drops 90%. Because metrics have become part of decision-making, \"fast site\" shifts from abstract goal to measurable business metric.",{"type":32,"tag":33,"props":3727,"children":3728},{},[3729],{"type":37,"value":3730},"The cost of preventing regression is 10 times lower than fixing it. Lighthouse CI + RUM together reduce that cost—lab-based deterministic testing on one side, real-world user experience in production on the other. Teams using both avoid lab surprises and production shocks. Those using only one face inevitable business impact. Measurement alone isn't enough—prevention is what matters.",{"type":32,"tag":3732,"props":3733,"children":3734},"style",{},[3735],{"type":37,"value":3736},"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);}",{"title":16,"searchDepth":103,"depth":103,"links":3738},[3739,3740,3743,3744,3747,3748],{"id":42,"depth":81,"text":45},{"id":626,"depth":81,"text":629,"children":3741},[3742],{"id":1535,"depth":103,"text":1538},{"id":1562,"depth":81,"text":1565},{"id":2322,"depth":81,"text":2325,"children":3745},[3746],{"id":2995,"depth":103,"text":2998},{"id":3349,"depth":81,"text":3352},{"id":3708,"depth":81,"text":3711},"markdown","content:en:tech:web-performance-budgets-linking-to-decision-making.md","content","en\u002Ftech\u002Fweb-performance-budgets-linking-to-decision-making.md","en\u002Ftech\u002Fweb-performance-budgets-linking-to-decision-making","md",1778767427210]