VARNI STOREFRONTS · QUALITY AUDIT · 2026-07-12

Website-19 — target theme

Live site: https://website-19.varnijewels.com · Design reference: target.com

48/100 Not Ready — Blockers 11 critical · 8 major · 19 medium · 23 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 40 fail 6
Performance / Core Web Vitals 50 fail 3
SEO (technical) 35 fail 9
Security 35 fail 4
Frontend / Responsive 68 warn 3
Backend (externally observable + MANUAL) manual 2
Analytics & Tracking 55 warn 3
Accessibility (WCAG) 82 warn 5
Brand Consistency 15 fail 3
Marketing Readiness 50 warn 3
Monitoring & Maintenance manual 1

Lighthouse & Core Web Vitals

Lighthouse CLI, mobile emulation defaults.

Pageperformanceaccessibilitybest_practicesseolcpfcpclstbtspeed_indexinteractiveurl
home_mobile0.560.980.9618.3 s6.3 s0.02210 ms17.3 s9.8 s
pdp_mobile0.550.880.960.928.6 s6.9 s0.00120 ms14.0 s9.7 shttps://website-19.varnijewels.com/products/400-ct-ef-vs-lab-grown-diamond-cartoon-pendant-in-14k-white-gold-232635

Launch-readiness findings

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

critical Every megamenu category link resolves to an empty listing (0 results) Core Functionality

The header/megamenu links 'Engagement Rings' and 'Wedding Bands' both point to /jewelry-rings; 'Diamonds', 'Necklaces', 'Earrings', 'Bracelets' all point to /jewelry. Both slug routes return 'NO PRODUCTS FOUND / 0 results' even in raw SSR HTML (verified via curl, not just client hydration lag). Only 'Categories' and 'Bestsellers' (both -> /products, the full catalogue) actually list products. Per the project's Meilisearch categories:slug convention, this means no product in the catalogue is tagged with a 'jewelry-rings' or 'jewelry' category slug, so 6 of 8 primary nav destinations are dead ends for shoppers.

curl https://website-19.varnijewels.com/jewelry-rings and /jewelry both contain literal text '0 results' / 'NO PRODUCTS FOUND' in the server-rendered HTML. Screenshot: w19-shots/01-rings-plp.png. Actual product breadcrumbs (e.g. Home > Pendants > Everyday Pendants > Shapes & Symbols > Cartoon) show the real taxonomy has nothing to do with the hardcoded nav slugs.

Fix: Wire the megamenu to the store's real backend category taxonomy/slugs (per the project's 'megamenu from backend API' rule) instead of hardcoded /jewelry-rings and /jewelry, or re-tag products so those slugs return results.

critical Mobile LCP and FCP are far outside 'Good' thresholds on both Home and PDP Performance / Core Web Vitals

Lighthouse mobile: Home LCP 8.3s / FCP 6.3s / Speed Index 17.3s. PDP LCP 8.6s / FCP 6.9s / Speed Index 14.0s. Google's 'Good' threshold is LCP < 2.5s and FCP < 1.8s; both pages are more than 3x over the Good LCP threshold and squarely in the 'Poor' bucket.

lh-website-19-home.json / lh-website-19-pdp.json audits: largest-contentful-paint, first-contentful-paint, speed-index (see lighthouse block below).

Fix: Investigate render-blocking JS/CSS (site preloads ~100 modulepreload chunks on first response — see Link header), defer non-critical chunks, and confirm the LCP element (hero image / PDP gallery image) is prioritized (fetchpriority=high, preloaded, correctly sized).

critical Sitemap referenced in robots.txt is completely broken SEO (technical)

robots.txt declares 'Sitemap: https://website-19.varnijewels.com/sitemaps/website-19.varnijewels.com-sitemaps/sitemap_index.xml'. Fetching that URL returns an XML S3 error 'NoSuchBucket / BucketName: varnijewels' on one request and a plain 404 on a retry. /sitemap.xml at the site root also returns empty content. Search engines cannot discover the site's URL list.

curl output: '<Error><Code>NoSuchBucket</Code><Message>The specified bucket does not exist</Message><BucketName>varnijewels</BucketName>...' and a follow-up curl -o /dev/null -w returning http status 404 for the same URL.

Fix: Fix the sitemap generation/storage pipeline (S3 bucket reference is wrong or missing) and confirm sitemap_index.xml + child sitemaps resolve with 200 and valid XML before launch.

critical Structured data leaks the reference/competitor brand name 'Jewelwesell' and contains malformed URLs SEO (technical)

Homepage Organization/JewelryStore JSON-LD correctly uses name 'Website-19', but the sibling WebSite JSON-LD block on the same page has name:'Jewelwesell' and description:'<p></p>' (empty placeholder). The Organization block's own '@id' and 'url' fields are malformed with a doubled protocol: 'https://https://website-19.varnijewels.com/#organization' and 'https://https://website-19.varnijewels.com' — these will fail schema validation / Rich Results eligibility. The Organization contactPoint email is '[email protected]', not a Website-19 address.

