VARNI STOREFRONTS · QUALITY AUDIT · 2026-07-12

Website-21 — lucira theme

Live site: https://website-21.varnijewels.com · Design reference: lucirajewelry.com

42/100 not-ready 16 critical · 11 major · 10 medium · 21 minor

Audited across three dimensions: launch readiness (functionality, SEO, performance, security, accessibility, analytics, brand), mobile QA (real device emulation, touch), and desktop QA (1920/1440/1366, hover + keyboard). Report-only — no purchase was completed.

Category scores

Launch-readiness scoring. Infra-only items are marked MANUAL and left unscored.

CategoryScoreVerdictDefects
Core functionality 35 fail 6
Performance & Core Web Vitals 58 warn 2
Technical SEO 25 fail 7
Security 30 fail 5
Frontend & responsive 68 warn 3
Backend (externally observable) 60 warn 2
Analytics & tracking 5 fail 1
Accessibility 85 pass 2
Brand consistency 15 fail 7
Marketing readiness 30 fail 4
Monitoring & maintenance manual 1

Lighthouse & Core Web Vitals

Lighthouse CLI, mobile emulation defaults.

PageformFactorperformanceaccessibilitybestPracticesseolcpclstbtfcpspeedIndexttiurl
homemobile0.730.950.960.924.9 s (score 0.28)0 (score 1)0 ms (score 1)2.9 s (score 0.54)5.5 s (score 0.54)4.9 s (score 0.78)
pdpmobile0.550.870.960.9212.5 s (score 0)0 (score 1)30 ms (score 1)8.6 s (score 0)20.0 s (score 0)12.5 s (score 0.14)https://website-21.varnijewels.com/products/05-carat-14k-rose-gold-igi-certified-lab-grown-round-cut-diamond-engagement-ring-with-half-pave-band-for-women-e-f-color-vs1-vs2-clarity

Launch-readiness findings

40 findings across functionality, SEO, security, performance, accessibility, analytics and brand consistency.

critical Every category/collection PLP route returns 0 products Core functionality

Navigating to /rings, /earrings, /bracelets, /necklaces, /pendants, /bestsellers, /solitaire(s), /9kt-collection, and /new-arrivals — all links present in the header/footer nav — renders 'NO PRODUCTS FOUND' / '0 Products'. Only the generic /products catalogue route returns real inventory (403 products). The backend category/menu/megamenu APIs return HTTP 200, so this is a category-to-slug/Meilisearch mapping gap, not a network failure. This breaks the CLAUDE.md bare-slug listing convention (`/<term>` should resolve as a Meilisearch category listing) for effectively every nav entry except the catch-all.

curl https://website-21.varnijewels.com/rings -> <title>Products</title>, body contains 'NO PRODUCTS FOUND'/'CLEAR ALL FILTERS'; w21-step3-plp-debug.json and w21-step4/5-category-check.json show identical 0-product result for every collection slug tested; screenshots w21-04-plp-rings.png

Fix: Fix the category/slug -> Meilisearch `categories` filter mapping for website-21's product catalogue so each nav category (rings, earrings, bracelets, necklaces, pendants, bestsellers, solitaire, 9kt-collection, new-arrivals) actually resolves its products. This is launch-blocking: a shopper cannot browse by category at all today.

critical robots.txt advertises a sitemap URL that 404s (S3 NoSuchBucket) Technical SEO

robots.txt Sitemap directive points to https://website-21.varnijewels.com/sitemaps/website-21.varnijewels.com-sitemaps/sitemap_index.xml, which returns HTTP 404 with an S3 <Error><Code>NoSuchBucket</Code><BucketName>varnijewels</BucketName> body. Search engines following robots.txt cannot discover the sitemap at all.

curl -s -o /dev/null -w '%{http_code}' -> 404; body: '<Error><Code>NoSuchBucket</Code><Message>The specified bucket does not exist</Message><BucketName>varnijewels</BucketName>...'

Fix: Provision the sitemap-hosting S3 bucket ('varnijewels') or repoint the Sitemap: directive to wherever this store's sitemap is actually generated/hosted.

critical PDP <title> and sitewide og:site_name leak reference-brand identity Technical SEO

PDP page <title> ends with '| JewelWeSell' (a reference/demo brand, not Website-21). Additionally, og:site_name is 'Boris&Twins' on the home page, /products, and the PDP alike — a completely different reference brand leaking into every page's Open Graph metadata, which is what search engines and social share cards will display as the site name.

curl PDP -> <title>...VS1-VS2 Clarity) | JewelWeSell</title>; curl home/products/PDP -> og:site_name" content="Boris&amp;Twins"

Fix: Fix the theme/SEO layer so PDP <title> suffix and og:site_name always derive from themeContent.brandName ('Website-21'), never a hardcoded/reference value.

critical /products catalogue page has an entirely wrong title, vertical, and brand Technical SEO

