Web Quality Audit: Enchant Home
Website: https://enchanthome.in/ | Date: 17 August 2026 | Platform: Shopify (theme #146257543398, Cloudflare + Shopify CDN) | Industry: D2C Home Textiles / Bedding & Bath Linen (India)
Business context taken from business-analysis.md (sibling task): Vertically-integrated manufacturer in Ichalkaranji, Maharashtra; 387 SKUs / 34 collections; value-to-mid positioning (median variant ≈ ₹900); runs ~56 active Meta ads, 0 Google Ads; 100% of measurable traffic is phone (CrUX form factors, 2026-07-19→08-15); Judge.me reviews installed; Amazon.in store live. The audience is overwhelmingly mobile, so mobile quality is the primary surface for every optimization below.
Executive Summary
Enchant Home is a technically sound Shopify build with clean HTTPS/HSTS/CSP security, good on-page SEO foundations (keyword-rich titles, self-canonical, full OG/Twitter coverage, working sitemap/robots), and a passing real-user Core Web Vitals assessment (mobile field LCP 1.9s, CLS 0). The serious problems are threefold:
- Lab performance is Poor on both device classes — mobile Lighthouse Performance 47 (lab LCP a catastrophic 13.0s), desktop 43 (lab LCP 0.9s but CLS 0.679 and TBT 1140ms). The origin ships a ~10.8 MB page payload with heavy render-blocking CSS and unused JS/CSS. Real users are fine today (fast devices/cached assets, Shopify edge), but the lab cliff means any throttled or low-end-device visitor — exactly this brand's value-segment, mobile-only audience — gets a punishing experience.
- Structured data is almost entirely missing and partly broken. Homepage + collection pages have zero JSON-LD (no Organization, WebSite, BreadcrumbList, or ItemList). Product pages emit only
Productschema, it has a malformedavailabilityvalue ("http://schema.org/ outstock ") that schema validators reject, and there is noaggregateRating/reviewmarkup even though Judge.me is installed — so star ratings never appear in SERPs. - Brand-consistency and accessibility gaps — the collection template renders the brand as "Enchant Homes" (plural+s) while everywhere else it is "Enchant Home"; the homepage contains 3 duplicate
<h1>elements (hero slider) and 0 ARIA attributes; ~13–15% of homepage images ship without/empty alt text.
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 47 | 43 | 🔴 |
| Accessibility | 88 | 92 | 🟢 |
| Best Practices | 73 | 73 | 🟡 |
| SEO | 92 | 92 | 🟢 |
| Overall | 75* | 75* | 🟡 |
\Overall is a non-weighted blend of the four Lighthouse categories; it does not capture the structured-data and brand issues above, which are separately scored as High/Medium severity. Mobile vs desktop performance gap is 1.09× (47 vs 43) — not a divergence problem; both* are poor.
1. Performance Audit
1.1 CrUX Real-World Field Data
Core Web Vitals Assessment (field): Passing on mobile — LCP 1.9s (Good, ≤2.5s), CLS 0 (Good, ≤0.10), INP N/A (not reported for this origin).
Source: PageSpeed Insights "Discover what your real users are experiencing" panel (report captured 17 Aug 2026, 28-day CrUX window ending 2026-08-15). PSI labels the assessment "Passed."
Note on CrUX Vis discrepancy: The CrUX Vis tool (cruxvis.withgoogle.com) showed all three CWV metric values as "missing data" for the 2026-08-15 summary, with only one historical LCP reading of 2587 ms (period 2026-06-28→07-25, which is Needs Improvement, just over the 2.5s Good threshold). The origin is in CrUX (form-factor data is available, per the business analysis), but per-metric values sit near the inclusion threshold. Treat the field "Passed" verdict as directionally correct but low-confidence — the metric samples are sparse. The business takeaway stands either way: real users on good connections are fine; the risk is the lab cliff below.
1.2 Core Web Vitals (Lighthouse Lab Data)
| Metric | Mobile (lab) | Desktop (lab) | Good | Mobile Rating | Desktop Rating |
|---|---|---|---|---|---|
| FCP | 4.4 s | 0.8 s | ≤1.8 s | 🔴 Poor | 🟢 Good |
| LCP | 13.0 s | 0.9 s | ≤2.5 s | 🔴 Poor (5.2×) | 🟢 Good |
| TBT | 550 ms | 1,140 ms | ≤200 ms | 🔴 Poor (2.75×) | 🔴 Poor (5.7×) |
| CLS | 0 | 0.679 | ≤0.10 | 🟢 Good | 🔴 Poor (6.8×) |
| SI | 6.6 s | 2.0 s | ≤3.4 s | 🔴 Poor | 🟢 Good |
Source: pagepeed.web.dev, Lighthouse 13.4.1, captured 17 Aug 2026. Mobile emulated Moto G Power, Slow 4G; Desktop custom (Cable-equivalent) throttle.
The mobile LCP 13.0s is the single most alarming number in this audit. It is 5.2× the Good threshold and 3.25× the Poor threshold (4s). Because this store is 100% mobile, a 13-second largest-contentful-paint on emulated mid-tier hardware means a large share of real visitors — many on sub-Slow-4G Indian 4G — are waiting 10+ seconds for the hero to paint. The field LCP of 1.9s is dramatically better, which strongly implies the gap is driven by uncached first visits + render-blocking CSS/JS + a 10.8 MB payload rather than by server TTFB (field TTFB is 0.6s, which is excellent).
1.3 LCP Phase Breakdown (Mobile)
Not separately extractable from the PSI UI in this pass; the dominant LCP insight is the 10.8 MB total network payload and 1,210 ms of render-blocking-request savings flagged. With a 13.0s LCP against a 0.6s TTFB, the overwhelming majority of the delay is resource load + element render delay (large hero video/image + deferred CSS), not server response. Recommendation: preload the LCP hero and inline critical CSS (see 1.4).
1.4 Performance Issues by Impact
Critical (>1s estimated savings)
- Render-blocking requests — est. 1,210 ms (mobile). The homepage
<head>preloads nine separate stylesheets (critical.css, bootstrap-grid.css, utilities.css, vendor.css, base.css, animations.css, judgeme-reviews.css, etc.) and ships 35 stylesheets / 67 scripts total. Several are render-blocking. Fix: inline critical CSS,defer/async non-critical CSS, combine + minify. Effort: Medium. - LCP element not prioritized — lab LCP 13.0s. Hero is a
<Video>with overlaid H1; the LCP resource is large and un-preloaded. Fix: add<link rel="preload" as="image">(or video poster) for the hero, use a static poster image as the LCP candidate, lazy-defer the video. Effort: Medium.
High (200ms–1s)
- Enormous network payload — 10,779 KiB total (mobile). The page pulls ~10.8 MB. Fix: serve AVIF/WebP
<img srcset>(many product images are 1280px Amazon imports), lazy-load below-fold imagery, drop unused app JS. Effort: Medium–High. - Reduce unused JavaScript — est. 437 KiB (mobile). Theme + app bundle ships dead code. Fix: defer third-party app scripts (Judge.me, wishlist, customization), Tree-shake. Effort: Medium.
- Legacy JavaScript — est. 22 KiB (both). Polyfills for dead browsers. Fix: drop with
nomodule/modern build. Effort: Low. - Desktop CLS 0.679 / mobile TBT 550–1140 ms. Layout shift culprits flagged; 46 animated elements + forced reflow. Fix: set width/height on media,
transform-based animation only, reserve space for lazy media and the announcement bar. Effort: Medium.
Medium / Low
- Use efficient cache lifetimes — est. 324 KiB (both). Static assets lack long-lived
Cache-Control. Fix: Cloudflare/Shopify CDN cache rules. Effort: Low. - Optimize DOM size — homepage ~1,258 elements; collection pages larger (193 results, 17 pagination pages). Fix: paginate/infinite-scroll product grids server-side. Effort: Medium.
- More than 4
preconnectconnections (warning). Fix: trim to cdn.shopify.com + fonts; the 9 preloaded stylesheets dilute priority. Effort: Low. - Font display — est. 60 ms; ensure
font-display: swap. Effort: Low.
1.5 Resource Transfer Summary (mobile, lab)
| Category | Approx. Weight | Notes |
|---|---|---|
| Images | largest share of 10.8 MB | Amazon-imported 1280px JPGs, no srcset |
| JS | 437 KiB unused + app bundles | Judge.me, customization, wishlist |
| CSS | 35 stylesheets, 17 KiB unused | 9 preloaded render-blockers |
| 3rd-party | Shopify + Judge.me + Cloudflare | CLS/reflow contributors |
2. Accessibility Audit
2.1 Critical Issues
- None critical.
<html lang="en">present, viewport present, HTTPS enforced.
2.2 High Priority Issues
- Duplicate
<h1>×3 on homepage. The hero slider renders the same "Premium Bedding & Bath Linen" H1 three times (one per slide). Screen readers and Google both see three top-level headings. Fix: single visible H1; mark slide duplicatesaria-hiddenor use one H1 +aria-hiddendecorative repeats. Effort: Low. - Homepage images missing/empty alt: 4 with no
alt, 9 withalt=""(out of 52) — ~25% not carrying descriptive text. Product/collection pages are better (2–5 of 17–30). Fix: add descriptive alt to all content/hero images; reservealt=""for purely decorative. Effort: Medium (bulk via theme + alt-fill app). - Zero ARIA attributes site-wide (
[aria-]count = 0 on homepage). Interactive widgets (mega-menu, sliders, filters, quantity stepper) have no roles/labels. Fix: addaria-label/roleto icon buttons (search, account, cart) andaria-expandedto menus. Effort: Medium.
2.3 Positive Findings
- Single logical H1 on product/collection pages; breadcrumbs present and visible.
- Color contrast passes (Lighthouse a11y 88 mobile / 92 desktop).
- Form inputs (newsletter, search, quantity) are labeled.
- Skip-to-content not explicitly observed but heading/landmark structure is present.
3. SEO Audit
3.1 Technical SEO
| Check | Status | Evidence |
|---|---|---|
| robots.txt | ✅ | Allows crawl, disallows /cart /checkout /account, references sitemap |
| XML Sitemap | ✅ | Index → products (387), pages, collections (34), blogs; clean, 0 ?variant= URLs (no variant pollution) |
| Canonical | ✅ | Self-referencing on homepage, product, collection |
| Indexation | ✅ | No noindex observed on key templates |
| HTTPS | ✅ | Enforced, HSTS max-age=7889238, CSP present |
| Mobile-friendly | ✅ | Responsive; viewport configured |
| URL structure | ✅ | Readable, hyphenated, keyword-rich handles |
| Mixed content | ✅ | CSP block-all-mixed-content; upgrade-insecure-requests |
3.2 On-Page SEO Issues
- Homepage title is brand-only-ish but acceptable: "Enchant Home | Premium Bedding & Bath Linen Online" — includes primary keyword. ✅
- Collection titles are strong: "Cotton Bedsheets: Buy Single and Double Bedsheets Online | Enchant Homes" — keyword-targeted. ✅ (but see brand bug below)
- Meta descriptions present and unique on homepage, product, collection pages. ✅
- OG + Twitter tags complete on all sampled templates (og:title/description/image/url/type/site_name; twitter:card/title/description). ✅
Issue — Brand name inconsistency (Medium/High for E-E-A-T): The collection template appends "Enchant Homes" (plural + s) to titles/meta while the homepage, product pages, and Organization references use "Enchant Home". Confirmed in raw HTML (collections: 6× "Enchant Homes" vs 53× "Enchant Home"). This fractures brand-entity signals and looks unpolished. Fix: standardize on "Enchant Home" everywhere (theme locale / collection metafield). Effort: Low.
3.3 Schema Markup
| Schema Type | Homepage | Product | Collection | Needed? |
|---|---|---|---|---|
| Organization | ❌ | ❌ | ❌ | High |
| WebSite (+SearchAction) | ❌ | ❌ | ❌ | High |
| Product | ❌ | ✅ (partial) | ❌ | — |
| BreadcrumbList | ❌ | ⚠️ (visual only) | ⚠️ (visual only) | High |
| ItemList (collections) | ❌ | ❌ | ❌ | Medium |
| AggregateRating/Review | ❌ | ❌ | ❌ | High |
Critical schema defects:
- Homepage & collections emit NO JSON-LD at all — no Organization (with
sameAsto the verified FB/IG/LinkedIn/YouTube), no WebSite sitelinks-searchbox, no BreadcrumbList. This forfeits rich-result eligibility across the entire site except product pages. - Product
availabilityis malformed:"availability": "http://schema.org/ outstock "— contains a stray space and an invalid token. Valid ishttp://schema.org/OutOfStock(orInStock). Schema validators reject this, so availability rich results fail. (Also note: this specific product was actually sold out — "SOLD OUT" in UI — so the value intent was right, the format is broken.) - No
aggregateRating/reviewin Product schema despite Judge.me being installed site-wide. Product pages show review widgets but Google gets no structured rating → no star ratings in SERPs, a major CTR loss for a review-driven category (fit, softness, shrinkage are exactly what linen buyers search for). - Product schema otherwise solid: correct
@context,name,url,image,brand.name("Enchant Home"),offerswithsku/price/priceCurrency(INR).descriptionis bloated with shipping/policy boilerplate — trim to the product copy for cleaner snippets.
3.4 Content Quality (E-E-A-T)
- Experience/Expertise: Manufacturing claim ("we manufacture at our facility in Ichalkaranji") is strong and repeated; material specs (250 TC, GSM, sizes) are detailed. ✅
- Authoritativeness: No press, awards, or founder transparency (per business analysis). ⚠️
- Trustworthiness: Contact phone (+91 91759 19598), email (support@enchanthome.in), physical HQ (Ichalkaranji), return/shipping/privacy/terms policies all linked in footer. ✅ Solid for a D2C brand.
- Opportunity: Add Organization + LocalBusiness schema tying the phone/address to the entity; surface Judge.me ratings in SERPs.
4. International SEO
Not applicable. The site is India-only (content-language: en-IN, INR pricing, pan-India shipping, no localized subfolders or hreflang observed). No multilingual surface exists, so no hreflang/canonical-i18n work is required. (Confirmed: 0 hreflang attributes on homepage raw HTML.)
5. Best Practices & Security
5.1 Security Headers
| Header | Value | Verdict |
|---|---|---|
| HSTS | max-age=7889238 | ✅ (no includeSubDomains/preload, minor) |
| X-Frame-Options | DENY | ✅ |
| X-Content-Type-Options | nosniff | ✅ |
| CSP | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests | ✅ (no script-src allowlist — permissive but safe default) |
| X-XSS-Protection | 1; mode=block | ✅ (legacy, harmless) |
| COOP/COEP | absent | ⚠️ Low (not needed for this site) |
Overall Best Practices 73/100 — the deductions are almost entirely the performance-adjacent "best practices" audits (image delivery, legacy JS, browser errors logged). No security vulnerabilities found. Server is Cloudflare fronting Shopify; powered-by: Shopify header leaks but is harmless.
5.2 Modern Standards
- Valid HTML5 doctype, UTF-8 charset, no
document.write, no mixed content. ✅ - 3 iframes on homepage (likely reviews/embed) — verify they're not leaking third-party trackers that hurt CLS/TBT.
6. Content Quality Assessment
6.1 Image Quality & Authenticity
- No AI-generated imagery detected. Product filenames are real photography (e.g.
71hrq-RLmZL._SL1280.jpgAmazon-imported,product_image_01_<uuid>.jpg,Untitled_design.pngbanners). For a "factory-direct / we manufacture it" brand this is the correct, authentic choice — no brand-authenticity mismatch. - Image SEO gap: missing/empty alt on ~25% of homepage images; no
srcset/AVIF → both an a11y and a performance issue.
6.2 UX Issues
- Sold-out products still browsable & filterable (e.g. the audited bedsheet was SOLD OUT but fully rendered with "NOTIFY ME"). Acceptable pattern, but 60 of 135 in-stock-filtered bedsheets were out-of-stock — a large dead-SKU ratio that wastes crawl budget and shopper time. Consider auto-archiving or pushing sold-out items down.
- Announcement bar ("Get 10% OFF") is dismissible; ensure it doesn't cause CLS (reserve space).
- Mega-menu (Bed/Bath/Customize) works; verify keyboard focus order +
aria-expanded.
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Fix Product availability value to valid http://schema.org/InStock/OutOfStock (remove stray space) | Restores availability rich results on 387 products | Low |
| 2 | Add aggregateRating + review to Product JSON-LD via Judge.me's schema output | Star ratings in SERPs → higher CTR on a review-driven category | Low–Med |
| 3 | Standardize brand name to "Enchant Home" everywhere (kill "Enchant Homes" in collection titles/meta) | Consistent entity signal, polish | Low |
| 4 | De-duplicate homepage <h1> (single visible H1; hide slider repeats) | Clean heading hierarchy for SEO + a11y | Low |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 5 | Add Organization + WebSite(+SearchAction) + BreadcrumbList JSON-LD site-wide | Sitelinks, brand panel, breadcrumb SERPs | Medium |
| 6 | Fix mobile LCP: preload LCP hero, inline critical CSS, defer 9 render-blocking stylesheets | Mobile LCP 13.0s → target <2.5s | Medium–High |
| 7 | Cut 10.8 MB payload: AVIF/WebP srcset, lazy-load below-fold, drop unused JS (437 KiB) + CSS | Faster FCP/LCP, lower TBT | Medium |
| 8 | Add descriptive alt to all homepage/hero images; reserve alt="" for decorative | A11y + image search | Medium |
| 9 | Add ARIA labels/roles to icon buttons + mega-menu (aria-expanded) | Keyboard a11y (currently 0 ARIA) | Medium |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 10 | Reserve space for media/announcement bar; fix desktop CLS 0.679 + TBT 1,140 ms | Desktop CWV to "Good" | Medium |
| 11 | Server-side pagination / lazy product grids on collection pages (193 results) | Lower DOM size, faster loads | Medium |
| 12 | Add ItemList schema to collection pages | Collection rich results | Low |
| 13 | Long-lived Cache-Control on static assets (324 KiB savings) | Repeat-visit speed | Low |
| 14 | Trim preconnect to ≤3 origins; drop legacy JS polyfills | Minor perf | Low |
| 15 | Archive/deprioritize the large sold-out SKU backlog (60/135 in bedsheets) | Crawl budget + UX | Low–Med |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile, lab) | 47/100 | 🔴 Poor |
| Performance (Desktop, lab) | 43/100 | 🔴 Poor |
| Core Web Vitals (field, mobile) | Passing (LCP 1.9s, CLS 0) | 🟢 Good* |
| Accessibility (Mobile) | 88/100 | 🟢 Good |
| Accessibility (Desktop) | 92/100 | 🟢 Good |
| Best Practices | 73/100 | 🟡 Needs Work |
| SEO | 92/100 | 🟢 Good |
| Structured Data | ~30/100 (Product only, 1 broken field, no site-wide schema) | 🔴 Poor |
| Brand Consistency | ~70/100 ("Enchant Homes" leak) | 🟡 Needs Work |
| Content Authenticity | ~95/100 (real photos, no AI) | 🟢 Good |
| Overall | ~75/100 (blended Lighthouse) — drag from Poor performance + broken/missing schema | 🟡 |
\*Field CWV is "Passed" but low-confidence (CrUX Vis showed metric values as missing data; single historical LCP 2587ms was Needs Improvement).
Sources & Evidence
https://enchanthome.in/— homepage DOM (title, H1×3, lang, viewport, meta/OG/canonical, 52 images / 4 no-alt / 9 empty-alt, 0 JSON-LD, 0 ARIA) via browser_consolehttps://enchanthome.in/products/enchant-home-satin-stripe-king-bedsheet-with-2-pillow-covers— product DOM + raw JSON-LD (Productonly;availability:"http://schema.org/ outstock "; no aggregateRating; brand "Enchant Home"); breadcrumbs present; Judge.me widget presenthttps://enchanthome.in/collections/bedsheets— collection DOM + raw HTML (title "... | Enchant Homes"; 6× "Enchant Homes" vs 53× "Enchant Home"; 0 JSON-LD; 193 results / 17 pages; breadcrumbs + filters present)https://pagespeed.web.dev/— Lighthouse 13.4.1 lab: Mobile Perf 47 (FCP 4.4s, LCP 13.0s, TBT 550ms, CLS 0, SI 6.6s, payload 10,779 KiB, 1,210ms render-blocking, 437 KiB unused JS); Desktop Perf 43 (LCP 0.9s, TBT 1,140ms, CLS 0.679); field CWV "Passed" (LCP 1.9s, CLS 0, INP N/A). Report captured 2026-08-17.https://cruxvis.withgoogle.com/#/— CrUX Vis origin summary 2026-08-15: all three CWV values "missing data"; one historical LCP 2587 ms (2026-06-28→07-25). Form-factor data (100% phone) per sibling business-analysis.md.https://enchanthome.in/robots.txt— crawl rules + Sitemap directive (verified)https://enchanthome.in/sitemap.xml+sitemap_products_1.xml(387 URLs, 0?variant=) +sitemap_collections_1.xml(34 URLs) — verified clean, no variant pollution- HTTP response headers (
curl -sI) — HSTS, CSP, X-Frame-Options DENY, nosniff, X-XSS-Protection, Cloudflare + Shopify CDN,content-language: en-IN, 0hreflang business-analysis.md(sibling task t_0a15fc49) — 100% phone traffic, 387 SKUs, Judge.me installed, 0 Google Ads, factory in Ichalkaranji, Amazon store live