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.
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 70 | 90 | 🟡🟢 |
| Accessibility | 83 | 83 | 🟡 |
| Best Practices | 92 | 96 | 🟢 |
| SEO | 100 | 100 | 🟢 |
| Overall | 81 | 92 | 🟡🟢 |
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)
| Metric | Latest 28-day (2026-06-28 — 2026-07-25) | Status | Trend |
|---|---|---|---|
| LCP | 2,850 ms | 🟡 Needs Improvement | Improving |
| INP | 121 ms | 🟢 Good | Improving |
| CLS | 0.13 | 🟡 Needs Improvement | Regressing |
Desktop (Origin): PASSED
| Metric | Latest 28-day | Status |
|---|---|---|
| LCP | 2.0 s | 🟢 Good |
| INP | 63 ms | 🟢 Good |
| CLS | 0.04 | 🟢 Good |
| FCP | 1.8 s | 🟡 Borderline |
| TTFB | 1.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
| Metric | Mobile | Desktop | Good Threshold |
|---|---|---|---|
| FCP | 2.6 s 🟡 | 0.6 s 🟢 | ≤ 1.8 s |
| LCP | 5.1 s 🔴 | 1.2 s 🟢 | ≤ 2.5 s |
| TBT | 120 ms 🟢 | 100 ms 🟢 | ≤ 200 ms |
| CLS | 0.116 🟡 | 0.056 🟢 | ≤ 0.10 |
| Speed Index | 4.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):
- 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
- 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):
- Forced reflow from JavaScript
- Evidence: PageSpeed Insights "Forced reflow" insight
- Recommendation: Avoid layout thrashing by batching DOM reads/writes
- Est. effort: Low
- Use efficient cache lifetimes — Est savings of 50 KiB
- Some static assets have short or no cache headers
- Recommendation: Set
Cache-Control: max-age=31536000on 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
altattributes 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 lowercaseen)- 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
| Check | Status | Detail |
|---|---|---|
| robots.txt | 🔴 MISSING | https://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 | 🔴 MISSING | https://circuitmess.com/sitemap.xml returns 404. Standard Shopify sitemap paths (sitemap_products_1.xml) also 404. No sitemap = poor discovery. |
| Canonical URLs | 🟡 Present | Self-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 | 🟢 Enforced | HSTS with max-age=31536000 |
| Mobile-friendly | 🟢 Yes | Responsive design, viewport configured |
| Page speed | 🔴 Poor mobile | See Performance section |
| Crawlability | 🔴 Impaired | Without 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
Carttitle 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:urlpresent - ✅
twitter:card=summary_large_image - ✅
twitter:domainpresent - ❓ 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/usesin(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
| Header | Value | Verdict |
|---|---|---|
| HSTS | max-age=31536000 | 🟢 Good (1 year, but missing includeSubDomains; preload) |
| X-Frame-Options | SAMEORIGIN | 🟢 Good |
| X-Content-Type-Options | nosniff | 🟢 Good |
| CSP | Comprehensive with strict-dynamic, base-uri 'self', frame-ancestors | 🟢 Excellent |
| Referrer-Policy | strict-origin-when-cross-origin | 🟢 Good |
| Permissions-Policy | Geolocation, picture-in-picture, fullscreen limited | 🟢 Good |
| X-XSS-Protection | 1; mode=block | 🟢 Good |
| X-Permitted-Cross-Domain-Policies | none | 🟢 Good |
| X-Download-Options | noopen | 🟢 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.comorcdn.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)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | robots.txt returns 404 — add a server-level route for /robots.txt with proper crawl directives | Critical — Google cannot crawl instructions | Low |
| 2 | sitemap.xml returns 404 — add a server-level route for /sitemap.xml with proper XML sitemap | Critical — poor content discovery | Low |
| 3 | Fix hreflang pointing to /robots.txt URLs — hreflang should point to actual content pages, not static files caught by the catch-all route | High — wrong hreflang signals | Low |
| 4 | Mobile LCP 5.1s — preload hero image, inline critical CSS, defer third-party scripts | High — direct ranking factor | Medium |
| 5 | CLS regressing — investigate layout shifts from dynamic content (sale banner, cookie banner, images without dimensions) | High — UX + Core Web Vital | Medium |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 6 | Image optimization — serve WebP/AVIF with responsive srcset (est. 841 KiB savings) | High — performance | Medium |
| 7 | Third-party script bloat — audit 15+ third-party scripts; lazy-load non-critical ones | High — performance | Medium |
| 8 | Meta description — ensure it's in the server-rendered HTML, not just client-side injected | Medium — SERP CTR | Low |
| 9 | Add WebSite+SearchAction schema — enables sitelinks search box in SERPs | Medium — SERP enhancement | Low |
| 10 | Add BreadcrumbList schema — improves SERP breadcrumb display | Medium — SERP enhancement | Low |
| 11 | Fix heading hierarchy — H6 headings for countdown timer should be div/span, not headings | Low — accessibility | Low |
| 12 | Localize product content for India — product titles/descriptions still in English on /in-en/ | Medium — UX for India users | High |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 13 | Add includeSubDomains; preload to HSTS | Low — security hardening | Low |
| 14 | Add Product schema (client-side injected) for rich results including star ratings | Medium — SERP CTR | Medium |
| 15 | Add physical address and business registration to footer | Low — trust signals | Low |
| 16 | Localize pricing to INR for the India storefront | Medium — UX | Medium |
| 17 | Consider server-side rendering (SSR) or static generation for critical pages to reduce SPA hydration overhead | High — all metrics | High |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | 70/100 | 🟡 |
| Performance (Desktop) | 90/100 | 🟢 |
| Accessibility | 83/100 | 🟡 |
| Best Practices | 92/100 | 🟢 |
| SEO | 100/100 | 🟢 |
| Content Quality | 85/100 | 🟢 |
| UX | 80/100 | 🟡 |
| Security | 95/100 | 🟢 |
| International SEO | 55/100 | 🔴 |
| Overall | 82/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.txtandhttps://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)