The /products page — the one route that actually returns inventory (403 products) — has <title>Women's Fashion Online — Stylish Dresses, Co-ord Sets & More | Arialshop</title>. This is not just a brand-name leak but an entirely wrong industry vertical (women's fashion/dresses vs. lab-grown diamond jewelry) and a third distinct reference brand ('Arialshop') from the JewelWeSell/Boris&Twins ones seen elsewhere.

curl https://website-21.varnijewels.com/products -> <title>Women's Fashion Online — Stylish Dresses, Co-ord Sets &amp; More | Arialshop</title>

Fix: This route's SEO metadata is pulling from an unrelated store's config entirely. Trace the /products route's title/meta source and force it to Website-21's own themeContent, independent of whatever store record 'Arialshop' belongs to.

critical Zero security response headers on home and PDP Security

No Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, or Strict-Transport-Security header present on either page tested.

curl -I https://website-21.varnijewels.com/ and curl -I .../products/... — headers present are only date, content-type, access-control-allow-origin:*, report-to/nel (Cloudflare), set-cookie, x-sveltekit-page, cf-cache-status, server, cf-ray. No security headers at all.

Fix: Add CSP, X-Frame-Options (or frame-ancestors in CSP), X-Content-Type-Options: nosniff, Referrer-Policy, Permissions-Policy, and HSTS at the edge (Cloudflare) or app layer, fleet-wide.

critical No analytics/tracking installed Analytics & tracking

No Google Analytics (gtag/GA4), Google Tag Manager, Meta/Facebook Pixel (fbq), or Microsoft Clarity script references found anywhere in the home page HTML. No dataLayer or conversion tracking of any kind detected.

curl home | grep -iE 'googletagmanager|gtag\(|dataLayer|fbq\(|facebook.net|clarity.ms' -> no matches

Fix: Install GA4 (with Enhanced Ecommerce events: view_item, add_to_cart, begin_checkout, purchase) and/or GTM before launch; without this the store has zero visibility into traffic, conversion funnel, or ad performance.

critical Reference brand identity leaks into mobile sidenav support contact Brand consistency

The mobile hamburger/sidenav 'SUPPORT CONTACT' block shows [email protected] and +(973) 399-9115, which do not match this store's own identity. The footer on the same page correctly shows [email protected] and +91 90000 00000 for Website-21.

Playwright headless capture of mobile sidenav (390x844): sidenav text includes 'SUPPORT CONTACT [email protected] +(973) 399-9115'; screenshot w21-03-mobile-sidenav.png

Fix: Trace the sidenav support-contact fields to their data source; they must read from themeContent (Website-21 identity) not the API store record, matching the footer's contact block.

critical og:site_name is 'Boris&Twins' sitewide (home, /products, PDP) Brand consistency

Every page tested emits og:site_name content="Boris&Twins" regardless of the correct <title> branding elsewhere. Anyone sharing a Website-21 link on social media will see 'Boris&Twins' as the site name in the preview card.

curl home/products/PDP -> og:site_name" content="Boris&amp;Twins" on all three

Fix: Fix og:site_name to derive from themeContent.brandName ('Website-21'), same fix as the JSON-LD/title brand-leak findings under SEO.

critical PDP <title> suffix leaks 'JewelWeSell'; /products page leaks an entirely different brand+vertical ('Arialshop') Brand consistency

See Technical SEO section for full evidence — repeated here because it is fundamentally a brand-consistency failure: three different non-Website-21 identities (JewelWeSell, Boris&Twins, Arialshop) appear across different pages of the same storefront.

PDP <title>...| JewelWeSell</title>; /products <title>...| Arialshop</title>; og:site_name=Boris&Twins

Fix: Audit every page-metadata source (title suffix, og:site_name, JSON-LD org name) for hardcoded/inherited reference-brand strings and force them all to themeContent.brandName.

major PLP filter and sort controls not interactable Core functionality

On the (broken, 0-product) /rings PLP, the Filter and Sort trigger buttons exist in the DOM but Playwright reports them 'not visible' / times out clicking them (they resolve to melt-ui dialog triggers with zero-size bounding boxes). Could not confirm price-range/faceted filtering or sort ordering works end-to-end.

w21-step2-plp-pdp-cart-checkout.json: sortInteractable:false, filterInteractable:false; w21-step3-plp-debug.json: sortErr2/filterErr2 'Element is not visible'

Fix: Re-test once category PLPs return real products (current 0-product state may itself be suppressing the filter/sort UI). If still not clickable/visible once products exist, fix the trigger button's layout/visibility.

major PDP — Lighthouse mobile shows severe load regression Performance & Core Web Vitals

Performance 55, Accessibility 87, Best Practices 96, SEO 92. LCP 12.5s (score 0 — critical fail), FCP 8.6s (score 0), Speed Index 20.0s (score 0), TTI 12.5s, TBT 30ms, CLS 0. A shopper on mobile waits ~8.6s to see anything and ~12.5s for the main product image/content to finish loading.

