VARNI STOREFRONTS · QUALITY AUDIT · 2026-07-12
Live site: https://iceheist.varnijewels.com · Design reference: iceheist.com
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.
Launch-readiness scoring. Infra-only items are marked MANUAL and left unscored.
| Category | Score | Verdict | Defects |
|---|---|---|---|
| Core Functionality (guest journey) | 75 | warn | 5 |
| Performance & Core Web Vitals | 20 | fail | 3 |
| Technical SEO | 42 | fail | 7 |
| Security | 38 | fail | 3 |
| Frontend / Responsive | 80 | warn | 2 |
| Backend / API (externally observable only) | 70 | manual | 2 |
| Analytics & Tracking | 5 | fail | 2 |
| Accessibility (WCAG) | 82 | warn | 3 |
| Brand Consistency | 60 | warn | 3 |
| Marketing Readiness | 42 | warn | 3 |
| Monitoring & Maintenance | — | manual | 1 |
Lighthouse CLI, mobile emulation defaults.
| Page | url | performance | accessibility | bestPractices | seo | lcp | cls | tbt | fcp | speedIndex | tti | reportPath |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| home | https://iceheist.varnijewels.com/ | 36 | 92 | 96 | 100 | 58.5 s | 0.6 | 0 ms | 3.9 s | 10.5 s | 58.7 s | lh-iceheist-home.json |
| pdp | https://iceheist.varnijewels.com/products/test-import-104364_0588_0402 | 59 | 89 | 96 | 100 | 9.4 s | 0.039 | 20 ms | 3.9 s | 8.9 s | 9.4 s | lh-iceheist-pdp.json |
34 findings across functionality, SEO, security, performance, accessibility, analytics and brand consistency.
LCP 58.5s (threshold: good <2.5s), Interactive/TTI 58.7s, Speed Index 10.5s, CLS 0.6 (threshold: good <0.1), FCP 3.9s, TBT 0ms.
Fix: Investigate the LCP element on the homepage (likely a large hero/banner image or slow-resolving client-side render) — this is launch-blocking. Also fix layout shift sources (banners/carousels loading without reserved space).
LCP 9.4s (threshold: good <2.5s), TTI 9.4s, Speed Index 8.9s, CLS 0.039 (good), TBT 20ms (good), FCP 3.9s.
Fix: Optimize PDP largest image/gallery loading (preload hero product image, serve next-gen formats, reduce render-blocking JS before first paint).
<title>Home | Our Store</title>; meta description 'Welcome to our store! We are dedicated to providing the best shopping experience.'; og:title/twitter:title also read 'Home | Our Store'. og:site_name correctly reads 'ICE HEIST', so the mismatch is isolated to page title/description templates, not a reference-brand leak.
Fix: Wire the homepage <title>/meta description/OG/Twitter title-description through themeContent.brandName and a real value prop, not the 'Our Store' placeholder default.
robots.txt declares Sitemap: https://iceheist.varnijewels.com/sitemaps/iceheist.varnijewels.com-sitemaps/sitemap_index.xml. /sitemap.xml returns 404 with {"message":"Sitemap not found, you can generate sitemap through the admin dashboard."}; the exact URL declared in robots.txt returns HTTP 500.
Fix: Generate the sitemap via the admin dashboard (per the site's own error message) or fix the sitemap generation job; this is launch-blocking for organic discovery/indexing.
curl -I on the homepage shows no Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, or Strict-Transport-Security headers.
Fix: Add the standard security header set at the edge (Cloudflare) or app layer: CSP, X-Frame-Options/frame-ancestors, X-Content-Type-Options: nosniff, Referrer-Policy, Permissions-Policy, and HSTS.
Grep of the full homepage HTML for googletagmanager, gtag, GTM-*, G-*, fbq(, and Facebook pixel script tags returned zero matches.
Fix: Install GA4/GTM (and Meta Pixel if used) with Enhanced Ecommerce events (view_item, add_to_cart, begin_checkout, purchase) before launch — currently there is no way to measure conversion or funnel drop-off.
This is a brand-consistency failure even though it isn't a reference-brand leak: the visible browser tab, search result snippet, and shared-link preview all show 'Home | Our Store' instead of Ice Heist branding.
Fix: Same fix as the SEO finding — wire title/meta through themeContent.brandName.
Fix: See Analytics & Tracking section.
Homepage, mobile nav, PLP, and 'You may also like' rails are dominated by placeholder products named 'TEST IMPORT-XXXXXX', 'DIAMOND ESSENTIALS BUNDLE 14K WHITE GOLD2', etc. Many of these show 'OUT OF STOCK'. The PDP used for this walkthrough itself is named 'Test Import-104364_0588_0402'.
Fix: Purge or hide test/seed SKUs from the live storefront before launch; replace with real, in-stock catalog data.
cf-cache-status: DYNAMIC on the homepage response — HTML is not being cached at the edge.
Fix: MANUAL/infra: review Cloudflare cache rules and server-side caching for HTML/API responses.
itemListElement[0].item = 'https://iceheist.varnijewels.comrings' — concatenation bug drops the '/' before the category slug, producing an invalid URL.
Fix: Fix the breadcrumb schema URL builder to join base URL and slug with a '/'.
Product ld+json only contains brand, aggregateRating (5.0 from 1 review), and offers.priceValidUntil. It is missing name, image, description, sku, url, offers.price, offers.priceCurrency, and offers.availability — Google's Merchant/Product rich-result validator will flag this as incomplete.
Fix: Populate full Product schema (name/image/sku/offers.price/priceCurrency/availability/url) from the same PDP data already rendered on the page.
Grep for cookie-consent/accept-cookies copy on the homepage returned no matches.
Fix: Add a consent banner if any tracking/analytics is added, and wire Google Consent Mode if targeting EU/UK traffic.
sameAs: ["https://x.com/", "https://www.facebook.com/", "https://www.instagram.com/", "https://youtube.com"] — matches the header social icon hrefs, which are also generic platform roots rather than a real @iceheist handle.
Fix: Point social icons and schema sameAs at real store social profile URLs, or remove them if no real profiles exist yet.
Fix: See Brand Consistency section.
276 links captured, 64 unique; 7 resolve to '', '#', or javascript:void(0).
Fix: Audit and fix or remove dead anchors.
<meta property="og:image" content=""/> and <meta name="twitter:image" content=""/> — sharing the homepage link will show no preview image.
Fix: Set a branded hero/logo image for social sharing previews.
Automated scan found <h1> elements reading 'Custom Design Jewellery' and 'FAQs' — not a page-level branded H1 for the homepage itself.
Fix: Confirm heading hierarchy: homepage should carry one canonical H1 (e.g. hero headline), with section titles as H2.
The actual header logo image (static.varnijewels.com asset) has alt text 'Logo' rather than the brand name (e.g. 'Ice Heist').
Fix: Set alt text to the brand name for accessibility and SEO.
Scanned for 'Skip to content'/'Skip to main' anchors on the homepage — none found.
Fix: Add a visually-hidden-until-focused skip link before the header.
See Frontend / Responsive finding.
Add to cart -> /checkout/cart -> 'Go To Checkout' -> /checkout/address renders a guest contact form (email, phone, 'Login to autofill your details' optional, Save Contact) without forcing login. Qty stepper, delete, subtotal, and coupon field are present on cart.
Fix: None — working as expected. Note: on first attempt the cart->address transition showed a stuck-looking full-page dim + spinner overlay for a few seconds before Playwright's shorter wait caught up; consider tightening the loading-state visual so it doesn't read as frozen.
Console shows 'Failed to load resource: 422' and 'While fetching wishlist {message: Invalid credentials.}' on home, PLP, PDP, and cart for an unauthenticated visitor.
Fix: This matches the known/expected guest-wishlist-422 behavior called out in the fix list — not a new bug. No action required, but confirm the UI never surfaces this as a visible user-facing error.
Automated scan found 0 option-group elements / 0 variant-button candidates on the 'Test Import-104364_0588_0402' PDP (single-variant product), so the mandatory selected-state visibility check could not be exercised on this SKU.
Fix: MANUAL follow-up: re-run the variant-selected-state check on a multi-variant product (e.g. a ring with metal/size options) to confirm selected-chip contrast per the mandatory PDP rule.
robots.txt disallows checkout/my/filter-query paths appropriately and declares a sitemap URL (which itself 500s, see above). Canonical tag present and self-referential on home and PDP.
Fix: None beyond the sitemap fix above.
Site is served over HTTP/2 HTTPS via Cloudflare with a valid cert (browser TLS negotiation succeeded for all Playwright/Lighthouse/curl runs). The litekart_store_id cookie is set with HttpOnly; Secure; SameSite=Lax.
Fix: None.
Not externally observable from the storefront surface.
Fix: MANUAL/ops: verify with the platform/infra team (shared api.varnijewels.com backend).
Mobile home, mobile sidenav open, and mobile nav click-through all captured without errors; sidenav text extraction succeeded with full category tree.
Fix: None.
No 502s or Cloudflare-shim crashes observed across home, PLP, PDP, cart, and checkout/address during this run.
Fix: None from the outside.
Not observable from outside the app.
Fix: MANUAL/ops: verify via backend monitoring on api.varnijewels.com.
Both above the common 90 bar on home, PDP slightly under.
Header wordmark, mobile sidenav, footer, product cards, PDP title, and Organization/WebSite schema all consistently say 'ICE HEIST' / 'Ice Heist'. No sign of a leaked reference/API-store name (e.g. no 'Boris & Twins').
Fix: None — this is the correct theme-wins behavior.
'Our Best Service For You' trust row (Ethical Sourcing, Customisation Service, Bespoke Jewellery, Excellent Quality, World Wide Shipping, Sales Support 24/7), an FAQ accordion, and a 'Stay In Touch' email subscribe field all render on the homepage.
Not observable from outside the storefront.
Fix: MANUAL/ops: confirm which of these are wired up for the shared Varni fleet (Dokploy + api.varnijewels.com).
Real mobile emulation (iPhone 13 (390x844, DPR3, touch, mobile Safari UA) via Playwright chromium headless, devices['iPhone 13'], Pixel 7 (412x915, DPR2.625, touch, mobile Chrome UA) via Playwright chromium headless, devices['Pixel 7'], Landscape spot-checks on both profiles (844x390 and 915x412) for home, PDP, checkout), touch interaction, thumb-driven journey.
Under Slow-4G + 4x CPU throttle (representative of real mobile conditions), the homepage hero/carousel region was still an empty grey placeholder or a partial sliver of image after 90+ seconds of elapsed wall time; the page's own H1/hero element jumped ~516 CSS px vertically (from y=4580 to y=4064) between the 8s and 15s in-page checkpoints. This corroborates and adds texture to the already-known ~58s unthrottled LCP / ~0.6 CLS finding from the prior launch-readiness pass: a real one-thumb user would almost certainly have abandoned long before the page settles, and any tap placed near the top of the visible content before the jump risks landing on the wrong element after content reflows underneath it. 104 of the page's image requests were observed with net::ERR_ABORTED during the load window (partly an artifact of repeat navigations in this test, but also consistent with images being repeatedly re-triggered as the layout reflows).
Fix: Reserve explicit width/height or aspect-ratio on the hero/carousel image containers so layout doesn't shift as images arrive; prioritize/preload the LCP hero image; investigate the high volume of aborted image requests; re-verify against the prior launch-readiness Core Web Vitals findings after a fix.
The PDP's Add to Cart button (374x64 on iPhone13, 396x64 on Pixel7 — good size) sits in a normal, non-fixed flow position. After scrolling down ~800-900px (e.g. to read specs), computed style is position:static and the button's rect moves to y=-114 / y=-175 (fully above the viewport). There is no persistent bottom action bar bringing it back, unlike the Cart page and PLP's sort/filter bar, both of which DO have a fixed bottom bar on this same site. A shopper who scrolls down to read product details has to manually scroll back to the top to buy.
Fix: Add a fixed/sticky bottom Add-to-Cart bar on PDP once the primary button scrolls out of view, matching the pattern already used on Cart/PLP.
Tapping Add to Cart produced no toast/snackbar and no immediate cart-badge change in the same view; toastVisible was false and both cartBadgeBefore/After were null immediately after the tap in the instrumented run, even though the add did register server-side (confirmed later on the Cart page where the subtotal was correct). On a slow, janky page this is exactly the situation where a user re-taps, adds a duplicate, or gives up thinking the button is broken.
Fix: Fire an immediate toast/snackbar plus a visible cart-badge bump animation the instant Add to Cart succeeds.
Every sampled Rings product (6 different PDPs, plus the PLP grid covering the 262-product Rings category) displays its literal import SKU — e.g. 'TEST IMPORT-104364_0588_0402', 'TEST IMPORT-100269' — as the product title on the PLP card, the PDP H1, and the Cart line item. Cart also shows a 'You saved $13,185.61' banner against an 81% strikethrough discount ($18,592 -> $3,568) on a single ring. On a phone, where a shopper skims a compact 2-column grid at speed, this reads as broken/fake inventory and undermines trust at the exact screens (PLP/PDP/cart) that decide mobile conversion. This is the mobile-visible face of the already-known 'catalog has TEST IMPORT seed SKUs' issue from the prior launch-readiness pass — flagged here with the specific mobile screens/evidence it appears on.
Fix: Replace seed/import SKU strings with real merchandised product names before launch; review discount-percentage plausibility across the catalog.
Measured on iPhone 13: quantity '+' stepper bounding box is 24x24 CSS px; remove/trash icon button is 30x30 CSS px. Pixel 7 confirms the same ~30x30 remove control. Both are core, frequently-tapped controls for a one-thumb shopper adjusting quantity or removing an item, and both sit meaningfully below the generally accepted 44x44 minimum hit area.
Fix: Increase the tappable hit-area (via padding, not necessarily the visual icon) to at least 44x44 CSS px on both controls.
On the iPhone-13-height viewport (390x844) the cart item's quantity stepper and trash icon sit flush against, and appear partially obscured by, the fixed black 'Go To Checkout' bottom bar. The identical cart page on the taller Pixel 7 viewport (412x915) shows clear separation between the same controls and the fixed bar. This indicates the cart list's bottom padding/safe-area doesn't reserve enough space for the fixed bar's height on standard-or-shorter phone screens, risking mis-taps or a control the user can't reach cleanly.
Fix: Add bottom padding to the cart item list equal to the fixed bar's rendered height (plus safe-area-inset-bottom) so controls are never crowded by it.
The mobile nav trigger (the primary way to reach all site navigation on a phone) has a bounding box of 28x28 CSS px, below the ~44x44 minimum recommended for a frequently-tapped primary control.
Fix: Increase the button's padding/hit-area to at least 44x44 CSS px while keeping the visual icon size unchanged.
document.title on the homepage reads 'Home | Our Store' even though the on-page header/footer clearly brand the site as 'Ice Heist'. This surfaces in the mobile browser tab, bookmarks, share sheets, and search snippets.
Fix: Wire the page <title> from the theme's brand config (brandName) rather than a generic default.
On the Rings PLP, the banner subtitle ('Level up your fit. Our collections are made of high quality moissanite diamonds and sterling silver.') renders as light grey text on a light grey overlay, requiring the reader to strain even without competing with outdoor daylight glare.
Fix: Increase the contrast ratio of the banner subtitle text against its background overlay.
Both the cart step and the contact-details/address step display the same 'YOUR SHOPPING BAG' H1, even though a step indicator elsewhere on the page (Shopping Cart -> Checkout Details -> Order Complete) shows the correct step. Navigating directly to /checkout/address with an empty cart renders 'Your cart is empty' / 'Continue Shopping' rather than address-step content, which is defensible behavior but the label mismatch across steps is a small polish gap.
Fix: Make the page H1 reflect the active checkout step (e.g. 'Checkout Details').
Across 6 different sampled Rings PDPs, none rendered any option-group or chip-button elements (0 in every case); each PDP instead lists attributes like 'Ring Size: 7', 'Metal Color: White' as static specs, suggesting each size/metal combination is modeled as its own separate product/SKU rather than a variant of one PDP. This may be an intentional catalog structure, in which case there is nothing to fix, but it does mean a mobile shopper cannot switch ring size or metal from the PDP itself without navigating back to search — and it means the known fleet-wide 'PDP selected option invisible' pattern could not be checked here for lack of a variant control to test.
Fix: If a variant model is intended (so the same product page lets a shopper switch size/metal), implement chip controls with a clearly visible selected state (per fleet standard: 2px accent border, readable text) and re-run this check. If the one-SKU-per-listing model is intentional, no action needed here, but consider surfacing 'other sizes' as related-product links.
Desktop viewports (1920x1080, 1440x900, 1366x768), hover states, keyboard navigation, layout integrity.
Product titles are raw 'TEST IMPORT-xxxxx' SKU strings across every category (rings, pendants). Multiple unrelated products all show identical $1784 price with a fabricated 'was $9296, saved $7512 (80%+ off)' discount banner, visible on PLP and again in cart ('You saved $7512 on this order').
Fix: Replace seed/import data with real catalog names, descriptions and honest pricing before launch; this is a catalog/CMS data fix, not a theme code fix.
Main product image renders at a fixed 547x547 CSS px regardless of viewport. Measured via DOM rects at 1920x1080: image right edge = 658px, product title (h1) left edge = 1235px, leaving 577px (30% of the 1920px viewport) of empty white space between the gallery and info column. No thumbnail strip, no lightbox, no hover-zoom overlay of any kind.
Fix: Make the gallery column responsive (scale with viewport / max-width container), add a thumbnail rail, and add hover-zoom or click-to-lightbox on the main image.
Hovering the main product image for 600ms produces a pixel-identical screenshot to the resting state — no cursor change, no magnify overlay, no zoom-in behavior tested.
Fix: Implement hover-zoom (magnifier or scale-on-hover) consistent with desktop shopper expectations called out in this audit's brief.
Direct PerformanceObserver measurement (buffered layout-shift entries, 9s settle window after domcontentloaded) recorded CLS of 0.668 at 1920x1080, 0.674 at 1440x900, and 0.622 at 1366x768 -- solidly in the 'poor' (>0.25) Core Web Vitals band on every desktop size tested. domcontentloaded itself took 10-17 seconds.
Fix: Reserve image/banner dimensions (aspect-ratio or explicit width/height) so hero content doesn't shift after load; this compounds the known ~58s LCP issue.
For several seconds after DOMContentLoaded, the top announcement bar shows the literal text '<ul></ul>' instead of the intended tagline. It later resolves to 'Crafting Beauty since 2015'. Reproduced at both 1920x1080 and 1440x900.
Fix: Fix the announcement-bar component's empty/loading state -- looks like an unescaped or mis-templated promo-list render.
document.title returns 'Home | Our Store' on every page at all 3 viewports tested, rather than an Ice Heist-branded title. Affects SEO and browser tab/bookmark identity, which matters more on desktop where users keep many tabs open.
Fix: Wire the theme's brandName into route/page metadata (title tag), following the same brand-wordmark-parity rule already applied to visible header/footer/sidenav.
Home/PLP/PDP header icon row shows 4 icons (compare/refresh, cart, account, wishlist). The /checkout/cart page's header shows only 3 icons -- the cart icon itself is missing while viewing the cart.
Fix: Fix the header component's conditional render so the cart icon persists on the cart page itself.
After adding to cart and scrolling ~1200px down the PDP, the Add to Cart button/price are gone and a large empty gray/white area is visible before the Reviews section -- the info column is much shorter than the (empty) gallery column, so scrolling exposes more dead space rather than more content.
Fix: Add a sticky/persistent add-to-cart summary bar for desktop, and balance column heights in the PDP grid.
Tabbing from page load on /checkout/address takes 16 presses (1920x1080), 20+ presses (1440x900, did not reach within 20 tabs), and 16 presses (1366x768) to reach the Email address input -- every page tabs through social icons, language selector, currency selector, account/wishlist icons, and the full 5-item nav before reaching page content. Focus rings themselves ARE visible (1-2px blue outline) throughout, so this is inefficiency rather than an invisible-focus failure.
Fix: Add a 'skip to content' link as the first focusable element, or reorder tabindex so page content is reachable before the full top-bar/nav chrome.
Screenshots taken before and after a 500ms hover on the first PLP product card are pixel-identical -- no shadow/elevation, no scale, no image swap. Quick-action icons (cart/wishlist/quick-view) are always visible rather than reveal-on-hover, so mouse-over communicates no interactivity.
Fix: Add a subtle hover transition (shadow/elevation or image swap) to product cards for desktop mouse users.
This pass explicitly enumerated header <a> (9 links), footer <a> (41 links), and every opened megamenu panel's links across all 3 viewports and found 0 with href='#', empty href, or javascript: -- contradicting prior known context of 7 dead/hash hrefs. Not claiming the prior finding was wrong; flagging as unresolved-but-not-reproduced since it may be on a page/state this pass didn't visit.
Fix: Re-verify against the original finding's specific page/state before considering it closed or still open.
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.
Desktop QA checked header, footer and megamenu across all three viewports and found zero dead hrefs.
Action: Left open rather than closed — the original finding may have sampled a page the QA pass did not.