VARNI STOREFRONTS · QUALITY AUDIT · 2026-07-12

Website-24 — fiona theme

Live site: https://website-24.varnijewels.com · Design reference: fionadiamonds.com

46/100 Not Ready — launch blockers present 11 critical · 13 major · 11 medium · 32 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 30 fail 7
Performance (Lighthouse + CWV) 50 warn 4
SEO (technical) 30 fail 8
Security 45 warn 5
Frontend / Responsive 78 pass 3
Backend (externally observable) 35 fail 2
Analytics & Tracking 55 warn 3
Accessibility (WCAG) 80 pass 4
Brand Consistency 12 fail 7
Marketing Readiness 45 warn 4
Monitoring & Maintenance manual 1

Lighthouse & Core Web Vitals

Lighthouse CLI, mobile emulation defaults.

PageurlperformanceaccessibilitybestPracticesseoLCPCLSTBTFCPSITTFB
homehttps://website-24.varnijewels.com/6192961005.3 s0.01110 ms5.3 s17.5 s3,700 ms (server-response-time audit failed)
pdphttps://website-24.varnijewels.com/products/480-ct-ef-vs-lab-grown-diamond-mens-statement-ring-in-10k-yellow-gold-_-sz0875-10133057919610011.1 s0.00340 ms4.7 s10.5 s860 ms

Launch-readiness findings

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

critical Add to Cart is broken — nothing can be purchased Core Functionality

Clicking 'Add to bag' on a PDP fires POST /api/carts/{cartId}/line-items which returns HTTP 400, followed by GET /api/carts/{cartId} returning 404. Cart page then shows 'YOUR BAG IS EMPTY' and /checkout/address shows 'Your cart is empty'. Reproduced on a fresh session with a rings PDP.

Network log: '400 https://website-24.varnijewels.com/api/carts/cart_01KXAQRTPJCBZA1KAXYGW7FQZ2/line-items', '404 .../api/carts/cart_01KXAQRTPJCBZA1KAXYGW7FQZ2'; screenshots w24-after-addcart.png, w24-cart2.png, w24-checkout2.png

Fix: Fix cart line-item creation on the backend/API integration for this store before launch; this blocks 100% of the guest purchase funnel.

critical LCP fails Core Web Vitals thresholds on both pages Performance (Lighthouse + CWV)

Home LCP 5.3s, PDP LCP 11.1s — both far above the 2.5s 'good' threshold (PDP is above even the 4s 'poor' cutoff).

Lighthouse JSON: lh-website-24-home.json / lh-website-24-pdp.json

Fix: Investigate PDP hero image loading (11.1s LCP), reduce server response time, and preload the LCP image.

critical sitemap.xml is completely broken and leaks an unrelated brand domain SEO (technical)

/sitemap.xml 302-redirects to https://<r2-bucket>.cloudflarestorage.com/varni/sitemaps/jewelwesell.com-sitemaps/sitemap_index.xml which itself returns HTTP 400 'InvalidArgument: Authorization'. The robots.txt-declared sitemap (/sitemaps/website-24.varnijewels.com-sitemaps/sitemap_index.xml) 404s. No working sitemap exists for search engines to crawl.

curl -I redirect chain; R2 bucket path literally contains 'jewelwesell.com-sitemaps'

Fix: Regenerate and publish a valid sitemap_index.xml under this store's own bucket path/brand, not the reference brand's leftover path.

critical Every PDP's <title>, meta description, og:title and og:site_name expose the reference brand 'Jewelwesell', not the store brand SEO (technical)

PDP <title> = '... | Jewelwesell'; og:site_name = 'Jewelwesell'; og:image points to media.jewelwesell.com. Meta description is a broken template: '<product name>. -' (literal trailing dash, no real copy). JSON-LD Product schema: brand.name/manufacturer = 'Jewelwesell', sku prefixed 'JWS...'. JSON-LD WebSite schema: name = 'Jewelwesell'. JSON-LD Organization schema: contactPoint.email = [email protected], phone (646) 598-7516, address '340 Amboy Ave, Metuchen, NJ', sameAs links to x.com/JewelWeSell, facebook @JewelWeSell1, instagram/jewelwesell, while the same schema's 'name' field says 'Website-24' — internally inconsistent.

curl page source: <title>4.80 ct EF VS Lab Grown Diamond Mens Statement Ring in 10k Yellow Gold _ Sz0875 101330 | Jewelwesell</title>; og:site_name content="Jewelwesell"; og:image https://media.jewelwesell.com/...; homepage JSON-LD Organization block in w24-full.json