lh-website-21-pdp.json (mobile run) for /products/05-carat-14k-rose-gold-igi-certified-lab-grown-round-cut-diamond-engagement-ring-with-half-pave-band-for-women-e-f-color-vs1-vs2-clarity

Fix: Investigate PDP-specific blocking (likely large unoptimized product gallery images, render-blocking JS/CSS chunks per the large Link preload header, or slow API waterfall). This is launch-blocking for mobile conversion — most PDP visits will bounce before LCP.

major /sitemap.xml (conventional path) returns a JSON error, not XML Technical SEO

Requesting the conventional /sitemap.xml path returns a JSON body '{"message":"Sitemap not found, you can generate sitemap through the admin dashboard."}' with (implied) non-XML content, instead of a valid sitemap or a proper redirect to one.

curl https://website-21.varnijewels.com/sitemap.xml -> {"message":"Sitemap not found, you can generate sitemap through the admin dashboard."}

Fix: Generate the sitemap via the admin dashboard as the message instructs, or fix the S3 bucket so the robots.txt-declared sitemap resolves; either should also serve at /sitemap.xml.

major Malformed doubled-protocol JSON-LD URLs, including a missing path separator Technical SEO

Home page JSON-LD contains 'https://https://website-21.varnijewels.com/#organization' and 'https://https://website-21.varnijewels.com' (doubled protocol). PDP JSON-LD is worse: 'https://https://website-21.varnijewels.comjewelry' and 'https://https://website-21.varnijewels.comjewelry-rings' — doubled protocol AND a missing '/' between domain and path segment, producing an entirely invalid URL that no crawler/rich-result validator will resolve.

curl home | grep 'https://https://' -> 2 matches; curl PDP | grep 'https://https://' -> 'https://https://website-21.varnijewels.comjewelry', 'https://https://website-21.varnijewels.comjewelry-rings'

Fix: Fix the URL-concatenation helper used to build JSON-LD @id/url/breadcrumb fields — it appears to prepend a hardcoded 'https://' onto a value that already includes the protocol, and separately drops the '/' between domain and category slug on PDP breadcrumb schema.

major Category APIs return 200 but empty result sets Backend (externally observable)

/api/menu, /api/categories/all, /api/categories/megamenu, and /api/ms-autocomplete/products all return HTTP 200, but the category PLPs they back render 0 products — indicating a data/mapping problem (Meilisearch category field not populated for this store's product catalogue, or slug-to-category-id mismatch) rather than an outright API outage.

w21-step3-plp-debug.json netLog: all 200 except the expected /api/wishlists/me 422

Fix: Dev to check the product catalogue's category-slug attribute in Meilisearch/DB for website-21 — likely not backfilled for this store's import.

major Contact-us page shows three different, inconsistent email addresses and phone numbers Brand consistency

The /contact-us page's extracted text contains [email protected] (reference-brand leak), [email protected] (Varni's own internal/ops domain, not a customer-facing Website-21 address), and [email protected] (an unreplaced placeholder) — plus three different phone numbers (+1 (201) 268-4531, +91 90000 00000, +(973) 399-9115).

curl /contact-us | grep -oE email-regex -> [email protected], [email protected], [email protected]; phone regex -> +1 (201) 268-4531, +91 90000 00000, +(973) 399-9115

Fix: Consolidate to a single Website-21 support email and phone number sourced from themeContent, and remove all placeholder/reference values from this page.

major No analytics/conversion tracking (cross-ref) Marketing readiness

Same finding as Analytics & Tracking category — without GA4/GTM/pixel there is no way to measure marketing campaign performance or funnel drop-off pre-launch.

See Analytics & tracking category.

Fix: See Analytics & tracking category.

major Brand identity inconsistency undermines marketing/trust (cross-ref) Marketing readiness

The og:site_name/title brand leaks (JewelWeSell / Boris&Twins / Arialshop) directly damage shareability and trust — any social share or SEO snippet currently promotes a different brand identity than the storefront itself.

See Brand consistency category.

Fix: See Brand consistency category — this is the single highest-impact fix for marketing readiness.

medium Breadcrumb href mismatch on PDP Core functionality

PDP breadcrumb 'Rings' link resolves to '/jewelry-rings' in two of three captured breadcrumb hrefs, not the canonical '/rings' used elsewhere in the site (header/footer nav, direct category link).

w21-step6-cart-checkout-detail.json: breadcrumbRingsHref: ['/jewelry-rings','/jewelry-rings','/rings']

Fix: Standardize the ring category breadcrumb to the same canonical slug ('/rings') used by the rest of the site's navigation.

medium Duplicate/generic <title> across every category page Technical SEO

Every collection route tested (/rings, /pendants, /earrings, /bracelets, /necklaces, /bestsellers, /solitaire) shares the identical generic <title>Products</title>, with no category-specific title or meta description — a duplicate-title / thin-metadata pattern across the whole category tier.

curl /pendants, /rings -> both <title>Products</title>

Fix: Generate per-category titles/meta descriptions (e.g. 'Rings | Website-21 — Fine Lab Grown Diamond Jewelry') once category routing itself is fixed.

