Web Quality Audit: Gro Club (gro.club)
Website: https://gro.club | Date: 08 Sep 2026 | Platform: Shopify (D2C) | Industry: Kids' mobility & baby gear (circular "Smart Ownership") Business context: See business-analysis.md (parent task t_add0e8ea). 30,000+ families served; 94.3% of traffic is phone; INR pricing; India-only; festive campaign live.
Executive Summary
Gro Club sits on a fast, well-secured Shopify stack with solid Best Practices (88) and SEO (85) fundamentals, but its performance on mobile — the only device that matters here (94% of traffic) — is Poor (Lighthouse 31–54), driven by an oversized, lazy-loaded hero image and a CSS/JS-heavy theme (148 stylesheets, 133 scripts, 2,758 DOM nodes). Field data is healthier than lab: the origin-wide Core Web Vitals assessment is Passing on phones (LCP 2.10 s, INP 156 ms, CLS 0.01 — all Good), but the homepage URL specifically fails mobile CWV (field LCP 2.6 s = Needs Improvement), confirming the landing page is the weakest link.
The biggest SEO/structured-data gap is the near-total absence of JSON-LD: no Organization, WebSite, BreadcrumbList, or LocalBusiness anywhere, and Product pages emit Product schema without aggregateRating/review/sku/brand despite 1,883 on-site reviews. Accessibility is dragged down by a broken heading hierarchy (14 <h1> tags on the homepage, zero <h2>). Real product photography (no AI images) and strong trust signals are positives.
Scores
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 31–54 (≈42) | 42 | 🔴 Poor |
| Accessibility | 71 | 71 | 🟡 Needs Improvement |
| Best Practices | 88 | ~85 | 🟢 Good |
| SEO | 85 | 85 | 🟢 Good |
| Overall | — | — | 🟡 Needs Improvement |
Performance note: Mobile Lighthouse runs varied 31→54 across two captures (Lighthouse noise on this heavy theme); one throttled run spiked to LCP 19.5 s / TBT 1,820 ms, indicating the ceiling is catastrophic on mid-tier Android + slow 4G. Desktop LCP lab = 3.2 s (same as mobile), so performance is uniformly weak, not just a mobile issue.
1. Performance Audit
1.1 CrUX Real-World Field Data
Source: CrUX Vis (Chrome User Experience Report), origin https://gro.club, phone-form-factor. Latest period 2026-08-09 → 2026-09-05.
Core Web Vitals Assessment (origin, phone): Passing. All three metrics are "Good and stable" per CrUX Vis (headings: "Loading Performance is good and stable", "Interactivity is good and stable", "Visual Stability is good and stable").
| Metric | Latest (phone) | 8 wks ago | Threshold (Good) | Rating |
|---|---|---|---|---|
| LCP | 2,096 ms | 1,903 ms (Jul) | ≤ 2,500 ms | 🟢 Good |
| INP | 156 ms | 149 ms (Jul) | ≤ 200 ms | 🟢 Good |
| CLS | 0.01 | 0.00 (Jul) | ≤ 0.10 | 🟢 Good |
| FCP (context) | ~1.3 s (PSI field) | — | ≤ 1,800 ms | 🟢 Good |
| TTFB (context) | 0.4 s (PSI field) | — | ≤ 800 ms | 🟢 Good |
Trend warning: LCP has risen ~21% (363 ms) over 10 months (1,733 ms in Nov 2025 → 2,096 ms now) and is creeping toward the 2.5 s "Good" boundary. INP and CLS are flat/healthy. Desktop share is only 5.7%, so desktop field data is not separately material — the audience is effectively all-mobile.
URL-level nuance (important): PageSpeed Insights' "This URL" mobile field data shows LCP 2.6 s (Needs Improvement), which is why PSI labels the homepage's own Core Web Vitals Assessment "Failed". The origin passes; the homepage specifically does not. This is consistent with the lab LCP of 3.2 s below and points the fix squarely at the homepage hero.
1.2 Core Web Vitals (Lighthouse Lab Data)
Source: PageSpeed Insights UI (https://pagespeed.web.dev), Lighthouse 13.4.1, captured 2026-09-08.
| Metric | Mobile (lab) | Rating | Desktop (lab) | Rating |
|---|---|---|---|---|
| FCP | 0.8 s | 🟢 Good | 0.8 s | 🟢 Good |
| LCP | 3.2 s | 🟡 Needs Improvement (1.28×) | 3.2 s | 🟡 Needs Improvement |
| TBT | 30 ms | 🟢 Good | 1 ms | 🟢 Good |
| CLS | 0.031 | 🟢 Good | 0.034 | 🟢 Good |
| SI | 3.2 s | 🟢 Good | 6.1 s | 🟡 Needs Improvement |
| Perf score | 31–54 | 🔴 Poor | 42 | 🔴 Poor |
One throttled run produced LCP 19.5 s, TBT 1,820 ms, SI 15.6 s — an outlier but a real signal of worst-case collapse on constrained devices/networks.
1.3 LCP Root Cause (Mobile)
- Hero/banner LCP image is
loading="lazy". Of 117 images on the homepage, only 34 are lazy-loaded and 83 are eager — and the LCP element (the top hero banner) is among the lazy ones. This is a critical anti-pattern: the browser deprioritizes the very element that defines LCP. - Massive render-blocking CSS: the homepage loads 148 separate stylesheets plus 133 scripts. The initial render is blocked waiting on this CSS/JS waterfall before the LCP image is even discovered.
- Oversized images: "Improve image delivery" flags ~3,700–4,100 KiB of savable image weight; hero/banner and product images are served at large dimensions without modern formats implied.
1.4 Performance Issues by Impact
| Severity | Issue | Evidence | Est. Savings | Fix |
|---|---|---|---|---|
| 🔴 Critical | LCP hero image loading="lazy" | 34/117 lazy; LCP element lazy | LCP 3.2 s → ~1.5 s | Add <link rel="preload" as="image"> for the hero; set hero fetchpriority="high"; remove lazy from above-fold hero |
| 🔴 Critical | Render-blocking CSS (148 stylesheets) | PSI "Render-blocking requests –100 ms" + 148 <link rel=stylesheet> | ~100–300 ms LCP | Bundle/critical-CSS; async non-critical; Shopify section CSS consolidation |
| 🔴 High | Unoptimized/oversized images | 3,700–4,100 KiB savings flagged | ~0.5–1.0 s LCP | Serve AVIF/WebP srcset; size hero to viewport; Shopify CDN width= already used but sizes too large |
| 🟡 Medium | >4 preconnect origins | PSI warning: "More than 4 preconnect connections" | minor | Trim to Shopify CDN + 1–2 critical third parties |
| 🟡 Medium | Forced reflows | flickity, reputon-google-carousel-widget.js | minor | Defer carousel init; batch DOM writes |
| 🟡 Medium | Excessive DOM size | 2,758 elements (homepage) | TBT/main-thread | Lazy-mount below-fold sections |
| 🟢 Low | Duplicate JS modules / unused CSS & JS | PSI diagnostics | minor | Tree-shake; remove unused app bundles |
1.5 Resource Transfer Summary (illustrative from PSI)
- Images: largest single category; ~3.7–4.1 MB savable. Hero + product banners dominate.
- JS: 133 script tags (Shopify core + ~10+ third-party apps: reputon reviews, swiper, flickity, toastify, firebase-utils, webmcp, salesnotifier, apo-product-options, lb-upsell, hotjar). Heavy main-thread cost.
- CSS: 148 stylesheets — the dominant render-blocking cost.
2. Accessibility Audit
2.1 Critical Issues
- Broken heading hierarchy — 14
<h1>tags on the homepage. Source: logo text "Gro Club" (h1), section label "Best Sellers" (h1), and every Best-Seller product card title rendered as<h1>(Flyer 14T, Flyer X 14T, Warrior S 16T, … Discoverer X 27.5T). A page must have exactly one<h1>. - Zero
<h2>elements site-wide. Homepage, product page, and collection page all jump from<h1>straight to<h3>for every section ("Shop By Age", "Why Gro Club?", "Commonly Asked Questions", product sub-sections). Screen-reader users lose the document outline. - Cause: theme renders product-card and section titles at the wrong level. Fix in
theme.liquid/ section templates (cards →<h3>; sections →<h2>).
2.2 High Priority Issues
- 48 images missing meaningful alt text: 47
alt=""(empty) + 1 with noaltattribute, out of 117. Empty alt on content images (category banners, benefit icons, product imagery) hides them from screen readers and Google Images. Decorative icons are acceptable asalt="", but product/category banners need descriptive alt. - Lighthouse Accessibility = 71 confirms multiple additional a11y failures (contrast, names, roles) not enumerated here — run a full axe/Pa11y pass to enumerate.
2.3 Positive Findings
lang="en"set ✓ ·<meta name="viewport">present ✓ · "Skip to content" link present ✓ · self-referencing canonical ✓ · HTTPS enforced ✓.
3. SEO Audit
3.1 Technical SEO
| Check | Status | Note |
|---|---|---|
| robots.txt | 🟢 | Crawlable; Sitemap: declared; correctly disallows /cart, /checkout, /account, filter/sort traps |
| XML sitemap | 🟢 | Index + 5 sub-maps: products 61, collections 26, pages 24, blogs 77 (matches business analysis: ~60 SKUs, 26 collections) |
| Canonical | 🟢 | Self-referencing on homepage & product |
| HTTPS / mixed content | 🟡 | Enforced site-wide, but og:image uses http:// (homepage & product) — insecure reference; should be https:// |
| Mobile-friendly | 🟢 | Responsive, viewport set, content parity |
| URL structure | 🟢 | Clean Shopify slugs (/products/…, /collections/kids) |
| Indexation | 🟢 | No noindex on key templates observed |
3.2 On-Page SEO
- Title tags: Good and keyword-targeted — homepage "Gro Club | Upgrade as Kids Grow with Smart Ownership"; collection "Kids' Bicycles | Perfect for Ages 2 to 10 | Gro Club". ✓
- Meta descriptions: Present and well-written on homepage, collections, and products (not the usual Shopify gap). ✓
- OG / Twitter Card: Present on all templates (
og:title,og:description,og:image,og:url,og:type,twitter:card=summary_large_image,twitter:site=@mygroclub). ✓ — fix thehttp://og:image. - Heading structure: Broken (see §2.1). 🔴
- Internal linking / breadcrumbs: No visible breadcrumb trail and no
BreadcrumbListschema on any page. 🟡
3.3 Schema Markup (Structured Data)
| Schema type | Homepage | Product | Collection | Status |
|---|---|---|---|---|
| Organization | ❌ | ❌ | ❌ | Missing everywhere |
| WebSite (+SearchAction) | ❌ | ❌ | ❌ | Missing |
| Product | ❌ | ⚠️ (bare) | ❌ | Present but no aggregateRating/review/sku/brand/mpn/gtin |
| BreadcrumbList | ❌ | ❌ | ❌ | Missing everywhere |
| LocalBusiness | ❌ | ❌ | ❌ | Missing (CIN, address, phone in footer but not structured) |
| Article (blog) | — | — | — | Not verified |
Critical schema gaps:
- No Organization / LocalBusiness schema — founder (Pruthvi Gowda), CIN
U35999KA2020PTC138092, Bengaluru/Hyderabad addresses, phone, socialsameAsare all unstructured. - Product schema lacks
aggregateRatingandreviewdespite 1,883 reviews shown on the homepage (4.4★) and per-product reviews — forfeits star-rating rich results in SERPs. - No BreadcrumbList — loses SERP breadcrumb rich results and wayfinding signals.
3.4 Content Quality (E-E-A-T)
- Trust signals: strong. Phone (+91 95136 31850) in announcement bar, WhatsApp connect, support email, 1,883 reviews @ 4.4★ (Reputon widget), FAQ section, warranty/delivery info, "Proudly Made in India", CIN in footer.
- Imagery: Real product/lifestyle photography; no AI-generated image signatures (no
Gemini_Generated,ChatGPT_Image,picsart-aiimageenhancer,ai0_,unnamed_1patterns). For a manufacturing/D2C brand this is appropriate — no artisan-authenticity mismatch. - Content depth: Blog active (77 posts in sitemap); collections carry descriptive copy. Good.
4. International SEO
Not applicable. Single locale (content-language: en-IN, lang="en", India-only). No hreflang is correct here — adding it would be wrong. No action needed beyond maintaining en-IN.
5. Best Practices & Security
5.1 Security Headers (from curl -sI https://gro.club)
| Header | Value | Verdict |
|---|---|---|
| HSTS | max-age=7889238 (~91 days) | 🟢 Present (could add includeSubDomains; preload) |
| X-Frame-Options | DENY | 🟢 |
| X-Content-Type-Options | nosniff | 🟢 |
| Content-Security-Policy | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests | 🟡 No script-src allowlist (permissive) |
| X-Download-Options | noopen | 🟢 |
| X-XSS-Protection | 1; mode=block | 🟢 (legacy, harmless) |
| COOP / COEP | absent | 🟡 Missing (nice-to-have) |
Best Practices score: 85–92 (Good). Cloudflare + Shopify front end is well hardened. Only nit: insecure http:// og:image references (mixed-content risk) and absent COOP.
5.2 Modern Standards
- Valid HTML5, UTF-8 declared, no
document.write, no mixed content on the page itself (the og:imagehttp://is metadata only). Source maps may be exposed but not a security risk. 🟢
6. Content Quality Assessment
6.1 Image Quality & Authenticity
Real photography throughout; zero AI-generated signatures. Hero/banner and product images are high-resolution but oversized for mobile (the core perf problem, §1.4), not a brand-authenticity problem.
6.2 UX Issues
- No breadcrumb navigation anywhere (visual or schema) — weakens wayfinding on deep product/collection pages.
- Heading outline broken (§2.1) — also a UX/scanning problem, not just a11y.
- Cart/checkout not audited here (separate CRO task); robots correctly hides it from crawl.
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Remove loading="lazy" + add preload/fetchpriority=high to homepage hero LCP image | LCP 3.2 s → ~1.5 s; fixes URL-level CWV fail | Low (theme edit) |
| 2 | Fix heading hierarchy: 1 <h1> + proper <h2>/<h3> (cards → h3, sections → h2) | A11y + SEO outline; removes 14-h1 violation | Low–Med (template) |
| 3 | Add aggregateRating/review to Product JSON-LD (1,883 reviews exist) | Star-rating rich results | Med (app/theme) |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 4 | Bundle/defer 148 stylesheets; critical-CSS for above-fold | LCP + render-blocking | Med |
| 5 | Serve AVIF/WebP srcset, right-size hero (saves ~4 MB) | LCP, payload | Med |
| 6 | Add Organization + LocalBusiness + WebSite/SearchAction + BreadcrumbList schema | Rich results, entity clarity | Med |
| 7 | Add visible breadcrumb navigation | UX + SEO | Low–Med |
| 8 | Fix http:// → https:// in og:image | Mixed-content hygiene | Low |
| 9 | Fill empty/missing alt on content images (48 instances) | A11y + image SEO | Med (bulk) |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 10 | Trim >4 preconnect; defer third-party app JS (reputon, swiper, flickity, webmcp, hotjar) | Main-thread/TBT | Med |
| 11 | Monitor LCP trend (rising 21% in 10 mo); set alert at 2.3 s | Prevent CWV regression | Low |
| 12 | Add COOP header; tighten CSP script-src | Hardening | Low |
| 13 | Lazy-mount below-fold sections to cut 2,758 DOM nodes | TBT | Med |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | ~42 (range 31–54) | 🔴 Poor |
| Performance (Desktop) | 42 | 🔴 Poor |
| Accessibility | 71 | 🟡 Needs Improvement |
| Best Practices | 88 | 🟢 Good |
| SEO | 85 | 🟢 Good |
| Content Quality | 82 | 🟢 Good |
| UX (breadcrumbs/headings) | 60 | 🟡 Needs Improvement |
| Overall | ~65 | 🟡 Needs Improvement |
Bottom line: The foundation is secure and crawlable, but for a 94%-mobile audience the homepage's lazy hero image + 148 stylesheets make mobile performance Poor in the lab (and push the homepage's own field LCP to Needs Improvement). Fixing the hero LCP and the heading/schema structure are the highest-ROI moves.
Sources & Citations
- CrUX Vis (https://cruxvis.withgoogle.com/#/) — origin phone field CWV 2026-08-09→09-05: LCP 2,096 ms, INP 156 ms, CLS 0.01; full 44-week series in
crux_form_factors.txt(parent deliverable). - PageSpeed Insights UI (https://pagespeed.web.dev/) — Lighthouse 13.4.1 mobile + desktop lab scores & metrics, captured 2026-09-08 (PSI API returned HTTP 429 quota-exceeded, so browser UI was used per the skill fallback).
- Live DOM inspection (browser, https://gro.club and sub-pages) — meta tags, 14
<h1>/0<h2>, 117 images (48 empty/missing alt), 148 stylesheets, 133 scripts, 2,758 DOM nodes, JSON-LD inventory,loading="lazy"hero,http://og:image. - HTTP headers (
curl -sI https://gro.club) — HSTS, CSP, X-Frame-Options, etc. - robots.txt & sitemap (
curl) — crawl rules; sitemap counts (products 61 / collections 26 / pages 24 / blogs 77). - Business context —
business-analysis.md(parent task t_add0e8ea): 94.3% phone, INR pricing, India-only, 30k+ families, CIN, founder.