Fix: Replace the theme's PDP <title>/meta template site-name suffix and og:site_name with the theme brandName; regenerate JSON-LD Organization/Product data from theme content, not the reference store account's business profile.

critical Cart API errors (see Core Functionality) Backend (externally observable)

POST .../line-items → 400; GET .../carts/{id} → 404. This is the backend root cause of the broken purchase funnel.

same as Core Functionality finding

Fix: Backend/API team to debug the cart-creation/line-item endpoint for this store.

critical Reference brand 'Jewelwesell' real contact email/phone visibly shown to customers in the mobile nav drawer Brand Consistency

Opening the mobile hamburger menu's 'SUPPORT CONTACT' section displays '[email protected]' and '+(646) 598-7516' — the reference brand's actual support email and US phone number — directly in the customer-facing UI, not just metadata.

Screenshot w24-mobile-nav.png

Fix: This is the most severe finding in the audit: any customer who emails or calls that contact reaches the wrong (real, unrelated) business. Replace with this store's own theme-configured support contact, sourced from themeContent, not storeData.businessEmail/phone.

critical Wordmark parity holds, but contact/identity data does not — 3 different, conflicting contact sets on one site Brand Consistency

(1) Mobile nav: [email protected] / +(646) 598-7516. (2) Footer: Bandra Kurla Complex, Mumbai + '+91 90000 00000' (an all-zero placeholder number) + '[email protected]' (a non-deliverable .example placeholder domain). (3) JSON-LD Organization schema: '340 Amboy Ave, Metuchen, NJ' + [email protected] + phone (646) 598-7516 + sameAs links to real x.com/JewelWeSell, facebook @JewelWeSell1, instagram/jewelwesell accounts. Header/sidenav/footer wordmark itself IS consistent ('Website-24' everywhere) — the mandatory wordmark-parity check passes — but every other piece of business identity (email/phone/address/socials) is inconsistent and/or leaked from the reference brand's real account.

w24-full.json jsonLd[1]; w24-mobile-nav.png; footer screenshot w24-cart2.png

Fix: Establish one canonical theme-owned contact/address/social block and use it everywhere (JSON-LD, mobile nav, footer). Do not fall back to storeData.businessEmail/phone/address.

critical PDP <title>/OG/JSON-LD brand fields say 'Jewelwesell', not the store's own brand Brand Consistency

Duplicate of the SEO-category finding — repeated here because it is fundamentally a brand-identity leak: og:site_name, product brand.name/manufacturer, and WebSite schema name are all 'Jewelwesell' on every product page.

curl PDP source; see SEO category for full evidence

Fix: See SEO category recommendation.

major Footer social icons are dead links Core Functionality

All 5 footer social icons (Instagram, Facebook, YouTube, X, LinkedIn) point to href="#" instead of real profile URLs.

w24-footer-a.json: 5 entries with href https://website-24.varnijewels.com/# and hasSvg:true

Fix: Wire real social profile URLs or remove the icons.

major Slow server response time (TTFB) Performance (Lighthouse + CWV)

Home page root document took 3,700ms to respond (Lighthouse server-response-time audit scored 0/1).

lh-website-24-home.json audits['server-response-time']

Fix: Investigate SSR/backend latency for the storefront's initial document render.

major Malformed URLs in BreadcrumbList structured data SEO (technical)

PDP BreadcrumbList JSON-LD items have doubled protocol and missing separators, e.g. 'https://https://website-24.varnijewels.comrings' and '...comwedding-mens' — these are not valid, resolvable URLs.

w24-pdp-full.json pdpJsonLd[1]

Fix: Fix the breadcrumb URL-building logic (string concatenation bug duplicating the protocol/host and omitting the leading slash).

major Organization JSON-LD @id is malformed the same way SEO (technical)

'@id': 'https://https://website-24.varnijewels.com/#organization' and 'url': 'https://https://website-24.varnijewels.com' — doubled protocol.

w24-full.json jsonLd[1]

Fix: Same root-cause fix as breadcrumb URLs — likely a shared URL-building helper.

major PLP/category pages have a generic, non-unique <title> SEO (technical)

Every category page (e.g. /rings) renders <title>Products</title> instead of a descriptive, unique, brand-inclusive title like 'Rings | Website-24'.

curl https://website-24.varnijewels.com/rings title tag

Fix: Populate per-category title/meta description from the category name + brand.

major No security response headers on any page Security

curl -I on home and PDP show no Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, or Strict-Transport-Security header.

curl -sI headers dump (only date/content-type/CF/NEL/link/set-cookie present)

Fix: Add CSP, X-Frame-Options (or frame-ancestors), X-Content-Type-Options: nosniff, Referrer-Policy, Permissions-Policy, and HSTS at the CDN/edge or app layer — platform-wide, not per-store.

