SEO & Quality Audit: The Pink Moon (thepinkmoon.in)
Website: https://thepinkmoon.in | Date: June 14, 2026 | Platform: Shopify | Industry: Plus-size women's fashion (D2C)
Executive Summary
The Pink Moon is an unfunded D2C plus-size fashion brand doing ₹7.98Cr revenue with 373 products across 137 collections. The site has solid desktop performance (LCP 2.7s) but severe mobile performance issues (LCP 22.6s — 9x slower than desktop), which is critical given 93% of traffic is mobile. Accessibility needs attention with 30 images missing alt text. SEO foundation is partially built — schema exists but is incomplete, Open Graph tags are missing from product pages, and the H1 on the homepage is logo-only text rather than keyword-targeted. Security headers are Shopify-managed and generally adequate but CSP is weak.
| Category | Mobile Score | Desktop Score | Grade |
|---|
| Performance | 51 | 73 | Mobile: 🔴 / Desktop: 🟡 |
| Accessibility | 78 | 78 | 🟡 |
| Best Practices | 92 | 92 | 🟢 |
| SEO | 85 | 85 | 🟡 |
| Content Quality | — | — | 🟡 |
| Overall | ~75 | ~80 | 🟡 |
Mobile:Desktop LCP gap is 8.4x — this single metric should be the #1 priority.
1. Performance Audit
1.1 CrUX Real-World Field Data
CrUX Vis returned data indicating the site is below the reporting threshold for real-world field data in the CrUX dataset. All performance findings below are from Lighthouse lab tests.
1.2 Core Web Vitals (Lighthouse Lab Data)
| Metric | Mobile | Status | Desktop | Status | Threshold |
|---|
| FCP | 5.1s | 🔴 Poor | 0.8s | 🟢 Good | ≤1.8s good, ≤3s NI |
| LCP | 22.6s | 🔴 Poor | 2.7s | 🟡 NI | ≤2.5s good, ≤4s NI |
| TBT | 270ms | 🟡 NI | 260ms | 🟡 NI | ≤200ms good, ≤600ms NI |
| CLS | 0 | 🟢 Good | 0 | 🟢 Good | ≤0.1 good |
| SI | 10.7s | 🔴 Poor | 2.1s | 🟢 Good | ≤3.4s good, ≤5.8s NI |
| TTFB | 0.7s | 🟢 Acceptable | — | — | ≤800ms good |
Key takeaway: Mobile LCP of 22.6s vs Desktop LCP of 2.7s = 8.4x gap. This is the defining performance issue. The mobile FCP of 5.1s means users see a blank screen for over 5 seconds on typical 4G.
1.3 LCP Phase Breakdown
Mobile LCP (22.6s total):
- TTFB: 0ms (from CrUX "this URL" view — server responds fast)
- Resource Load Delay: 180ms
- Resource Load Duration: 70ms
- Element Render Delay: 2,070ms
- Pre-resource delay: ~20.4s (preventing LCP discovery)
Interpretation: The LCP element IS using fetchpriority="high" and loading="eager" correctly — but there are 20.4 seconds of pre-resource-delay. This is almost certainly caused by render-blocking JavaScript (Swiper bundle, theme.js, Shopify analytics) preventing the browser from even discovering the hero image. The LCP <img> tag exists in the HTML but the parser can't reach it due to blocking scripts earlier in the document.
Desktop LCP (2.7s total):
- TTFB: 0ms
- Resource Load Delay: 210ms
- Resource Load Duration: 110ms
- Element Render Delay: 470ms
- Pre-resource delay: ~1.9s
1.4 Performance Issues by Impact
🔴 Critical (> 1s estimated savings)
| # | Issue | Evidence | Savings | Recommendation |
|---|
| 1 | Render-blocking Swiper JS | swiper-bundle.min.js (40.5KB) blocks 1,950ms — included even on pages without carousels | ~2s mobile | Conditionally load Swiper only where needed, or defer with defer attribute |
| 2 | Render-blocking CSS | theme.css (29.5KB) blocks 1,500ms, custom.css (15.1KB) blocks 1,050ms | ~1.5s mobile | Inline critical CSS in <head>, defer non-critical stylesheets with media="print" onload="this.media='all'" |
| 3 | 20.4s pre-resource delay on mobile | LCP element not discoverable for 20+ seconds due to blocking scripts before the <img> | ~18s mobile | Move all non-critical scripts (Swiper, Perf Kit, shop-cart-sync) to defer or load after DOMContentLoaded |
| 4 | Shopify Perf Kit | b032da393w19368061p0cc732e2m671615c3m.js (970KB!) — enormous script from Shopify app | ~672KB transfer | Audit which app injects this script; consider removing if not essential |
| 5 | Unused CSS | theme.css offers 23.9KB savings, custom.css offers 13.9KB savings via minification/compression | ~42KB total | Purge unused CSS (Shopify themes ship CSS for all sections) |
🟡 High (200ms–1s savings)
| # | Issue | Evidence | Savings | Recommendation |
|---|
| 6 | Google Tag Manager bloat | GTM loads 613.7KB across 4 scripts (G-XNEJYP8X2K, AW-108.., GTM-WBZC8KBZ, plus gtag/js), consuming 529ms main thread time | ~306KB transfer | Consolidate GA4 + Google Ads into single gtag.js call; load GTM with defer instead of synchronous <head> injection |
| 7 | Facebook Pixel | 102KB main script + 61KB config, 109ms main thread — particularly impactful on mobile | ~164KB total | Load FB Pixel after user interaction or on requestIdleCallback |
| 8 | Gokwik scripts | 42KB + 8KB scripts from pdp.gokwik.co | ~50KB | Defer loading until checkout or product page interaction |
| 9 | Large product images | Product images averaging 700-800KB each; up to 1,338KB estimated savings per product image | ~1.3MB potential | Serve WebP/AVIF, use proper srcset widths, compress to <200KB per image |
| 10 | Video element on homepage | fec8fc3...HD-720p-3.0Mbps.mp4 (1,995.6KB!) — autoplay video consuming 2MB of data | ~2MB | Convert to compressed WebM, reduce resolution, or remove autoplay; use poster image only |
| 11 | Video poster image | preview_images/fec8fc35eeab4e2e90b55579354...jpg (1.8MB!) serving as <video poster> | ~1.3MB | Compress poster image to <50KB, serve WebP |
| 12 | Hero banner image (mobile) | Pink_Moon_Banner-March_Mob.jpg — oversized for mobile | ~24KB | Serve properly sized mobile image via srcset |
| 13 | More than 4 preconnect connections | 5 preconnect links found (Shopify CDN x2, Cloudflare CDN, Google Fonts, etc.) | — | Reduce to 2-3 most important origins (Shopify CDN + Google Fonts) |
🟡 Medium
| # | Issue | Evidence | Savings | Recommendation |
|---|
| 14 | Inefficient cache lifetimes | 259KB of resources have short cache TTLs | ~259KB re-download | Set long Cache-Control: max-age=31536000 for versioned static assets |
| 15 | DOM size: 3,977 elements | Deep DOM tree with complex navigation mega-menu | — | Simplify mega-menu markup; reduce nested <group> elements |
1.5 Resource Transfer Summary
Mobile Total: ~152KB HTML + ~2,100KB images + ~970KB JS + ~56KB CSS + ~300KB 3rd-party = ~3.6MB
| Category | Transfer Size | Request Count |
|---|
| Images (1st party) | ~2,100KB | ~20 |
| JavaScript (1st party) | ~1,130KB | ~15 |
| CSS (1st party) | ~50KB | ~5 |
| 3rd-party (GTM, FB, Gokwik, Clarity, Fonts) | ~370KB | ~12 |
| Video | ~2,000KB | 1 (poster ~1.8MB) |
| Total | ~3,650KB | ~63 requests |
2. Accessibility Audit
2.1 Critical Issues
| # | Issue | Elements | WCAG |
|---|
| 1 | 29 images missing alt attribute | Collection thumbnails (sub_category_image_*.png, TOP_CROP_BLK_1.jpg, 64.jpg, etc.) have no alt | A — Screen readers announce "image" with no context |
2.2 High Priority Issues
| # | Issue | Elements | WCAG |
|---|
| 2 | 1 image with empty alt="" | 17_3_1.png — unclear if decorative; if content, needs description | A |
| 3 | H1 is logo text on homepage | <h1>The Pink Moon</h1> — no keyword content for search engines | Best Practice |
| 4 | src="" on editorial images | "THE CASUAL EDIT", "THE VACATION EDIT", "THE OFFICE EDIT", "THE PARTY EDIT" have empty src | A — Broken image references |
2.3 Positive Findings
- ✅
<html lang="en"> declared — screen reader pronunciation works
- ✅
<meta name="viewport"> present — mobile-friendly, though maximum-scale=1.0 prevents user zoom
- ✅ Skip to content link present
- ✅ Breadcrumb navigation visible on product pages
- ✅ BreadcrumbList schema on homepage
- ✅ Logical heading hierarchy on product page (H1 → H4 → H6)
- ✅ ARIA attributes used appropriately (aria-label, aria-modal, role="dialog" on quick-buy/newsletter)
- ✅ Form inputs have associated labels (newsletter email)
- ✅ Button elements used for interactive controls (not
<div>)
2.4 Accessibility Issues Summary
| Severity | Count |
|---|
| Critical (missing alt) | 29 images |
| High (empty alt + empty src) | 2 images + 4 empty src |
| Medium (H1 content, viewport scale) | 2 items |
| Positive findings | 10+ items |
3. SEO Audit
3.1 Technical SEO
| Check | Status | Detail |
|---|
| robots.txt | ✅ Good | Properly disallows /admin, /cart, /orders, /accounts, /search, sort params, filter params; includes Sitemap directive (listed twice — minor issue) |
| XML Sitemap | ✅ Present | Shopify-generated: 373 products, 137 collections, 22 pages, 98 blog posts |
| Canonical URLs | ✅ Good | Product page has proper self-referencing canonical |
| HTTPS | ✅ Enforced | Cloudflare serves HTTPS; HSTS with long max-age |
| Indexation | ✅ Likely | No noindex tags detected; sitemap properly referenced |
| URL Structure | ✅ Good | /products/slug, /collections/slug, /blogs/news/slug — clean and descriptive |
| Page Speed | 🔴 Poor (mobile) | LCP 22.6s on mobile — direct ranking signal failure |
| Mobile-Friendly | 🟡 Partial | Viewport configured, but maximum-scale=1.0 limits pinch-to-zoom |
| Mixed Content | ✅ None | All resources load over HTTPS |
| Redirect chains | ✅ Clean | No redirect chains detected |
| Sitemap in HTML head | ❌ Missing | <link rel="sitemap"> not present in HTML <head> |
3.2 On-Page SEO
Homepage:
- Title: "Plus Size Clothing for Women Online - XXL Size | The Pink Moon" — 62 chars ✅ good length, keyword near start ✅
- Meta Description: "Embrace your curves with The Pink Moon, a dedicated online store for trendy plus clothing for women. From trendy dresses, tops to pants, we have all sizes starting from L to 10 XL." — 189 chars ⚠️ slightly over 160 recommended, but acceptable
- H1: "The Pink Moon" — logo text only ⚠️ no keyword targeting; Google may discount
- Content below the fold: Homepage is primarily visual (sliders, carousels) with minimal text content above the fold
Product Pages:
- H1: Product name with size — "Pure Cotton Thread Embroidered Top" ✅ keyword-rich
- Meta Description: Auto-generated from product description ✅
- Structured Data: Product schema present but minimal (see schema section below)
- Internal Links: Related products not visible on product page template
Collection Pages:
- Carousel imagery with only category names (TOPS, BOTTOM WEAR, DRESSES, CO-ORDS, HUG ME) — no text content blocks for SEO
- Editorial section names (THE CASUAL EDIT, THE VACATION EDIT) are image-only with
src="" — broken rendering
3.3 Structured Data (JSON-LD)
Schema Present on Homepage:
| Schema | Status | Notes |
|---|
| BreadcrumbList | ✅ Present | Home > current page |
| WebSite | ✅ Present | With SearchAction for sitelinks |
Schema Present on Product Pages:
| Schema | Status | Notes |
|---|
| ProductGroup | ⚠️ Wrong type | Uses ProductGroup instead of Product — this is a known Shopify issue since new structured data rollout |
| Brand: "Tops" | ⚠️ Wrong value | Brand name is "Tops" instead of "The Pink Moon" — entity mismatch |
| Category field | ✅ Present | "Clothing" |
| Description | ✅ Present |
| Price/Offer | ❌ Missing | No offers in Product schema — no rich price in SERPs |
| AggregateRating/Review | ❌ Missing | No review schema despite customer reviews showing in page (review names like "Deepika" visible) |
| SKU | ❌ Missing | No SKU in schema |
| Gtin/MPN | ❌ Missing |
Missing Schema Types:
| Schema | Impact | Priority |
|---|
| Organization | No entity panel, no logo/searchbox signal | High |
| WebSite + SearchAction | Present on homepage only — good | ✅ |
| Product (offers) | No price rich result | High |
| AggregateRating | No star ratings in SERPs | High |
| Article (blog posts) | No Google Discover eligibility | Medium |
| LocalBusiness | Missed local SEO signal (they have a physical store) | Medium |
| ItemList (collections) | No carousel rich result | Medium |
| FAQPage | No FAQ rich result | Low |
3.4 Image SEO
| Check | Status |
|---|
| Alt text on product images | ✅ Present (descriptive filenames used as alt) |
| Alt text on collection images | ❌ 29 images missing alt entirely |
| Descriptive filenames | ✅ Good (Pure_Cotton_Thread_Embroidered_Top1.jpg) |
| WebP/AVIF formats | ❌ Not used — all JPEG/PNG |
srcset responsiveness | ✅ Present on product images |
| Lazy loading on below-fold | ✅ loading="lazy" used |
| LCP image not lazy | ✅ loading="eager" + fetchpriority="high" on hero |
| Product image sitemap | ❌ Not present in XML sitemap |
4. International SEO
The site operates in English only (India), with content-language: en-IN header. No hreflang implementation needed for single-language operation.
5. Best Practices & Security
5.1 Security Headers
| Header | Value | Status |
|---|
| HSTS | max-age=7889238 (~91 days) | 🟡 OK, but short; recommend max-age=31536000; includeSubDomains; preload |
| X-Frame-Options | DENY | ✅ Good |
| X-Content-Type-Options | nosniff | ✅ Good |
| CSP | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests | 🟡 Weak — missing script-src, no object-src 'none', no Trusted Types |
| COOP | Missing | ❌ High priority fix — add Cross-Origin-Opener-Policy: same-origin |
| X-XSS-Protection | 1; mode=block | ✅ Present |
| X-Download-Options | noopen | ✅ Good |
| Referrer-Policy | Not set | 🟡 Add strict-origin-when-cross-origin |
| Permissions-Policy | Not set | 🟡 Consider adding |
5.2 Modern Standards
| Check | Status |
|---|
| HTML5 DOCTYPE | ✅ Present |
| UTF-8 charset | ✅ Declared |
| No document.write | ✅ None detected |
| No .map files in production | ❌ .js.map files accessible — v2/loader.init-shop-cart-sync.en.esm.js.map returns HTML 404 (JSON parse errors in console), but the mapping URLs are in JS source |
| jQuery version | 3.7.0 (current) ✅ |
| Source map errors | ❌ Console shows SyntaxError on .js.map files returning HTML — minor, but noisy |
| CSP frame-ancestors conflict | ❌ Console errors: "Framing 'https://shop.app/' violates CSP directive: frame-ancestors 'self' https://shop.app https://admin.shopify.com" — actual CSP has 'none' which conflicts with the more permissive frame-ancestors mentioned in the error |
5.3 Lighthouse Best Practices — Issues
| Issue | Severity | Recommendation |
|---|
CSP: script-src directive missing | High | Add script-src 'self' or appropriate directives |
CSP: object-src not set to 'none' | High | Add object-src 'none' |
HSTS max-age too low | High | Increase to 31536000 |
No includeSubDomains on HSTS | Medium | Add directive |
No preload directive on HSTS | Medium | Add if submitting to HSTS preload list |
| No COOP header | High | Add Cross-Origin-Opener-Policy: same-origin |
| Trusted Types not in CSP | High | Consider adding |
.js.map files returning HTML | Low | Fix source map serving or remove references |
6. Content Quality Assessment
6.1 Image Quality & Authenticity
- 150 total images on homepage — rich visual content
- Product images: Real photography with descriptive alt text — good for a fashion brand
- Collection images: Functional but 29 missing
alt attributes
- Video on homepage: Auto-playing store visit video (2MB) — high data cost without user consent
- AI-generated images: None detected by filename pattern
- Editorial images with
src="": 4 collection card images (THE CASUAL EDIT etc.) have empty src — broken rendering
6.2 UX Issues
| Issue | Detail |
|---|
| Newsletter popup blocking content | Full-screen modal newsletter drawer auto-opens after 5 seconds — aggressive for mobile |
Empty src on editorial images | "THE CASUAL EDIT", "THE VACATION EDIT", "THE OFFICE EDIT", "THE PARTY EDIT" appear as broken images |
| No cross-sell/upsell on product page | No "You may also like" or "Complete the look" section |
| Social proof | Customer reviews visible but not linked to structured data |
| Return policy | "All refunds will be processed as store credit only" — clearly stated, positive for trust |
| Trust badges on product page | Free Shipping, Easy Exchange, COD Available icons present ✅ |
6.3 Content Depth
- Product descriptions: Detailed with fabric info, measurements, fit notes, and care instructions ✅
- Blog: 98 blog posts — good content depth for SEO
- Collection pages: Primarily image-based carousels with minimal text content ⚠️
- About/brand story: Not audited in scope (business analysis covers this)
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|
| 1 | Fix render-blocking JS causing 20.4s mobile pre-resource delay | LCP from 22.6s to potentially <4s | Medium — defer Swiper, Perf Kit, shop-cart-sync |
| 2 | Inline critical CSS + defer non-critical | Reduce FCP by ~1.5s on mobile | Medium — Shopify theme modification |
| 3 | Remove/replace 2MB video on homepage | Save 2MB mobile data, improve SI | Low — replace with poster image only |
| 4 | Compress/Fix product images (700KB+ each) | Save ~1.3MB per product page | Medium — bulk WebP conversion |
| 5 | Add alt text to 29 images missing it | Accessibility + image search | Low — bulk Shopify admin update |
| 6 | Fix 4 editorial images with src="" | Broken visual content | Low — replace with proper images |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|
| 7 | Add Product offers (price) to structured data | Price rich results in SERPs | Medium — Shopify themeLiquid edit |
| 8 | Fix Product schema type (Product → correct implementation) | Proper rich result eligibility | Medium |
| 9 | Fix Brand name in schema ("Tops" → "The Pink Moon") | Entity consistency | Low |
| 10 | Add Organization + LocalBusiness schema | Local SEO for Bangalore store | Medium |
| 11 | Add AggregateRating/Review schema to product pages | Star ratings in SERPs | Medium — Shopify app or theme edit |
| 12 | Consolidate GTM scripts (4 → 1) and defer | Reduce 614KB GTM to ~180KB | Low |
| 13 | Load Facebook Pixel on interaction, not onload | Improve mobile performance | Low |
| 14 | Reduce header maximum-scale=1.0 to allow zoom | Accessibility | Low |
| 15 | Add link rel="sitemap" to HTML head | Sitemap discovery | Low |
| 16 | Fix robots.txt duplicate Sitemap entries | Clean robots.txt | Low |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|
| 17 | Strengthen CSP with script-src and object-src | Security | Medium |
| 18 | Add COOP header | Security | Low |
| 19 | Add hreflang for Hindi/regional languages | If expanding to multilingual | Medium |
| 20 | Add FAQPage schema to key pages | Rich results | Medium |
| 21 | Add Article schema to blog posts | Google Discover | Medium |
| 22 | Implement breadcrumbList on collection pages | SERP navigation | Medium |
| 23 | Reduce DOM depth (3,977 elements → target <2,000) | parse performance | High — redesign navigation |
| 24 | Upgrade HSTS to 1 year + preload | Security | Low |
| 25 | Add Referrer-Policy and Permissions-Policy headers | Security | Low |
Summary Score Card
| Category | Score | Grade |
|---|
| Performance (Mobile) | 35/100 | 🔴 F |
| Performance (Desktop) | 73/100 | 🟡 C |
| Accessibility | 70/100 | 🟡 C |
| Best Practices | 78/100 | 🟡 C |
| SEO | 72/100 | 🟡 C |
| Content Quality | 75/100 | 🟡 C |
| Security | 65/100 | 🟡 D |
| Mobile:Desktop Gap | 8.4x LCP | 🔴 Critical |
| Overall | ~68/100 | 🟡 D+ |
Data sources: Lighthouse v13 (PageSpeed Insights), browser DOM inspection, curl header analysis, Shopify sitemap analysis