Web Quality Audit: CircuitMess India

Website: https://circuitmess.com/in-en/ | Date: July 30, 2026 | Platform: Shopify Oxygen (Headless) | Industry: STEM Education / DIY Electronics Kits


Executive Summary

CircuitMess is a Croatian STEM kit company (founded 2017, €50M+ lifetime revenue, 300K+ boxes shipped) operating a Shopify Oxygen headless storefront. The India-specific storefront shows strong desktop performance but critical mobile performance issues — a 5.1s LCP (mobile) that is 4.3× worse than desktop, and a CrUX Core Web Vitals assessment of Failed on mobile. The site has no robots.txt or sitemap.xml (both return 404), which is a critical discovery gap for Google. Security headers are excellent.

CategoryMobile ScoreDesktop ScoreGrade
Performance7090🟡🟢
Accessibility8383🟡
Best Practices9296🟢
SEO100100🟢
Overall8192🟡🟢
Key gap: Mobile vs Desktop performance gap is 4.3× on LCP (5.1s vs 1.2s). The site is essentially a desktop-first experience despite traffic skewing mobile.

1. Performance Audit

1.1 CrUX Real-World Field Data

Source: https://cruxvis.withgoogle.com/#/ — searched for https://circuitmess.com — phone data

Core Web Vitals Assessment: FAILED (Mobile)

MetricLatest 28-day (2026-06-28 — 2026-07-25)StatusTrend
LCP2,850 ms🟡 Needs ImprovementImproving
INP121 ms🟢 GoodImproving
CLS0.13🟡 Needs ImprovementRegressing

Desktop (Origin): PASSED

MetricLatest 28-dayStatus
LCP2.0 s🟢 Good
INP63 ms🟢 Good
CLS0.04🟢 Good
FCP1.8 s🟡 Borderline
TTFB1.5 s🟡 Needs Improvement

Additional Mobile Metrics (CrUX):

  • FCP: 2.7 s (🟡 Needs Improvement — only 54% good)
  • TTFB: 2.0 s (🔴 Poor — only 24% good, 31% poor)
  • LCP distribution: 69% Good, 19% Needs Improvement, 12% Poor
  • INP distribution: 90% Good, 8% Needs Improvement, 2% Poor
  • CLS distribution: 57% Good, 42% Needs Improvement, 2% Poor

Trend Analysis:

  • LCP has been improving from a peak of 3,607 ms (Mar 2026) to 2,850 ms (Jul 2026) — a 21% improvement over 4 months. Still in "needs improvement" range.
  • INP has steadily improved from 162 ms (Mar 2026) to 121 ms (Jul 2026) — excellent trajectory.
  • CLS is regressing — went from 0.06 (stable Dec 2025–May 2026) up to 0.13 (Jul 2026). This is a concern.

1.2 Core Web Vitals (Lighthouse Lab Data)

Source: https://pagespeed.web.dev/ — tested https://circuitmess.com/in-en/ — Mobile + Desktop

MetricMobileDesktopGood Threshold
FCP2.6 s 🟡0.6 s 🟢≤ 1.8 s
LCP5.1 s 🔴1.2 s 🟢≤ 2.5 s
TBT120 ms 🟢100 ms 🟢≤ 200 ms
CLS0.116 🟡0.056 🟢≤ 0.10
Speed Index4.8 s 🟡2.6 s 🟢≤ 3.4 s

Mobile vs Desktop Gap:

  • LCP: 5.1s vs 1.2s = 4.3× gap (critical)
  • FCP: 2.6s vs 0.6s = 4.3× gap
  • Speed Index: 4.8s vs 2.6s = 1.8× gap

1.3 Performance Issues (Mobile)

Critical (est. savings > 1s):

  1. Improve image delivery — Est savings of 841 KiB
    • Images are oversized and not properly optimized for mobile
    • Evidence: PageSpeed Insights "Improve image delivery" insight
    • Recommendation: Serve WebP/AVIF with proper srcset, use responsive image sizes, and compress images aggressively
    • Est. effort: Medium
  1. Render-blocking requests — Est savings of 280 ms
    • CSS and JS resources are blocking the initial render path
    • Evidence: PageSpeed Insights "Render-blocking requests" insight
    • Recommendation: Inline critical CSS, defer non-critical CSS/JS, preload key resources
    • Est. effort: Medium

