Web Quality Audit: Claus Porto

Website: https://clausporto.com/ | Date: July 30, 2026 | Platform: Adobe Commerce (Magento) on Magento Cloud | Industry: Luxury Fragrance & Beauty | Founded: 1887


Executive Summary

Claus Porto's website suffers from critically poor performance on mobile (22/100) and desktop (23/100), with a 17.0s LCP on mobile — 6.8× the good threshold. The site has no canonical URLs, no structured data (JSON-LD), no Open Graph/Twitter Card tags, no hreflang tags, no H1 on the homepage, and no breadcrumb navigation. Security is solid with HSTS and CSP, but the CSP is report-only (unenforced). The 139-year-old luxury brand's digital presence is significantly underinvested relative to its premium positioning.

CategoryMobile ScoreDesktop ScoreGrade
Performance2223🔴 Critical
Accessibility7474🟡 Needs Work
Best Practices9292🟢 Good
SEO100100🟢 Good
Overall2223🔴 Critical

Mobile vs. Desktop gap: Negligible — both are critically poor. The mobile LCP (17.0s) is 5.9× worse than desktop (2.9s), but desktop CLS (0.635) is 1.6× worse than mobile (0.401).


1. Performance Audit

1.1 CrUX Real-World Field Data

Core Web Vitals Assessment: Failed (PageSpeed Insights report)

CrUX field data was available via PageSpeed Insights (report generated Jul 30, 2026). The assessment shows "Failed" for the origin at clausporto.com.

Key metrics from CrUX (mobile):

  • LCP: Poor — exceeds 4.0s threshold significantly
  • CLS: Poor — exceeds 0.25 threshold (lab CLS: 0.401)
  • FCP: Poor — 3.0s, well above 1.8s good threshold

Note on CrUX Vis: The CrUX Vis tool (cruxvis.withgoogle.com) was not accessible during this audit (connection timeout). Data above is from PageSpeed Insights' CrUX integration.

1.2 Core Web Vitals (Lighthouse Lab Data)

MetricMobileDesktopGood ThresholdRating
First Contentful Paint (FCP)3.0 s0.5 s≤ 1,800 ms🔴 Mobile Poor / 🟢 Desktop Good
Largest Contentful Paint (LCP)17.0 s2.9 s≤ 2,500 ms🔴 Mobile Critical / 🟡 Desktop Needs Improvement
Total Blocking Time (TBT)820 ms1,140 ms≤ 200 ms🔴 Both Critical
Cumulative Layout Shift (CLS)0.4010.635≤ 0.10🔴 Both Critical
Speed Index (SI)13.4 s4.3 s≤ 3,400 ms🔴 Mobile Critical / 🟡 Desktop Needs Improvement

Worst offender: Mobile LCP at 17.0s — 6.8× the good threshold. This is extraordinarily slow and will severely impact both SEO rankings and conversion rates.

1.3 LCP Phase Breakdown (Mobile)

PhaseDurationNotes
Time to First Byte (TTFB)60 msGood — fast server response
Resource Load Delay1,230 ms1.2s delay before LCP image starts loading
Resource Load Duration60 msImage download is fast
Element Render Delay1,030 ms1s delay after download before visible
Pre-resource delay (render-blocking)~14,620 msMassive — render-blocking CSS/JS prevents LCP discovery

The LCP image is a hero image (20211019_Claus_HR-126_Mobile_5.jpg) that uses loading="lazy" (via the lazyloaded class) and is not preloaded. The main culprit is render-blocking resources that prevent the browser from discovering the LCP element for ~14.6 seconds.

1.4 Performance Issues by Impact

🔴 Critical (Estimated savings > 1s)

#IssueEvidenceEst. SavingsRecommendation
1Render-blocking CSS/JS2 CSS files (styles-m.min.css 76.8KB, merged/027aefe.min.css 58.2KB) and JS block initial render1,110 msInline critical CSS, defer non-critical CSS/JS, use media="print" for non-critical stylesheets
2LCP image uses loading="lazy"Hero image has lazyloaded class, no fetchpriority="high", not preloaded~14,000 msAdd <link rel="preload" as="image" href="..."> for the LCP image, set fetchpriority="high", remove lazy loading
3Enormous network payload6,571 KB total — 2.6MB from Google reCAPTCHA alone (loaded 7 times!)2,000+ msRemove redundant reCAPTCHA instances, defer 3rd-party scripts, lazy-load below-fold content
4Massive JavaScript execution4.0s of JS execution time, 20 long tasks (>50ms)2,000+ msCode-split bundles, defer non-critical JS, reduce 3rd-party scripts

