Web Quality Audit: Project Skin (theprojectskin.com)
Website: https://theprojectskin.com Date: 25 August 2026 Platform: Shopify (theme 193763770739, Online Store 2.0) + Cloudflare CDN, INR pricing, Judge.me reviews, Tailwind (CDN), Swiper 11, DM Sans / Inter Tight / Lexend fonts Industry: Beauty & Personal Care — D2C acne skincare (flagship of Nureya Beauty and Wellness Pvt Ltd) Context: Early-stage brand (incorporated Sep 2025), 7 SKUs + 1 kit, India-only, no marketplace presence, 0 reviews live. Business analysis: business-analysis.md.
Executive Summary
Project Skin is built on a modern, well-structured Shopify foundation: SEO's automated crawl checks pass cleanly (Lighthouse SEO = 100), HTTPS/HSTS are enforced, canonicals are self-referencing, and the sitemap is correctly declared. The brand also publishes a solid trust layer (money-back guarantee, corporate policy, payment policy, contact + WhatsApp).
However, three areas drag real quality down:
- Performance is Poor in lab and fragile in the field. Lighthouse scores 40 (mobile) / 48 (desktop). The root cause is a runtime-compiled Tailwind CDN, a heavy
preconnectfan-out (~5+ origins), Swiper + Judge.me third-party JS, and render-blocking CSS — driving desktop Total Blocking Time to 1,220 ms. CrUX field LCP is still "good" (2.4 s at p75) but regressing month-over-month (2.18 s → 2.42 s), a warning sign for a brand scaling paid acquisition. - Best Practices fails (54) on both platforms. The Content-Security-Policy has no
script-src/object-srcdirective (so it cannot mitigate XSS), HSTSmax-ageis only ~91 days (noincludeSubDomains, nopreload), and COOP/COEP are absent. - On-page SEO and structured data are inconsistent. Meta descriptions are missing on every non-home, non-product page (about, FAQ, contact, money-back, blog, collection), inner-page title tags are keyword-less (the collection page literally titles itself "Home page – Project Skin"), and schema is thin — product pages emit
brand.name: "My Store"(the Shopify default instead of "Project Skin"), and there is no BreadcrumbList, FAQPage, Article, or LocalBusiness markup anywhere.
Accessibility is the strongest non-SEO dimension (80/82) but still has real defects: the homepage carries 6 <h1> elements (slider + logo), collection/contact/blog pages have 0 <h1>, and ~12 images per page ship without alt text.
Overall verdict: a technically competent but not-yet-production-hardened storefront. None of the issues are architectural; most are template-level fixes a Shopify dev can clear in 1–2 sprints. Priorities: fix the meta-description/title/H1/schema template gaps (cheap, high SEO + CTR impact), replace the Tailwind CDN with a compiled stylesheet, and tighten the security headers.
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 40 | 48 | 🔴 Poor |
| Accessibility | 80 | 82 | 🟡 Needs work |
| Best Practices | 54 | 54 | 🔴 Poor |
| SEO | 100 | 100 | 🟢 Good (automated; content gaps below) |
| Content Quality / E-E-A-T | — | — | 🟡 Needs work |
| Overall | — | — | 🟡 Mixed |
1. Performance Audit
1.1 CrUX Real-World Field Data
Source: CrUX Vis, origin theprojectskin.com, "as of 2026-08-22."
Core Web Vitals Assessment: Needs Improvement on Loading (LCP) — regressing; Good on Visual Stability (CLS); Not assessed on Interactivity (INP missing data — insufficient sample at this origin's traffic level).
| Metric | Value (p75, latest period 2026-07-26 → 2026-08-22) | Threshold (Good / Poor) | Rating |
|---|---|---|---|
| LCP | 2,421 ms (was 2,180 ms prior period) | ≤ 2,500 / > 4,000 ms | 🟡 Good but regressing |
| CLS | 0.00 | ≤ 0.10 / > 0.25 | 🟢 Good and stable |
| INP | Not available (insufficient sample) | ≤ 200 / > 500 ms | ⚪ Not assessed |
Form-factor (device) split is unavailable for this origin (below CrUX reporting threshold). Given a likely mobile-first Indian D2C audience, the LCP regression is the most important signal here: field LCP is creeping toward the 2.5 s "Good" boundary and will breach it if the trend continues.
1.2 Core Web Vitals (Lighthouse Lab Data)
Source: PageSpeed Insights, Lighthouse 13.4.1. (PSI REST API returned HTTP 429 / quota 0 — lab data captured via the PSI browser UI only, per environment constraint.)
| Metric | Mobile (Moto G Power, Slow 4G) | Desktop | Good / Poor |
|---|---|---|---|
| FCP | 5.5 s | 0.9 s | 🔴 / 🟢 |
| LCP | 18.2 s ⚠️ | 2.4 s | 🔴 / 🟢 |
| TBT | 630 ms | 1,220 ms | 🔴 / 🔴 |
| CLS | 0.00 | 0.004 | 🟢 / 🟢 |
| SI | 11.3 s | 4.3 s | 🔴 / 🔴 |
| Performance score | 40 (Poor) | 48 (Poor) | 🔴 |
Interpretation note: The mobile LCP of 18.2 s is an artifact of Lighthouse's Slow-4G + CPU throttling on a JS-heavy page; it should not be read as the real-user number (CrUX field LCP = 2.4 s). The trustworthy, throttle-independent signal is TBT = 1,220 ms on desktop — that is a genuine main-thread-blocking problem regardless of network, and it is what's pulling the score into the red.
1.3 LCP Phase Breakdown (Mobile)
Lighthouse lists the mobile LCP as render-blocking-request-bound. The two expanded "Insights" groups most relevant:
- Render-blocking requests — Est. savings 2,530 ms (mobile) / 360 ms (desktop).
- LCP request discovery and LCP breakdown groups are present (content collapsed in the AX tree).
The dominant pattern: the browser must download and parse a large JS/CSS chain before the hero renders. With Tailwind delivered via the Play CDN (https://cdn.tailwindcss.com, preloaded as="script"), the browser compiles the entire utility CSS at runtime on every page load — a well-known performance killer that also inflates TBT.
1.4 Performance Issues by Impact
Critical (>1 s est. savings — mobile lab)
| Issue | Evidence | Est. savings | Recommendation |
|---|---|---|---|
| Render-blocking CSS/JS chain | 103/200 headers emit 14 rel=preload/CSS + multiple rel=preconnect; Lighthouse "Render-blocking requests" = 2,530 ms (mobile) | 2.5 s (mobile) / 360 ms (desktop) | Inline critical CSS; defer/async non-critical theme JS; collapse preloads to real LCP path only |
| Tailwind compiled at runtime via CDN | link rel=preload as=script https://cdn.tailwindcss.com; Play CDN JIT compiles in-browser | Major TBT contributor | Replace with a built, purged Tailwind stylesheet served from Shopify assets (no CDN) |
| Third-party JS bloat | Swiper 11 (jsDelivr), Judge.me, Shopify Monorail, fonts | Adds to TBT 630–1,220 ms | Defer Swiper; lazy-load Judge.me widget; self-host fonts or use font-display: swap with preconnect only to fonts.gstatic (not googleapis CSS host where avoidable) |
High (200 ms–1 s)
| Issue | Evidence | Recommendation |
|---|---|---|
Excessive preconnect fan-out | Headers show 5 preconnects (Shopify CDN ×2, fonts.googleapis, jsDelivr, Tailwind CDN); Lighthouse warns ">4 preconnect connections found" | Trim to 2–3 highest-value origins (Shopify CDN, font host) |
| Inefficient cache lifetimes | Lighthouse "Use efficient cache lifetimes" = 287 KiB (mobile) / 384 KiB (desktop) est. | Ensure static assets carry long Cache-Control (Shopify CDN usually does; verify theme assets) |
| Unoptimized image delivery | "Improve image delivery" = 93 KiB est. (desktop); hero/collection PNGs served full-size | Serve WebP/AVIF, add srcset, right-size hero images |
Medium / Low
- Legacy JavaScript = 36 KiB est. (desktop) — polyfill/transpile cleanup.
- No COOP/COEP headers (neutral for perf, see §5).
1.5 Resource Transfer Summary (qualitative)
| Category | Notes |
|---|---|
| Images | Hero + product PNGs (some full-size, e.g. Screenshot_2026-07-23_014448.png); image:image in product sitemap present |
| JS | Tailwind Play CDN (runtime compile), Swiper 11 bundle (jsDelivr), Judge.me, Shopify theme + Monorail |
| CSS | 14 component-*.css preloaded; Tailwind runtime |
| 3rd-party | Shopify CDN, Google Fonts, jsDelivr, Tailwind CDN, Judge.me CDN, Cloudflare |
2. Accessibility Audit
2.1 Critical Issues
- Multiple
<h1>on the homepage (6). Live DOM shows H1s for each of the 5 hero-carousel slides ("Where Dermatology Meets Daily Care", "India's First Multi-Action Encapsulated Boba Cream", "It's Not Only Niacinamide…", "Because Every Percentage Matters.", "Track Your Skin's Daily Needs!") plus the logo link. Screen readers and Google treat this as ambiguous document structure. - Zero
<h1>on collection, contact, and blog pages (verified via server-rendered HTML: collection/contact/blog each returnH1 count: 0). A page with no top-level heading fails WCAG 2.4.6 and weakens topical signal.
2.2 High Priority Issues
- ~12 images per page missing
alt(consistent across home, product, collection, about, FAQ, contact, money-back, blog). The recurring offenders are the mega-menu flyout graphicsshop_menu_slider.png/_2/_3(rendered 3–4× each). Decorative icons should usealt=""; content/logo images need real alt. - One logo image ships
alt=""(LOGO_PNG.jpg) — acceptable only if truly decorative; the footer/header logo should carryalt="Project Skin". <html lang="en">is set (good), but the store iscontent-language: en-IN— considerlang="en-IN"for correct regional pronunciation/segmentation.
2.3 Positive Findings
- Skip-to-content link present (top of DOM: "Skip to content").
- Viewport meta present; HTTPS enforced.
- Color-contrast not flagged by Lighthouse; tap targets generally adequate.
- Headings otherwise use a logical H2/H3 hierarchy for content sections (product names, value props, FAQ-style blocks).
3. SEO Audit
3.1 Technical SEO
| Check | Status | Evidence |
|---|---|---|
| robots.txt | ✅ | Crawlable; Sitemap: directive present; disallows /cart/, /checkout, /account, AJAX surfaces, filter/sort traps |
| XML Sitemap | ✅ | sitemap.xml index → products, collections, pages, blogs sub-maps; products include <image:image> |
| Canonical URLs | ✅ | Self-referencing on all sampled templates |
| Indexation | ✅ | No noindex found; all key pages in sitemap |
| URL structure | ✅ | Descriptive, hyphenated, keyword-rich (/products/5-niacinamide-serum-acne-prone-skin) |
| HTTPS | ✅ | Enforced; HSTS present (but weak — see §5) |
| Mobile-friendly | ✅ | Responsive; viewport configured |
| Crawl traps | ⚠️ | robots.txt disallows /+, %2B*, filter combos — good; verify no internal links to those params |
Lighthouse SEO = 100 (mobile & desktop) — the automated crawler sees a clean, indexable, mobile-friendly page. That score reflects the homepage only; it does not surface the content-level gaps below, which matter for ranking the long tail.
3.2 On-Page SEO Issues
Title tags — inconsistent.
| Page | Title | Problem |
|---|---|---|
| Home | "Project Skin – Science-Backed Acne Skincare, Built for Indian Skin" (75 chars) | ✅ Strong, keyword-led |
| Product | "5% Niacinamide Serum for Oily & Acne-Prone Skin | Project Skin" | ✅ Good |
| Collection | "Home page – Project Skin" | 🔴 Wrong — collection falls back to default "Home page" title; no collection keyword |
| About / FAQ / Contact / Money-Back / News | "About – Project Skin", "FAQ – Project Skin", "Contact Us – Project Skin", "Money-Back Guarantee – Project Skin", "News – Project Skin" | 🟡 Keyword-less; brand-only. Add target query (e.g. "About Project Skin – Science-Backed Acne Skincare") |
Meta descriptions — missing on most templates (HIGH).
| Page | Meta description |
|---|---|
| Home | ✅ Present (259 chars) |
| Product | ✅ Present (449 chars) |
| Collection | 🔴 Missing |
| About / FAQ / Contact / Money-Back / Blog | 🔴 Missing |
This is the single highest-leverage SEO fix: 6 of 8 template types ship no meta description, so Google either auto-generates a weak snippet or uses the generic homepage blurb (the og:description on inner pages is literally the homepage paragraph). Fixing this is a bulk Liquid edit — low effort, direct SERP-CTR gain.
Open Graph / Twitter Card — present on all templates (good), but every non-product page reuses the homepage og:description and a logo-only og:image. Product pages do get a product og:image. Recommend product/collection-specific OG images.
Internal linking / keywords — homepage links to all 6 products + collection; nav is shallow. No blog content yet to build topical depth (see §6).
3.3 Schema Markup
| Type | Home | Product | Inner pages | Verdict |
|---|---|---|---|---|
| Organization | ✅ | ✅ | ✅ | Present, but sameAs contains 5 empty-string entries (malformed — should omit blanks) |
| WebSite + SearchAction | ✅ | — | — | ✅ Good (enables sitelinks search box) |
| ProductGroup / Product | — | ✅ | — | ⚠️ brand.name: "My Store" — Shopify default, not "Project Skin" (breaks entity consistency + rich-result brand signal) |
| AggregateRating / Review | — | ❌ | — | Expected empty (0 reviews) — see §6 |
| BreadcrumbList | ❌ | ❌ | ❌ | Missing everywhere despite visual breadcrumbs |
| FAQPage | — | — | ❌ (FAQ page) | Missing — high-value rich-result opportunity |
| Article | — | — | ❌ (blog) | Missing — blocks Discover eligibility |
| LocalBusiness | — | — | ❌ | Missing (no physical store, but Dermatologist-led Indian brand could use MedicalOrganization/Brand) |
Schema bugs to fix first: (1) brand.name = "My Store" → "Project Skin"; (2) remove empty sameAs strings; (3) add BreadcrumbList to all templates; (4) add FAQPage to /pages/faq (it already has Q&A content ripe for markup).
3.4 Image SEO
- Filenames are non-descriptive (
Screenshot_2026-07-23_014448.png,C3630762-96EB-4254-8CEF-1242DB403429_1.png,1.jpg). These read as design mockups / screenshots / placeholders, not optimized product photography (see §6.1). Rename to keyword-rich files on upload. altmissing on ~12 images/page (see §2.2).
4. International SEO
Not applicable — single locale. The store ships one language/region (content-language: en-IN, India-only pricing/shipping). No hreflang is therefore neither required nor expected. Recommended: keep a single clean en-IN locale; if a future en global storefront is added, implement reciprocal hreflang on all templates (Shopify only emits it on the homepage by default — a known pitfall). No action needed today.
5. Best Practices & Security
5.1 Security Headers (from curl -sI)
| Header | Value observed | Assessment |
|---|---|---|
| Content-Security-Policy | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests; | 🔴 No script-src or object-src — the CSP cannot mitigate XSS. Lighthouse penalizes this. Add at minimum script-src 'self' …; object-src 'none'. |
| Strict-Transport-Security | max-age=7889238 (~91 days) | 🟡 Below the 1-year recommendation; missing includeSubDomains and preload. Raise to max-age=31536000; includeSubDomains; preload. |
| X-Frame-Options | DENY | ✅ |
| X-Content-Type-Options | nosniff | ✅ |
| X-Download-Options | noopen | ✅ |
| X-XSS-Protection | 1; mode=block | ✅ (legacy, harmless) |
| Referrer-Policy | (not set) | 🟡 Add strict-origin-when-cross-origin. |
| COOP / COEP | absent | 🟡 Add Cross-Origin-Opener-Policy: same-origin (cheap, defense-in-depth). |
| Permissions-Policy | absent | 🟢 Optional. |
5.2 Modern Standards
- No
document.write, no synchronous XHR observed. Valid HTML5 + UTF-8. No mixed content (CSP enforces upgrade). ✅ - The CSP's lack of a
script-srcdirective is the primary driver of the 54 Best-Practices score; fixing it is a one-line header change with real XSS-defense value.
6. Content Quality Assessment
6.1 Image Quality & Authenticity
- Product imagery looks like exported mockups/screenshots, not studio photography. Evidence: filenames
Screenshot_2026-07-23_014448.png(the hero serum image),C3630762-96EB-4254-8CEF-1242DB403429_1.png(cleanser), and1.jpg(moisturiser). For a clinical/skincare brand where visual trust drives conversion, placeholder-grade imagery is a brand-authenticity risk (mirrors the skill's "AI/image-mismatch for trust-sensitive brands" severity logic). Recommend real product + texture + in-use photography with descriptive filenames. (Note: filenames alone cannot prove AI-generation; this is flagged as "verify these are genuine product shots," not a confirmed AI-image finding.) - Mega-menu flyout graphics (
shop_menu_slider*.png) are decorative duplicates — markalt=""rather than leavingaltabsent.
6.2 Trust Signals (strong baseline)
| Signal | Present? |
|---|---|
| Email (support@theprojectskin.com) | ✅ Contact page |
| WhatsApp (+91 84465 44458) | ✅ Contact page |
| Money-back guarantee page | ✅ /pages/money-back-guarantee |
| Corporate / payment / order-status / FAQ pages | ✅ All present |
| Business identity (Nureya Beauty, CIN on about) | ✅ |
| Customer reviews | 🔴 0 reviews live (Judge.me installed, un-seeded) |
| Certifications / lab-test proof on PDP | 🟡 Claimed in copy ("lab-tested", "250+ beta testers") but no visible certificate/badge asset |
6.3 Review / Social Proof
- Judge.me is installed on all PDPs but shows "Be the first to write a review" with (0) counts across the catalog. No
AggregateRating/Reviewschema can fire until reviews exist. Activating review collection is the top conversion + E-E-A-T lever (and a catalog gap already noted in the business analysis).
6.4 E-E-A-T
- Experience/Expertise: Strong narrative — dermatologist-formulated, 250+ beta testers, concentration transparency. Lacks named formulator/expert and visible credentials.
- Authoritativeness: No press/awards beyond a founder-investor platform feature; no external citations.
- Trustworthiness: Good policy/contact layer; undermined by zero reviews and placeholder imagery.
- Content depth: The blog (
/blogs/news) exists in the sitemap but has 0 posts — a missed topical-authority and "acne skincare India" organic-discovery channel.
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Add meta descriptions to collection, about, FAQ, contact, money-back, blog templates (Liquid {% if page_description %}…) | SERP CTR on long-tail | Low |
| 2 | Fix product brand.name from "My Store" → "Project Skin" in Product JSON-LD | Rich-result entity consistency | Low |
| 3 | Add script-src/object-src 'none' to CSP; raise HSTS to 1y + includeSubDomains; preload | Security score (54→~90+) + XSS defense | Low |
| 4 | Replace runtime Tailwind Play CDN with a compiled, purged stylesheet | Removes largest TBT/LCP drags | Medium |
| 5 | Add alt to the ~12 missing images/page (mark decorative shop_menu_slider* as alt="") | Accessibility + image SEO | Low–Med |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 6 | Collapse homepage to a single <h1>; add a real <h1> to collection/contact/blog pages | A11y + topical clarity | Low |
| 7 | Keyword-rich title tags for collection + inner pages (drop "Home page – Project Skin") | Ranking of inner pages | Low |
| 8 | Add BreadcrumbList schema site-wide + FAQPage on /pages/faq + Article on blog | Rich results | Medium |
| 9 | Trim preconnect to 2–3 origins; defer Swiper/Judge.me; verify cache lifetimes | Performance (TBT ↓) | Medium |
| 10 | Clean empty sameAs strings in Organization schema | Structured-data validity | Low |
| 11 | Product/collection-specific og:image + og:description | Social share quality | Low |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 12 | Replace mockup/screenshot product images with real studio/texture photography; keyword-rich filenames | Brand trust + conversion | Medium |
| 13 | Seed Judge.me reviews (post-purchase flow, beta-tester UGC) | Social proof + E-E-A-T + review schema | Low–Med |
| 14 | Launch the blog with "acne skincare India" educational content | Topical authority / organic discovery | Medium |
| 15 | Add Referrer-Policy + COOP: same-origin; consider lang="en-IN" | Hardening / regional correctness | Low |
| 16 | Monitor CrUX LCP trend (currently regressing 2.18→2.42 s); set alert before it crosses 2.5 s | Protect field CWV | Low |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | 40/100 | 🔴 Poor |
| Performance (Desktop) | 48/100 | 🔴 Poor |
| Accessibility | 80/100 | 🟡 Needs work |
| Best Practices | 54/100 | 🔴 Poor |
| SEO (automated) | 100/100 | 🟢 Good |
| Content Quality / E-E-A-T | ~65/100 (est.) | 🟡 Needs work |
| Overall | Mixed — strong SEO/trust foundation, weak perf + best-practices + on-page consistency | 🟡 |
Sources & Evidence
- Security/headers/robots/sitemap:
curl -sI https://theprojectskin.com/,curl …/robots.txt,curl …/sitemap*.xml(executed 2026-08-25). HSTSmax-age=7889238; CSPblock-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests;; no COOP/COEP/Referrer-Policy. - CrUX field data: CrUX Vis (
cruxvis.withgoogle.com), origintheprojectskin.com, "as of 2026-08-22": LCP p75 2,421 ms (regressing from 2,180 ms); CLS 0.00 ("good and stable"); INP "missing data"; form factors unavailable. - Lighthouse lab data: PageSpeed Insights UI (
pagespeed.web.dev), Lighthouse 13.4.1, report 2026-08-25 05:53 UTC. Mobile: Perf 40 / A11y 80 / BP 54 / SEO 100; FCP 5.5 s, LCP 18.2 s, TBT 630 ms, CLS 0, SI 11.3 s. Desktop: Perf 48 / A11y 82 / BP 54 / SEO 100; FCP 0.9 s, LCP 2.4 s, TBT 1,220 ms, CLS 0.004, SI 4.3 s. Est. savings: render-blocking 2,530 ms (mobile)/360 ms (desktop); cache lifetimes 287/384 KiB; image delivery 93 KiB; legacy JS 36 KiB; ">4 preconnect" warning. (PSI REST API returned HTTP 429 quota-exceeded — lab data sourced from the browser UI only.) - SEO/schema/DOM (server-rendered): Python fetches of home, product, collection, about, FAQ, contact, money-back, blog HTML — title/meta/canonical/lang/viewport/OG/Twitter/JSON-LD/H1/image-alt extracted. Key: inner-page meta descriptions missing; collection title "Home page – Project Skin"; product
brand.name:"My Store"; OrganizationsameAshas 5 empty strings; only Organization (+WebSite on home, +ProductGroup on product) schema present. - Live DOM/a11y: Browser console eval on
https://theprojectskin.com/— 72 images, 12 no-alt, 1 empty-alt, 6<h1>, 20<h2>, 34<h3>; skip-link present;lang="en". - Business context:
business-analysis.md(Nureya Beauty; 7 SKUs + kit; INR; Judge.me 0 reviews; India-only; no marketplace). - Image authenticity: product-sitemap
<image:image>+ page<img src>filenames (Screenshot_2026-07-23_014448.png,C3630762-…_1.png,1.jpg) indicate mockup/screenshot exports rather than descriptive product photography.
Caveat: Lighthouse mobile LCP (18.2 s) is a Slow-4G/CPU-throttle artifact and is not the real-user metric — use CrUX LCP (2.4 s) for field assessment. Lighthouse SEO=100 reflects the homepage only and does not capture the inner-page meta-description/title gaps documented above.