HairMNL — Performance Dashboard

Last updated: 2026-05-20 00:38 UTC  ·  Snapshots: 20  ·  RUM window: last 7 days
Open in PSI ↗

Production truth CrUX p75 · 28-day rolling field data · what Google uses for SEO

What this is: Chrome UX Report p75 — real-shopper field data over the last 28 days. This is the metric Google uses for Core Web Vitals search ranking. 2026-04-20 → 2026-05-17
Form factorLCPCLSINPFCPTTFB
Mobile2.79s 0.030 227ms 2.52s 927ms
Desktop2.31s 0.170 178ms 2.16s 472ms

Today's snapshot CrUX = real-shopper p75 (28-day) · PSI = single-run lab simulation

ScoreThe overall 0–100 perf grade Google gives the page (weighted blend of all metrics below).Goal: 90+How to act: Caveat: swings ±5–10 points between runs. Trust trends, not single numbers.
29
no change vs prev
PSI lab
LCPLargest Contentful Paint — how long the biggest visible thing (usually the hero image) takes to appear. Slow LCP = shoppers think the site is broken.Goal: ≤ 2.5 sHow to act: preload the hero image, defer non-critical scripts, serve images in WebP at the right size.
2.79 s
no change vs prev
⚠ ΔCrUX (28d p75) and GA4 RUM (7d) diverge by 10pp on this metric. Possible cause: sampling bias, time-window difference, or bot contamination. Investigate before drawing conclusions.
CrUX p75
CLSCumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.
0.030
no change vs prev
CrUX p75
INPInteraction to Next Paint — how long the page takes to react when a shopper taps or clicks. Slow INP feels laggy.Goal: ≤ 200 msHow to act: break up long JavaScript tasks, defer third-party scripts, lazy-init heavy widgets (carousels, modals).
227 ms
no change vs prev
⚠ ΔCrUX (28d p75) and GA4 RUM (7d) diverge by 12pp on this metric. Possible cause: sampling bias, time-window difference, or bot contamination. Investigate before drawing conclusions.
CrUX p75
TBTTotal Blocking Time — how long the main thread is frozen by heavy JavaScript during page load. Lab proxy for INP.Goal: ≤ 200 msHow to act: defer non-critical JS (add the defer attribute), code-split bundles, lazy-load below-fold scripts.
3410 ms
↑ 622ms vs prev
PSI lab
FCPFirst Contentful Paint — how long until the shopper sees ANYTHING (often the header or page background).Goal: ≤ 1.8 sHow to act: reduce server response time, eliminate render-blocking CSS/JS in the head, use a CDN.
2.52 s
no change vs prev
⚠ ΔCrUX (28d p75) and GA4 RUM (7d) diverge by 23pp on this metric. Possible cause: sampling bias, time-window difference, or bot contamination. Investigate before drawing conclusions.
CrUX p75
TTFBTime to First Byte — how long Shopify takes to respond after the shopper clicks a link.Goal: ≤ 800 msHow to act: minimize Shopify app overhead, cache where possible. Largely determined by Shopify's servers + apps installed.
927 ms
no change vs prev
CrUX p75

Trend over time — PSI Lab mobile

Performance score The overall 0–100 perf grade Google gives the page (weighted blend of all metrics below).Goal: 90+How to act: Caveat: swings ±5–10 points between runs. Trust trends, not single numbers.

Largest Contentful Paint (s) Largest Contentful Paint — how long the biggest visible thing (usually the hero image) takes to appear. Slow LCP = shoppers think the site is broken.Goal: ≤ 2.5 sHow to act: preload the hero image, defer non-critical scripts, serve images in WebP at the right size.

Total Blocking Time (ms) Total Blocking Time — how long the main thread is frozen by heavy JavaScript during page load. Lab proxy for INP.Goal: ≤ 200 msHow to act: defer non-critical JS (add the defer attribute), code-split bundles, lazy-load below-fold scripts.

Cumulative Layout Shift Cumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.

