Web Quality Audit: Adoria Threads
Website: https://adoriathreads.com/ | Date: 2026-08-22 | Platform: Shopify (theme 135006290073) | Industry: Slow-fashion / made-to-order women's linen dresses Business context: Canadian micro slow-fashion studio (founder Lynn, Okanagan BC). 37 live dress SKUs, CAD $230–$270, made-to-order custom sizing, 2–5 wk lead time. D2C + Etsy (855 sales, 4.8/5) + Shop.app. ~126 D2C visits/mo. See business-analysis.md.
Executive Summary
Adoria Threads is a clean, well-structured Shopify store with strong SEO fundamentals (100/100) and good accessibility (93/100), but it is dragged down by a severe mobile performance problem and a handful of brand-integrity and structured-data gaps that matter disproportionately for a trust-led artisan brand.
The headline issue is mobile LCP of 16.8s — 6.7× Google's "Poor" threshold — caused by a JS-heavy Shopify theme rendering the page on a throttled mobile device. Desktop LCP is fine (2.5s), so this is a mobile-rendering pathology, not a server problem. For a discovery-constrained brand (126 visits/mo), a 16.8s mobile load is effectively a wall: any organic or social mobile visitor bounces before the hero renders.
Two findings are brand-critical for an artisan positioning:
- No structured data on the homepage or site-wide (no Organization, WebSite, BreadcrumbList JSON-LD) — the brand forfeits rich results and entity signals.
- A leftover competitor email (
hello@nangthelabel.com) appears in the product-page shipping/sizing copy — a copy-paste artifact from another store that undermines the handmade, personal brand promise.
| Category | Mobile Score | Desktop Score | Grade |
|---|---|---|---|
| Performance | 49 | 58 | 🔴 Poor |
| Accessibility | 93 | 93 | 🟢 Good |
| Best Practices | 62 | 62 | 🟡 Needs work |
| SEO | 100 | 100 | 🟢 Good |
| Overall (avg) | 76 | 78 | 🟡 Mixed |
Mobile-vs-desktop Performance gap: 16.8s vs 2.5s LCP = 6.7× — flag this ratio explicitly; mobile is the priority.
1. Performance Audit
1.1 CrUX Real-World Field Data
Core Web Vitals Assessment: Not assessed. The origin adoriathreads.com is not present in the Chrome UX Report — confirmed two ways: (a) cruxvis.withgoogle.com returned no data after searching the origin; (b) PageSpeed Insights shows "No Data / Discover what your real users are experiencing" for both mobile and desktop. This is expected: per the business analysis, D2C traffic is ≈126 monthly visits, well below the ~500–1,000 visit CrUX reporting threshold. All performance figures below are Lighthouse lab data (emulated), not field data.
1.2 Core Web Vitals (Lighthouse Lab Data)
| Metric | Mobile | Rating | Desktop | Rating | Threshold (Good / Poor) |
|---|---|---|---|---|---|
| FCP | 3.8s | 🔴 Poor | 0.5s | 🟢 Good | ≤1.8s / >3.0s |
| LCP | 16.8s | 🔴 Poor | 2.5s | 🟢 Good* | ≤2.5s / >4.0s |
| TBT | 530ms | 🔴 Poor | 480ms | 🟡 Needs Improv | ≤200ms / >600ms |
| CLS | 0 | 🟢 Good | 0.135 | 🟡 Needs Improv | ≤0.10 / >0.25 |
| SI | 6.0s | 🔴 Poor | 1.7s | 🟢 Good | ≤3.4s / >5.8s |
| Perf score | 49 | 🔴 | 58 | 🔴 | — |
*Desktop LCP 2.5s sits exactly on the Good boundary — one regression pushes it to Needs Improvement.
1.3 LCP Phase Interpretation (Mobile)
Mobile LCP of 16.8s is dominated by the JS-render-blocking pattern typical of Shopify themes: 75 <script> tags, render-blocking CSS/JS (650ms estimated savings), and >4 preconnect connections (Lighthouse warns these should be used sparingly). The page's main-thread work is 2.8s and JS execution 1.6s — the browser cannot even discover the LCP element until the theme's JavaScript hydrates. This is a pre-resource-delay problem, not an image-size problem (image-delivery savings are only 87KiB).
1.4 Performance Issues by Impact
🔴 Critical
- Mobile LCP 16.8s (6.7× Poor threshold). Root cause: JS-rendered Shopify theme blocks first paint on throttled mobile. Fix: defer/inline critical CSS, remove render-blocking apps, reduce preconnects to 2–3, lazy-load below-fold sections, consider a lighter theme or Dawn. Estimated savings: 650ms render-blocking + large JS reduction (704KiB unused JS).
- Enormous network payload: 3,262 KiB total (mobile). Reduce unused JS (704KiB), unused CSS (38KiB), legacy JS (36KiB), and serve properly-sized/WebP images.
🟡 High
- Desktop TBT 480ms / CLS 0.135 (both Needs Improvement). Cheap wins once JS is trimmed; CLS needs explicit
width/heighton images (Lighthouse flags layout-shift culprits). - Desktop Performance 58 still Poor despite good LCP — driven by the same JS bloat.
🟢 Low
- Minify JS (3KiB savings) — negligible; bundle with the JS-reduction work.
1.5 Resource Transfer Summary (Mobile)
- Total payload 3,262 KiB across JS (75 scripts), 3 stylesheets, 14 images (mostly lazy-loaded). 4 preconnects (warning). Cache lifetimes inefficient (321KiB could be cached longer).
2. Accessibility Audit
Score: 93/100 (Good). Strong baseline; issues are concentrated in image alt text and heading hierarchy.
2.1 Critical Issues
- None.
2.2 High Priority Issues
- Empty
alt=""on content/product images. Homepage: 13 of 14 images have empty alt (only the logo has descriptive alt). Product gallery thumbnails and carousel slides similarly lack alt. For a visual product brand this hides dresses from screen readers and image search. The hero/LCP image and product photos should carry descriptive alt (e.g., "Penelope in Raisin linen maxi dress"). - Heading hierarchy skip (h3 → h5) on homepage. Section headings run h2, h3, then jump to h5 (the "Adoria Threads is born from labour of love…" block is an h5). Insert an h4 or re-level to keep a logical order.
2.3 Positive Findings
- Skip-to-content link present (first focusable element).
- Single H1 per page (homepage H1 = brand/logo; product H1 = product name).
- Viewport meta present,
<html lang>present, meta description present. - No color-contrast failures (93 score implies passes).
- Form inputs (newsletter email, quantity, personalization) have associated labels.
- Logical landmark structure (header nav, main, footer nav).
3. SEO Audit
Score: 100/100 (Excellent). Technical SEO is the store's strongest dimension.
3.1 Technical SEO
| Check | Status |
|---|---|
| robots.txt | ✅ Well-formed; disallows cart/checkout/account; includes Sitemap: directive |
| XML Sitemap | ✅ Present (sitemap.xml index → products/pages/collections/blogs + agentic-discovery) |
| Canonical URLs | ✅ Self-referencing on homepage and product pages |
| HTTPS | ✅ Enforced site-wide (HSTS, no mixed content — CSP block-all-mixed-content) |
| Mobile-friendly | ✅ Viewport configured, responsive theme |
| URL structure | ✅ Clean, hyphenated, descriptive (/products/penelope-in-raisin) |
| Indexation | ✅ No stray noindex on key pages |
3.2 On-Page SEO Issues
lang="en"instead oflang="en-CA". The HTTPcontent-languageheader is correctlyen-CA, but the HTMLlangattribute is bareen. Low impact, but fix for precise Canadian locale signaling.twitter:imagemissing. Homepage and product pages emittwitter:card,twitter:title,twitter:descriptionbut notwitter:image— Twitter shares will show no preview image. Addtwitter:image(mirrorog:image).- Homepage title is keyword-light: "Adoria Threads - A Canadian Slow Fashion Brand Focused On Fiber Fabric" — acceptable (brand + descriptor), but a primary commercial keyword ("linen dresses", "made-to-order") would help non-branded discovery. Product titles are strong and keyword-rich.
3.3 Schema Markup
| Schema Type | Homepage | Product Page | Notes |
|---|---|---|---|
| Product | ❌ none | ✅ present | Product JSON-LD has name, image, brand, offers (24 variants, InStock, CAD) — good |
| Organization | ❌ none | ❌ none | Missing site-wide — forfeits entity/rich-result signals |
| WebSite + SearchAction | ❌ none | ❌ none | Missing sitelinks search box opportunity |
| BreadcrumbList | ❌ none | ❌ none | Missing on collection/product pages |
| AggregateRating / Review | n/a | ❌ none | Product reviews show (0) on-site; no review schema markup |
Critical SEO gap: the homepage (and entire site) emits zero JSON-LD. Only product pages carry Product schema. Adding Organization + WebSite + BreadcrumbList is a high-ROI, low-effort win (theme.liquid edit).
3.4 Image SEO
- Filenames are descriptive and human (
JINI0082_…jpg,Adoria_threads_logo_…png) — noIMG_1234junk. ✅ - Alt text absent on product/content images (see Accessibility 2.2) — this is also an image-SEO loss.
3.5 Internal Linking & 3.6 Keyword Targeting
- Primary nav links resolve correctly (
/collections/new-arrival-collection,/collections/all,/collections/dresses-collection). ⚠️ Note: the bare handle/collections/dressesreturns a 404 — the real handle isdresses-collection. Verify no template/footer link uses the bare/collections/dressespattern (the collection-context product URLs correctly use/collections/dresses-collection/products/…). - No keyword cannibalization observed; collection and product titles are distinct.
3.7 E-E-A-T Signals
- Experience/Expertise: Strong — About page narrates founder Lynn, generational sewing, French-seam craft, BC home studio.
- Authoritativeness: Off-site validation exists (Etsy 4.8/5, Trustpilot ~579) but is not surfaced on-site.
- Trustworthiness: Contact emails present (hello@, return@, marketing@), policies linked (Returns, Privacy, Order & Delivery, Garment Care). ⚠️ No physical street address or business registration number published (common for home studios; low priority but noted).
4. International SEO
Not applicable — single locale (CAD / en-CA). No hreflang needed. No shell-translation risk. Only fix: set <html lang="en-CA"> to match the content-language header.
5. Best Practices & Security
Score: 62/100 (Needs work). Concrete header-level findings (from curl -sI):
| Header | Value | Assessment |
|---|---|---|
strict-transport-security | max-age=7889238 (~91 days) | ⚠️ Missing includeSubDomains and preload |
content-security-policy | block-all-mixed-content; frame-ancestors 'none'; upgrade-insecure-requests | ⚠️ No script-src/object-src; not a real CSP — PSI likely flags "CSP not implemented" |
x-frame-options | DENY | ✅ |
x-content-type-options | nosniff | ✅ |
x-xss-protection | 1; mode=block | ✅ (legacy, harmless) |
server | cloudflare | ✅ |
| Mixed content | none | ✅ |
Findings:
- HSTS without
includeSubDomains/preload— subdomains not protected; addmax-age=31536000; includeSubDomains; preload. - No effective CSP — the directive only blocks mixed content and frames; it does not constrain scripts. For a payment-handling store, implement a real CSP with
script-src(Shopify requiresunsafe-inline+noncepatterns) andobject-src 'none'. - PSI Best Practices 62 on both platforms also likely reflects deprecated-API usage and/or missing image dimensions (CLS culprits) in the theme's third-party apps.
6. Content Quality Assessment
6.1 Image Quality & Authenticity
- No AI-generated images detected. Filenames (
JINI0082_…jpg, model-shot PNGs) and the Shopify CDN paths indicate real, professionally photographed garments on models. ✅ This is critical for an artisan "handmade/heirloom" positioning — the brand passes the authenticity test that would be a Critical failure for AI-generated product imagery.
6.2 Brand-Integrity Issue (High)
- Product pages contain a leftover competitor email:
hello@nangthelabel.com(in the sizing/shipping note: "…email us at hello@nangthelabel.com…"). This is a copy-paste artifact from another store's theme. For a brand whose entire promise is personal, handmade, founder-led service, a mismatched third-party email is a trust and brand-integrity failure — fix immediately (replace withhello@adoriathreads.com).
6.3 Trust Signals & Social Proof (High)
- No on-site reviews. Product pages show "Customer Reviews (0)" / "Store reviews (0)" with a "Write a review" button, but the brand's real social proof lives off-site (Etsy 4.8/5 across ~855 sales; Trustpilot ~579 reviews). For a trust-led brand with discovery as the bottleneck, surfacing Etsy/Trustpilot ratings on the D2C site is the single highest-ROI conversion fix (Low effort, High impact per business-analysis.md gap #13).
- Payment badges (Amex, Apple Pay, Visa, Mastercard, PayPal, Shop Pay, etc.) and policy links are present — adequate trust scaffolding.
6.4 UX Issues
- No broken primary navigation discovered; collection handles resolve.
- Newsletter capture, currency selector (CAD default, multi-region), and cart are functional.
- The 2–5 week lead-time message is prominent and honest (good for expectation-setting), but it is the main conversion friction — mitigate with the off-site review surfacing above.
7. Priority Recommendations
🔴 Immediate (This Week)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 1 | Fix mobile LCP (16.8s): defer/inline critical CSS, cut render-blocking JS, reduce preconnects to 2–3, lazy-load below-fold | Core Web Vitals + mobile bounce | High |
| 2 | Replace hello@nangthelabel.com with hello@adoriathreads.com in product template | Brand trust integrity | Low |
| 3 | Trim total payload (3,262 KiB): remove unused JS (704KiB) / CSS (38KiB), legacy JS | Perf score + TBT | Medium |
🟡 Short-Term (This Month)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 4 | Add Organization + WebSite + BreadcrumbList JSON-LD site-wide (theme.liquid) | Rich results, entity signals | Low |
| 5 | Add twitter:image mirroring og:image on all templates | Social share previews | Low |
| 6 | Add descriptive alt to product/carousel images (not empty alt) | A11y + image SEO | Medium |
| 7 | Surface Etsy/Trustpilot ratings on-site (widget/badge) | Conversion (trust) | Low |
| 8 | Set <html lang="en-CA"> to match content-language | Locale precision | Low |
| 9 | Implement real CSP (script-src + object-src 'none') and HSTS includeSubDomains; preload | Security best practices | Medium |
🟢 Long-Term (This Quarter)
| # | Issue | Impact | Effort |
|---|---|---|---|
| 10 | Fix heading hierarchy skip (h3→h5) on homepage | A11y correctness | Low |
| 11 | Add AggregateRating/Review schema once on-site reviews exist | Star ratings in SERPs | Medium |
| 12 | Explicit width/height on images to resolve desktop CLS 0.135 | Desktop CWV | Low |
| 13 | Add physical studio address / business number to About/Contact (optional) | E-E-A-T | Low |
Summary Score Card
| Category | Score | Grade |
|---|---|---|
| Performance (Mobile) | 49/100 | 🔴 Poor |
| Performance (Desktop) | 58/100 | 🔴 Poor |
| Accessibility | 93/100 | 🟢 Good |
| Best Practices | 62/100 | 🟡 Needs work |
| SEO | 100/100 | 🟢 Good |
| Content Quality | ~80/100 | 🟢 Good (real photos; minus no on-site reviews + brand-email artifact) |
| Overall | ~74/100 | 🟡 Mixed — fix mobile perf + 2 brand gaps |
Sources & Citations
- https://cruxvis.withgoogle.com/ — CrUX lookup for
adoriathreads.com: no data (origin not in dataset) - https://pagespeed.web.dev/ — Lighthouse 13.4.1 lab report, Aug 22 2026 (Mobile 49/93/62/100; Desktop 58/93/62/100; Mobile LCP 16.8s, FCP 3.8s, TBT 530ms, CLS 0, SI 6.0s; Desktop LCP 2.5s, TBT 480ms, CLS 0.135)
curl -sI https://adoriathreads.com/— security headers (HSTS, CSP, X-Frame-Options, etc.)curl -sL https://adoriathreads.com/robots.txt— robots directives + Sitemap referencecurl -sL https://adoriathreads.com/sitemap.xml— sitemap index (products/pages/collections/blogs + agentic)- Live browser DOM inspection (homepage, product
penelope-in-raisin, collectiondresses-collection): meta tags, JSON-LD schema types, alt-text counts, heading levels,nangthelabel.comemail artifact, image filenames - business-analysis.md — brand context, traffic (~126/mo), channels, review counts (Etsy 4.8/5, Trustpilot ~579)