medium access-control-allow-origin: * on HTML responses Security

Both home and PDP HTML responses send 'access-control-allow-origin: *', an overly permissive CORS policy for full page HTML (normally unnecessary unless intentionally serving cross-origin embeds/widgets).

curl -I home/PDP -> access-control-allow-origin: *

Fix: Confirm this is intentional (e.g. for headless/embed use cases); if not required, scope it down.

medium Session cookie lacks visible Secure/HttpOnly/SameSite attributes Security

The litekart_store_id cookie is set with only Max-Age and Path — no Secure, HttpOnly, or SameSite attribute is present in the Set-Cookie header.

set-cookie: litekart_store_id=store_01KG2S7TF4HFHJQM0S3RYK73RM; Max-Age=31536000; Path=/

Fix: Add Secure; HttpOnly (if not read client-side); SameSite=Lax/Strict to the store-id cookie and audit other cookies (auth/session) for the same gap.

medium PLP filter/sort dialog triggers not visible/clickable in automated testing Frontend & responsive

See Core Functionality — same finding, cross-referenced here as a frontend interaction defect (melt-ui dialog trigger elements resolve but report zero-size/hidden).

w21-step3-plp-debug.json sortErr2/filterErr2: 'Element is not visible'

Fix: Manually verify in a real browser at desktop and mobile widths whether this is a genuine hidden-element bug or a headless-only artifact; fix if reproducible.

medium Favicon is a raw product photo, not a brand mark Brand consistency

The <link rel="icon"> points to a store product image (frame-...jpg) rather than a dedicated favicon/logo asset, so the browser tab icon is an arbitrary product photo rather than a recognizable Website-21 mark.

<link rel="icon" href="https://static.varnijewels.com/stores/store_01KG2S7TF4HFHJQM0S3RYK73RM/products/20260704/frame-150607-um6zraz0pth6.jpg"/>

Fix: Generate and wire a proper favicon (ico/png/svg) derived from the Website-21 wordmark/logo mark instead of a product photo.

medium No real social profile links found in footer HTML Marketing readiness

Searching the rendered home page HTML for facebook.com/instagram.com/twitter.com/x.com/pinterest.com/tiktok.com links returned no matches — no discoverable social presence links for trust/marketing purposes.

curl home | grep -oE 'href="https://(www\.)?(facebook|instagram|twitter|x|pinterest|tiktok)\.com...' -> no matches

Fix: Add real social profile links (not platform homepages) to the footer if Website-21 has active social accounts, or omit the section entirely rather than leaving it silently absent.

minor Repeated console noise from expected guest-wishlist 422 Frontend & responsive

Every page navigation logs a 422 + 'Invalid credentials' console error for the wishlist fetch. Expected behavior per known fleet pattern, but it pollutes devtools and could mask real errors during debugging.

consoleErrors arrays across all steps consistently show the same 422/wishlist pair

Fix: Optional: catch/silence this specific expected-401 case in the wishlist fetch handler.

minor Stray 'vvarni-storefronts' text in footer Brand consistency

Footer renders a stray line 'vvarni-storefronts' below the copyright line, reading as leftover debug/placeholder text rather than brand content.

Footer text capture: '... 2026 Website-21. All Rights Reserved. vvarni-storefronts'

Fix: Locate and remove/replace this stray string in the footer component/theme content.

info PDP variant selected-state visibility check — PASS Core functionality

Clicking a metal/size chip shows an unmistakable selected state: 2px solid dark maroon border (rgb(97,0,0)), matching dark text color, transparent/white background — readable and distinguishable from unselected chips.

w21-step2-plp-pdp-cart-checkout.json: variantSelectedStyle = {border:'2px solid rgb(97, 0, 0)', color:'rgb(97, 0, 0)', background:'rgba(0, 0, 0, 0)'}

Fix: None — meets the mandatory selected-chip contrast requirement.

info Add-to-cart, cart, and checkout-address flow work Core functionality

Add-to-cart from PDP succeeds; cart correctly shows item, chosen variant attributes (metal/carat/ring size), subtotal, and savings; quantity/remove controls work (remove-from-cart confirmed, cart not left in a broken state); Proceed to Shipping reaches /checkout/address with contact-details form rendering. Real payment was not attempted (per audit rules).

w21-step2 cartHasItem:true, cartSnippet shows correct variant attrs/subtotal; w21-step6-cart-checkout-detail.json: proceedClicked:true, urlAfterProceed='https://website-21.varnijewels.com/checkout/address', removeClicked:true, cartEmptyAfterRemove:false (item still present is expected since remove was tested on a re-added item, not last item); screenshots w21-09/10/11/12*.png

Fix: None for this slice. Re-verify once category browsing is fixed, since most shoppers would reach a PDP via category navigation, not a direct URL.

info Guest wishlist 422 is expected, not a bug Core functionality