ScoreThe overall 0–100 perf grade Google gives the page (weighted blend of all metrics below).Goal: 90+How to act: Caveat: swings ±5–10 points between runs. Trust trends, not single numbers.
60
↑ 4 vs prev
PSI lab
LCPLargest Contentful Paint — how long the biggest visible thing (usually the hero image) takes to appear. Slow LCP = shoppers think the site is broken.Goal: ≤ 2.5 sHow to act: preload the hero image, defer non-critical scripts, serve images in WebP at the right size.
2.31 s
no change vs prev
CrUX p75
CLSCumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.
0.170
no change vs prev
⚠ ΔCrUX (28d p75) and GA4 RUM (7d) diverge by 14pp on this metric. Possible cause: sampling bias, time-window difference, or bot contamination. Investigate before drawing conclusions.
CrUX p75
INPInteraction to Next Paint — how long the page takes to react when a shopper taps or clicks. Slow INP feels laggy.Goal: ≤ 200 msHow to act: break up long JavaScript tasks, defer third-party scripts, lazy-init heavy widgets (carousels, modals).
178 ms
no change vs prev
CrUX p75
TBTTotal Blocking Time — how long the main thread is frozen by heavy JavaScript during page load. Lab proxy for INP.Goal: ≤ 200 msHow to act: defer non-critical JS (add the defer attribute), code-split bundles, lazy-load below-fold scripts.
1458 ms
↓ 1486ms vs prev
PSI lab
FCPFirst Contentful Paint — how long until the shopper sees ANYTHING (often the header or page background).Goal: ≤ 1.8 sHow to act: reduce server response time, eliminate render-blocking CSS/JS in the head, use a CDN.
2.16 s
no change vs prev
CrUX p75
TTFBTime to First Byte — how long Shopify takes to respond after the shopper clicks a link.Goal: ≤ 800 msHow to act: minimize Shopify app overhead, cache where possible. Largely determined by Shopify's servers + apps installed.
472 ms
no change vs prev
CrUX p75

Trend over time — PSI Lab desktop

Performance score The overall 0–100 perf grade Google gives the page (weighted blend of all metrics below).Goal: 90+How to act: Caveat: swings ±5–10 points between runs. Trust trends, not single numbers.

Largest Contentful Paint (s) Largest Contentful Paint — how long the biggest visible thing (usually the hero image) takes to appear. Slow LCP = shoppers think the site is broken.Goal: ≤ 2.5 sHow to act: preload the hero image, defer non-critical scripts, serve images in WebP at the right size.

Total Blocking Time (ms) Total Blocking Time — how long the main thread is frozen by heavy JavaScript during page load. Lab proxy for INP.Goal: ≤ 200 msHow to act: defer non-critical JS (add the defer attribute), code-split bundles, lazy-load below-fold scripts.

Cumulative Layout Shift Cumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.

Real-shopper Core Web Vitals GA4 last 7 days · ≥75% good = PASS the CWV threshold

LCPLargest Contentful Paint — how long the biggest visible thing (usually the hero image) takes to appear. Slow LCP = shoppers think the site is broken.Goal: ≤ 2.5 sHow to act: preload the hero image, defer non-critical scripts, serve images in WebP at the right size.
79%
(N=22,719)
good · 22,719 events ✓ PASS
79% good · 9% NI · 6% poor
CLSCumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.
84%
(N=27,165)
good · 27,165 events ✓ PASS
84% good · 5% NI · 7% poor
INPInteraction to Next Paint — how long the page takes to react when a shopper taps or clicks. Slow INP feels laggy.Goal: ≤ 200 msHow to act: break up long JavaScript tasks, defer third-party scripts, lazy-init heavy widgets (carousels, modals).
83%
(N=13,953)
good · 13,953 events ✓ PASS
83% good · 6% NI · 3% poor
FCPFirst Contentful Paint — how long until the shopper sees ANYTHING (often the header or page background).Goal: ≤ 1.8 sHow to act: reduce server response time, eliminate render-blocking CSS/JS in the head, use a CDN.
78%
(N=18,887)
good · 18,887 events ✓ PASS
78% good · 9% NI · 7% poor
TTFBTime to First Byte — how long Shopify takes to respond after the shopper clicks a link.Goal: ≤ 800 msHow to act: minimize Shopify app overhead, cache where possible. Largely determined by Shopify's servers + apps installed.
79%
(N=17,349)
good · 17,349 events ✓ PASS
79% good · 10% NI · 4% poor