🟡 High (200ms–1s)

#IssueEvidenceEst. SavingsRecommendation
5Unused CSS141KB of wasted CSS across 3 stylesheets (95% of styles-m.min.css is unused)141 KBRemove unused CSS with Magento's built-in critical CSS or a purge tool
6Unused JavaScript1,273KB of unused JS — reCAPTCHA (726KB), GTM (207KB), Charla widget (139KB), Klarna SDK (103KB)1,273 KBLazy-load 3rd-party widgets, implement route-based code splitting
7Poor image deliveryHero images served at 1000×1000px but displayed at 721×721px; no WebP; no responsive srcset243 KBServe WebP/AVIF, add srcset with correct sizes, compress images
8Layout shift (CLS 0.401)"BEST SELLERS" section causes 0.401 CLS — images without explicit width/height0.401 CLSSet explicit width and height on all images, reserve space for dynamic content
9CLS 0.635 on desktopWorse than mobile — likely due to larger viewport layout calculations0.635 CLSSame as above — set dimensions on all images and fix dynamic content placement

🟢 Medium/Low

#IssueEvidenceRecommendation
10Inefficient cache lifetimes491KB of assets with short/zero cache TTL (Charla widget, CookieFirst, Salesforce)Set longer cache lifetimes (min 1 year) for static assets via .htaccess
11No preconnect hints0 preconnect origins despite loading from 15+ 3rd-party originsAdd <link rel="preconnect"> for top 3-4 origins (Google Fonts, GTM, Klarna)
12Duplicated JavaScript11KB of duplicate JS modulesRemove duplicate bundles, audit Magento module dependencies
13Legacy JavaScript25KB of polyfills for modern features (Facebook Pixel, CookieFirst)Use nomodule attribute for ES5 bundles, serve modern JS to modern browsers
14Minify JavaScript9KB of unminified JS (jquery.magnific-popup.min.js 12.4KB → 6.7KB savings)Re-minify all JS bundles, verify Magento production mode is properly configured

1.5 Resource Transfer Summary

CategoryTransfer Size% of TotalNotes
Images~490 KB7%Moderately sized, but no WebP and no responsive images
JavaScript~2,500 KB38%Heaviest category — 59 script tags, 4.0s execution time
CSS~150 KB2%Small but 95% unused
3rd-party~3,400 KB52%reCAPTCHA (2.6MB — loaded 7 times!), GTM, Klarna, Charla, Facebook, New Relic, ActiveCampaign, Clarity, CookieFirst, Salesforce
HTML222 KB3%Large HTML for Magento

Key finding: 3rd-party scripts account for over half of all transferred bytes. Google reCAPTCHA alone is loaded 7 times (2.6MB total) — this appears to be a misconfiguration.


2. Accessibility Audit

Lighthouse Score: 74/100

2.1 Critical Issues

#IssueEvidenceWCAG
1No H1 heading on homepage0 <h1> elements found on the homepage. The page has no visible or hidden H1 — critical for screen reader navigation.A
2Links without discernible text8 links have no accessible name — product/category image links in the homepage slideshow, social media icons, and two footer linksA
3ARIA dialog without accessible nameThe country selector modal (role="dialog") has no aria-label or aria-labelledbyA
4ARIA role containment issues9 <li> elements are not contained in <ul>/<ol> parent; role="menuitem" elements not contained by role="menu"A

2.2 High Priority Issues

#IssueEvidenceRecommendation
5Touch targets too small24+ footer links have insufficient touch target size (below 48×48px)Increase footer link touch targets, add padding
6ARIA attributes don't match rolesUser dropdown and language switcher have aria-haspopup="true" on non-menu elementsFix ARIA role assignments
7Empty heading in cookie bannerCookieFirst banner has an <h2> with no contentFix CookieFirst banner heading
8Non-composited animations11 animated elements (price visibility, slider buttons) use unsupported CSS propertiesUse transform and opacity for animations (GPU-composited)