Extracted ld+json from home.html: block 0 has '@id':'https://https://website-19.varnijewels.com/#organization' and contactPoint email 'customerservice@j[ewelwesell.com]'; block 1 (WebSite) has 'name':'Jewelwesell'.

Fix: Fix the double-https URL bug in the Organization schema generator, replace 'Jewelwesell' with the theme's brandName in the WebSite schema, and replace the leaked support email/phone with the actual Website-19 contact details.

critical og:site_name and full <title>/OG/Twitter metadata on every non-home page reads 'Jewelwesell' SEO (technical)

Homepage title/OG correctly say 'Website-19 — Certified Diamonds & Fine Jewelry', but og:site_name is 'Jewelwesell' even on the homepage, and every other page's <title>, og:title, og:description, twitter:title, twitter:description read 'Jewelwesell' instead of Website-19: /products -> 'Shop All Products | Jewelwesell' (+ og:description 'Explore our latest collection at Jewelwesell...'), /checkout/cart -> 'Cart - Jewelwesell', /checkout/address -> 'Address - Jewelwesell', PDP -> '... 232635 | Jewelwesell'.

curl + grep of <title> and og:*/twitter:* meta tags on /, /products, /checkout/cart, /checkout/address, and a PDP URL (see command output above).

Fix: This is the single largest brand-consistency defect on the site (see Brand Consistency category) and a genuine copyright/reference-brand-name leak per project rules. Every page-level title/meta template must read the theme's brandName, not a hardcoded 'Jewelwesell' fallback.

critical Reference/competitor brand name 'Jewelwesell' leaks across page titles, OG/Twitter metadata, structured data, and support contact details Brand Consistency

While the header wordmark, the mobile sidenav, the footer, the homepage <title>, and the homepage Organization JSON-LD all correctly show 'Website-19', a large and systemic set of surfaces still read 'Jewelwesell' (the apparent reference/competitor site this theme was cloned from): og:site_name on every page including the homepage; <title>/og:title/og:description/twitter:title/twitter:description on /products, /checkout/cart, /checkout/address, and PDP pages; the WebSite JSON-LD 'name' field; and the Organization JSON-LD contactPoint email '[email protected]'.

See SEO category findings for exact strings; summarized here: og:site_name='Jewelwesell' (home + products), <title>Cart - Jewelwesell</title>, <title>Address - Jewelwesell</title>, <title>...232635 | Jewelwesell</title>, ld+json WebSite name='Jewelwesell', Organization contactPoint email '[email protected]'.

Fix: This is the top-priority fix before launch: audit every title/meta/schema template for a hardcoded 'Jewelwesell' fallback or literal string and replace with themeContent.brandName ('Website-19'), and replace the support email/phone with the real Website-19 contact details.

critical Product photography carries a visible 'JewelWeSell' watermark Brand Consistency

The PDP product image (a diamond pendant) has a faint but clearly visible cursive 'JewelWeSell' watermark and a stylized 'W' logo baked into the photo itself.

Screenshot shots/05b-pdp.png shows the watermark diagonally across the product photo and in the bottom-left corner.

Fix: Do not use reference-site product photography with its watermark intact — this is both a brand-consistency failure and a real copyright/plagiarism risk per the project's originality rules. Source clean/licensed product imagery or have the watermark removed before these images are used in a live store.

major Intermittent 'please check your internet connection' errors on menu fetch and search Core Functionality

During the walkthrough, console repeatedly logged 'Error fetching menu: {message: Please check your internet connection and try again}' and 'Search error: {message: ...}' even though the network was fine and the page rendered content. Suggests a flaky API call or a race condition on the menu/search fetch (possibly a timeout too short, or the fetch firing before the store/session is ready).

walkthrough-log.txt console error dump: multiple 'Error fetching menu' and 'Search error' entries interleaved with successful navigations.

Fix: Investigate the menu/search API client's timeout and retry behavior; confirm it isn't erroring on cold start or on first paint before session/store id is set.

major Category listing pages return 200 with 'NO PRODUCTS FOUND' (soft 404s) and generic duplicate titles SEO (technical)

/jewelry-rings and /jewelry both return HTTP 200 with zero results, and both were observed with the generic title 'Products' rather than a unique, descriptive category title. A 200-status empty results page is a soft-404 SEO anti-pattern, and duplicate/generic titles across distinct category URLs hurt search differentiation.

Playwright walkthrough: 'rings category title: Products'; curl of /jewelry contains literal '0 results'.

Fix: Once the category/slug wiring is fixed (see Core Functionality), also give each category page a unique <title>/meta description, and consider returning a real 404 or noindex for genuinely empty category states.

major No security response headers on any page checked Security

Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy and Strict-Transport-Security (HSTS) were all absent from response headers on /, PDP, /checkout/cart and /checkout/address.

