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

CategoryMobile ScoreDesktop ScoreGrade
Performance31–54 (≈42)42🔴 Poor
Accessibility7171🟡 Needs Improvement
Best Practices88~85🟢 Good
SEO8585🟢 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").

MetricLatest (phone)8 wks agoThreshold (Good)Rating
LCP2,096 ms1,903 ms (Jul)≤ 2,500 ms🟢 Good
INP156 ms149 ms (Jul)≤ 200 ms🟢 Good
CLS0.010.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.

MetricMobile (lab)RatingDesktop (lab)Rating
FCP0.8 s🟢 Good0.8 s🟢 Good
LCP3.2 s🟡 Needs Improvement (1.28×)3.2 s🟡 Needs Improvement
TBT30 ms🟢 Good1 ms🟢 Good
CLS0.031🟢 Good0.034🟢 Good
SI3.2 s🟢 Good6.1 s🟡 Needs Improvement
Perf score31–54🔴 Poor42🔴 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

SeverityIssueEvidenceEst. SavingsFix
🔴 CriticalLCP hero image loading="lazy"34/117 lazy; LCP element lazyLCP 3.2 s → ~1.5 sAdd <link rel="preload" as="image"> for the hero; set hero fetchpriority="high"; remove lazy from above-fold hero
🔴 CriticalRender-blocking CSS (148 stylesheets)PSI "Render-blocking requests –100 ms" + 148 <link rel=stylesheet>~100–300 ms LCPBundle/critical-CSS; async non-critical; Shopify section CSS consolidation
🔴 HighUnoptimized/oversized images3,700–4,100 KiB savings flagged~0.5–1.0 s LCPServe AVIF/WebP srcset; size hero to viewport; Shopify CDN width= already used but sizes too large
🟡 Medium>4 preconnect originsPSI warning: "More than 4 preconnect connections"minorTrim to Shopify CDN + 1–2 critical third parties
🟡 MediumForced reflowsflickity, reputon-google-carousel-widget.jsminorDefer carousel init; batch DOM writes
🟡 MediumExcessive DOM size2,758 elements (homepage)TBT/main-threadLazy-mount below-fold sections
🟢 LowDuplicate JS modules / unused CSS & JSPSI diagnosticsminorTree-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 no alt attribute, 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 as alt="", 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

CheckStatusNote
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 the http:// og:image.
  • Heading structure: Broken (see §2.1). 🔴
  • Internal linking / breadcrumbs: No visible breadcrumb trail and no BreadcrumbList schema on any page. 🟡

3.3 Schema Markup (Structured Data)

Schema typeHomepageProductCollectionStatus
OrganizationMissing everywhere
WebSite (+SearchAction)Missing
Product⚠️ (bare)Present but no aggregateRating/review/sku/brand/mpn/gtin
BreadcrumbListMissing everywhere
LocalBusinessMissing (CIN, address, phone in footer but not structured)
Article (blog)Not verified

Critical schema gaps:

  1. No Organization / LocalBusiness schema — founder (Pruthvi Gowda), CIN U35999KA2020PTC138092, Bengaluru/Hyderabad addresses, phone, social sameAs are all unstructured.
  2. Product schema lacks aggregateRating and review despite 1,883 reviews shown on the homepage (4.4★) and per-product reviews — forfeits star-rating rich results in SERPs.
  3. 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_1 patterns). 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)

HeaderValueVerdict
HSTSmax-age=7889238 (~91 days)🟢 Present (could add includeSubDomains; preload)
X-Frame-OptionsDENY🟢
X-Content-Type-Optionsnosniff🟢
Content-Security-Policyblock-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests🟡 No script-src allowlist (permissive)
X-Download-Optionsnoopen🟢
X-XSS-Protection1; mode=block🟢 (legacy, harmless)
COOP / COEPabsent🟡 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:image http:// 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)

#IssueImpactEffort
1Remove loading="lazy" + add preload/fetchpriority=high to homepage hero LCP imageLCP 3.2 s → ~1.5 s; fixes URL-level CWV failLow (theme edit)
2Fix heading hierarchy: 1 <h1> + proper <h2>/<h3> (cards → h3, sections → h2)A11y + SEO outline; removes 14-h1 violationLow–Med (template)
3Add aggregateRating/review to Product JSON-LD (1,883 reviews exist)Star-rating rich resultsMed (app/theme)

🟡 Short-Term (This Month)

#IssueImpactEffort
4Bundle/defer 148 stylesheets; critical-CSS for above-foldLCP + render-blockingMed
5Serve AVIF/WebP srcset, right-size hero (saves ~4 MB)LCP, payloadMed
6Add Organization + LocalBusiness + WebSite/SearchAction + BreadcrumbList schemaRich results, entity clarityMed
7Add visible breadcrumb navigationUX + SEOLow–Med
8Fix http://https:// in og:imageMixed-content hygieneLow
9Fill empty/missing alt on content images (48 instances)A11y + image SEOMed (bulk)

🟢 Long-Term (This Quarter)

#IssueImpactEffort
10Trim >4 preconnect; defer third-party app JS (reputon, swiper, flickity, webmcp, hotjar)Main-thread/TBTMed
11Monitor LCP trend (rising 21% in 10 mo); set alert at 2.3 sPrevent CWV regressionLow
12Add COOP header; tighten CSP script-srcHardeningLow
13Lazy-mount below-fold sections to cut 2,758 DOM nodesTBTMed

Summary Score Card

CategoryScoreGrade
Performance (Mobile)~42 (range 31–54)🔴 Poor
Performance (Desktop)42🔴 Poor
Accessibility71🟡 Needs Improvement
Best Practices88🟢 Good
SEO85🟢 Good
Content Quality82🟢 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 contextbusiness-analysis.md (parent task t_add0e8ea): 94.3% phone, INR pricing, India-only, 30k+ families, CIN, founder.