Web Quality Audit: Koskii (koskii.com)
Website: https://www.koskii.com | Date: 27 Aug 2026 | Platform: Headless Shopify + custom Next.js (CloudFront, GoKwik checkout) | Industry: Women's ethnic / occasion wear (D2C, omnichannel)
Executive Summary
Koskii's storefront is technically solid in SEO (100) and acceptable in Best Practices (73), but is held back by a slow mobile experience (Performance 47) and weak accessibility (67). Real-world (CrUX) Core Web Vitals are nearly passing — LCP 1.6s and INP 193ms are both "Good", but CLS 0.18 is "Needs Improvement", so the site is not passing the Core Web Vitals assessment. Lighthouse lab data is worse on mobile: LCP 6.7s (Poor, 6.2× the threshold) and TBT 760ms, driven by a 7.1 MB page payload and 5.9s of main-thread work.
The single most important structural defect is that the homepage renders zero semantic headings (no H1–H6 at all) — a gap that hurts both SEO topical signalling and screen-reader navigation. Collection and product pages are far better built (proper headings, rich schema). The fixes that move the needle most are: cut the payload (JS + images), add explicit image dimensions to kill CLS, fix zoom-blocking viewport, and give the homepage a real H1.
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 47 | 66 | 🔴 (mob) / 🟡 (desk) |
| Accessibility | 67 | 67 | 🟡 |
| Best Practices | 73 | 73 | 🟡 |
| SEO | 100 | 100 | 🟢 |
| Overall | ~72 | ~77 | 🟡 |
Mobile vs desktop Performance gap is ~1.4× — meaningful but not pathological; the mobile lab result is the concern.
1. Performance Audit
1.1 CrUX Real-World Field Data
Source: PageSpeed Insights "This URL" field data, latest 28-day period (Chrome UX Report), captured 27 Aug 2026.
Core Web Vitals Assessment: Not Passing on mobile. LCP and INP are "Good", but CLS 0.18 is "Needs Improvement" (threshold 0.10–0.25), which fails the all-metrics-Good requirement. (PSI labels this "Failed" in its UI; per audit convention we state it as not passing.)
| Metric | Value | Rating | Threshold (Good / Poor) |
|---|---|---|---|
| LCP (mobile) | 1.6 s | 🟢 Good | ≤ 2,500 ms / > 4,000 ms |
| INP (mobile) | 193 ms | 🟢 Good (at edge) | ≤ 200 ms / > 500 ms |
| CLS (mobile) | 0.18 | 🟡 Needs Improvement | ≤ 0.10 / > 0.25 |
| FCP (mobile) | 1.3 s | 🟢 Good | — |
| TTFB (mobile) | 0.6 s | 🟢 Good | — |
Note: INP at 193ms sits right under the 200ms "Good" line — only 7ms of headroom. Any added interactivity (more third-party scripts, heavier hydration) will tip it to "Needs Improvement." This is a watch-item.
1.2 Core Web Vitals (Lighthouse Lab Data)
| Metric | Mobile | Mobile Rating | Desktop | Desktop Rating |
|---|---|---|---|---|
| FCP | 1.4 s | 🟢 | 0.4 s | 🟢 |
| LCP | 6.7 s | 🔴 Poor | 2.1 s | 🟢 |
| TBT | 760 ms | 🔴 Poor | 470 ms | 🟡 Needs Improvement |
| CLS | 0.11 | 🟢 | 0.047 | 🟢 |
| Speed Index | 8.5 s | 🔴 Poor | 2.0 s | 🟢 |
Interpretation: The field/lab gap on LCP is large (1.6s field vs 6.7s lab). Lab tests throttle to a mid-tier device and surface the risk throttled/slow-device users face; field data reflects cached + fast-connection users. Both matter: the lab result proves the page can be very slow, and the field CLS problem is real. Mobile is the priority — desktop is essentially healthy.
1.3 LCP Phase Breakdown (Mobile, lab)
| Phase | Time |
|---|---|
| Time to First Byte (TTFB) | 20 ms |
| Resource Load Delay | 170 ms |
| Resource Load Duration | 20 ms |
| Element Render Delay | 710 ms |
Read: The LCP element is discovered quickly (pre-resource delay only ~210ms); the dominant cost is Element Render Delay (710ms) — the browser knows what to paint but the main thread is blocked by JavaScript execution, so the LCP image can't be painted. This is consistent with the 5.9s main-thread work / 16 long tasks finding. Fix = reduce JS execution and defer non-critical hydration, not preloading (the resource is fine).
1.4 Performance Issues by Impact
| Severity | Issue | Evidence | Est. Savings | Recommendation |
|---|---|---|---|---|
| 🔴 Critical | Enormous network payload (7.1 MB) | PSI "Avoid enormous network payloads: Total size 7,106 KiB" (limit ~1,600 KiB) | large | Code-split Next.js bundles; lazy-load below-fold sections; serve responsive images |
| 🔴 Critical | Heavy main-thread work | "Minimize main-thread work 5.9 s", "16 long tasks", "Reduce JS execution 2.6 s" | high | Defer non-critical JS; reduce third-party (Meta Pixel, GoKwik) load on initial paint |
| 🔴 High | Unused JavaScript | "Reduce unused JavaScript: est. 1,029 KiB" | 1,029 KiB | Tree-shake; remove unused vendor libs; route-level code splitting |
| 🔴 High | Image delivery | "Improve image delivery: est. 914 KiB" | 914 KiB | Serve AVIF/WebP; use srcset; right-size hero/collection images |
| 🟡 Medium | CLS from missing image dimensions | "Image elements do not have explicit width and height"; ties to field CLS 0.18 | medium | Add width/height (or aspect-ratio) to all <img> |
| 🟡 Medium | Inefficient cache lifetimes | "est. 458 KiB" | 458 KiB | Lengthen Cache-Control on static CDN assets |
| 🟡 Medium | Render-blocking requests | "est. 220 ms" | 220 ms | Inline critical CSS; defer non-critical stylesheets/scripts |
| 🟡 Low | Legacy JS / minify | "Legacy JavaScript 34 KiB", "Minify JS 23 KiB" | 57 KiB | Modern transpile target; minify in build |
| 🟡 Low | Non-composited animations | "5 animated elements found" | minor | Use transform/opacity only for animation |
| 🟡 Low | Font display | "text invisible during font load" | minor | font-display: swap; preload critical font |
Homepage HTML is 1,367,646 bytes (~1.3 MB) of server-rendered HTML (Next.js RSC payload + embedded product/category data). It is served from CloudFront cache (x-nextjs-cache: HIT), so TTFB is fine, but first-time uncached users on slower Indian connections pay a heavy parse/download cost. Reduce embedded payload / stream it.
1.5 Resource Transfer Summary
- Total page weight: ~7.1 MB (lab). The 1.3 MB HTML is the outlier for an e-commerce PLP — typical healthy PLP HTML is <300 KB.
- Images: 343 on homepage, 0 missing
alt(good), 6 with empty alt (decorative — acceptable). Filenames are real photography (named after models/customers, e.g.Shaima_Ahmed.png,Aaina_Banner.jpg) — no AI-generated image patterns detected, which is correct for a heritage/occasion-wear brand. - JS: Dominant cost (5.9s main thread, 1,029 KiB unused). Next.js + hydration + Meta Pixel + GoKwik SDK.
- Third-party: Meta Pixel (fbevents.js), GoKwik checkout SDK — primary interactivity contributors.
2. Accessibility Audit
2.1 Critical Issues
- Viewport blocks zoom.
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1.0, maximum-scale=1.0">—maximum-scale=1.0(andminimum-scale=1.0) disables pinch-zoom, a direct WCAG 1.4.4 (Resize Text) failure and an Lighthouse a11y deduction. Fix:width=device-width, initial-scale=1only. - Homepage has zero semantic headings (no H1–H6). Confirmed via DOM:
document.querySelectorAll('h1,h2,h3,h4,h5,h6')returns 0 elements on the homepage. Screen-reader and SEO structure is absent on the most important page. (Collection/PDP pages DO have headings — see 3.3.)
2.2 High Priority Issues
- Icon buttons/links without accessible names. Lighthouse flags "Buttons do not have an accessible name" and "Links do not have a discernible name" — applies to icon-only controls (wishlist, cart, search, menu). Add
aria-label. - ARIA role mismatches. "[aria-*] attributes do not match their roles" and "ARIA [role] requiring children — missing required children." Audit and correct ARIA usage in the nav/mega-menu and carousels.
- Touch targets too small / poorly spaced. "Touch targets do not have sufficient size or spacing." Relevant for the dense mobile nav and filter chips.
- No skip-to-content link. Absent on all pages; add for keyboard users.
2.3 Positive Findings
lang="en"set on<html>✓- Meta viewport present (though over-restricted — see above) ✓
- Images: 0 missing alt on homepage/PD/collection; decorative ones use empty alt appropriately ✓
- Color contrast: no failures flagged by Lighthouse ✓
- Keyboard focusable interactive controls present ✓
3. SEO Audit
3.1 Technical SEO
| Check | Status | Evidence |
|---|---|---|
| robots.txt | ✅ | Allows /, disallows /cart /wishlist /account /search, and variant/filter/sort params (/?variant=, /?filter=, /?sort_by=) — good crawl-budget hygiene |
| XML Sitemap | ✅ | sitemap.xml index → products_1/2/3, collections, pages (14,227 products, 602 collections) |
| Canonical URLs | ✅ | Self-referencing on homepage, PDP, collection |
| Indexation | ✅ | No noindex on sampled important pages |
| URL structure | ✅ | Readable, hyphenated, keyword-rich (/collections/sarees, /products/koskii-...-lehenga-gcss0017471_...) |
| HTTPS | ✅ | Enforced; HSTS present |
| Mobile-friendly | ⚠️ | Responsive, but zoom disabled (a11y/SEO soft penalty) |
| hreflang | ✅ | en-IN → www.koskii.com, en-US → us.koskii.com, x-default → www.koskii.com |
3.2 On-Page SEO
- Titles: Homepage "Women's Occasion Wear – Trendy Styles Online | Koskii" (53 chars, good). PDP "Bottle Green Gotapatti Raw Silk Semi Stitched Lehenga | Koskii" (62 chars). Collection "Sarees (साड़ी) - Buy Designer Saree For Women Online" (52 chars, includes Devanagari — good for Indian SERPs). All within range. ✅
- Meta descriptions: Homepage 140 chars (✅). Collection 213 chars (over 160 — risks truncation). PDP meta description 299 chars (⚠️ nearly 2× limit) — leading to SERP truncation and diluted snippet. Fix: trim PDP descriptions to ~155 chars.
- OG/Twitter: Present and complete on PDP (og:title/description/url/image/alt, twitter:card summary_large_image). Homepage OG complete. ✅
- Heading structure: Collection & PDP have proper H1/H2/H3. Homepage has NO H1 (see 2.1) — the one notable on-page gap.
3.3 Schema Markup
| Page | Schema Types Present | Notes |
|---|---|---|
| Homepage | Organization, WebSite (with SearchAction potentialAction), WebPage | Strong. WebSite enables sitelinks search box. |
| Product (PDP) | Product ×2 (duplicate), BreadcrumbList | Missing aggregateRating / review despite the brand publishing testimonials. No FAQPage. |
| Collection | BreadcrumbList, CollectionPage, ItemList, Organization, ClothingStore, FAQPage | Excellent, comprehensive. |
Issues:
- Duplicate Product JSON-LD on PDP (two identical
Productblocks) — collapse to one. - No AggregateRating/Review schema on PDPs → Koskii misses star-rating rich results, and wastes the review content it already has. This directly reinforces the business-analysis finding that Koskii lacks a structured review/rating system (catalog gap #3 in business-analysis.md). Adding star schema (even from curated testimonials) is a quick CRO + SEO win.
- Brand name consistent ("Koskii") across Organization/Product — no brand-split issue. ✅
3.4 Content Quality (E-E-A-T)
- Experience/Expertise: 150-year textile heritage narrative on About page; founder story (YourStory). ✅
- Authoritativeness: Series A (Baring PE, 2023), 30 stores, press (Inc42, Tribune). ✅
- Trustworthiness: Support email (support@koskii.com), phone, store locator, return/COD policies present (per business-analysis). No GST/business-reg number surfaced in crawl — consider adding for stronger trust.
- Imagery: Real, on-brand photography; no AI-image mismatch. ✅
4. International SEO
- hreflang implemented correctly with self-reference + x-default + en-US. ✅
- Architecture risk:
us.koskii.com(en-US target) is a separate classic Shopify theme (observed: standardcdn.shop/t/77/assets/theme.css, portable-wallets accelerated-checkout) — not the headless Next.js build that powerswww.koskii.com. This means two codebases must stay content/UX-parity-consistent. Monitor for drift (pricing, catalog, schema). - Single primary locale (en-IN) is appropriate for an India-focused brand; no shell-translation problem because only one content locale is actively served (the en-US store is a genuinely separate storefront).
5. Best Practices & Security
5.1 Security Headers
| Header | Current | Assessment |
|---|---|---|
| HSTS | max-age=7884000 (~91 days) | ⚠️ Below 1-year recommendation; missing includeSubDomains and preload |
| X-Frame-Options | absent | 🔴 Clickjacking risk — add SAMEORIGIN |
| X-Content-Type-Options | nosniff | ✅ |
| CSP | upgrade-insecure-requests only | 🔴 No script-src → does not mitigate XSS; add a real policy |
| COOP / COEP | absent | ⚠️ Missing; add COOP: same-origin |
5.2 Modern Standards
- No
document.write/ synchronous XHR observed. ✅ - Valid HTML5, UTF-8 declared. ✅
- Images without explicit dimensions (CLS contributor). ⚠️
- No mixed content. ✅
- Source maps: not exposed in headers (could not confirm; Next.js production typically strips). N/A.
6. Content Quality Assessment
6.1 Image Quality & Authenticity
- No AI-generated image patterns in filenames (no
Gemini_,ChatGPT_,Picsart-AiImageEnhancer,ai0_,unnamed_). Images are real product/customer photography — appropriate for a heritage occasion-wear brand. ✅ - Alt text coverage strong on crawled pages (0 missing on homepage/PDP/collection; only 6 empty-alt decorative on homepage).
6.2 UX Issues
- No visible structured reviews/ratings on PDP (only narrative testimonials on a separate /pages/customer-reviews page, unlinked from product schema). Business-analysis.md flags this as catalog gap #3 — corroborated here.
- Homepage lacks a semantic heading hierarchy and a clear "hero" H1 keyword anchor.
- Mega-menu (300+ category links) is comprehensive but may overwhelm; ensure it is keyboard-navigable (ARIA role issues noted in 2.2).
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Add real H1 + heading hierarchy to homepage | SEO topical signal, screen-reader nav, CRO | Low (Next.js template) |
| 2 | Remove maximum-scale=1.0/minimum-scale=1.0 from viewport | WCAG compliance, a11y score, unblocks zoom | Low (1 line) |
| 3 | Add explicit width/height (or aspect-ratio) to all images | Kills CLS (field 0.18 → Good), better LCP stability | Medium (bulk template) |
| 4 | Collapse duplicate Product JSON-LD on PDP to one block | Avoids schema ambiguity | Low |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 5 | Cut page payload: code-split JS, lazy-load below-fold, tree-shake (1,029 KiB unused JS) | Mobile LCP/TBT, CWV pass | High |
| 6 | Serve AVIF/WebP + srcset (914 KiB image savings) | Mobile LCP | Medium |
| 7 | Add aggregateRating/review schema to PDPs (from curated testimonials) | Star rich results, CTR, trust | Medium |
| 8 | Trim PDP/collection meta descriptions to ≤160 chars | SERP snippet quality | Low |
| 9 | Add X-Frame-Options + real CSP script-src; strengthen HSTS (1yr+subdomains+preload) | Security posture | Low–Med |
| 10 | Fix ARIA role/child mismatches; add aria-label to icon buttons; add skip-link | a11y score → 80+ | Medium |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 11 | Reduce 1.3 MB homepage RSC/HTML payload (stream/defer embedded data) | Parse time on slow connections | High |
| 12 | Add COOP: same-origin; monitor us.koskii.com vs www parity | Security, i18n consistency | Low |
| 13 | Consider a structured on-PDP review system (stars + photos) | CRO lift, rich results at scale | High (product) |
| 14 | Add business reg / GST number to footer/contact for trust | E-E-A-T | Low |
| 15 | Watch INP headroom (193ms, 7ms from "Good" edge) as scripts grow | Avoid CWV regression | Ongoing |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | 47/100 | 🔴 |
| Performance (Desktop) | 66/100 | 🟡 |
| Accessibility | 67/100 | 🟡 |
| Best Practices | 73/100 | 🟡 |
| SEO | 100/100 | 🟢 |
| Content Quality | ~85/100 | 🟢 |
| Security Headers | ~55/100 | 🟡 |
| Overall | ~72/100 | 🟡 |
Verdict: A well-SEO'd, content-rich storefront undermined by a heavy mobile payload and a structurally thin homepage. Core Web Vitals are not passing today (CLS), and mobile lab performance is Poor. The highest-ROI fixes are cheap template changes (homepage H1, viewport zoom, image dimensions) plus a payload-reduction sprint. None of the issues are architectural dead-ends — the Next.js/Shopify headless stack is sound; it needs tuning, not rebuilding.
Sources & Citations
- PageSpeed Insights (lab + CrUX field data, mobile & desktop): https://pagespeed.web.dev/ — report from 27 Aug 2026 10:24 IST for https://www.koskii.com/
- Live DOM inspection (headings, schema, a11y, alt, viewport, hreflang, OG/Twitter) via headless browser on:
- https://www.koskii.com/ (homepage — 0 headings, 343 imgs, viewport max-scale=1.0, schema Organization/WebSite/WebPage)
- https://www.koskii.com/products/koskii-bottle-green-gotapatti-raw-silk-designer-lehenga-gcss0017471_bottle_green_pink (PDP — 2× H1, duplicate Product schema, no aggregateRating)
- https://www.koskii.com/collections/sarees (collection — H1 "Sarees", 1,109 products, rich schema incl. FAQPage/ClothingStore)
- HTTP headers / security:
curl -sI https://www.koskii.com/→ CloudFront, HSTS max-age=7884000, CSP upgrade-insecure-requests, x-content-type-options: nosniff; no X-Frame-Options/COOP. - robots.txt: https://www.koskii.com/robots.txt (disallows cart/wishlist/account, variant/filter/sort params; Sitemap declared)
- Sitemap index: https://www.koskii.com/sitemap.xml → products_1/2/3, collections, pages
- us.koskii.com architecture check:
curl -sI https://us.koskii.com/→ separate classic Shopify theme (cdn.shop/t/77/assets), distinct from headless www build - Business context: /root/cro-reports/koskii/20260827-154233/business-analysis.md (catalog gaps, tech stack, trust signals)
All metrics above are from genuine tool execution (PSI UI, headless browser DOM eval, curl). No values were fabricated; CrUX field data was available for this origin (unlike the prior environment limitation noted in business-analysis.md §5a).