curl -D - on all four URLs; grep for the header names returned nothing in every case.

Fix: Add the standard security header set at the CDN/edge (Cloudflare) or app layer: CSP (at least a reasonable default-src), X-Frame-Options: DENY/SAMEORIGIN, X-Content-Type-Options: nosniff, Referrer-Policy, Permissions-Policy, and Strict-Transport-Security with a sensible max-age.

major Nav-level wordmark parity is actually correct (positive finding) Brand Consistency

Unlike prior findings on other stores in this fleet, the header logo, the mobile hamburger/sidenav, and the footer here ALL correctly show 'Website-19' — no API store-account-name leak (e.g. no 'Boris & Twins'-style leak) was found in the primary navigation surfaces.

Mobile nav text dump: 'Website-19 | Search for rings... | WELCOME GUEST | ... Website-19' consistent across header, mobile drawer, and footer copy ('Website-19 is your destination for certified diamonds...').

Fix: Keep this working correctly; the remaining brand-consistency work is entirely in page-level metadata/schema/imagery, not in-app navigation chrome.

medium Header search input not reliably automatable / behavior unconfirmed Core Functionality

A visible 'Search for rings, diamonds, gifts…' box renders in the header, but standard input selectors did not find a real <input> element in two automated passes, and typing did not consistently produce a results dropdown in the automated run.

Screenshot shots/01-home.png shows the search box; w19-pdp-variants-log.txt: 'search box found: false' on a later pass.

Fix: Manually re-verify search-as-you-type suggestions and full search-results page in a real browser; confirm results respect the project's bare-slug link convention rather than /products?search=.

medium No true PDP variant/option selector found on multiple products (mandatory check N/A, but flags a catalog design gap) Core Functionality

The PDP variant/selected-state check could not be exercised: the pendant PDP and the engagement-ring PDP both have zero metal/size swatches. Product titles instead bake the size directly into the product name/slug (e.g. '..._Sz0875-102848'), implying each size is modeled as a separate product/SKU rather than a variant of one PDP.

Ring PDP body text dump shows no size/metal option group; only gallery, price, ADD TO BAG. Screenshot w19-shots/ring-pdp-full.png.

Fix: Not a selected-state visibility bug (there is no selector to fail), but this materially hurts comparison shopping (customers must browse separate listings per size) and inflates catalogue/SEO duplication. Consider a true variant picker if the backend supports grouping by base product.

medium Lighthouse Performance score 55-56/100 (mobile) Performance / Core Web Vitals

Home performance category score 0.56, PDP 0.55.

lh-website-19-home.json categories.performance.score=0.56; lh-website-19-pdp.json categories.performance.score=0.55.

Fix: Target 90+ before launch for an ecommerce storefront; current scores indicate real-world mobile shoppers will perceive the site as slow to first paint.

medium og:image missing on the products/category page SEO (technical)

og:image and twitter:image are empty strings ('') on /products, meaning link shares of the catalogue page will render with no preview image.

grep of og:image on products.html: <meta property="og:image" content=""/>

Fix: Set a fallback OG image for listing pages when no category-specific image exists.

medium SearchAction JSON-LD target still uses /products?search= instead of the bare-slug convention SEO (technical)

The WebSite schema's potentialAction.target.urlTemplate is 'https://website-19.varnijewels.com/products?search={search_term_string}'. Per the project's standing link-convention rule, term/category search should resolve via the bare slug route (e.g. /{search_term_string}), not a query-string search on /products.

ld+json block 1 (WebSite) potentialAction.target.urlTemplate.