Top friction pages ≥50 pageviews · click any path to open in PSI

LCP — slow paint Largest Contentful Paint — how long the biggest visible thing (usually the hero image) takes to appear. Slow LCP = shoppers think the site is broken.Goal: ≤ 2.5 sHow to act: preload the hero image, defer non-critical scripts, serve images in WebP at the right size.

/
199 impact 12.5% poor N=1,596 · 199 poor PSI ↗
/pages/search-results-page
92 impact 5.0% poor N=1,832 · 92 poor PSI ↗
/cart
31 impact 11.2% poor N=278 · 31 poor PSI ↗

INP — slow interaction Interaction to Next Paint — how long the page takes to react when a shopper taps or clicks. Slow INP feels laggy.Goal: ≤ 200 msHow to act: break up long JavaScript tasks, defer third-party scripts, lazy-init heavy widgets (carousels, modals).

/
85 impact 9.1% poor N=939 · 85 poor PSI ↗
/pages/search-results-page
33 impact 2.7% poor N=1,229 · 33 poor PSI ↗
/cart
16 impact 14.3% poor N=112 · 16 poor PSI ↗
/pages/azta-urban-salon-service-menu
15 impact 2.9% poor N=526 · 15 poor PSI ↗
/pages/rewards
14 impact 5.6% poor N=248 · 14 poor PSI ↗

CLS — layout shift Cumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.

/
119 impact 4.1% poor N=2,891 · 119 poor PSI ↗
/pages/azta-urban-salon-service-menu
109 impact 11.1% poor N=984 · 109 poor PSI ↗
/cart
83 impact 27.5% poor N=302 · 83 poor PSI ↗

Top friction templates poor% × event volume · all pages of a given template type

LCP — by template

TemplateImpact% poorN eventsPoor count
product3566.7%5,332357
article30112.1%2,485301
index19912.5%1,596199
page985.0%1,96198
collection704.6%1,52470
cart3111.2%27831
page.salon-menu-azta254.2%60025
collection.brand.davines-sis2514.5%17225
4042225.3%8722
collection.branded216.3%33221

INP — by template

TemplateImpact% poorN eventsPoor count
product1624.0%4,082162
index859.1%93985
page352.6%1,32235
article332.2%1,49633
collection333.0%1,10633
cart1614.3%11216
page.salon-menu-azta152.9%52615
page.rewards-main145.6%24814
page.hairmnlstudio-menu94.2%2139
collection.brand.specialoffers98.7%1039

CLS — by template

TemplateImpact% poorN eventsPoor count
article65318.7%3,486653
product3344.9%6,788334
index1194.1%2,891119
page.salon-menu-azta10911.1%984109
collection905.3%1,68890
cart8327.5%30283
page675.4%1,24367
4046045.1%13360
page.rewards-main4514.6%30845
page.hairmnlstudio-main3713.8%26837

Top INP attribution targets CSS selectors / elements causing slow taps

Attribution target (CSS selector / element)Poor INP count
(not set) — interaction during page load354
(not set) — interaction during page load58
#shopify-section-template--18636969443427__main>div.cart__template>div.wrapper.p8
div.flickity-slider>div.product__media.is-selected>div>div.lazy-image.mobile-zoo6
div.product__headline>div.product__title__wrapper>h1.product__title6
#shopify-section-footer3
#shopify-section-template--16528967270499__main>div.cart__template>div.wrapper.p3
article.grid__item.medium-up--two-thirds>div.blog__article>div.blog__article__co3
div.wrapper>div.header__desktop.header__desktop--split>div.header__desktop__bar_3
div.wrapper>div.static-banner-box>picture>img.static-banner-img3

JavaScript errors last 7 days