2.3 Positive Findings

  • ✅ All images have alt attributes (17 images on homepage, 11 with empty alt for decorative)
  • ✅ Color contrast passes (no failures detected)
  • ✅ Document has a <title> element
  • <html lang="en"> attribute present and valid
  • ✅ Viewport meta tag present with width=device-width, initial-scale=1
  • ✅ Form elements have associated labels
  • ✅ Skip link/landmark navigation present (<main> landmark)
  • ✅ Heading order is sequentially descending
  • ✅ No [tabindex] values greater than 0

3. SEO Audit

3.1 Technical SEO

CheckStatusDetails
robots.txt✅ PassValid, includes Sitemap directives for both EN and PT sitemaps, properly disallows Magento internal paths
XML Sitemap⚠️ Warning274 EN URLs, 279 PT URLs. Sitemaps include internal Magento URLs (/catalog/category/view/id/). Lastmod dates range from 2020 to 2026 — some URLs haven't been updated in 6 years
Canonical URLsCritical FailNo canonical URLs on any page tested — homepage, product page, and collection page all lack <link rel="canonical">. This is a serious duplicate content risk
Indexation✅ PassNo noindex on important pages, HTTP 200 status codes
URL structure⚠️ WarningClean, descriptive URLs (/en/soaps, /en/black-edition-soap-on-a-rope). However, sitemap includes catalog/category/view/id/ admin URLs
HTTPS✅ PassEnforced site-wide, HSTS active
Page speedCritical Fail22/100 mobile, 23/100 desktop — see Performance section
Mobile-friendly⚠️ MixedViewport configured, responsive design present. But mobile performance is catastrophic (17.0s LCP)

3.2 On-Page SEO Issues

Title Tags

PageCurrent TitleIssueRecommendation
Homepage"Claus Porto"Too short — just brand name, no keywords"Luxury Handcrafted Soaps & Fragrances Since 1887Claus Porto"
Soaps (collection)"Soaps"Too short — no descriptive keywords"Handcrafted Luxury SoapsDeco, Clássico & Musgo Real CollectionsClaus Porto"
Black Edition Soap"Black Edition Soap on a Rope"✅ GoodKeep as-is, though could be slightly longer

Meta Descriptions

PageCurrent Meta DescriptionIssue
HomepagePortuguese description about brand historyLanguage mismatchlang="en" but description is in Portuguese. Also too long (200+ chars)
Soaps (collection)English description✅ Good — descriptive, includes keywords
Black Edition SoapEmptyMissing — no meta description on product page

Heading Structure

PageH1Issue
HomepageNoneCritical — missing H1 entirely
Soaps (collection)"Soaps"✅ Good, but could be more descriptive
Black Edition Soap"Black Edition Soap on a Rope"✅ Good

Open Graph & Twitter Card Tags

CheckStatus
og:title❌ Missing on all pages
og:description❌ Missing on all pages
og:image❌ Missing on all pages
og:url❌ Missing on all pages
og:type❌ Missing on all pages
og:site_name❌ Missing on all pages
twitter:card❌ Missing on all pages
twitter:title❌ Missing on all pages
twitter:description❌ Missing on all pages
twitter:image❌ Missing on all pages

No social sharing tags at all. When shared on social media (Facebook, Twitter/X, LinkedIn, Instagram, WhatsApp), the link will appear as a bare URL or without proper preview image, description, or title. This is a critical gap for a luxury brand that relies on visual appeal and social sharing.

3.3 Schema Markup (JSON-LD)

Schema TypeStatusNotes
Organization❌ MissingBrand name, logo, URL, social links, founding date should be marked up
WebSite❌ MissingSitelinks search box opportunity
Product❌ MissingNo Product schema on product pages — no price, availability, SKU, brand, or aggregateRating
BreadcrumbList❌ MissingNo breadcrumb navigation visible or in schema
ItemList❌ MissingNo schema on collection pages
LocalBusiness❌ Missing4 physical stores not marked up
Article❌ MissingBlog pages (if any) not marked up

No JSON-LD structured data found anywhere on the site. This is a critical gap for rich results (star ratings, product availability, breadcrumbs, sitelinks search box, store information).