Fix: Point the SearchAction template at the bare-slug pattern (e.g. https://website-19.varnijewels.com/{search_term_string}) to match every other generated link on the site.

medium Thin PDP content SEO (technical)

PDP 'Description' section literally renders '-' and 'Specifications' has no visible content; this is thin content that will not help topical relevance or user trust.

Ring PDP body text dump: 'Product Description | - | Specifications | No reviews yet'.

Fix: Populate real product descriptions/specs per SKU or hide empty sections instead of rendering a bare dash.

medium litekart_store_id cookie set without Secure/HttpOnly attributes Security

The store-id cookie is issued with only Max-Age and Path; no Secure, HttpOnly, or explicit SameSite attribute is visible in the raw Set-Cookie header, though the browser-level cookie jar reported SameSite=Lax by default.

Set-Cookie header: 'litekart_store_id=store_01JNKD4PGSR8E3QZSGXYEE0PRV; Max-Age=31536000; Path=/'. Playwright cookie dump: secure:false, httpOnly:false.

Fix: Mark non-essential/tracking-adjacent cookies Secure (site is HTTPS-only) and HttpOnly where the cookie is not read by client JS; confirm SameSite is explicit rather than relying on browser defaults.

medium 38 console errors during a single guest session walkthrough Frontend / Responsive

Across Home -> PLP -> PDP -> Cart -> Checkout-address, 38 console.error entries were logged. Most are the expected guest-wishlist 422, but a meaningful subset are 'Error fetching menu' / 'Search error: Please check your internet connection and try again' style failures that do not correspond to an actual connectivity problem.

walkthrough-log.txt console error dump (38 entries, see Core Functionality finding on menu/search flakiness).

Fix: Clean up guest-state console noise and root-cause the intermittent menu/search fetch failures.

medium Color contrast and aria-attribute issues on PDP (Lighthouse) Frontend / Responsive

PDP fails 'aria-allowed-attr' (aria-* attributes don't match their roles) and 'color-contrast' (insufficient contrast) accessibility audits.

lh-website-19-pdp.json: aria-allowed-attr score 0, color-contrast score 0.

Fix: See Accessibility category for detail; fix ARIA role/attribute mismatches and low-contrast text/buttons on the PDP template.

medium Enhanced Ecommerce events (add_to_cart, purchase, etc.) not confirmed Analytics & Tracking

This audit did not capture an add_to_cart or begin_checkout GA event in the same run where the item was actually added to the bag (analytics network capture and the add-to-cart script were run separately). No Facebook/Meta Pixel (fbq) was detected at all.

typeof window.fbq === 'undefined'; dataLayer captured only 'js'/'config'/gtm.dom/gtm.historyChange events in the sampled run.

Fix: Re-verify with combined instrumentation that add_to_cart, view_item, begin_checkout and purchase Enhanced Ecommerce events actually push to dataLayer/GA4; add a Meta Pixel if paid social is part of the marketing plan.

medium No cookie-consent banner detected Analytics & Tracking

The word 'cookie' did not appear anywhere in the rendered body text on the pages visited, suggesting no consent banner/cookie notice is shown despite GA4 setting _ga/_ga_LXBXGL3R0P cookies immediately on load.

Playwright check: bodyText.toLowerCase().includes('cookie') === false; cookie jar shows _ga and _ga_LXBXGL3R0P set without any observed consent gate.

Fix: Add a cookie/consent notice (and ideally Google Consent Mode) before launch in any region with consent requirements (EU/UK/CA etc.).

medium aria-allowed-attr failure on PDP Accessibility (WCAG)

'[aria-*] attributes do not match their roles' — likely an ARIA attribute applied to an element/role combination that doesn't support it (common on custom gallery/carousel or option controls).

lh-website-19-pdp.json audits['aria-allowed-attr'].score = 0.

Fix: Run axe DevTools on the PDP to find the exact offending element(s) and correct the ARIA role/attribute pairing.

medium Color contrast failure on PDP Accessibility (WCAG)

Background/foreground color contrast ratio is insufficient somewhere on the PDP template.

lh-website-19-pdp.json audits['color-contrast'].score = 0.

Fix: Check price/badge/button text colors against their backgrounds (e.g. the red 'ADD TO BAG' button text, the strikethrough 'reg $X' price, and any light-gray micro-copy) with a contrast checker at WCAG AA (4.5:1 for normal text).

medium No social profile links or newsletter capture found in the footer link inventory Marketing Readiness

The footer link crawl returned 21 links, all policy/nav/duplicate-home links; no distinct social media profile URLs (Instagram/Facebook/Pinterest) or an email-capture form were detected.

Footer link dump: Contact Us, FAQs, Shipping Policy, Returns & Refunds, Engagement Rings, Wedding Bands, Loose Diamonds, The Journal, Our Story, Privacy Policy, Terms & Conditions, Refund Policy, Home (x5, some blank text) — no social icons/newsletter form present in this list.

Fix: Confirm whether social links/newsletter capture exist elsewhere on the page (they were not detected inside the <footer> tag); add if genuinely missing, as reference domains/handles per project rules (not the source brand's own profiles).

minor CLS and TBT are good Performance / Core Web Vitals

Cumulative Layout Shift: 0.022 (home) / 0.001 (PDP) — both well under the 0.1 'Good' threshold. Total Blocking Time: 10ms (home) / 20ms (PDP) — excellent.

lh-website-19-home.json / lh-website-19-pdp.json audits.

Fix: No action needed; layout stability and main-thread blocking are not the problem here — startup/paint timing is.

minor Heading order not sequential (Lighthouse) SEO (technical)

Lighthouse flags 'Heading elements are not in a sequentially-descending order' on both Home and PDP.

lh audits: heading-order score 0 on both pages.

Fix: Audit heading levels (h1->h2->h3) per template section; do not skip levels for styling reasons.

minor Heading order not sequential on both pages Accessibility (WCAG)

See SEO category for the same finding — impacts both SEO and screen-reader navigation.

lh audits: heading-order score 0 on Home and PDP.

Fix: Fix heading hierarchy per template.

minor Redundant alt text on Home Accessibility (WCAG)

'Image elements have [alt] attributes that are redundant text' — likely alt text duplicating adjacent visible text (e.g. alt="Website-19" next to a text logo).

lh-website-19-home.json audits['image-redundant-alt'].score = 0.

Fix: Use empty alt="" for purely decorative/duplicate images, and meaningful unique alt text for content images.

info Guest wishlist 422 is expected behavior Core Functionality

GET /api/wishlists/me returns 422 'Invalid credentials' for guests; this matches the documented expected behavior, not a defect.

Console: 'Failed to load resource: 422' + 'While fetching wishlist {message: Invalid credentials., success:false}'

Fix: No action needed; consider suppressing the console.error noise for guest sessions for cleanliness.

info Add to cart / cart / checkout-address happy path works Core Functionality

ADD TO BAG on the pendant PDP correctly added the item; cart page showed correct qty, subtotal, discount amount and 'PROCEED TO SHIPPING'; /checkout/address rendered guest contact fields (email required, phone optional) after an item was in the cart.

w19-shots/cart-with-item.png, w19-shots/address-with-item.png; cart body text confirmed '$6409.00' subtotal and correct discount math.

Fix: None — this portion of the funnel is functioning. Full address+payment+order-confirmation was not exercised (per instructions, no real purchase/payment was attempted).

info Canonical, meta viewport, robots.txt disallow rules present and reasonable on the pages checked SEO (technical)

PDP has a correct self-referencing canonical and a valid viewport meta tag. robots.txt blocks /checkout/*, /my/*, faceted-filter URLs, etc. — sensible crawl-budget rules.

curl of PDP HTML: <link rel="canonical" href="https://website-19.varnijewels.com/products/..."/>; robots.txt content dumped in full during audit.

Fix: None.

info TLS/certificate valid, no mixed content observed Security

Certificate is valid (Google Trust Services, CN=varnijewels.com likely wildcard, not-after Aug 28 2026), HTTP/2 in use via Cloudflare, and no mixed-content warnings surfaced during the walkthrough.

openssl s_client output: notBefore=May 30 2026, notAfter=Aug 28 2026, issuer=Google Trust Services.

Fix: None — keep monitoring expiry (MANUAL/ops item, see Monitoring category).

info CSRF/XSS protection, rate limiting, CAPTCHA, admin-panel protection, MFA, password policy, session timeout Security

Not observable from outside without attempting exploit-like behavior, which was out of scope for this audit.

N/A

Fix: Ops team should confirm these server-side controls exist on the shared api.varnijewels.com backend.

info Mobile layout collapses correctly, no horizontal scroll observed Frontend / Responsive

At 390x844 the header collapses to a hamburger, the sidenav opens correctly with the same 'Website-19' wordmark, and no horizontal overflow was visible in captured screenshots.

w19-shots / shots/02-mobile-home.png, 03-mobile-nav-open.png.

Fix: None from this pass; recommend a dedicated mobile-qa pass across more device sizes.

info Observed API behavior during the session Backend (externally observable + MANUAL)

Add-to-cart, cart-subtotal/discount calculation, and checkout-address rendering all responded quickly and correctly during manual exercise. Only failing API call observed was the expected guest wishlist 422.

w19-cart-checkout-log.txt.

Fix: None from the client side.

info DB query optimization/indexing, memory leaks, background job/queue/cron failures, log/error management, session management, cache invalidation, load balancing, autoscaling Backend (externally observable + MANUAL)

Not observable from outside the infrastructure.

N/A

Fix: Ops team should verify against the shared api.varnijewels.com backend directly (query plans, queue dashboards, server metrics).

info GA4 installed and firing page_view/user_engagement events Analytics & Tracking

gtag.js loads with measurement ID G-LXBXGL3R0P; page_view and user_engagement hits were captured going to google-analytics.com/g/collect during normal navigation. window.dataLayer and window.gtag are both populated/defined.

Network log: requests to www.googletagmanager.com/gtag/js?id=G-LXBXGL3R0P and www.google-analytics.com/g/collect with en=page_view / en=user_engagement.

Fix: None for basic install; verify Enhanced Ecommerce events specifically (see below).

info Lighthouse accessibility scores: 98/100 (Home), 88/100 (PDP) Accessibility (WCAG)

Home is close to perfect; PDP drops due to specific failures below.

lh-website-19-home.json categories.accessibility.score=0.98; lh-website-19-pdp.json categories.accessibility.score=0.88.

Fix: Close the gap between Home and PDP templates.

info Trust signals present Marketing Readiness

Cart/PDP sidebar shows 'Book an Appointment', 'Free Ring Sizing', 'Insured Delivery', 'Free Shipping & Returns', and the PDP shows 'Free & easy returns' and a WhatsApp chat bubble.

Cart and PDP body text dumps.

Fix: None; these read well for a jewelry vertical.

info Reviews present as an empty state, not populated Marketing Readiness

PDP shows 'No reviews yet / Be the first to share your thoughts' — an honest empty state rather than fake reviews, which is correct behavior, but means no social-proof signal exists yet for any product checked.

Ring PDP body text dump.

Fix: Consider seeding a modest number of real reviews once available; do not fabricate reviews.

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

Not observable from outside; this audit is a one-time external snapshot, not a monitoring integration check.

N/A

Fix: Confirm with ops which of these are wired up fleet-wide (e.g. uptime checks, SSL-expiry alerts for the Aug 28 2026 cert, CWV monitoring via CrUX/Search Console) vs. still to configure.

Mobile QA

Real mobile emulation (iPhone-class (Playwright devices['iPhone 13'], 390x664 CSS viewport, DPR 3, touch, mobile Safari UA) - portrait, iPhone-class - landscape spot-check on PDP (664x390), iPhone-class - Slow4G (400kbps/400ms latency) + 4x CPU throttle full pass, Android-class (Playwright devices['Pixel 7'], 412x839 CSS viewport, DPR 2.75, touch, Chrome mobile UA) - portrait, Android-class - landscape spot-check on PDP (839x412)), touch interaction, thumb-driven journey.

critical Mobile nav drawer leaks JewelWeSell brand identity and contact info nav-drawer

Opening the hamburger drawer shows a JewelWeSell script/cursive gold logo (not the Website-19 red wordmark used in the header) plus real JewelWeSell support contact info: [email protected] and +(646) 598-7516. Reproduced on both iPhone and Pixel profiles.

Load https://website-19.varnijewels.com/, tap the hamburger icon top-left, observe logo + Support Contact section.

Fix: Replace the drawer's logo asset and support email/phone with Website-19's own identity/placeholder; audit theme header/nav/footer components for any other leftover source-brand assets.

critical PDP hero product image fails to load (ORB-blocked) pdp

The primary product image request is blocked (net::ERR_BLOCKED_BY_ORB) on the cdn-cgi resize URL (media.jewelwesell.com/cdn-cgi/image/width=1280,quality=80,format=auto/stores/.../232635-0.jpg), leaving a large blank gray box in place of the hero photo. Reproduced on both iPhone and Pixel profiles.

Open https://website-19.varnijewels.com/products/400-ct-ef-vs-lab-grown-diamond-cartoon-pendant-in-14k-white-gold-232635 on a mobile viewport; main image area renders blank; console shows ERR_BLOCKED_BY_ORB for the cdn-cgi image URL.

Fix: Fix the image proxy/CDN/CORS configuration for the cdn-cgi resize path so mobile browsers can load the resized hero image.

major Add to Cart/Bag button is not sticky and starts below the fold pdp

The 'ADD TO BAG' CTA has position:static all the way up its ancestor chain (class tg-cta). On initial PDP load its bounding box sits below the visible viewport (y=867.8 vs 664px viewport height on iPhone profile), and it scrolls with the page rather than staying pinned: scrolling 600px moved the button by exactly 600px (867.8 -> 267.8), proving it is not fixed/sticky.

Load a PDP on a 390x664 mobile viewport; note the Add to Bag button position via devtools/boundingBox; scroll down and observe the button move with the page instead of staying pinned near the bottom.

Fix: Wrap the PDP add-to-cart CTA in a position:sticky/fixed bottom bar on mobile, matching the pattern already used correctly on the cart page's 'PROCEED TO SHIPPING' bar.

major No visible confirmation (toast/badge) after Add to Cart tap pdp

Tapping Add to Bag gives no toast/snackbar and no detectable cart-badge update in the DOM immediately after the tap; the button itself just turns a paler/washed-out red, which reads as disabled rather than confirmed. The item IS actually added (confirmed by loading the cart page afterward), so this is a silent-success UX defect, not a broken add-to-cart.

On any PDP, tap 'Add to Bag'; observe no toast and no header cart-count change; then separately navigate to /checkout/cart and see the item is there.

Fix: Add an immediate toast/snackbar confirmation and animate/update the header cart badge count on successful add-to-cart.

medium Small horizontal scroll on PDP in landscape orientation pdp-landscape

Rotating to landscape on the PDP produces scrollWidth slightly exceeding clientWidth (iPhone: 673 vs 664; Pixel: 847 vs 839), a ~7-9px overflow producing a visible scrollbar sliver at the right edge.

Open a PDP, rotate the emulated device to landscape (664x390 iPhone-class or 839x412 Android-class), check document.documentElement.scrollWidth vs clientWidth.

Fix: Audit fixed-width elements (likely the 3-up Pickup/Delivery/Shipping info row or gallery container) for landscape overflow and clamp to 100% width.

medium Filter sheet category-group labels are clipped/unreadable plp

In the Filters full-screen sheet, left-column facet-group labels are visually truncated with no ellipsis-affordance clarity, e.g. 'CENTER STONE CT...', 'SIDE STONE SETTI...', 'SIDE STONE SHAP...' - users cannot tell what the full facet name is without tapping into it.

On /products at mobile width, tap the 'Filter' chip at the bottom of the page; look at the left-hand facet group column.

Fix: Widen the label column, reduce font-size for long labels, or wrap text instead of clipping.

medium Hamburger menu tap target under 44px nav

The hamburger icon's actual hit area measured 24x24px on both iPhone and Pixel profiles, below the ~44x44px thumb-target guideline for a primary, every-page nav trigger.

Measure the boundingBox of the header hamburger button at mobile viewport width.

Fix: Increase the button's padding/hit-area to at least 44x44px without necessarily changing the visual icon size.

medium Product-card price block wraps awkwardly in 2-col mobile grid plp

On product cards, the 'reg' label is orphaned at the end of the current price line while the actual struck-through original price wraps down onto its own line beneath it (e.g. '$6409.00 reg' then '$32049.00' below), reading as an incomplete/broken price at a glance.

Load /products at mobile width, view any card's price block in the 2-column grid.

Fix: Prevent 'reg $X' from wrapping (white-space: nowrap or restructure the price row), or intentionally stack label above price with clear spacing/styling.

minor Duplicate 'Home' entry in mobile nav drawer nav-drawer

The drawer's 'Shop & Explore' section lists two separate 'Home' rows back to back.

Open the hamburger drawer and look at the first two links under Shop & Explore.

Fix: De-duplicate the nav/menu configuration entries feeding the mobile drawer.

minor Could not verify PDP variant-chip selected-state contrast pdp

The sampled PDP (4.00ct cartoon diamond pendant) has no color/size/metal variant chips at all - only a star-rating widget (1-5) and review/feedback tab buttons were found. The known fleet-wide risk of an invisible/low-contrast selected variant state could not be exercised on this product.

N/A - need a configurable product (e.g. a ring with size/metal options) to test.

Fix: Re-run this specific check against a product that has real variant options.

Desktop QA

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

critical Multiple distinct nav category labels collapse onto the same 2 slugs, and both return 0 products Nav / Category mapping

Header nav renders 7 category links (Engagement Rings, Wedding Bands, Diamonds, Necklaces, Earrings, Bracelets, Gifts) but they only resolve to 2 unique hrefs: Engagement Rings & Wedding Bands both -> /jewelry-rings; Diamonds, Necklaces, Earrings, Bracelets all -> /jewelry (Gifts -> /products, generic). Loading /jewelry directly renders 'All Products / 0 results'. Confirmed identically at all 3 desktop widths.

Load https://website-19.varnijewels.com/, hover/click 'Necklaces' in the top nav row (renders href=/jewelry) -> PLP shows 'All Products, 0 results'. Compare hrefs of Diamonds/Necklaces/Earrings/Bracelets in DOM - all identical '/jewelry'.

Fix: Wire each nav category label to its own real Meilisearch category slug (e.g. /necklaces, /earrings, /diamonds, /bracelets) per the project's slug-route convention, instead of funneling 4+ categories into one shared, empty '/jewelry' listing.

critical Homepage promo/collection banner images fail to load, leaving large blank white gaps in wide layout Home / Visual polish

Scrolling the homepage at desktop width reveals 'The Solitaire Collection' banner and both 'Gifts they will treasure' cards (Anniversary gifts / Bridal party gifts) rendering with no image at all - just empty white space where a lifestyle/product image should fill the section, breaking the wide-screen layout balance. Network capture shows repeated 'net::ERR_ABORTED' on GET requests to media.jewelwesell.com/New_JWS/... on every page (home, PLP) across all 3 viewports (consistently ~14-16 aborted image requests per page load) - classic ORB (Opaque Response Blocking) behavior for a cross-origin hotlinked image loaded in an <img> without proper CORS.

Load https://website-19.varnijewels.com/ at any desktop width, scroll to 'The Solitaire Collection' and 'Gifts they will treasure' sections; open DevTools Network tab and filter on media.jewelwesell.com - all requests show (failed) net::ERR_ABORTED.

Fix: Stop hotlinking media.jewelwesell.com. Rehost/proxy these images through static.varnijewels.com (as the main PDP/PLP product photography already correctly does) or through the app's own image proxy so the browser doesn't ORB-block the cross-origin no-cors image load.

major No megamenu/dropdown exists at all on desktop hover - category nav is flat with color-only hover feedback Nav / Megamenu

Hovering any top-level category link (Categories, Engagement, Engagement Rings, Necklaces, Diamonds, etc.) at 1920x1080 / 1440x900 / 1366x768 produces only a text-color change (to red) - no dropdown/flyout panel appears in the DOM at any width, checked both programmatically (querying for any newly-visible [class*=mega], [class*=dropdown], [class*=submenu], [role=menu] element) and visually via screenshot. A discerning desktop shopper expects a hover-triggered megamenu with sub-category groupings on a jewelry storefront of this density (1000+ products); instead all sub-navigation is flattened into a single static second row.

At any of the 3 desktop widths, hover 'Engagement Rings' or 'Necklaces' in the header for 800ms and observe: text turns red, no panel opens below it.

Fix: Either implement a real hover megamenu with sub-category flyouts pulled from the backend menu API (per the fleet's 'megamenu from backend API' convention), or, if a flat single-row nav is the intended design for this theme, confirm that's deliberate - as-is it reads as a broken/missing interaction to a mouse-driven desktop shopper.

major Product description text does not match the actual product (templated/generic copy) PDP / Content quality

PDP for '4.00 ct EF VS Lab Grown Diamond Cartoon Pendant in 14k White Gold 232635' (a diamond teddy-bear pendant) shows Product Description: "...this ring showcases a rich green emerald surrounded by dazzling diamonds, all set in a finely crafted gold band..." - describes a completely different product (a ring, with an emerald, no bear motif). This is a generic/templated description that was not customized per product.

Open https://website-19.varnijewels.com/products/400-ct-ef-vs-lab-grown-diamond-cartoon-pendant-in-14k-white-gold-232635, expand 'Product Description' - text describes an emerald ring, not the pendant shown.

Fix: Audit the product-description generation/import pipeline for this store; ensure descriptions are generated per-product (title/gem/setting-aware) rather than reused boilerplate. This directly undermines shopper trust at the moment of purchase decision.

medium No toast notification or cart-badge update after clicking Add to Bag PDP / Add to Cart feedback

Clicking 'ADD TO BAG' on the PDP successfully adds the item (confirmed by navigating to /checkout/cart and seeing it there), but no toast/snackbar appears and the header cart icon shows no count badge immediately after the click, across all 3 viewports. The button itself also fades to a washed-out light-pink color after the click (screenshot: w19d-1920x1080-10-pdp-add-to-cart.png), which reads ambiguously like a disabled/error state rather than a clear 'added' confirmation.

Open any PDP, click 'ADD TO BAG', observe header cart icon (top right) - no badge/count appears; no toast shown; button turns pale pink.

Fix: Add an immediate toast/snackbar ('Added to bag') and update the cart icon badge count synchronously with the add-to-cart response so a desktop shopper gets instant confirmation without navigating away.

minor No hover-zoom on the main product image PDP / Gallery

Hovering the large PDP gallery image at all 3 desktop widths produces no CSS transform/zoom or lightbox trigger (computed transform stayed 'none' before/after hover). For a jewelry storefront where shoppers want to inspect stone/setting detail, this is a missed desktop-specific polish opportunity (mouse users expect hover-zoom or click-to-lightbox, unlike mobile pinch-zoom).

Open any PDP at desktop width, hover over the main image for 500ms - image does not scale/zoom, no lightbox opens.

Fix: Add a hover-zoom (magnifier or scale-on-hover) or click-to-lightbox interaction on the main PDP image for desktop pointer users.

minor No visible sort control found on /products PLP

Automated search for a sort <select>/button (`select[name*=sort]`, `[class*=sort] select`, `button[class*=sort]`) found nothing on 3 separate runs, despite a 'SORT / Recommended' label being visible in the PLP screenshot toolbar - it's likely a custom dropdown component whose DOM doesn't match common sort-control patterns, or genuinely non-interactive.

Load /products at any desktop width, inspect the 'SORT Recommended' control in the filter bar.

Fix: Verify manually that the 'SORT: Recommended' control in the top-right of the filter bar actually opens a functioning sort menu; if it's a static label, wire it up.

minor One PLP card image renders with a large blank/white gap under a partial image PLP / Product imagery

On /products, the 4th card in the first row ('0.66 ct ... Circle Cluster Engagement Ring... ') shows only the top sliver of a necklace/tiara image with a large blank white area filling the rest of the image box, while sibling cards show full images cleanly.

Load /products at 1920x1080, look at card #4 in the first row - see w19d-1920x1080-05-plp.png.

Fix: Check that product's source image asset/crop; likely a bad crop or an image with excess whitespace baked in, or a partially-failed image load.

minor Intermittent 'Failed to fetch' console errors for featured products, collection, search, and menu APIs Reliability / Backend

During the 1366x768 pass, 6 additional console errors appeared beyond the expected/known wishlist 422 ('Error loading featured products: TypeError: Failed to fetch', 'Error fetching menu: TypeError: Failed to fetch', 'Search error: TypeError: Failed to fetch', etc.) that did not appear on the 1920 or 1440 passes with an identical script. Likely transient network/backend flakiness (possibly rate-limiting from rapid repeated automated navigations) rather than a hard desktop-specific bug, but flagged since it touches menu/search/featured-products reliability.

Not reliably reproducible on demand; seen once during the 1366x768 automated pass. See w19d-result-1366x768.json consoleErrors array.

Fix: Monitor backend (api.varnijewels.com) for rate-limit or intermittent network errors under back-to-back navigation; not conclusively a desktop-QA-specific defect, worth a follow-up spot check.

← All storefronts