TypeMessageSourceCount
error(no message):0:014,430
rejectionCannot update a null/nonexistent service worker registration(unknown)5,338
rejectionFailed to update a ServiceWorker for scope ('https://www.hairmnl.com/') with script ('Unknown'): Not(unknown)4,722
rejectionLoad failed(unknown)2,068
errorScript error.:0:01,346
rejectionFailed to fetchat window2.fetch (https://www.hairmnl.com/cdn/shopifycloud/storefront/assets/sho1,204
rejectionreduce of empty array with no initial value@https://apps-bundles-cluster.makebecool.com/js/app.js:1:97018914
rejectionFailed to fetchat https://www.hairmnl.com/cdn/wpm/b7a919571w0b784b64p16d009bem0237e62em.js:1:72810
ReferenceErrorReferenceError: Can't find variable: _AutofillCallbackHandlerhttps://www.hairmnl.com/collections/kerastase-refill-bottles-pouches?utm_source=411
rejectionFailed to update a ServiceWorker for scope ('https://www.hairmnl.com/') with script ('Unknown'): The(unknown)341

vs April 26 baseline PSI mobile lab · cumulative project impact

MetricApr 26 baselineNowΔDirection
Score2629↑ +12%better
LCP (s)11.89.076↓ -23%better
TBT (ms)43403410↓ -21%better
CLS0.0430.015↓ -65%better
FCP (s)3.1402.255↓ -28%better
Speed Index (s)23.59.612↓ -59%better

Third-party weight by origin PSI mobile · top 8 origins over last 30 snapshots, latest table

OriginBytes% of total
Total transfer6157 KB100%
hairmnl.com2908 KB47.2%
Shopify CDN929 KB15.1%
Google Tag Manager798 KB13.0%
LoyaltyLion337 KB5.5%
edge.personalizer.io192 KB3.1%
Klaviyo177 KB2.9%
searchanise-ef84.kxcdn.com127 KB2.1%
app.octaneai.com110 KB1.8%
maxcdn.bootstrapcdn.com95 KB1.5%
judgeme-public-images.imgix.net75 KB1.2%
cdn.bogos.io54 KB0.9%
analytics.tiktok.com46 KB0.7%
satcb.azureedge.net38 KB0.6%
tgtag.io37 KB0.6%
bat.bing.com36 KB0.6%

INP + CLS Scorecard — Week-over-Week Week-over-week — % of events meeting Google's 'good' threshold this week vs the prior 7 days.Goal: ≥ 75% good (Google's CWV pass threshold for SEO). Aim for steady or rising; sudden drops mean a regression.How to act: investigate the most recent deploy or app update; check the Top Friction Pages section for affected URLs; verify with 7+ days of post-fix data before declaring victory. GA4 RUM · this week vs previous 7 days · click tabs to compare

INP — Week-over-WeekInteraction to Next Paint — how long the page takes to react when a shopper taps or clicks. Slow INP feels laggy.Goal: ≤ 200 msHow to act: break up long JavaScript tasks, defer third-party scripts, lazy-init heavy widgets (carousels, modals).

83%
good · 13,953 events ✓ PASS
↑ +2.2 pp vs prev 7d
83% good · 6% NI · 3% poor
Prev 7d (5,346 events)
80% good · 12% NI · 7% poor

CLS — Week-over-WeekCumulative Layout Shift — how much page content jumps around as it loads (a button moving just as you tap it).Goal: ≤ 0.10How to act: set width + height on every image, reserve space for ads/embeds, never inject content above existing elements.

84%
good · 27,165 events ✓ PASS
↓ -5.9 pp vs prev 7d
84% good · 5% NI · 7% poor
Prev 7d (16,553 events)
90% good · 5% NI · 5% poor
90-day targets (end of Q3 2026)
INP: ≤200 ms p75 · ≥75% good
CLS: ≤0.10 p75 · ≥75% good (mobile from ~0.30 → <0.10)
Threshold: ≥75% good = CWV PASS (Google Search ranking signal). Current sprint: mobile CLS p75 from ~0.30 → <0.10 via layout-shift fixes.