Web Quality Audit: Boldfit (boldfit.com)
Website: https://www.boldfit.com/ | Date: 03 Aug 2026 | Platform: Shopify (theme 141066502231) on Cloudflare | Industry: E-commerce — Fitness / D2C sports goods Test profile: Lighthouse 13.4.1 (PSI, Moto G Power / Slow 4G); CrUX Vis origin data; live curl + HTML inspection Business context: ~₹137–140Cr FY24 revenue, ~96% phone audience, Bessemer-backed value-positioned fitness D2C targeting ₹500Cr by FY26 (see business-analysis.md).
Executive Summary
Boldfit's site is functional and secure at the platform level but is held back by performance (mobile LCP) and Shopify-theme SEO gaps. It lands solid desktop performance (92) and acceptable accessibility (92/94) and best-practices (96) scores, but mobile performance scores just 74 with a 6.5s lab LCP (vs 1.9s on desktop — a 3.4× gap) driven by render-blocking CSS/JS and heavy hero images. Real-world CrUX shows mobile LCP "needs improvement & regressing" and rising INP, against a backdrop of 96% phone traffic where slow mobile load is not an edge case but the core user journey.
The biggest SEO finding is that every collection page — 194 of them — reuses the homepage's low-value meta description ("We've got all thee sports you need", with the misspelling "thee" hard-coded site-wide) and has no H1. Product pages carry the full weight of schema hygiene: the Product JSON-LD omits offers (price/availability/currency) entirely, so products are ineligible for price-rich results, and the brand name is inconsistent ("BoldFit" in schema vs "Boldfit" in Organization markup).
There is one broken image in the live RCB banner (mobile variant 404s) and a dead third-party checkout script (Shopflo) throwing console errors — real bugs hurting the brand's flagship sponsorship campaign pages.
Scores
| Category | Mobile | Desktop | Grade |
|---|---|---|---|
| Performance | 74 | 92 | 🟡 (mobile) / 🟢 (desktop) |
| Accessibility | 92 | 94 | 🟢 |
| Best Practices | 96 | 96 | 🟢 |
| SEO | 92 | 92 | 🟢 (schema/on-page gaps hide here) |
| Agentic Browsing | 2/3 | 2/3 | 🟡 |
| Overall | ~82 | ~93 | 🟡 |
Mobile is 18 points behind desktop on performance with a 3.4× LCP gap — significant for a ~96%-mobile store.
1. Performance Audit
1.1 CrUX Real-World Field Data
Source: Chrome UX Report via CrUX Vis, origin https://www.boldfit.com.
Core Web Vitals Assessment: Needs Improvement on mobile. LCP is Needs Improvement (~2.9s, threshold good ≤2.5s / poor >4s) and regressing. INP is borderline Needs Improvement (~200ms, threshold good ≤200ms) and regressing. CLS is Good and stable (~0.04, threshold ≤0.10).
| Metric | Good | Needs Imp. | Poor | CrUX 28d (mobile) | Rating |
|---|---|---|---|---|---|
| LCP | ≤2,500ms | 2,500–4,000ms | >4,000ms | ~2.7–3.0s (regressing) | 🟡 NI |
| INP | ≤200ms | 200–500ms | >500ms | ~200ms (regressing) | 🟡 borderline NI |
| CLS | ≤0.10 | 0.10–0.25 | >0.25 | ~0.02–0.04 | 🟢 Good |
Trend (28-week origin series, phone):
- LCP: ~2.5s (Oct 2025) → deteriorated to ~3.0s (May 2026), easing to ~2.7–2.9s (Jul 2026). Overall regressing since late 2025.
- INP: improved 193ms→165ms through early 2026, then climbed back to ~200ms in Jun–Jul (right at the good threshold, trending worse).
- CLS: strong improvement 0.18→0.00 through early 2026; recent mild rise to ~0.04 but still comfortably Good.
PageSpeed's this-URL 28-day field panel corroborates: LCP ~2.4s, INP ~294ms (Needs Improvement), CLS 0.02, FCP ~2.1s, TTFB ~1.3s.
1.2 Core Web Vitals (Lighthouse Lab Data)
| Metric | Mobile | Desktop | Rating (mobile) |
|---|---|---|---|
| FCP | 2.4s | 0.6s | 🟡 |
| LCP | 6.5s | 1.9s | 🔴 Poor |
| TBT | 0ms | 0ms | 🟢 |
| CLS | 0.001 | 0.003 | 🟢 |
| Speed Index | 2.4s | 0.7s | 🟢 |
Mobile is 3.4× slower than desktop on LCP (6.5s vs 1.9s). TBT and CLS are excellent — interaction responsiveness and visual stability are not the problem; loading is.
1.3 LCP Phase Breakdown (Mobile)
LCP element: hero slider image (div.hero__inner > a > div.media > img, a 1500×1832 PNG).
| Phase | Duration |
|---|---|
| Time to First Byte | 30ms |
| Resource load delay | 200ms |
| Resource load duration | 30ms |
| Element render delay | 200ms |
| Pre-resource delay (render-blocking CSS/JS) | ~6.0s |
The four labelled phases sum to only ~460ms of the 6.5s LCP — ~6s is pre-resource delay, i.e. render-blocking CSS and JS preventing the browser from even discovering the hero image. The hero image also carries loading="lazy" + fetchpriority="high" — contradictory signals that can further delay it. This is the single most important fix.
1.4 Performance Issues by Impact
Critical (>1s savings):
- Render-blocking requests — est. 1,050ms savings. Six first-party section CSS files (base.css 15.8KiB, section-header, section-announcement-bar, section-marquees, section-header-floating, swiper) block render, one for 750ms each in mobile lab. Worse, the theme loads jQuery 1.9.1 from Google's CDN (
ajax.googleapis.com) as a render-blocking resource — 1,200ms in mobile lab. Fix: inline critical CSS, defer non-critical CSS/JS, and remove or localize/defer jQuery (Shopify's Liquid + Vanilla themes don't need it). - LCP hero image lazy+high mismatch. The LCP
<img>hasloading="lazy"while alsofetchpriority="high". Fix: removeloading="lazy"from the hero/LCP image, keep priority, and convert hero to WebP/AVIF.
High (200ms–1s):
- Image delivery — est. 1,799KiB savings off 2,023.8KiB of first-party image bytes. Resistance Tube "Set of 11" ships 180KiB (could save 168KiB; 840×840 served for a 272×272 display slot). RCB hero PNGs and
Built_to_fly.png(1440×707 served for 1335×655) are oversized. Fix: WebP/AVIF conversion + tightersrcsetwidths. - Third-party bloat on load path. Shopify hosting 147KiB, Gokwik (COD) 82KiB, Google CDN jQuery 33KiB, SagePilot WhatsApp widget 10KiB. Gokwik merchant JS and SagePilot load early. Fix: defer non-Cart/checkout 3rd parties below the fold.
Medium:
- Inefficient cache lifetimes — est. 73KiB savings. Gokwik
kp-merchant-v2.js(68KiB) has a 1h TTL;merchant.integration.js10m; SagePilotwhatsapp-widget.js4h. These are long-lived static JS assets with very short cache TTLs. Fix: extend cache to ≥ 1 day. - Forced reflow — ~158ms total from JS DOM manipulation (theme sliders/tabs). Fix: batch DOM reads/writes in theme JS.
- Large DOM — 3,548 elements on homepage (recommendation: <1,500). Fix: prune unused sections/blocks.
1.5 Resource Transfer Summary
| Category | Est. transfer |
|---|---|
| First-party images | 2,023.8KiB (1,799KiB saveable) |
| Shopify hosting (JS/CSS) | 147KiB |
| Gokwik (COD) | 82KiB |
| Google CDN (jQuery) | 33KiB |
| SagePilot (WhatsApp) | 10KiB |
2. Accessibility Audit
Lighthouse Accessibility: Mobile 92 / Desktop 94. The theme has good fundamentals (viewport, lang, labelled form fields, visible focus) but fails 4 automated checks.
2.1 Critical Issues
None at security-blocking severity; all is fixable theme work.
2.2 High Priority Issues
- Elements use prohibited ARIA attributes. The custom
<hero-slider>element carriesaria-labelbut custom elements (unless they define a role) don't support recommended ARIA roles/names — the label is dropped by AT. Fix: add an explicitrole(e.g.role="region"/role="group") or move the accessible name to an associated text/aria-labelledbysource. - Links do not have a discernible name. Hero slide links (
<a class="hero__slide-link">) wrap an<img alt="">with no text — screen-reader users get unlabeled links. Fix: give hero images descriptive alt text or add an aria-label/sr-only text. - Heading elements not in sequentially-descending order. Homepage uses h2→h3 (no h1) with h3s stacking; "Choose options" is an
<h5>. Fix: enforce a single h1 and logical h1→h2→h3 nesting. - Accessibility tree not well-formed. Related to the above ARIA/link issues; fixing 1 & 2 resolves this.
2.3 Positive Findings
- All 310 homepage images have an
altattribute present (0 missing); 42 are empty (decorative). <html lang="en">correctly set.<meta name="viewport">present and correct.- Skip-to-content link present and working.
- Touch targets and focus states generally adequate in the theme.
3. SEO Audit
Lighthouse SEO: 92 (mobile & desktop). The obvious score is fine, but manual inspection reveals structural on-page and schema gaps that a Lighthouse crawl of one URL can't surface.
3.1 Technical SEO
| Check | Result |
|---|---|
| robots.txt | 🟢 Excellent — comprehensive: allows crawl, blocks /cart, /checkout, /orders, /account, filters/sort crawl-traps; declares Sitemap:; Shopify agentic/UCP instructions present |
| XML Sitemap | 🟢 sitemap.xml index → 509 products, 194 collections, 59 pages, 18+ blogs; all return 200 |
| Canonical URLs | 🟢 Self-referencing on home, product, collection, blog pages |
| Indexation / noindex | 🟢 No unwanted noindex detected |
| URL structure | 🟢 Clean, readable, hyphenated: /products/, /collections/, /blogs/bold-blogs/ |
| HTTPS | 🟢 Enforced with 301 from http://; HSTS present (but weak — see Security) |
| Mobile-friendly | 🟢 Responsive, viewport configured (critical given 95.9% phone traffic) |
No issue with crawlability or architecture — Boldfit's technical SEO foundation is genuinely good.
3.2 On-Page SEO Issues
- 🔴 Homepage title is just
Boldfit— no keywords, wastes the most valuable title tag on the domain. Fix: e.g. "Fitness & Gym Equipment, Yoga Mats, Sports Shoes | Boldfit" (≤60 chars). - 🔴 Collection pages re-use the homepage meta description verbatim. All 194 collections (men, yoga, home-gym, bestsellers, sports-shoes…) emit
<meta name="description" content="We've got all thee sports you need">. This is (a) duplicate/boilerplate for every collection and (b) contains a misspelling "thee". Collection descriptions are treated as auto-thin and CTR-squandered. Fix: unique meta description per collection (Shopify admin). - 🔴 No H1 on homepage OR any collection page (0
<h1>detected). Homepage jumps h2→h3; collections have no h1 at all. Hurts relevance and heading hierarchy. Fix: theme template — single keyword-h1 per collection ("Yoga Mats & Accessories" etc.) and an h1 on homepage. - 🟡 Homepage meta description is generic and irrelevant to a fitness store. It also repeats as the
og:description. - 🟡
twitter:imagemissing on homepage (card won't render an image on X). - 🟡
og:imageuses http:// scheme (content="http://...secure_urlis https, so most platforms pick the secure copy — low severity but sloppy). - 🟡
twitter:siteis malformed —@https://x.com/Boldfit_India?lang=en(mixes @ and full URL). - 🟨 Product titles are good ("Heavy Resistance Band – Boldfit"); H1 present on product pages; blog posts have H1 + Article schema. On-page works where the theme's default templates were set.
3.3 Schema Markup (JSON-LD)
Source: rendered HTML on home, product, collection, and blog pages.
| Type | Home | Product | Collection | Blog | Notes |
|---|---|---|---|---|---|
| Organization | ✅ | ✅ | ✅ | ✅ | sameAs has 3 empty strings in the array |
| WebSite | ✅ | ❌ | ❌ | ❌ | + SearchAction (sitelinks) present on home only |
| Product | — | ⚠️ | — | — | Missing offers entirely (see below) |
| BreadcrumbList | ❌ | ⚠️ | ❌ | ❌ | Visual breadcrumbs on product (11 mentions) but no BreadcrumbList JSON-LD detected |
| Article | — | — | — | ✅ | headless fine: headline, dates, author, image |
| ItemList | ❌ | — | ❌ | — | No product listing schema on collections |
Critical Product-schema findings (products):
- 🔴
offersobject is completely absent (noprice,priceCurrency,availability). Products cannot earn price/availability rich results — the most valuable SERP feature for a value-priced store where price is the #1 differentiator. - 🔴 Brand name inconsistent: Product schema
brand.name="BoldFit"(capital F) vsOrganization.name="Boldfit"— fragments the brand entity. - 🟡
skuis empty string on product JSON-LD. - 🟡 No
aggregateRating/review— Boldfit shows no star ratings in SERP despite being a heavy-reviews e-commerce brand. - ✅ Positive:
gtin(8906135450586) present; product IDs present.
Note (schema detection): structured data is verified in rendered DOM / raw HTML. Organization + WebSite + Product + Article JSON-LD confirmed; BreadcrumbList and ItemList are absent, which is not a tooling artifact.
3.4 Content Quality (E-E-A-T)
- Experience/Expertise: Strong real-world signals — founder Pallav Bihani (Forbes India 30 Under 30), athlete ambassadors (Manika Batra, KL Rahul, Sania Mirza, Arshdeep Singh), RCB/IPL partnership.
- Authoritativeness: Bessemer Series A, extensive media coverage. Blog (18 posts) covers informative queries (yoga-mat selection guides) with Article schema — good content depth.
- Trustworthiness: HTTPS, phone/email/address, return/shipping/privacy policies, GST-typed brand. Comprehensive trust infrastructure.
- Gap: Product descriptions are functional but generic boilerplate (AI-ish "Take your workouts to the next level…"), reused patterns across SKUs — dilute on-page differentiation for 509 nearly-identical-looking products.
4. International SEO
Not applicable — single-locale site (India), no hreflang, no alternate language URLs, html lang="en". content-language: en-IN and localization=IN cookie confirm India-only. No action required.
5. Best Practices & Security
Best Practices score: 96/96 (mobile/desktop). Strong baseline; failures are security-header depth.
5.1 Security Headers
| Header | Value | Verdict |
|---|---|---|
| HSTS | max-age=7889238 (≈91 days), no includeSubDomains, no preload | 🟡 Low max-age; missing directives |
| X-Frame-Options | DENY | 🟢 |
| X-Content-Type-Options | nosniff | 🟢 |
| CSP | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests — no script-src, no object-src | 🟡 High-severity gaps |
| COOP | Missing | 🟡 |
| X-XSS-Protection | 1; mode=block (deprecated; low value) | 🟡 |
| referrer/NEL/Reporting | report-to + nel present (Cloudflare) | 🟢 |
x-download-options | noopen | 🟢 |
Issues worth fixing (in order):
- 🟡 CSP missing
script-src— allows unsafe script execution if an injection occurs. Fix: addscript-src 'self' 'unsafe-inline' https://cdn.shopify.com https://pdp.gokwik.coetc. - 🟡 Missing
object-src 'none'— plugins could load. Add it. - 🟡 No COOP header — cross-origin isolation hardening missing. Add
Cross-Origin-Opener-Policy: same-origin. - 🟡 HSTS max-age 91 days too low (+ no includeSubDomains/preload). Bump to
max-age=31536000; includeSubDomains; preload. - 🟡 No Trusted Types directive in CSP (defence-in-depth against DOM XSS).
5.2 Broken Resources (Console Findings)
Lighthouse console captured three real load failures:
- 🔴
RCB-flat_300_-hb-m.pngreturns 404 (confirmed live — mobile RCB-banner variant missing while desktop-d.pngreturns 200). Broken image on a flagship sponsorship banner on a ~96%-mobile site. - 🔴
cloudfront.net/shopflo.bundle.jsfails withERR_CONNECTION_FAILED— a dead/abandoned Shopflo(rebuy) checkout integration still referenced on every page. Dead third-party JS. - 🟡
checkout-merchant.snapmint.comreturns 403 — Snapmint EMI snippet blocked (may be geo/bot-gated, but flagging).
These are real, user-visible bugs: remove the abandoned Shopflo script and fix/replace the broken RCB image.
6. Content Quality Assessment
6.1 Image Quality & Authenticity
- 310 homepage images, 0 missing alt; 42 empty alt (decorative — acceptable).
- Collection page: 213 images, 17 empty alt on product cards — product card images with empty alt are lost to image search and text-to-image/vision agents.
- Product photography is real studio/sport imagery (authentic, not AI-generated) — no gene-fraud concern for a sport brand; this is strong and consistent with the sport-marketing identity.
- Main image issue is delivery, not authenticity: oversized PNG/JPG heroes (LCP) and lazy-loaded LCP image.
6.2 UX Issues
- Homepage hero/slider and the RCB mobile banner 404 (broken image on first viewport).
- Dead Shopflo third-party script firing console errors (perceived flakiness, wasted bytes).
- Collection pages lack an H1/on-page explainer — thin, undifferentiated pages.
- Large DOM (3,548 elements) on homepage adds jank on low-end Android — exactly the users Boldfit targets.
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Fix broken RCB mobile banner 404 (RCB-flat_300_-hb-m.png) | Brand/UX on flagship campaign, 96% of users | Low — re-upload asset |
| 2 | Remove dead Shopflo script (shopflo.bundle.js ERR_CONNECTION_FAILED) | Errors, wasted bytes, agentic jank | Low |
| 3 | Unblock LCP: remove loading="lazy" on hero image, convert hero to WebP | Mobile LCP 6.5s→~3s target | Medium |
| 4 | Defer/remove render-blocking jQuery from Google CDN | ~1.2s mobile LCP | Medium |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 5 | Unique meta description + title + H1 per collection; stop reusing homepage boilerplate; fix "thee" typo | SERP CTR across 194 collections | Low-Medium (bulk admin) |
| 6 | Add offers (price/currency/availability) to Product JSON-LD | Price-rich results eligibility | Medium (theme JSON-LD) |
| 7 | Fix brand-name consistency: "Boldfit" everywhere; purge empty sameAs | Entity consistency | Low |
| 8 | Optimize images: WebP/AVIF + tighter srcset | ~1.8MB savings, faster PLPs | Medium |
| 9 | CSP script-src + object-src 'none' + COOP + harder HSTS | Security hardening | Low-Medium |
| 10 | A11y: fix hero-slider ARIA, hero-link names, heading order, "Choose options" h5 | WCAG A compliance | Medium |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 11 | Add BreadcrumbList + ItemList schema (collections) | Breadcrumbs/rich listings | Medium |
| 12 | Add aggregateRating/review schema on products | Star ratings in SERP | Medium (app/feeds) |
| 13 | Add twitter:image, fix malformed twitter:site, use https og:image | Social share quality | Low |
| 14 | Reduce DOM (3,548 elements) and defer all non-critical 3rd parties below fold | Mobile jank, INP headroom | High |
| 15 | Differentiate product descriptions (509 SKUs boilerplate) | On-page + E-E-A-T depth | High |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | 74 | 🟡 |
| Performance (Desktop) | 92 | 🟢 |
| Accessibility | 92–94 | 🟢 |
| Best Practices / Security | 96 (with header gaps) | 🟢/🟡 |
| SEO | 92 (Lighthouse) / structural gaps | 🟡 |
| International SEO | N/A (single locale) | — |
| Content Quality | 85 (authentic imagery, thin product copy) | 🟢/🟡 |
| UX | 88 (mobile perf + broken RCB img) | 🟡 |
| Overall | ~85/100 | 🟡 |
Verdict: Solid, secure, well-architected Shopify store with an excellent technical-SEO foundation, but mobile performance (LCP) is the single biggest business risk for a ~96%-mobile, price-driven audience, and the collection-page on-page SEO (meta/title/H1) plus missing Product offers schema are the biggest quick wins. Fix the two broken assets (RCB image, Shopflo script) immediately, then tackle LCP and collection on-page SEO.
Sources
- Chrome UX Report / CrUX Vis — https://cruxvis.withgoogle.com/#/ — origin LCP/INP/CLS 28-week phone trend, CWV assessment, device split (95.9% phone / 4.1% desktop / 0% tablet).
- PageSpeed Insights — https://pagespeed.web.dev/ — Lighthouse 13.4.1 lab scores (mobile/desktop), metrics, failed audits, insights, this-URL field panel, console errors, security audits.
- Live site / headers —
curl -sI https://www.boldfit.com/— HSTS/CSP/X-Frame/COOP headers,powered-by: Shopify, Cloudflare, Gokwik preconnect,content-language: en-IN. - robots.txt — https://www.boldfit.com/robots.txt — crawl rules, Sitemap directive, agentic/UCP instructions.
- sitemap.xml — https://www.boldfit.com/sitemap.xml → sitemap_products_1 (509), sitemap_collections_1 (194), sitemap_pages_1 (59), sitemap_blogs_1 (18+).
- Rendered HTML inspection — homepage,
/products/boldfit-heavy-resistance-band,/collections/yoga,/collections/men,/collections/home-gym,/collections/bestsellers,/collections/sports-shoes,/pages/about-us,/blogs/bold-blogs/…— title/meta/canonical/H1 counts, JSON-LD blocks (Organization, WebSite, Product, Article, BreadcrumbList, ItemList), image alt audit, broken-image 404 checks. - business-analysis.md — parent task (boldfit biz, t_b5efb1c8) — revenue/funding, audience, positioning context.