Every page load fires a wishlist-fetch that 422s with 'Invalid credentials' for guest sessions. Per known fleet behavior this is expected (wishlist requires auth) and not a functional defect, though it does add console noise on every page.

Repeated across all steps: 'Failed to load resource: 422' + 'While fetching wishlist {message: Invalid credentials.}' on /api/wishlists/me

Fix: Optional: suppress the console error for the expected guest-401/422 case to keep devtools clean, but not launch-blocking.

info Home page — Lighthouse mobile Performance & Core Web Vitals

Performance 73, Accessibility 95, Best Practices 96, SEO 92. LCP 4.9s (poor), CLS 0 (perfect), TBT 0ms (perfect), FCP 2.9s (needs improvement), Speed Index 5.5s, TTI 4.9s.

lh-website-21-home.json (mobile run)

Fix: Improve LCP (likely hero image) via preloading, next-gen format, and reduced payload.

info Structured data present; HTTPS redirect and canonical correct Technical SEO

3 JSON-LD blocks present on home (Organization/JewelryStore, WebSite, ItemList — good baseline schema coverage beyond the URL bugs above). HTTP->HTTPS redirects with 308. Canonical tag present and correct on home ('https://website-21.varnijewels.com/').

curl -I http://... -> 308 Location: https://website-21.varnijewels.com/; curl home -> rel="canonical" href="https://website-21.varnijewels.com/"

Fix: None for these specific mechanics — fix the JSON-LD URL construction bug above without removing the schema types themselves.

info HTTPS/TLS itself is fine Security

Site serves over HTTP/2 via Cloudflare with a valid certificate (browser/curl connect without TLS errors) and HTTP is redirected to HTTPS (308).

curl -I http://website-21.varnijewels.com/ -> 308 Permanent Redirect to https://

Fix: None.

info Infra-only security items — MANUAL / ops Security

SQL-injection protection, admin-panel hardening/MFA, password policy, session timeout, rate limiting, CAPTCHA on forms, and dependency/vulnerability scanning cannot be assessed from the outside.

N/A — not externally observable

Fix: Ops team should confirm: API rate limiting on auth/checkout endpoints, admin panel MFA, password complexity rules, session expiry, and a recurring dependency vulnerability scan (npm audit / Snyk / Dependabot) for the shared api.varnijewels.com backend.

info Viewport meta correct; mobile hamburger/sidenav opens and renders Frontend & responsive