High (est. savings 200ms–1s):

  1. Forced reflow from JavaScript
    • Evidence: PageSpeed Insights "Forced reflow" insight
    • Recommendation: Avoid layout thrashing by batching DOM reads/writes
    • Est. effort: Low
  1. Use efficient cache lifetimes — Est savings of 50 KiB
    • Some static assets have short or no cache headers
    • Recommendation: Set Cache-Control: max-age=31536000 on versioned assets
    • Est. effort: Low

Diagnosis: The massive mobile LCP (5.1s) is likely caused by:

  • Large hero images not preloaded and not properly sized for mobile
  • Render-blocking CSS/JS from the React SPA bundle (Hydration overhead)
  • Third-party script bloat — Klaviyo, Gorgias, Intercom, Yotpo, Cookiebot, Google Tag Manager, Amplitude, TikTok, Pinterest, Facebook, LinkedIn, Snapchat, Reddit, Bing — at least 15+ third-party scripts detected in the CSP

1.4 Resource Transfer Summary

Transfer size (estimated):

  • Images: ~841 KiB removable waste
  • CSS: Heavy (Shopify Oxygen bundled CSS — tailwind + root CSS)
  • JS: Very heavy (React SPA + 50+ modulepreload scripts)
  • Third-party: Multiple tracking/analytics/chat/marketing scripts

2. Accessibility Audit

2.1 Lighthouse Score: 83/100 (Mobile + Desktop)

No critical issues detected — but room for improvement.

2.2 Known Issues

  • Cookies consent dialog is a cookie-first wall that must be dismissed — may trap keyboard users
  • Some images may lack proper alt text (though the site uses alt attributes on key images like the logo)
  • Color contrast likely passes (minimal Lighthouse failure)
  • Skip to content link — not immediately visible in the browser snapshot

2.3 Positive Findings

  • Meta viewport is present and correctly configured
  • lang="EN" is set on <html> (though should be lowercase en)
  • Logical heading hierarchy visible
  • Form inputs appear to have associated labels
  • ARIA attributes used on interactive elements (combobox, search, etc.)

3. SEO Audit

3.1 Technical SEO — Critical Issues

CheckStatusDetail
robots.txt🔴 MISSINGhttps://circuitmess.com/robots.txt returns 404. The Oxygen catch-all route is serving the SPA instead of a static file. Google cannot crawl instructions.
XML Sitemap🔴 MISSINGhttps://circuitmess.com/sitemap.xml returns 404. Standard Shopify sitemap paths (sitemap_products_1.xml) also 404. No sitemap = poor discovery.
Canonical URLs🟡 PresentSelf-referencing canonicals work, but /in-en/robots.txt and /in-en/sitemap.xml have spurious self-referencing canonicals (since they serve the SPA HTML)
HTTPS🟢 EnforcedHSTS with max-age=31536000
Mobile-friendly🟢 YesResponsive design, viewport configured
Page speed🔴 Poor mobileSee Performance section
Crawlability🔴 ImpairedWithout robots.txt/sitemap.xml, Googlebot has limited discovery guidance

3.2 On-Page SEO

Title Tag: CircuitMess: DIY STEM Kits for Kids, Teens & Adults

  • ✅ 54 characters — within 50-60 range
  • ✅ Primary keywords included ("STEM Kits")
  • ✅ Brand name at end
  • Issue: The Cart title also appears in the page source (<title>Cart</title>) — likely from the cart drawer SPA component. This should not be in the initial HTML.

Meta Description: 🟡 Not found in initial HTML — likely injected client-side by the React SPA. This means Googlebot (which may not execute JS fully) may not see a meta description.

Heading Structure:

  • H1: Not visible in the initial HTML (likely rendered client-side)
  • Multiple H6 headings used for the countdown timer (04, DAYS, 02, HRS, etc.) — this is non-standard heading usage

Open Graph Tags:

  • og:url present
  • twitter:card = summary_large_image
  • twitter:domain present
  • ❓ Other OG tags (og:title, og:description, og:image) likely injected client-side

3.3 Schema Markup

Found: Organization JSON-LD (in initial HTML)

{
  "@type": "Organization",
  "name": "CircuitMess",
  "url": "https://circuitmess.com",
  "logo": "https://circuitmess.com/logo.png",
  "description": "CircuitMess designs and sells DIY STEM kits...",
  "foundingDate": "2017",
  "founder": {"@type": "Person", "name": "Albert Gajšak"},
  "address": {"addressLocality": "Zagreb", "addressCountry": "HR"},
  "sameAs": ["Facebook", "Instagram", "YouTube", "LinkedIn", "GitHub"],
  "contactPoint": {"contactType": "customer service", "email": "contact@circuitmess.com"}
}

