Adding a Cache-Control header can significantly improve repeat-visit performance.
B
Third-Party Impact
53% third-party, 0 ms blocking
REVIEW
53% third-party, 0 ms blocking
Warning::
!
Third-party code accounts for 53% of page weight (2.4 MiB of 4.5 MiB)
Info::
✓
Third-party blocking time is low (0 ms)
47%
53%
First-party Third-party
C
Image Optimization
Action
75 images, 0 KB saveable
REVIEW
75 images, 0 KB saveable
Warning::
!
https://cdn-widget-assets.yotpo.com/static_assets/... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Hardw... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://cdn.shopify.com/s/files/1/0527/5051/6381/f... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Deck_... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://cdn-widget-assets.yotpo.com/static_assets/... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Wheel... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Cruis... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Beari... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Cloth... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/Nhs-Skat... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Compl... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://cdn.shopify.com/s/files/1/0527/5051/6381/f... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/files/IN_Truck... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://nhsskatedirect.com/cdn/shop/t/286/assets/d... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
Warning::
!
https://cdn-widget-assets.yotpo.com/static_assets/... is missing width/height — may cause layout shift
Set explicit width and height to prevent CLS.
75images1.2 MB
0oversized-0 KB
33legacy format
15missing dimensionsCLS risk
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
Set explicit width and height to prevent CLS.
Why this matters
Image without explicit width/height — browser can't reserve space; CLS jumps when image loads.
Source: web.dev / Core Web Vitals
C
Asset Compression
Action
4 of 7 asset hosts still on gzip
REVIEW
4 of 7 asset hosts still on gzip
Info::
✓
cdn.accentuate.io serves assets with brotli (assets: 19)
Got: cdn.accentuate.io (image/svg+xml)
Info::
✓
staticw2.yotpo.com serves assets with brotli (assets: 17)
Got: staticw2.yotpo.com (text/javascript)
Info::
✓
cdn.shopify.com serves assets with brotli (assets: 12)
Got: cdn.shopify.com (text/javascript)
Info::
i
cdn-widgetsrepository.yotpo.com serves assets with gzip; brotli would be ~20% smaller (assets: 8)
Every current browser accepts brotli. On a CDN this is a per-pull-zone toggle (Cloudflare, Fastly, CloudFront, CDN77, Bunny all expose it); on an origin it needs the brotli module (nginx-brotli, Apache mod_brotli). The saving lands on the assets this host serves, not on the HTML document -- the document's own encoding is reported separately.
cdn-widget-assets.yotpo.com serves assets with gzip; brotli would be ~20% smaller (assets: 4)
Every current browser accepts brotli. On a CDN this is a per-pull-zone toggle (Cloudflare, Fastly, CloudFront, CDN77, Bunny all expose it); on an origin it needs the brotli module (nginx-brotli, Apache mod_brotli). The saving lands on the assets this host serves, not on the HTML document -- the document's own encoding is reported separately.
cdn.attn.tv serves assets with gzip; brotli would be ~20% smaller (assets: 4)
Every current browser accepts brotli. On a CDN this is a per-pull-zone toggle (Cloudflare, Fastly, CloudFront, CDN77, Bunny all expose it); on an origin it needs the brotli module (nginx-brotli, Apache mod_brotli). The saving lands on the assets this host serves, not on the HTML document -- the document's own encoding is reported separately.
Got: cdn.attn.tv (application/javascript)
Info::
i
assets.findify.io serves assets with gzip; brotli would be ~20% smaller (assets: 3)
Every current browser accepts brotli. On a CDN this is a per-pull-zone toggle (Cloudflare, Fastly, CloudFront, CDN77, Bunny all expose it); on an origin it needs the brotli module (nginx-brotli, Apache mod_brotli). The saving lands on the assets this host serves, not on the HTML document -- the document's own encoding is reported separately.
Got: assets.findify.io (application/javascript)
B
Main HTML Cache-Control
No Cache-Control header on main HTML response
REVIEW
No Cache-Control header on main HTML response
Info::
i
Main HTML response has no Cache-Control header
Without an explicit Cache-Control, browsers fall back to heuristic caching (~10% of Last-Modified age). Set `Cache-Control: no-cache` or `max-age=300` for HTML to control freshness explicitly -- prevents stale auth state and SPA shell drift.
B
JavaScript Blocking
2 JS blocking issue(s) detected
REVIEW
2 JS blocking issue(s) detected
Warning::
!
5 render-blocking <script src> tag(s) without async/defer
Each `<script src=...>` without `async`, `defer`, or `type="module"` blocks HTML parsing while the browser fetches and executes it. The block lasts the entire round-trip + execution time -- on slow networks this translates directly into LCP delay. Add `defer` (executes after parse, in source order) for scripts that interact with the DOM, or `async` (executes whenever ready) for analytics / independent scripts. Module scripts (`type="module"`) are deferred by default.
Warning::
!
Total JS execution time is 8.6 s -- over the 3.5s budget
Total JavaScript execution (parse + compile + run) across all scripts exceeds 3.5 seconds. On low-end devices that becomes 7-15+ seconds and shows up directly in TBT and INP. Reduce by: tree-shaking unused dependencies, code-splitting (dynamic `import()`), removing or deferring third-party tracking, and replacing heavy frameworks where they're not needed.
Each `<link rel="stylesheet">` without a non-blocking `media` attribute holds up the first paint. Browsers download all of them before painting any content. Consolidate into 1-2 critical-path stylesheets; defer non-critical CSS via `<link rel="stylesheet" media="print" onload="this.media='all'">` or via the loadCSS pattern; inline above-the-fold CSS in `<style>` to short-circuit the request entirely.
Warning::
!
1 `@font-face` rule(s) without `font-display` -- causes FOIT
An `@font-face` rule without `font-display` causes Flash of Invisible Text (FOIT): the browser hides the styled text for up to 3 seconds while the custom font downloads, then either swaps to fallback (Chrome / Firefox) or stays invisible (older Safari). Add `font-display: swap` (shows fallback immediately, swaps in the custom font when ready) or `font-display: optional` (uses fallback if the font isn't ready in 100ms; never causes visible swap). Either eliminates FOIT outright.
A+
Text Compression
All text resources are compressed
PASS
All text resources are compressed
Info::
✓
All text resources are compressed
All text resources are properly compressed.
A+
Font Loading
7 fonts (150 KB)
PASS
7 fonts (150 KB)
Info::
i
7 font(s) use font-display: swap (FOUT risk but functional)
Web fonts
7
150 KB total
Render-blocking
0
of 7
Dominant font-display
swap
Most common across fonts
Font loading timeline
TransferFOIT (block)FOUT (swap)
S6uyw4BMUTPHjx4wXiWtFCc...woff2swap
Size14 KB
Load time38 ms
Start702 ms
RiskFOUT — text flashes from fallback to web font
S6u9w4BMUTPHh50XSwiPGQ3...woff2swap
Size13 KB
Load time31 ms
Start702 ms
RiskFOUT — text flashes from fallback to web font
EuclidCircularA-Bold-We...woffswap
Size20 KB
Load time32 ms
Start702 ms
RiskFOUT — text flashes from fallback to web font
Convert to woff2 for ~30% smaller file size
EuclidCircularA-Semibol...woffswap
Size21 KB
Load time40 ms
Start703 ms
RiskFOUT — text flashes from fallback to web font
Convert to woff2 for ~30% smaller file size
S6u8w4BMUTPHjxsAXC-qNiX...woff2swap
Size15 KB
Load time29 ms
Start703 ms
RiskFOUT — text flashes from fallback to web font
open-sans-v34-vietnames...woff2swap
Size56 KB
Load time94 ms
Start2.2 s
RiskFOUT — text flashes from fallback to web font
yotpo-widget-font.woffwoffswap
Size12 KB
Load time96 ms
Start2.2 s
RiskFOUT — text flashes from fallback to web font
Convert to woff2 for ~30% smaller file size
Optimization checklist
Preload critical fonts (priority=high)
Use woff2 format for all fonts
Set font-display to swap, optional, or fallback
Subset large fonts (≤100 KB each)
Fixing the unchecked items could save ~16 KB and ~32 ms
A+
Resource Caching
All resources properly cached
PASS
All resources properly cached
Info::
✓
No caching issues found
All static resources have appropriate caching headers.
A+
Critical Rendering Path
No render-blocking resources
PASS
No render-blocking resources
Info::
✓
No render-blocking resources detected
A+
Resource Hints
208 hints, 0 missing preconnects
PASS
208 hints, 0 missing preconnects
Info::
✓
Page uses 208 resource hint(s)
Current Resource Hints
preconnect
1
preload—
dns-prefetch
1
prefetch
+196
206
208 resource hints configured
A+
HTTP/3 (QUIC)
HTTP/3 advertised via Alt-Svc
PASS
HTTP/3 advertised via Alt-Svc
Info::
✓
HTTP/3 (QUIC) is supported
First-load mobile users on cellular networks see meaningful latency improvements with HTTP/3. The QUIC transport collapses TLS + TCP handshakes into one and recovers faster from packet loss.
A+
Document Compression
Document response uses brotli
PASS
Document response uses brotli
Info::
✓
Main HTML response uses brotli (Content-Encoding: br)
Brotli is the best text-compression algorithm for general use, ~20% smaller than gzip on average (40% on smaller files). Modern browsers all support it.
A+
LCP Image Preload
LCP preload audit not available
PASS
LCP preload audit not available
Info::
✓
LCP image preload audit not available for this scan
A+
Server-Timing Observability
18 Server-Timing entries advertised
PASS
18 Server-Timing entries advertised
Info::
✓
Server-Timing header advertises 18 timing entries
A+
Server Response Intelligence
2 server-response signal(s) detected
PASS
2 server-response signal(s) detected
Info::
✓
`Vary` header declared: accept-encoding
The page declares a `Vary` header, telling downstream caches which request headers the response varies on. Critical for content-negotiated responses (compression, language, cookies, device class).
Info::
✓
`ETag` present -- conditional GET supported
A+
Render-Blocking Resources
No render-blocking resources detected
PASS
No render-blocking resources detected
Info::
✓
No render-blocking resources detected in <head>
A+
Third-Party Resources
No third-party resources detected
PASS
No third-party resources detected
A+
Green Hosting
Whether the site is served from green-energy infrastructure
PASS
Green Hosting
This site is hosted on green energy infrastructure
Provider: Cloudflare
Network Waterfall
288 requests over 5343ms
INFO
HTML JavaScript CSS Images Fonts XHR/Fetch Other
Third-Party Script Cost
Per-script blocking time, transfer cost, and cache headers
INFO
45%of JavaScript execution is third-party
First-party Third-party3869ms · 1693KB · €20/mo
Script
Category
Execution
Transfer
Unused
Monthly Cost
Verdict
Google Tag Manager
www.googletagmanager.com
Tag Manager
572ms
196 KB
32%
€3/mo
Costly
staticw2.yotpo.com
staticw2.yotpo.com
Other
400ms
105 KB
69%
€2/mo
Costly
assets.findify.io
assets.findify.io
Other
382ms
29 KB
—
€2/mo
Costly
cdnapisec.kaltura.com
cdnapisec.kaltura.com
Other
375ms
410 KB
68%
€2/mo
Costly
cdn-widgetsrepository.yotpo.com
cdn-widgetsrepository.yotpo.com
Other
346ms
13 KB
—
€2/mo
Costly
cdn-swell-assets.yotpo.com
cdn-swell-assets.yotpo.com
Other
248ms
192 KB
80%
€1/mo
Costly
Google Tag Manager
www.googletagmanager.com
Tag Manager
243ms
146 KB
48%
€1/mo
Costly
cdn-widgetsrepository.yotpo.com
cdn-widgetsrepository.yotpo.com
Other
204ms
131 KB
46%
€1/mo
Costly
js.squarecdn.com
js.squarecdn.com
Other
172ms
140 KB
59%
€1/mo
Optional
cdn.attn.tv
cdn.attn.tv
Other
135ms
51 KB
60%
€1/mo
Optional
limits.minmaxify.com
limits.minmaxify.com
Other
129ms
10 KB
—
€1/mo
Optional
jsDelivr
cdn.jsdelivr.net
CDN
113ms
43 KB
—
€1/mo
Optional
cdn.gladly.com
cdn.gladly.com
Other
111ms
45 KB
72%
€1/mo
Optional
cdn-widgetsrepository.yotpo.com
cdn-widgetsrepository.yotpo.com
Other
111ms
16 KB
—
€1/mo
Optional
cdn-widgetsrepository.yotpo.com
cdn-widgetsrepository.yotpo.com
Other
93ms
22 KB
—
€0/mo
Optional
jsDelivr
cdn.jsdelivr.net
CDN
62ms
38 KB
—
€0/mo
Optional
cdn-widget-assets.yotpo.com
cdn-widget-assets.yotpo.com
Other
61ms
30 KB
75%
€0/mo
Optional
cdn.shopify.com
cdn.shopify.com
Other
56ms
15 KB
—
€0/mo
Optional
cdnbspa.spicegems.com
cdnbspa.spicegems.com
Other
55ms
59 KB
—
€0/mo
Optional
Google Tag Manager
Tag Manager
Costly
Execution572ms
Transfer196 KB
Unused32%
Monthly Cost€3/mo
staticw2.yotpo.com
Other
Costly
Execution400ms
Transfer105 KB
Unused69%
Monthly Cost€2/mo
assets.findify.io
Other
Costly
Execution382ms
Transfer29 KB
Monthly Cost€2/mo
cdnapisec.kaltura.com
Other
Costly
Execution375ms
Transfer410 KB
Unused68%
Monthly Cost€2/mo
cdn-widgetsrepository.yotpo.com
Other
Costly
Execution346ms
Transfer13 KB
Monthly Cost€2/mo
cdn-swell-assets.yotpo.com
Other
Costly
Execution248ms
Transfer192 KB
Unused80%
Monthly Cost€1/mo
Google Tag Manager
Tag Manager
Costly
Execution243ms
Transfer146 KB
Unused48%
Monthly Cost€1/mo
cdn-widgetsrepository.yotpo.com
Other
Costly
Execution204ms
Transfer131 KB
Unused46%
Monthly Cost€1/mo
js.squarecdn.com
Other
Optional
Execution172ms
Transfer140 KB
Unused59%
Monthly Cost€1/mo
cdn.attn.tv
Other
Optional
Execution135ms
Transfer51 KB
Unused60%
Monthly Cost€1/mo
limits.minmaxify.com
Other
Optional
Execution129ms
Transfer10 KB
Monthly Cost€1/mo
jsDelivr
CDN
Optional
Execution113ms
Transfer43 KB
Monthly Cost€1/mo
cdn.gladly.com
Other
Optional
Execution111ms
Transfer45 KB
Unused72%
Monthly Cost€1/mo
cdn-widgetsrepository.yotpo.com
Other
Optional
Execution111ms
Transfer16 KB
Monthly Cost€1/mo
cdn-widgetsrepository.yotpo.com
Other
Optional
Execution93ms
Transfer22 KB
Monthly Cost€0/mo
jsDelivr
CDN
Optional
Execution62ms
Transfer38 KB
Monthly Cost€0/mo
cdn-widget-assets.yotpo.com
Other
Optional
Execution61ms
Transfer30 KB
Unused75%
Monthly Cost€0/mo
cdn.shopify.com
Other
Optional
Execution56ms
Transfer15 KB
Monthly Cost€0/mo
cdnbspa.spicegems.com
Other
Optional
Execution55ms
Transfer59 KB
Monthly Cost€0/mo
These scripts may cost more than they're worth
Google Tag Manager adds 572ms and costs ~€3/month
staticw2.yotpo.com adds 400ms and costs ~€2/month
assets.findify.io adds 382ms and costs ~€2/month
cdnapisec.kaltura.com adds 375ms and costs ~€2/month
cdn-widgetsrepository.yotpo.com adds 346ms and costs ~€2/month
cdn-swell-assets.yotpo.com adds 248ms and costs ~€1/month
Google Tag Manager adds 243ms and costs ~€1/month
cdn-widgetsrepository.yotpo.com adds 204ms and costs ~€1/month
45% of JavaScript execution time comes from third-party scripts.
Why this matters
Third-party scripts (analytics, ads, social, A/B testing) often dominate execution time — every one is a perf-and-privacy tax.
Learn more ▾▴
Each third-party script is a black box: you don't control when it loads, what it executes, or how much it grows. They often account for a major share of total blocking time on average sites (HTTP Archive's Web Almanac documents the trend). Audit which ones you actually need, defer the rest, and use facade patterns (lite-youtube, lite-vimeo) for embedded media.
Source: web.dev / HTTP Archive Web Almanac
Google Tag Manager takes 572ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
staticw2.yotpo.com takes 400ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
69% of staticw2.yotpo.com's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.
Source: web.dev
assets.findify.io takes 382ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
cdnapisec.kaltura.com takes 375ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
68% of cdnapisec.kaltura.com's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.
Source: web.dev
cdn-widgetsrepository.yotpo.com takes 346ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
cdn-swell-assets.yotpo.com takes 248ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
80% of cdn-swell-assets.yotpo.com's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.
Source: web.dev
Google Tag Manager takes 243ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
cdn-widgetsrepository.yotpo.com takes 204ms of CPU time. Consider loading it asynchronously or replacing it with a lighter alternative.
Why this matters
This script has high main-thread execution time — optimize hot paths or defer.
Source: web.dev
59% of js.squarecdn.com's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.
Source: web.dev
60% of cdn.attn.tv's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.
Source: web.dev
72% of cdn.gladly.com's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.
Source: web.dev
75% of cdn-widget-assets.yotpo.com's code is unused. The script may be loading features you don't use.
Why this matters
Bundle has high unused-code ratio — tree-shaking and route-splitting recover the wasted bytes.