Viewport meta tag is properly configured (width=device-width, initial-scale=1.0, maximum-scale=5.0 — note max-scale=5 is reasonable and doesn't block pinch-zoom). Mobile sidenav opens correctly at 390x844 and shows category shortcuts and a mini product grid.

<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=5.0" />; w21-02/03-mobile-*.png

Fix: None.

info DB/queue/infra internals — MANUAL / ops Backend (externally observable)

Database indexing/query performance, memory usage, background job/cron/queue health, log/exception management, cache invalidation, load balancing, and autoscaling cannot be assessed from outside the API.

N/A — not externally observable

Fix: Ops to confirm via internal monitoring/logs on the shared api.varnijewels.com backend.

info Lighthouse accessibility scores are strong Accessibility

Home accessibility 95/100 (mobile), PDP accessibility 87/100 (mobile) — both solidly in the passing range.

lh-website-21-home.json, lh-website-21-pdp.json

Fix: Address whatever Lighthouse a11y audit flagged on PDP to close the 8-point gap versus home (not itemized in this pass; re-run a11y-specific Lighthouse categories audit for the line items).

info Home page images have alt attributes Accessibility

All 23 <img> tags on the home page HTML carry an alt attribute, and none were empty alt="" (which would be a red flag for meaningful product imagery).

curl home | grep -c 'alt=' -> 23 of 23 <img> tags

Fix: Spot-check that alt text is descriptive (e.g. product name) rather than generic placeholder text — not verified at the text-content level in this pass.

info Wordmark parity holds on header/footer/home-title Brand consistency

Header, footer, and home page <title>/og:title all consistently show 'Website-21' branding with no reference-brand leak on those three specific surfaces (the leaks are elsewhere: sidenav contact, og:site_name, PDP/products titles, contact page).

homeTitle='Website-21 — Fine Lab Grown Diamond Jewelry'; header text='WEBSITE-21'; footer heading='WEBSITE-21'

Fix: Use this as the template fix pattern — extend the same theme-content-wins resolution to og:site_name, PDP title suffix, /products metadata, sidenav contact block, and the contact-us page.

info Trust badges present in cart/checkout Marketing readiness

Cart/checkout pages display '100% SECURE PAYMENTS', 'EASY RETURNS', 'QUALITY ASSURANCE' trust badges, and 'SECURE 256-BIT ENCRYPTION' messaging near the CTA.

w21-step2 cartSnippet: '100% SECURE PAYMENTS EASY RETURNS QUALITY ASSURANCE'

Fix: None — keep, but consider adding review/rating trust signals on PDP as well (not confirmed present).

info Uptime/error/performance/log/SSL-expiry/backup monitoring — MANUAL / ops Monitoring & maintenance

None of uptime monitoring, error tracking (Sentry-equivalent), CDN health, DB health, SSL-expiry alerts, or Core-Web-Vitals field monitoring can be confirmed from outside the site.

N/A — not externally observable

Fix: Ops team to confirm what's configured fleet-wide (e.g. Dokploy health checks, Cloudflare analytics, an uptime pinger, and a CWV field-data tool such as GA4/CrUX) vs. what's still needed for website-21 specifically.

Mobile QA

Real mobile emulation (iPhone 13 (390x844, DPR3, touch on, Mobile Safari UA) via Playwright headless Chromium, Pixel 7 (412x915, DPR2.625, touch on, Chrome Mobile UA) via Playwright headless Chromium, Pixel 7 landscape spot-check (915x412)), touch interaction, thumb-driven journey.

critical Add to Cart is completely broken — no product can be added to bag PDP / Cart

Tapping ADD TO BAG on a PDP always fails silently. Network trace shows POST /api/carts succeeds (200) but the follow-up POST /api/carts/{cartId}/line-items always returns 400 {"message":"Variant id is required"} — regardless of whether color/cttw/ring-size chips were explicitly selected first. The cart drawer then opens showing 'EMPTY CART!! We didn't find any item inside cart.' No error toast is shown to the user; the UI gives no indication the add failed. Reproduced 3x on iPhone 13 profile (with 1 option selected, with all 3 option groups selected) and confirmed again on Pixel 7 profile — same 400 every time.

shots/w21m-iphone-25-atc-all-selected.png, shots/w21m-iphone-23-atc-verify2.png, shots/w21m-pixel-04-after-atc.png; network log: 400 POST /api/carts/{id}/line-items {"message":"Variant id is required"}

Fix: Fix the frontend variant-resolution logic so the selected option combination (color + cttw + ring size) resolves to a concrete variant id before the line-items POST fires; add a visible error toast if resolution fails. This is a full purchase-funnel blocker — nothing downstream (cart qty/subtotal, checkout address, payment) could be exercised because the cart can never contain an item.

critical Selected variant/option chips show no visible selected state (violates standing PDP rule) PDP

Color chips (14K Rose Gold / White Gold / Yellow Gold), center-stone weight chips (cttw), and ring-size chips are visually IDENTICAL before and after tapping — same border (1px solid rgb(209,213,219)), same transparent background, same text color. There is no border-color change, fill, checkmark, or any other affordance to show which option is currently selected. Confirmed on both iPhone 13 and Pixel 7 profiles for color chips and ring-size chips.

shots/w21m-iphone-18-color-chips.png, shots/w21m-iphone-19-size-chips.png, shots/w21m-iphone-24-all-options-selected.png — computed styles logged identical for selected vs unselected in both device profiles

Fix: Apply the standing selected-state rule for this fleet (2px primary/accent border + readable dark text on white for selected; plain gray border for unselected) to all PDP option-chip groups (color, cttw, ring size) in the lucira theme's option/variant component.

critical Wrong brand contact identity leaks into the mobile nav drawer Nav / Drawer

The hamburger drawer's 'SUPPORT CONTACT' section shows '[email protected]' and '+(973) 399-9115' — a different brand's ('Boris & Twins') email and phone number — instead of Website-21/Lucira contact details. Confirmed on iPhone 13 and Pixel 7.

shots/w21m-iphone-01-drawer-open.png, shots/w21m-pixel-02-drawer.png

Fix: Wire drawer support contact fields to themeContent/store settings for website-21/lucira, not a fallback/leftover value from a different tenant's data. Cross-check footer and any other surfaces (contact-us page, checkout) for the same leaked identity.

critical Every category slug landing page (e.g. /rings) shows 'NO PRODUCTS FOUND' — category browsing is broken PLP / Category navigation

Tapping any of the 'Shop by Category' links or drawer category links (BESTSELLERS, RINGS, EARRINGS, BRACELETS, NECKLACES, PENDANTS, 9KT COLLECTION) — all of which point to bare slug routes like /rings per this fleet's link convention — lands on a page reading 'NO PRODUCTS FOUND / CLEAR ALL FILTERS', even after an 8s wait. Network trace shows the page calls /api/ms-autocomplete/products?search= with an EMPTY search term instead of passing the category slug as the filter. The full catalogue route /products works fine and returns real products, proving the product data and search API are healthy — only the slug-route category resolution is broken.

shots/w21m-iphone-02-plp.png, shots/w21m-iphone-02b-plp-8s.png (still empty after 8s), shots/w21m-iphone-02c-allproducts.png (control, works); network: GET /api/ms-autocomplete/products?search= (empty)

Fix: Fix the (www)/[slug] route so it passes the resolved category slug into the Meilisearch categories filter instead of an empty search term. This breaks the primary category-based navigation path for every mobile shopper who taps a category chip/menu link instead of using the full-catalogue page.

major Two homepage collection banners overlap and render illegible, garbled text Home

The 'Our Bestsellers' banner heading and the 'Most in Demand' banner heading render stacked directly on top of each other at mobile width — both headlines become an unreadable overlapping mess ('Our Best[Mos]t in Demand'), and their 'Explore the collection' subtext also collides.

shots/w21m-demand-region.png (clear overlap), shots/w21m-recon-home.png (full page, same area)

Fix: Two adjacent full-bleed collection-banner sections are collapsing into the same layout box at mobile breakpoint (likely a missing height/margin on one card, or an absolute-positioned overlay bleeding into the next section). Give each banner card its own block height/margin at mobile widths so headings never overlap.

major Horizontal scroll and broken header appear in landscape orientation Home / Header (landscape)

Rotating to landscape (915x412 on the Pixel-7-class profile) shows document.scrollWidth 1081 vs clientWidth 915 (166px of horizontal overflow) — a real user would see a slice of content cut off / scrollable sideways. The header also drops the hamburger trigger and the 'Shop by Category' row entirely, replacing them with only account/search/cart icons — an in-between state that is neither the mobile drawer pattern nor a real desktop nav (no way to reach categories at all in this state).

shots/w21m-pixel-05-landscape-home.png; scroll metrics sw:1081 cw:915

Fix: Add a landscape-width breakpoint that keeps the mobile hamburger nav (or a usable category-accessible nav) instead of falling into a bare desktop-icon header with no way to browse categories, and find/fix the element causing the 166px horizontal overflow.

medium Variant option chips are under the 44px minimum tap-target height PDP

All PDP option chips (color, cttw, ring size) measure only 36px tall (widths vary 56-135px). Ring-size chips are packed 5-per-row with narrow gaps, making them cramped for thumb tapping, especially for users with larger fingers or on a jostled commute.

chip bounding-box dump from w21m-pdp-cart.cjs run: e.g. ring size '4.5' w:56 h:36

Fix: Increase chip min-height to ~44px (padding or explicit min-height) across all PDP option groups.

medium Hamburger drawer does not lock background scroll and has a large empty gap Nav / Drawer

With the drawer open, document.body computed overflow is still 'visible' (not hidden/locked) — the page behind the drawer can still scroll, which is disorienting and can cause scroll bleed-through. Separately, the drawer itself has a large empty vertical gap between the 'MY ACCOUNT' section header and the 'SUPPORT CONTACT' section — for a guest user, 'MY ACCOUNT' shows no links at all, just wasted space pushing contact info far down.

shots/w21m-iphone-01-drawer-open.png (empty gap visible); computed body overflow = 'visible' while drawer open

Fix: Lock body scroll while the drawer is open (overflow:hidden / scroll-trap). Either populate 'MY ACCOUNT' with guest-relevant links (Login/Register is already above it, so this section may be redundant for guests) or collapse it when empty.

medium Hamburger and cart tap targets are under the 44x44 minimum Header

The hamburger menu trigger measures ~18x18px CSS px, and the cart toggle button measures ~34x18px — both well under the ~44x44 thumb-friendly minimum, making them easy to mis-tap in a hurry.

boundingBox dump: .lucira-mobile-trigger {width:18,height:18}; [aria-label="Toggle Cart"] {width:34,height:18}

Fix: Increase the tappable hit-area (padding) around both icons to at least 44x44 even if the visual icon glyph stays small.

minor Full-screen product image lightbox takes a moment before it can be dismissed PDP

Tapping the main product photo opens a full-screen zoom/lightbox overlay with a 'Close Carousel' control that spans the whole viewport (tap-anywhere-to-close). If dismissed immediately during the open transition, the first tap can fail to register; waiting ~1-1.5s (or simply tapping again) closes it reliably. Not a true trap — confirmed closeable — but the brief unresponsive window reads as a stutter/glitch to an impatient thumb user.

shots/w21m-iphone-07-after-img-tap.png, shots/w21m-iphone-13-touchtap-result.png (closed successfully after a settled tap)

Fix: Low priority polish: ensure the close/backdrop tap handler is attached before or synchronously with the opening transition so the very first tap always registers.

info Cart qty/remove/subtotal and checkout address keyboard types could not be verified Cart / Checkout

Because Add to Cart never succeeds (see critical defect above), the cart page always shows 'YOUR BAG IS EMPTY' and /checkout/address renders only an empty-cart guard with zero form inputs. Cart quantity steppers, remove button, subtotal updates, coupon field, and the checkout address form's per-field keyboard types (email/tel/pincode) could not be exercised or verified this run.

shots/w21m-iphone-26-checkout-cart-empty.png, shots/w21m-iphone-27-checkout-address.png

Fix: Re-run this portion of mobile QA once the Add to Cart 400 bug is fixed.

info Guest wishlist 422 console error — expected fleet behavior, not counted as a defect Wishlist

Console repeatedly logs 'Failed to load resource: 422' and 'While fetching wishlist {message: Invalid credentials.}' for guest sessions. Per known fleet behavior this is expected for unauthenticated wishlist calls and is NOT flagged as a bug.

console log capture

Fix: No action needed — documented as expected.

Desktop QA

Desktop viewports (1920x1080, 1440x900, 1366x768), hover states, keyboard navigation, layout integrity.

critical Header <nav> renders completely empty on desktop — no category links, no megamenu Nav/Header

header nav innerHTML is 0 chars of real content after up to 10s wait, at all 3 desktop widths. Only logo + search/account/cart icons visible in header. Root cause: /api/menu returns the 'Header' menu record with active:false and items:"" (empty string), while /api/categories/megamenu DOES return real category data (Jewelry, Rings, Earrings, etc.) that the header component is not consuming as a fallback.

Load https://website-21.varnijewels.com/ at 1920x1080 / 1440x900 / 1366x768 and inspect <header><nav> — it is empty.

Fix: Activate/populate the 'Header' menu record in store admin, or wire the header nav component to render from /api/categories/megamenu when the header menu record is inactive/empty.

critical Category slug pages (/rings, /necklaces, /earrings, /bracelets) show "No products found" PLP/Category

All 4 tested category slug routes render an empty state despite the same categories having products under /products with a category filter applied. Reproduced at all 3 viewports.

Navigate to https://website-21.varnijewels.com/rings (or /necklaces, /earrings, /bracelets) at any desktop width.

Fix: Fix slug-route Meilisearch category filter (categories: slug) so it returns the same products /products returns when filtered by that category.

critical Majority of product images broken/blank across homepage, PLP, and some PDP gallery thumbnails Home/PLP/PDP imagery

On /products, 5 of the first 6 product cards show a blank gray placeholder instead of a photo. Homepage 'Bestsellers' carousel cards are blank. PDP gallery thumbnails 4-5 are blank on the sampled product. Network shows GET https://jwsimages.s3.amazonaws.com/.../main_rg.jpg and GET https://jwsimages.s3.eu-north-1.amazonaws.com/rings/BOXIMAGE.jpg failing with net::ERR_ABORTED — these point at an unmigrated external host from the original source template instead of static.varnijewels.com.

Load /products or scroll the homepage 'Bestsellers' row at any desktop width; view network tab for jwsimages.s3.amazonaws.com requests.

Fix: Re-point all product/category image URLs to the migrated static.varnijewels.com CDN asset host instead of the leftover jwsimages.s3.amazonaws.com / jwsimages.s3.eu-north-1.amazonaws.com source-site references.

major Promo banner headline/subtext clipped at left edge; 'Most in Demand' heading overlaps 'Bestsellers' banner card Home/Promo banners

Every promo banner tile in the 'Shop the Collection' grid has its headline/subtext clipped by the card's left edge (e.g. 'Everyday Layers' shows as 'ryday Layers', 'Timeless Solitaires' as 'ess Solitaires'). Separately, the 'Most in Demand' section subheading renders overlapping/stacked on top of the 'Bestsellers' promo card, producing garbled overlaid text. Reproduced identically at 1920x1080, 1440x900, and 1366x768.

Scroll to the 'Shop the Collection' promo grid and the 'Bestsellers' section on the homepage at any desktop width.

Fix: Fix promo-card text-block positioning (text currently bleeds outside/gets clipped by the card's overflow boundary) and fix the 'Most in Demand' heading's positioning so it no longer overlaps the adjacent Bestsellers banner card.

minor 5 dead links with href="#" found on homepage Nav

Hash/empty hrefs found: ["#","#","#","#","#"].

Inspect anchor elements on homepage at 1920x1080.

Fix: Wire real hrefs or remove anchor semantics for JS-only controls.

minor Product grid renders only 3 columns even at 1920px wide PLP

Grid shows 3 columns at 1920x1080, 1440x900, and 1366x768 alike; 4 columns is typical for a 1920px-wide desktop layout with a persistent filter sidebar.

Load /products at 1920x1080.

Fix: Consider a 4-column breakpoint at >=1920px alongside the filter sidebar.

Cross-check notes

The three dimensions were run independently, so some findings were corrected or contradicted by a later pass. Those disagreements are recorded here rather than silently resolved — a claim below is not firm until re-verified.

Contradicted Add-to-cart fails with 400 "Variant id is required"

Mobile QA reproduced this 3x on iPhone 13 and again on Pixel 7. Desktop QA tested a product with option chips and got 200/200 with a correct variantId. Most likely product-specific (some SKUs carry options whose id never reaches the payload) rather than a device difference.

Action: Re-verify per-product before launch; do not assume fixed.

Contradicted PDP option chips have no selected-state affordance

Mobile QA found chips pixel-identical selected vs unselected on both device profiles. Desktop QA found a clear 2px maroon border on the selected chip. Suggests the selected style is present but not applied on all chip groups (colour/cttw/size) or not at mobile breakpoints.

Action: Check each option group at mobile widths specifically.

← All storefronts