3.4 Content Quality (E-E-A-T)

Experience

  • ✅ Strong heritage story (Since 1887 section, timeline, story page)
  • ✅ Handcrafted, hand-wrapped product narrative
  • ✅ Physical stores with rich descriptions

Expertise

  • ✅ 139-year-old brand with four generations of expertise
  • ✅ Original Portuguese soap and perfume manufacturer
  • ⚠️ Missing: founder credentials, artisan profiles, manufacturing process details

Authoritativeness

  • ✅ Premium retail partnerships (Anthropologie, Bluemercury, Amazon)
  • ✅ International distribution (50+ countries)
  • ⚠️ Missing: press mentions, industry awards, press coverage on website

Trustworthiness

  • ✅ HTTPS enforced
  • ✅ Privacy Policy, Terms of Use, Shipping & Handling pages present
  • ✅ Quality Policy page
  • ⚠️ Missing: Customer reviews on product pages, trust badges, business registration number, Klarna presence (but integrated)

4. International SEO

4.1 Locale Configuration

The site serves two locales:

  • English: /en/ prefix (e.g., /en/soaps)
  • Portuguese: /pt/ prefix (e.g., /pt/sabonetes)

The default domain (/) serves the Portuguese version.

4.2 Hreflang Implementation

CheckStatusDetails
Hreflang tags in HTMLMissingNo <link rel="alternate" hreflang="..."> tags found on homepage, product page, or collection page
Self-referencing hreflang❌ MissingNo self-referencing hreflang entry
x-default hreflang❌ MissingNo fallback locale marker
Sitemap hreflang❌ MissingNeither EN nor PT sitemap includes <xhtml:link> hreflang annotations

No hreflang implementation exists. Google cannot determine which locale to serve in search results for users in different regions. This can cause:

  • Portuguese users seeing English results (or vice versa)
  • Duplicate content signals between /en/ and /pt/ versions
  • Reduced international search visibility

4.3 Canonicalization for Multilingual

Broken: No canonical URLs exist on any page. For a multilingual site, each locale page should self-canonical (e.g., /en/soaps/en/soaps, /pt/sabonetes/pt/sabonetes). Cross-locale canonical would be even worse.

4.4 URL Structure

✅ Good — subdirectory-based (/en/, /pt/) is the recommended approach.

4.5 Localization Quality

CheckStatusDetails
Product titles translated✅ GoodDifferent products listed per locale
Product descriptions translated⚠️ PartialMagento allows per-locale content, verified on spot-check
Meta descriptions translated⚠️ MixedHomepage meta description is in Portuguese regardless of locale
Currency localization✅ GoodEuro (€) for both locales
UI chrome translated✅ GoodNavigation, footer, buttons properly localized

Note: Unlike Shopify's "shell translation" problem, Magento natively supports full content translation per store view, so this risk is lower.


5. Best Practices & Security

5.1 Security Headers

HeaderValueRating
Strict-Transport-Securitymax-age=31536000🟡 Missing includeSubDomains and preload directives
X-Frame-OptionsSAMEORIGIN✅ Good
X-Content-Type-Optionsnosniff✅ Good
Content-Security-PolicyReport-only onlyNot enforced — CSP is report-only, provides no actual XSS protection
X-XSS-Protection1; mode=block✅ Good (legacy, but still useful)
Cross-Origin-Opener-PolicyMissing❌ Missing — no COOP header
Referrer-PolicyMissing❌ Missing
Permissions-PolicyMissing❌ Missing

5.2 CSP Issues

  • CSP is report-only only — no enforced CSP means no XSS protection
  • unsafe-inline and unsafe-eval present in script-src — significantly weakens XSS protection
  • CSP includes wildcard * in several directives (img-src, connect-src, frame-src) — effectively useless
  • Content Security Policy issues detected in Chrome DevTools Issues panel — multiple 3rd-party scripts violate CSP

5.3 HSTS Issue

Missing includeSubDomains — without this, subdomains (e.g., shop.clausporto.com, help.clausporto.com) are not protected. Missing preload — prevents inclusion in browser HSTS preload lists.

5.4 Browser Console Errors