major Product photography carries the source/reference brand's visible watermark Brand Consistency

Product images are served from media.jewelwesell.com and the rendered PDP gallery image shows a faint diamond/'W' logo watermark baked into the photo itself (visible bottom-left of the main product image).

Screenshot w24-after-addcart.png (watermark visible on product photo)

Fix: Source watermark-free product photography, or a licensing arrangement, before launch — do not ship a competitor/source brand's watermark to customers.

major Stray build/debug text rendered in the live footer Brand Consistency

Bottom-right of every page's footer renders the literal text 'vvarni-storefronts' — looks like a leaked internal repo/build tag, not customer-facing copy.

w24-full.json footerText; screenshot w24-cart2.png bottom-right corner

Fix: Remove this debug string from the footer template.

major Product titles expose raw internal SKU/size codes Brand Consistency

Customer-facing product titles read e.g. '4.80 ct EF VS Lab Grown Diamond Mens Statement Ring in 10k Yellow Gold _ Sz0875 101330' — the trailing '_ Sz0875 101330' is an internal size/SKU code, not customer-appropriate copy.

PLP screenshot w24-plp.png; PDP h1

Fix: Strip internal SKU/size tokens from the customer-facing title; keep SKU only in the dedicated sku field.

major Dead social profile links (duplicate of Core Functionality finding) Marketing Readiness

All 5 footer social icons point to '#'.

w24-footer-a.json

Fix: See Core Functionality recommendation.

medium Soft-404: nonexistent slugs return HTTP 200 with a generic listing instead of a real 404 SEO (technical)

GET /this-page-does-not-exist-xyz123 returns HTTP 200 with <title>Products</title> (an empty/generic product-listing shell) rather than a 404. This is a side effect of the bare [slug]-as-listing route convention, but it creates Google Search Console 'soft 404' signals at scale.

curl -o /dev/null -w '%{http_code}' → 200; page title 'Products'

Fix: Return a real 404 (or noindex) when a slug matches zero categories/products, distinct from a valid empty-filter state.

medium Enhanced Ecommerce events unverifiable Analytics & Tracking

Because Add to Cart is broken, add_to_cart/begin_checkout events could not be confirmed. No Meta/Facebook Pixel (fbq) detected.

w24-analytics.json fbq:false; broken cart flow

Fix: Re-verify GA4 ecommerce events once the cart bug is fixed; add a pixel if the business wants paid-social retargeting.

medium Newsletter block is enabled but has no configured copy Marketing Readiness

Site settings show newsletter:{active:true, placeholder:'', heading:'', subheading:''} — the capture block is turned on but every text field is blank, which likely renders an empty/blank section or nothing visible.

grep of homepage SSR payload for 'newsletter'

Fix: Populate the newsletter heading/subheading/placeholder copy, then verify it renders and actually captures an email.

medium Footer contact info is placeholder, not real Marketing Readiness

Footer phone '+91 90000 00000' is an all-zero placeholder; footer email '[email protected]' uses the reserved, non-deliverable .example TLD.

w24-cart2.png footer

Fix: Replace with this store's real, monitored support phone/email before launch.

minor Duplicate 'Home' entry in mobile nav drawer Core Functionality

Mobile hamburger menu lists 'Home' twice in sequence under SHOP & EXPLORE.

w24-mobile-nav.png / mobileNavText dump

Fix: De-duplicate the menu source data.

minor Several footer content links funnel to the same generic page Core Functionality

'About Website-24', 'Our Materials', and 'Boutiques' all resolve to /contact-us instead of distinct pages; 'Gifting' resolves to the generic /products listing.

w24-full.json footerLinks array

Fix: Build dedicated About/Materials/Boutique-locator pages or relabel the links.

minor Unused CSS/JS Performance (Lighthouse + CWV)

Est. 25 KiB unused CSS and 94 KiB unused JS on the homepage.

lh-website-24-home.json audits unused-css-rules / unused-javascript

Fix: Tree-shake/lazy-load non-critical bundles.

minor og:image on homepage is a relative URL SEO (technical)

Homepage og:image = '/fiona/hero-1.svg' (relative), which most social platforms (Facebook/LinkedIn/X) will fail to resolve into a share-preview image; also an SVG is not universally supported as an OG image format.

w24-full.json ogImage

Fix: Use an absolute https:// URL and a raster (PNG/JPG) fallback for og:image.

minor Cookies set without Secure attribute on an HTTPS-only site Security

litekart_store_id, _ga, _ga_LXBXGL3R0P all have secure:false despite the site being HTTPS-only.