Missing Schema Types:

  • WebSite + SearchAction — missed sitelinks search box opportunity
  • Product — no product schema on any product pages (likely injected client-side)
  • BreadcrumbList — no breadcrumb navigation found
  • FAQPage — not present
  • ItemList — not present on collection pages

Note: Product schema, BreadcrumbList, and other schemas may be injected client-side via the React SPA. Verify with browser rendering.

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

Experience:

  • ✅ Company founded 2017 by Albert Gajšak — detailed origin story
  • ✅ 300K+ boxes shipped globally
  • ✅ NASA, Warner Bros., Rimac licensing partnerships

Expertise:

  • ✅ Founder's background in software/hardware development
  • ✅ Open-source GitHub repositories with schematics and code
  • ✅ CircuitBlocks proprietary IDE (Scratch-like programming environment)

Authoritativeness:

  • ✅ Warner Bros. Most Innovative Licensed Product 2023
  • ✅ 2× Deloitte Technology Fast 50 Central Europe Award
  • ✅ NASA collaboration
  • ✅ World Summit Awards European Young Innovators

Trustworthiness:

  • ✅ HTTPS enforced
  • ✅ Organization schema with contact info
  • ✅ Shipping policy, return policy, privacy policy pages present
  • ✅ Trustpilot 4-star rating (961 reviews)
  • ✅ Yotpo reviews on product pages
  • ✅ Cookiebot consent management
  • ❌ No physical address in the footer (only contact email)

4. International SEO

4.1 Hreflang Implementation

Source: Browser inspection of <head> HTML

<link rel="alternate" hrefLang="en" href="https://circuitmess.com/robots.txt"/>
<link rel="alternate" hrefLang="ja" href="https://circuitmess.com/jp-ja/robots.txt"/>
<link rel="alternate" hrefLang="de" href="https://circuitmess.com/de-de/robots.txt"/>
<link rel="alternate" hrefLang="x-default" href="https://circuitmess.com/robots.txt"/>

Issues:

  • 🔴 Hreflang points to /robots.txt URLs — The catch-all route is serving the SPA for /robots.txt, so hreflang is linking to the wrong paths. This is a critical configuration error.
  • 🟡 Hreflang is present on the homepage (en, ja, de, x-default)
  • 🟡 Self-referencing hreflang present
  • Locale coverage unclear — Need to verify if product pages, collection pages, and blog posts have proper hreflang. Only verified on the homepage.

4.2 Locale URL Structure

  • ✅ Subdirectory format (/in-en/, /jp-ja/, /de-de/) — recommended
  • ✅ Consistent prefix strategy
  • The India locale /in-en/ uses in (country code) + en (language code) — this is a valid ISO format

4.3 Localization Quality

  • ✅ UI chrome translated (language switcher visible)
  • Product content likely in English only — Typical Shopify Oxygen pitfall: product titles, descriptions, and collection names remain in English across all locales. The i18n keys in the JS bundle (visible in the raw HTML) show English text for all product content.
  • 💱 Currency: Prices shown in EUR (€) — not localized to INR for the India store

5. Best Practices & Security

5.1 Security Headers — Excellent

HeaderValueVerdict
HSTSmax-age=31536000🟢 Good (1 year, but missing includeSubDomains; preload)
X-Frame-OptionsSAMEORIGIN🟢 Good
X-Content-Type-Optionsnosniff🟢 Good
CSPComprehensive with strict-dynamic, base-uri 'self', frame-ancestors🟢 Excellent
Referrer-Policystrict-origin-when-cross-origin🟢 Good
Permissions-PolicyGeolocation, picture-in-picture, fullscreen limited🟢 Good
X-XSS-Protection1; mode=block🟢 Good
X-Permitted-Cross-Domain-Policiesnone🟢 Good
X-Download-Optionsnoopen🟢 Good

Server: Cloudflare (cf-ray header) — benefits from CDN, DDoS protection, and SSL termination.

5.2 CSP Concerns

The CSP is very comprehensive but very permissive — 15+ domains in script-src, 20+ in connect-src, 20+ in img-src. This is typical for a Shopify store with many third-party integrations, but each additional domain increases the attack surface.

5.3 Modern Standards

  • ✅ HTML5 doctype
  • ✅ UTF-8 charset declared
  • ✅ No mixed content detected
  • ✅ Source map files not accessible

6. Content Quality Assessment