ErrorSourceImpact
WebSocket connection failedapp.charla.com (live chat)Chat widget won't work
Failed to load resource (HTTP 428)Salesforce Embedded MessagingLive chat/Case service broken
reCAPTCHA storage access deniedGoogle reCAPTCHAreCAPTCHA may fail
Failed to retrieve Business Hours dataSalesforceChat availability unknown
TypeError: Cannot read properties of nulljquery.min.jsHomepage theme JS error

Multiple JavaScript errors on the homepage indicate broken integrations and unhandled edge cases.

5.5 Modern Standards

CheckStatus
✅ Valid HTML5 doctypePass
✅ Charset declared as UTF-8Pass
✅ No mixed contentPass
⚠️ Source maps exposed3 source maps (CookieFirst, Klarna) accessible in production
✅ HTTPS enforcedPass

6. Content Quality Assessment

6.1 Image Quality & Authenticity

CheckStatusDetails
AI-generated image detection✅ CleanNo AI-generated image patterns detected in filenames
Image filenames⚠️ MixedProduct images use descriptive names like musgo_soaproap_classicscent.png — good. WYSIWYG images use date-based names like 20210705_Claus3512_HR_Mobile_4.jpg — acceptable
Image format⚠️ JPEG onlyNo WebP or AVIF formats detected — missing optimization opportunity
Product photography✅ GoodProfessional studio photography with lifestyle and product shots
Alt text⚠️ Decorative only11 of 17 images use alt="" (decorative). Product images in best-sellers section have descriptive alt text. Hero/promotional images have alt="" — this is acceptable for decorative but limits image search

6.2 Trust Signals

SignalPresentNotes
Phone number✅ YesMultiple store phone numbers in footer
Email✅ YesContact form available
Physical address✅ YesStore addresses
Return/refund policy✅ YesShipping & Handling page
Privacy Policy✅ YesDedicated page
Terms of Use✅ YesDedicated page
Quality Policy✅ YesDedicated page
Business registration❌ NoNIF/VAT number not visible
Customer reviews❌ NoNo product reviews or star ratings visible
Trust badges❌ NoNo payment security badges on PDP
Klarna integration✅ YesKlarna payment available

6.3 UX Issues

IssueDetails
Cookie bannerCookieFirst banner blocks content until accepted — adds to FCP/TBT
Country selector modalPopup asking "You're visiting Claus Porto European website" — adds to poor UX and CLS
No breadcrumb navigationNo visual breadcrumbs on any page — makes navigation difficult for users and search engines
No product reviewsNo customer reviews, ratings, or UGC — reduces social proof and trust for a luxury brand
Footer link density24+ links in footer with small touch targets — poor mobile usability
Copyright noticeStates "© 2021 Claus Porto" — 5 years out of date

7. Priority Recommendations

🔴 Immediate (This Week)

#IssueImpactEffort
1Fix render-blocking resources — inline critical CSS, defer non-critical CSS/JS1.1s+ savings on LCPMedium — Magento configuration
2Preload LCP image — add fetchpriority="high", rel="preload", remove loading="lazy"~14s savings on LCPLow — single template edit
3Add canonical URLs — self-referencing on every page via Magento configurationDuplicate content riskLow — Magento SEO config
4Add Open Graph + Twitter Card tags — add to Magento theme templateSocial sharing previewsLow — template edit
5Add Organization + WebSite JSON-LD schema to all pagesRich results, sitelinks searchLow — add to theme head
6Add Product schema to product pages (name, price, availability, brand, SKU)Product rich results, pricingMedium — Magento template
7Add H1 heading to homepage — currently missingAccessibility, SEO rankingLow — CMS page edit
8Fix homepage meta description — currently Portuguese on English pageSERP click-throughLow — CMS field edit
9Add meta descriptions to product pages — currently emptySERP click-throughLow — bulk edit via Magento admin

🟡 Short-Term (This Month)