w24-analytics.json cookies array

Fix: Set Secure (and where applicable HttpOnly/SameSite=Lax/Strict) on all first-party cookies.

minor Color contrast failure on eyebrow/index labels Frontend / Responsive

Gold/tan text (#9a7b4f) on white background used for 'SHOP BY CATEGORY' eyebrow and category index numbers ('01','02'...) measures 3.94:1, below the WCAG AA 4.5:1 requirement for normal-size text.

Lighthouse color-contrast audit, lh-website-24-home.json

Fix: Darken the accent gold or increase font-weight/size to meet contrast requirements for that token.

minor No cookie-consent banner observed Analytics & Tracking

GA cookies are set and a GA hit fires immediately on load with no visible consent banner or Google Consent Mode gating (gcd/dma params present but default/unblocked).

w24-analytics.json cookies + GA collect URL params

Fix: Confirm with legal/compliance whether a consent banner is required for this store's target markets (US/India) — if EU traffic is expected, add one.

minor Color contrast failure (duplicate of Frontend finding) Accessibility (WCAG)

Same #9a7b4f-on-white eyebrow/index-number contrast failure (3.94:1 vs required 4.5:1).

lh-website-24-home.json audits['color-contrast']

Fix: See Frontend recommendation.

info PDP variant/option selected-state is visually unmistakable Core Functionality

Metal Type, Metal Color and Ring Size chips: selected chip renders solid black background with white text; unselected chips are white background with light-gray border and dark text. High contrast in both states.

Screenshot w24-pdp-variant-clicked.png

Fix: None — passes the mandatory PDP variant visibility check.

info PLP filters, sort, pagination and item count work Core Functionality

/rings shows '1000+ Products', category tree, Tags (CVD/Lab Grown/Lab Grown Diamond), price range slider, Center Stone CTW facet, and a working Sort By dropdown (Recommended).

Screenshot w24-plp.png

Fix: None.

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

GET /api/wishlists/me returns 422 'Invalid credentials' for guest sessions on home/PLP/PDP/cart. This matches the known, accepted guest-wishlist behavior noted in prior fixes.

console/network logs on every page

Fix: No action needed; confirms expected behavior.

info Lighthouse category scores Performance (Lighthouse + CWV)

Home: performance 61, accessibility 92, best-practices 96, seo 100. PDP: performance 57, accessibility 91, best-practices 96, seo 100. CLS is good on both (0.011 home, 0.003 PDP). TBT good (10ms/40ms). Total byte weight only 697 KiB on home — page weight itself is not the bottleneck, latency is.

lh-website-24-home.json / lh-website-24-pdp.json

Fix: N/A

info Core SEO plumbing otherwise present SEO (technical)

robots.txt exists with sensible disallow rules; homepage canonical tag is correct and absolute; viewport meta correct; single H1 on homepage; Lighthouse SEO category scored 100/100 on both pages (Lighthouse's checks don't catch the structural issues above, which require manual/content inspection).

curl robots.txt; lh-website-24-*.json categories.seo = 1

Fix: None beyond the items above.

info Valid HTTPS/SSL Security

Certificate for varnijewels.com issued by Google Trust Services (WE1), valid 2026-05-30 through 2026-08-28. HTTP/2 in use, served via Cloudflare.

openssl s_client output

Fix: Ensure the cert auto-renews before 2026-08-28 (MANUAL/ops).

info No secret API keys exposed Security

The SSR page payload embeds only publishable/public keys (Stripe pk_live_..., PayPal client id, Affirm public key) — this is expected/normal for client-side checkout SDKs, not a leak. No sk_live/sk_test secret keys found in page source.

grep for sk_live/sk_test on homepage HTML returned nothing

Fix: None.

info Infra-only security items Security

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

N/A

Fix: Ops/backend team to verify against internal checklist.

info Mobile layout renders correctly, hamburger drawer opens/closes, no obvious horizontal scroll Frontend / Responsive

Tested at 390x844 (iPhone-class viewport). Hero, category grid, bestsellers, FAQ, and footer all reflow correctly to single column.

w24-mobile-home.png, w24-mobile-nav.png

Fix: None.

info Viewport meta and responsive meta correct Frontend / Responsive

meta viewport = 'width=device-width, initial-scale=1.0, maximum-scale=5.0' (pinch-zoom not disabled — good for accessibility).

w24-full.json viewportMeta

Fix: None.

info Infra-only backend items Backend (externally observable)

DB query optimization/indexing, memory leaks, server resource usage, background job/queue/cron health, log/error management, session management, cache invalidation, load balancing/autoscaling cannot be assessed externally.

N/A

Fix: Ops team to verify via internal monitoring/APM.

info GA4 installed and firing Analytics & Tracking

gtag.js loads (G-LXBXGL3R0P), dataLayer populated, and a page_view collect request fires on load.

w24-analytics.json

Fix: None.

info Lighthouse accessibility score Accessibility (WCAG)

Home 92/100, PDP 91/100.

lh-website-24-home.json / lh-website-24-pdp.json categories.accessibility

Fix: None beyond the contrast fix noted above.

info Other core a11y checks pass Accessibility (WCAG)

image-alt, link-name, button-name, heading-order, html-has-lang, meta-viewport all scored 1/1 in Lighthouse.

lh-website-24-home.json audits

Fix: None.

info Deep keyboard-nav / screen-reader walkthrough not performed Accessibility (WCAG)

Full tab-order, focus-trap, and screen-reader-announcement testing was not performed in this headless pass.

N/A

Fix: Recommend a manual screen-reader pass (VoiceOver/NVDA) before launch.

info Wordmark itself is consistent across header, mobile sidenav, footer, and H1 Brand Consistency

All show 'Website-24' / 'WEBSITE-24' consistently — no 'API store name wins' pattern (e.g. no leaked 'Boris & Twins'-style account name) was found for the wordmark specifically.

w24-full.json headerLogoText, mobileNavText, footerText

Fix: None for the wordmark itself — but see the contact-info findings above, which are a related but distinct identity leak.

info Trust badges and hero present Marketing Readiness

Homepage hero has a clear headline, subhead, and visible CTA ('SHOP SOLITAIRES'); trust row shows 'IGI / GIA Certified', 'Lifetime Warranty', 'Free Insured Shipping', '30-Day Returns'; testimonials section present ('Loved by our clients') with named reviewers; FAQ accordion present; live WhatsApp chat widget present.

w24-home.png, w24-full.json mobileNavText

Fix: None.

info Uptime/error/performance/log/broken-link/SSL-expiry/backup/CDN/DB-health/CWV monitoring Monitoring & Maintenance

None of these can be verified from outside the storefront. SSL cert expires 2026-08-28 — confirm renewal automation is in place.

openssl cert dates

Fix: Ops team to confirm monitoring stack (uptime checker, error tracking, CWV field monitoring, SSL-expiry alerting) is wired up for this store.

Mobile QA

Real mobile emulation (iPhone 13 (390x844, DPR 3, touch on, Mobile Safari UA) via Playwright device descriptor, Pixel 7 (412x915, DPR 2.625, touch on, Chrome Mobile UA) via Playwright device descriptor), touch interaction, thumb-driven journey.

critical Hamburger menu tap target is 18x18px - far below 44x44 minimum Header / global nav

The hamburger icon button (aria-label 'Toggle menu') that opens the mobile nav drawer measures only 18x18px, positioned at the extreme top-left corner (top:54, left:14) on both iPhone 13 and Pixel 7. This is the primary navigation trigger for the entire site on mobile and is roughly 40% of the recommended minimum tap target in both dimensions, sitting in the hardest-to-reach corner for one-thumb use.

Load https://website-24.varnijewels.com/ under iPhone 13 or Pixel 7 emulation; inspect the button's getBoundingClientRect() - {w:18,h:18}. Confirmed identical on both device profiles.

Fix: Increase the clickable/tappable area of the hamburger button to at least 44x44px via padding on the button element (icon can stay visually small), not just the SVG glyph size.

major Quantity +/- steppers in the cart preview drawer are ~18x26px - too small and too close together Cart drawer

After adding an item, a 'Your Cart' slide-over opens with a quantity stepper. The 'Subtract 1 from qty' and 'Add 1 to qty' buttons each measure only ~17.8 x 26px, sitting directly adjacent to each other. This is the single most likely place for a mis-tap to accidentally remove/duplicate line items during checkout.

Add any product to cart on iPhone 13 or Pixel 7 emulation; the cart drawer opens; measure the qty buttons - {w:17.8,h:26} for both '-' and '+'.

Fix: Pad the qty buttons to at least 44x44px hit area and add visible spacing between '-', the count, and '+' so adjacent taps don't collide.

major Metal/stone option chips are 36px tall - below the 44px minimum tap target PDP variant chips

Stone Type / Stone Quality / Metal Type / Metal Color chip buttons on the PDP (e.g. '10k Gold', '14k Gold', 'White Gold') are 36px tall (widths vary 71-162px). Height is the constraining dimension and is 8px short of the recommended minimum, on a row of several adjacent chips a thumb can easily overshoot into the wrong option.

Open any PDP (e.g. /products/480-ct-ef-vs-lab-grown-diamond-mens-statement-ring-in-10k-yellow-gold-_-sz0875-101330) on iPhone 13 or Pixel 7; measure any metal/stone chip button - h:36.

Fix: Increase vertical padding on option chips to reach 44px height minimum.

medium Remove-item (trash) icon and close-cart (X) icon are under 44x44 Cart drawer

'Remove item' trash icon measures ~23x34px; 'close cart' X measures ~25x36px. Both are icon-only buttons with no visible padding buffer.

Open the cart drawer after add-to-cart on either device profile; measure via getBoundingClientRect(): Remove item {w:23.3,h:34}, close cart {w:24.7,h:36}.

Fix: Add invisible padding to reach 44x44 hit area on both icon buttons; the close action is lower risk since tapping the backdrop likely also closes the drawer, but the trash/remove icon is a destructive action and deserves a comfortable target.

medium Product images render as blank grey placeholders for the first ~2-3 seconds after PLP load PLP

On initial screenshot capture (~2.5s after navigation) all product card images on the /rings PLP were still blank grey boxes with only the wishlist heart icon visible; a follow-up check confirmed the underlying <img> tags do use loading="lazy" and do load correctly (naturalWidth 1280) a couple seconds later. There is no skeleton/shimmer placeholder during this gap, so on a real phone (especially with any added latency) the grid reads as broken/empty for a noticeable moment.

Navigate to https://website-24.varnijewels.com/rings on iPhone 13 emulation and screenshot at ~2.5s post-navigation vs ~4s - grey boxes vs loaded photos.

Fix: Add a skeleton/shimmer background on product-card image containers while the lazy image loads instead of plain grey, and consider prioritizing (loading="eager", fetchpriority=high) the first 4-6 above-the-fold PLP images.

medium This PDP only exposes 1 image (no swipeable gallery) - swipe/pinch-zoom could not be exercised PDP gallery

The sampled PDP (first product in /rings) has galleryDotCount=1 and the 'Next slide'/'Previous slide'/'Close Carousel' controls exist in the DOM but are 0x0/hidden - i.e. genuinely only one product photo is attached, there is nothing to swipe between. This is a content/catalog gap rather than a gallery-code bug (the carousel infrastructure is present and presumably works once >1 image exists), but for a lab-grown-diamond jewelry storefront a single static image per product (no macro/angle/on-hand shots) undersells the product on mobile where zoom is the main way to inspect detail.

Open the same PDP; document.querySelectorAll('button[aria-label*="Go to slide"]').length === 1; 'Next slide' button getBoundingClientRect() = 0x0.

Fix: Backfill multi-angle product photography (or at minimum a rendered alt-angle) for catalog SKUs so the built-in swipe/carousel component actually has multiple slides to page through on mobile; not an engineering fix.

medium Filter/Sort controls are easy to miss - sit in a low-contrast bar below the fold with no icon-first affordance issue but were not detected by any of the common selector conventions PLP

Sort By / Filter DO exist as a sticky-looking bar under the product grid ('Sort By: Recommended' / 'Filter'), each tap target 195x47 - comfortably sized. This is a PASS on tap-target size, listed here only because the bar sits visually disconnected from the grid content (no border/shadow separating it from the page background at the bottom) and could be mistaken for footer text rather than an interactive control.

Screenshot /rings on iPhone 13 - the Sort/Filter row appears as plain grey text with small icons, no button-like affordance (no border, background fill, or shadow).

Fix: Give the Sort/Filter bar a visible container (background fill or top border) so it reads clearly as tappable UI rather than page footer text.

medium No error toast/message would ever be shown if add-to-cart silently fails - only path to notice is the slide-over failing to open PDP / Add to cart feedback

On success, the app opens a 'Your Cart (N)' slide-over immediately (good, app-like feedback). No dedicated toast/snackbar/aria-live region was found on the page ([class*=toast], [class*=snackbar], [role=status], [role=alert] all absent). If the previously-documented cart-API 400/404 does occur on a future/real request, the customer's only signal that anything went wrong is that the cart drawer never appears - there is no explicit 'Something went wrong, please try again' message. On a slow connection this reads as 'nothing happened,' inviting repeated taps.

Inspect DOM for toast/snackbar/status/alert roles after tapping Add to Bag on either device profile - none found; behavior is inferred from the known desktop 400/404 case in w24-pdp-full.json where the button click produced no visible error state either.

Fix: Add an explicit error toast (e.g. 'Could not add to bag, please try again') triggered on any non-2xx response from the add-to-cart request, so failures are never silent on mobile.

minor Wishlist heart icon on PDP is 36x36px, slightly under the 44x44 recommendation PDP

The 'Add to wishlist' heart button on the PDP measures 36x36px. Smaller gap than the other findings above but still short of guidance.

Measure the visible 'Add to wishlist' button on the sampled PDP: w:36,h:36.

Fix: Bump to 44x44 if convenient; low priority relative to the cart/nav issues above.

info Add-to-cart WORKED in this mobile pass and could not be reproduced as broken - flag for re-verification against the prior launch-readiness finding Add to cart / cart / checkout functionality

The task brief stated add-to-cart is known-broken (cart API 400/404) from a prior launch-readiness pass. In this run, on BOTH iPhone 13 and Pixel 7 emulation, tapping 'ADD TO BAG' produced zero network/console errors, opened a 'Your Cart (1)' slide-over with correct product image/price/qty stepper, and the item carried through to /checkout/cart and /checkout/address with correct subtotal ($4319.00) and a working checkout form. This directly contradicts the expected-broken state. Two explanations are plausible: (a) the issue is intermittent/session- or variant-dependent - an EARLIER same-session desktop-viewport run against this exact PDP (before this mobile pass) DID reproduce the 400 on POST /api/carts/{id}/line-items followed by 404 on GET /api/carts/{id}, or (b) the issue has since been fixed. Because this pass could not reproduce the failure, do not treat 'add-to-cart is broken' as confirmed on mobile without a fresh check; also do not treat it as fixed without checking (a).

This run: POST to /api/carts/*/line-items returned 2xx (no entries in networkErrorsDuringAdd) on iPhone 13 and Pixel 7, cart populated correctly. Earlier same-session desktop run (1400x900, saved at w24-pdp-full.json) shows: '400 https://website-24.varnijewels.com/api/carts/cart_01KXAQRTPJCBZA1KAXYGW7FQZ2/line-items' then '404 .../carts/cart_01KXAQRTPJCBZA1KAXYGW7FQZ2' with an empty bag afterward.

Fix: Re-run the add-to-cart flow a few times back-to-back (fresh cart_id each time) to determine if the 400/404 is intermittent (e.g. a race between cart-creation and line-item POST, or a stale/expired cart_id reused across page loads) rather than a hard the-button-does-nothing bug. If intermittent, this is arguably WORSE for mobile UX than a consistent failure because there is no error toast either way - see next finding.

Desktop QA

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

critical Desktop main navigation is completely empty — no megamenu, no category links, no hamburger fallback header/nav

nav.fiona-nav (aria-label=Main navigation) renders as an empty Svelte each-block (<!--[--><!--]-->) at 1920/1440/1366, persisting 6+ seconds after load. No hamburger/menu-toggle button exists in the header at any desktop width. Root cause confirmed via network capture: GET /api/categories/featured?limit=18 returns 200 {"data":[],"cache":"HIT"} — an empty cached category list. Only ways to reach categories on desktop are the homepage 'Shop by category' tiles (~1000px down) or footer links.

Load https://website-24.varnijewels.com/ at any desktop width, wait 3-6s, inspect document.querySelector('nav.fiona-nav').outerHTML — empty. Confirm via network tab: /api/categories/featured?limit=18 returns empty data array.

Fix: Backend: repopulate/invalidate the featured-categories cache for this store so the endpoint returns real category data. Frontend: add a resilient fallback (e.g. hamburger/'All Categories' link) so an empty API response never leaves the desktop header with zero navigation.

critical Add-to-cart intermittently fails with 400 (POST line-items) then 404 (GET cart), leaving the bag empty — resolves the launch-readiness vs mobile-qa contradiction as genuine flakiness, not fixed pdp/cart

Tested 6 total add-to-cart attempts across 2 ring products (with metal-only selection and with every variant group incl. Ring Size explicitly selected) at 1920x1080 and 1440x900. At 1920x1080, 3/3 attempts failed (final /checkout/cart = 'YOUR BAG IS EMPTY' for both products). At 1440x900, 1 attempt succeeded cleanly (cart drawer + /checkout/cart correctly showed the item at $4319.00, matching the sibling mobile-qa run on the identical product/variant), 1 was blocked by a stale UI overlay (see separate defect), and 1 (different product) failed explicitly with 400 POST .../line-items. Network pattern: a cart is created, GET on that cart id 404s, a new cart id is used for POST line-items which returns 400, and subsequent GETs against that id keep 404ing.

Open any ring PDP, select a metal/attribute chip, click Add to Bag; repeat across 2-3 different products/attempts. Failure rate is non-zero but not 100% — characterized here as ~50% across 6 attempts in this session.

Fix: Investigate a backend race/cache-consistency bug in cart-id creation and lookup (client and server appear to disagree on which cart id is currently valid). Do not close this as 'fixed' based on any single successful run, and do not treat it as a pure desktop bug — it reproduced on desktop and (per sibling agent) also succeeded on mobile with the exact same product/variant.

major Cart drawer/overlay persisted across a PDP reload and physically blocked the Add to Bag button pdp/cart interaction

After a successful add-to-cart opened the 'Your Cart (1)' drawer, reloading the PDP left the drawer/overlay rendered on top of the page, causing a Playwright click on Add to Bag to time out waiting for the element to become visible/stable (not an API error this time).

Add an item so the cart drawer opens, reload the PDP page, attempt to click Add to Bag again while the drawer is still shown.

Fix: Ensure the cart drawer/overlay state resets correctly on navigation/reload so it never remains as a click-blocking layer over the page beneath it.

medium No toast or aria-live/role=status/role=alert element exists anywhere in the DOM — failed add-to-cart is silent feedback/accessibility

When the 400/404 add-to-cart failure above occurs, there is no visual signal to the shopper at all; the page looks unchanged. Confirmed by DOM inspection during each failed-add screenshot.

Trigger a failed add-to-cart (see cart defect above) and inspect the DOM for any error-surface element — none found.

Fix: Add an explicit error toast/banner shown on any non-2xx response from the add-to-cart call.

medium Product cards show zero hover affordance on desktop plp

Hovering the first product card on /rings produced no change in computed transform or box-shadow at 1920, 1440, or 1366 — only the always-visible wishlist heart icon is present. No quick-add/quick-view reveal, no elevation/shadow shift.

Load /rings at any desktop width, hover the first product card, compare getComputedStyle(transform/box-shadow) before vs after hover — identical.

Fix: Add a hover elevation/shadow or a quick-add/quick-view reveal consistent with desktop-shopper expectations for a premium jewelry PLP.

minor 5 footer social icons are dead href="#" links footer

Instagram/Facebook/YouTube/X/LinkedIn icons in the footer all point to '#' at every desktop width tested (deadHashLinkCount: 5 in all three viewport result sets). Previously known issue, reconfirmed this pass.

Scroll to the footer on any page, inspect the 5 circular social icon links — all href="#".

Fix: Wire real social profile URLs, or remove the icons until they are available.

minor Stray debug string 'vvarni-storefronts' renders in the footer on every page footer

Visible bottom-right of the footer on home, PLP, PDP, cart, and checkout pages at all widths tested. Previously known issue, reconfirmed this pass.

Load any page, scroll to the very bottom-right of the footer.

Fix: Remove the internal debug/build identifier string from the production footer template.

minor JSON-LD contains malformed doubled-protocol URLs seo/schema

Organization schema @id/url = 'https://https://website-24.varnijewels.com/#organization' (doubled protocol). PDP BreadcrumbList item URLs are similarly malformed and missing a path separator, e.g. 'https://https://website-24.varnijewels.comrings' instead of 'https://website-24.varnijewels.com/rings'.

View page source / JSON-LD <script type=application/ld+json> tags on the homepage and any PDP.

Fix: Fix the string-concatenation logic that builds canonical/breadcrumb/organization URLs — it appears to prepend a protocol onto a value that already includes one, and to omit a leading slash before path segments.

minor Sampled PDPs have only 1 product photo — hover-zoom/lightbox could not be meaningfully exercised pdp gallery

Hover over the main image showed cursor:zoom-in and one zoom-classed element present and sized, but with only a single photo per sampled product, true multi-image gallery swipe/hover-zoom-pan behavior has no content to exercise. Matches sibling mobile-qa's galleryDotCount:1 finding.

Open any sampled PDP (e.g. the 4.80ct ring or 4.75ct ring products used in this test) and check the thumbnail rail — only 1 thumbnail present.

Fix: Catalog/content gap (backfill multi-angle photography), not a code defect — flagged so the passing zoom-cursor check isn't mistaken for a fully-verified hover-zoom gallery.

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.

Refined Add to cart is completely broken (POST line-items 400, GET cart 404)

Launch-readiness saw it fail; mobile QA saw it succeed cleanly on the same PDP. Desktop QA ran 6 attempts across 2 products and 2 viewports: 3/3 failed at 1920x1080; at 1440x900 one succeeded, one failed with 400, one was blocked by a stale overlay. Conclusion: intermittent, not consistently broken — consistent with a backend cart-id race.

Action: Still a launch blocker. Needs a backend fix, not a theme fix.

← All storefronts