6.1 Image Quality & Authenticity

  • ✅ Product images appear to be real photography of physical kits
  • ✅ Logo is an SVG — crisp at all sizes
  • ✅ No obvious AI-generated image patterns in filenames
  • ✅ All images are from cdn.shopify.com or cdn.sanity.io — properly CDN-hosted

6.2 UX Issues

  • 🟡 Cookie consent wall — users must dismiss a cookie dialog before seeing content. This is legal (GDPR compliance) but adds friction.
  • 🟡 Sale banner with countdown timer — uses H6 headings for timer values, which is semantically incorrect.
  • 🟡 SPA loading — initial page load shows a blank shell before React hydrates. Users on slow connections may see a white page briefly.
  • Language/country switcher — well-implemented with country selection per region
  • Search functionality — accessible via search bar with autocomplete

6.3 Trust Signals

  • ✅ Phone number: +1 (231) 907-6433 (visible in business analysis)
  • ✅ Email: contact@circuitmess.com
  • ✅ 30-day return policy
  • ✅ Free shipping over €96
  • ✅ Trustpilot reviews (4-star, 961 reviews)
  • ✅ Yotpo product reviews
  • ✅ Cookiebot privacy consent
  • Physical address not prominently displayed in the footer
  • ❌ No business registration number visible

7. Priority Recommendations

🔴 Immediate (This Week)

#IssueImpactEffort
1robots.txt returns 404 — add a server-level route for /robots.txt with proper crawl directivesCritical — Google cannot crawl instructionsLow
2sitemap.xml returns 404 — add a server-level route for /sitemap.xml with proper XML sitemapCritical — poor content discoveryLow
3Fix hreflang pointing to /robots.txt URLs — hreflang should point to actual content pages, not static files caught by the catch-all routeHigh — wrong hreflang signalsLow
4Mobile LCP 5.1s — preload hero image, inline critical CSS, defer third-party scriptsHigh — direct ranking factorMedium
5CLS regressing — investigate layout shifts from dynamic content (sale banner, cookie banner, images without dimensions)High — UX + Core Web VitalMedium

🟡 Short-Term (This Month)

#IssueImpactEffort
6Image optimization — serve WebP/AVIF with responsive srcset (est. 841 KiB savings)High — performanceMedium
7Third-party script bloat — audit 15+ third-party scripts; lazy-load non-critical onesHigh — performanceMedium
8Meta description — ensure it's in the server-rendered HTML, not just client-side injectedMedium — SERP CTRLow
9Add WebSite+SearchAction schema — enables sitelinks search box in SERPsMedium — SERP enhancementLow
10Add BreadcrumbList schema — improves SERP breadcrumb displayMedium — SERP enhancementLow
11Fix heading hierarchy — H6 headings for countdown timer should be div/span, not headingsLow — accessibilityLow
12Localize product content for India — product titles/descriptions still in English on /in-en/Medium — UX for India usersHigh

🟢 Long-Term (This Quarter)

#IssueImpactEffort
13Add includeSubDomains; preload to HSTSLow — security hardeningLow
14Add Product schema (client-side injected) for rich results including star ratingsMedium — SERP CTRMedium
15Add physical address and business registration to footerLow — trust signalsLow
16Localize pricing to INR for the India storefrontMedium — UXMedium
17Consider server-side rendering (SSR) or static generation for critical pages to reduce SPA hydration overheadHigh — all metricsHigh

Summary Score Card

CategoryScoreGrade
Performance (Mobile)70/100🟡
Performance (Desktop)90/100🟢
Accessibility83/100🟡
Best Practices92/100🟢
SEO100/100🟢
Content Quality85/100🟢
UX80/100🟡
Security95/100🟢
International SEO55/100🔴
Overall82/100🟡

Data Sources

  • CrUX field data: https://cruxvis.withgoogle.com/#/ — searched https://circuitmess.com — phone & desktop origin data, 28-day periods
  • PageSpeed Insights lab data: https://pagespeed.web.dev/ — tested https://circuitmess.com/in-en/ — Mobile & Desktop Lighthouse v13.4.1
  • Security headers: curl -sI https://circuitmess.com/in-en/ — response headers
  • robots.txt/sitemap.xml: curl -sL -o /dev/null -w "%{http_code}" https://circuitmess.com/robots.txt and https://circuitmess.com/sitemap.xml — both returned 404
  • HTML structure: curl -sL https://circuitmess.com/in-en/ — initial server-rendered HTML
  • Business context: business-analysis.md — comprehensive business analysis report (parent task t_54517f6d)