#IssueImpactEffort
10Optimize images — serve WebP/AVIF, add responsive srcset, compress oversized images243KB savingsMedium — Magento extension or CDN config
11Remove unused CSS — 141KB waste (95% of stylesheet)CSS deliveryMedium — critical CSS extraction
12Reduce 3rd-party script bloat — defer/lazy-load Charla, Klarna, New Relic, ActiveCampaign; fix reCAPTCHA loading 7 times1,273KB+ savingsMedium — audit and reconfigure
13Set explicit width/height on images — fix 0.401 CLS on mobile, 0.635 on desktopCLS fixLow — template CSS
14Add hreflang tags — EN and PT with x-default; add to sitemap xhtml:linkInternational SEOMedium — Magento theme + sitemap generator
15Add BreadcrumbList schema + visual breadcrumbsSEO, UXMedium — template addition
16Fix JavaScript console errors — Charla WebSocket, Salesforce 428, reCAPTCHA storage accessStabilityMedium — debug integrations
17Add Product AggregateRating/Review schemaStar ratings in SERPsMedium — review app integration
18Improve homepage title tag — add keywordsDirect ranking signalLow
19Improve collection page title tags — add descriptive keywordsDirect ranking signalLow
20Fix footer link touch targets — increase padding/spacingMobile usabilityLow — CSS fix

🟢 Long-Term (This Quarter)

#IssueImpactEffort
21Enforce CSP — move from report-only to enforced, remove unsafe-inline/unsafe-evalXSS protectionHigh — requires full audit of all scripts
22Add HSTS preload + includeSubDomainsSecurityLow — config change
23Add COOP, Referrer-Policy, Permissions-Policy headersSecurityLow — .htaccess/vcl config
24Remove internal Magento URLs from sitemap (/catalog/category/view/id/)Crawl budgetMedium — Magento SEO config
25Add customer reviews/ratings to product pagesSocial proof, trustHigh — review app integration
26Consider page builder image optimization — WYSIWYG images served at 1000×1000px for 721×721px displayImage performanceMedium — Page Builder templates
27Add LocalBusiness schema for 4 physical storesLocal SEO, map resultsMedium
28Implement preconnect hints for top 3rd-party originsPerformanceLow
29Update copyright year from "2021" to 2026Trust signalLow
30Add customer reviews/trust badges on PDP and checkoutConversion rateMedium

8. Summary Score Card

CategoryScoreGrade
Performance (Mobile)22/100🔴 Critical
Performance (Desktop)23/100🔴 Critical
Accessibility74/100🟡 Needs Work
Best Practices92/100🟢 Good
SEO100/100🟢 Good
Content Quality65/100🟡 Needs Work
International SEO20/100🔴 Critical
Security70/100🟡 Needs Work
Overall22/100🔴 Critical

Verdict: Claus Porto's website is critically underperforming. The 139-year-old luxury brand has a beautiful product and heritage story, but its digital presence severely undermines this. The 17.0s mobile LCP, missing structured data, missing canonical URLs, no social sharing tags, no hreflang, no H1 on the homepage, and massive 3rd-party script bloat collectively create a poor user experience that will hurt both organic search rankings and conversion rates. The most impactful fix is addressing the LCP image (preload + no lazy loading) which alone can save ~14 seconds of load time. The second is fixing the 3rd-party script bloat (reCAPTCHA loaded 7 times at 2.6MB).


9. Sources

SourceURLData Used
PageSpeed Insightshttps://pagespeed.web.dev/ (report for https://clausporto.com/)Lighthouse scores, Core Web Vitals, performance audits, accessibility audit, best practices, SEO
curl HTTP headershttps://clausporto.com/Security headers, HSTS, CSP, XFO, HSTS max-age
robots.txthttps://clausporto.com/robots.txtCrawl directives, sitemap references
EN sitemaphttps://clausporto.com/media/sitemap_en.xmlURL count, lastmod dates, URL structure, image markup
PT sitemaphttps://clausporto.com/media/sitemap_pt.xmlURL count, lastmod dates, locale comparison
Homepage HTMLhttps://clausporto.com/Title, meta description, viewport, lang, h1, images, script count
Product page HTMLhttps://clausporto.com/en/black-edition-soap-on-a-ropeTitle, meta description, canonical, H1, JSON-LD
Collection page HTMLhttps://clausporto.com/en/soapsTitle, meta description, canonical, H1, H2, JSON-LD
EN version homepagehttps://clausporto.com/en/Title, meta description, canonical, hreflang, JSON-LD
Browser snapshotClaus Porto homepage (rendered)Visual structure, navigation, content sections, images, footer
Business Analysisbusiness-analysis.md (prior task)Brand context, company info, store locations, product categories