CRO Audit + Implementation Sprint

Scandinavian Furniture Marketplace

Full CRO audit and 87-commit implementation sprint for a Norwegian used luxury furniture store with 0.11% mobile conversion rate. Microsoft Clarity data, Dawn Sense 2.2 theme customization, and trust-first PDP rebuild.

+51% Total sales (30-day)
+41% Add to cart
+40% Checkout

Scandinavian furniture marketplace Shopify homepage on Dawn Sense 2.2 selling premium vintage Stressless and Conform recliners

The Store

A Norwegian curated marketplace selling premium used and vintage Scandinavian furniture, including mid-century Danish teak dining sets, designer chairs, and other high-end pieces. Price points ranged from 5,000 to 30,000+ NOK (roughly $500 to $3,000+), with every item being one-of-a-kind. The store ran on Shopify’s Dawn-based Sense 2.2 theme.

75% of traffic came from mobile, with 56% of all sessions arriving through Meta’s in-app browser (FacebookApp), which has known issues with cookie support, tracking pixels, and page rendering. The store was spending on acquisition but converting almost nobody. Mobile CVR sat at 0.11-0.23%, with an ATC rate of 1.6% against a 5-10% benchmark. In a 3-day Clarity sample of 893 sessions (123 bots excluded), only 6 resulted in an add-to-cart. 94.74% of visitors were new users with almost zero returning customers. Average active time per session was 31 seconds.

The Audit: Microsoft Clarity Data

The 5-day audit produced 43 findings across homepage, PDP desktop, PDP mobile, cart, checkout, collection pages, and the about page: 15 critical, 19 high priority, and 8 medium. Before writing a single line of code, I installed Microsoft Clarity and collected behavioral data. The findings directed the entire sprint.

Scroll Depth - PDP Mobile (76 Sessions)

Scroll % Visitors Remaining Drop-off What’s at This Depth
5% 76 (100%) 0% Header + announcement bar
15% 69 (91%) 9% Product images
30% 60 (79%) 21% ATC button area
50% 50 (66%) 34% Trust icons + description
70% 40 (53%) 47% Accordion tabs
80% 38 (50%) 50% Related products
85% 11 (14%) 86% Contact form + footer

21% of visitors never reached the ATC button. By the time 50% of visitors had left, they had not seen the description, trust signals, or related products. The page was too long for its mobile layout, and the ATC button was buried below oversized images.

Click/Tap Data - Popups Blocking Everything

Rank Element Taps % of Total
1 Cookie consent “Accept” 23 23%
2 Omnisend email popup 14 14%
3 Cookie consent “Decline” 10 10%
4 Omnisend (second interaction) 9 9%

56% of ALL mobile taps were on cookie consent and email popups. Users were spending their sessions dismissing overlays instead of shopping. The cookie consent modal covered approximately 60% of the mobile viewport. The Omnisend popup was firing on product pages where it had zero signups. A persistent bottom bar for email notifications was blocking content on every page.

Session Recording Findings

  • Users navigated in listing-to-PDP loops without adding to cart (rapid scanning behavior)
  • Meta ad traffic spent time on product images but never reached the CTA
  • Some users reached checkout but abandoned at the quantity/special instructions step
  • Users visited the About page and Return Policy page multiple times, which is trust-seeking behavior indicating they wanted to buy but did not feel confident enough

The Implementation: 87 Commits Across 10 Tasks

The implementation was prioritized by the Clarity data. Popup fixes first (56% of taps wasted), then mobile PDP layout (21% drop before ATC), then trust signals, then collection page improvements.

The cookie consent modal was converted from a full-screen overlay to a small bottom-bar notice. The Omnisend email popup was disabled on product pages entirely (zero signups from PDPs, only tap-wasting). The persistent “Get notified about new items” bottom bar was removed from product pages via CSS scoping.

After this single change, 56% of mobile interaction was freed up for actual shopping behavior.

P1: Mobile PDP Layout Rebuild

Image height constraint. Product images were consuming the entire mobile viewport. Added max-height: min(55vw, 280px) with object-fit: contain to keep images proportional but not overwhelming. On a 390px iPhone, this saved roughly 220px of scroll depth.

Spacing cleanup. Removed dead whitespace above and below the image. Reduced margin-bottom from 3rem to 1rem on the product media list. These changes alone pushed the ATC button significantly higher in the scroll order.

Sticky ATC bar. Built an IntersectionObserver-based sticky bar that appears when the main ATC button scrolls out of view. The bar shows the current price and an Add to Cart button. It delegates clicks to the real form submit button (no duplicate form logic), syncs price updates via MutationObserver when variants change, and uses env(safe-area-inset-bottom) to avoid the iPhone home indicator. Hidden on desktop via media query.

Quantity selector hidden for single-unit items. Since every piece is one-of-a-kind, the quantity selector was unnecessary on 100% of products. Hiding it saved roughly 80px of vertical space and removed a confusing interaction for items that can only be purchased once.

Dynamic checkout button removed. The “Buy Now” button appeared alongside the ATC button as two equally-weighted black CTAs. For 10,000+ NOK purchases, dual competing buttons cause decision paralysis. Removed the dynamic checkout to leave a single clear primary CTA.

The PDP had 13 images with no mobile thumbnail navigation. Users could only swipe with a “1/13” counter. Enabled mobile thumbnails via template JSON config change, then styled a horizontal scrollable thumbnail strip with scroll-snap-type: x mandatory. Added lightbox with prev/next navigation arrows.

P1: Trust Grid + Klarna + Accordions

New trust grid snippet. Built a 2x2 mobile grid (4-column on desktop) with 4 editable trust items: inspected by experts, 14-day return policy, free pickup in Bergen, and secure payment. Fully editable via theme editor schema blocks so the client can update text without code.

Klarna messaging. Added “Pay in 30 days, 0% interest with Klarna” line directly under the price. For items priced at 10,000+ NOK, installment framing changes perceived affordability without changing the actual price.

Accordion reorder. Moved the “Condition” accordion to first position and set it to open by default. Clarity showed users were trust-seeking, and condition is the primary qualifier for used goods. Putting it first and open addresses the biggest question immediately.

Condition badge above title. Rendered the product’s condition metafield as a colored pill badge above the product title on the PDP. Green for excellent, amber for very good, grey for good. Visible before scrolling.

Shipping info on PDP. “Home delivery 990 kr, PostNord 590 kr, Free pickup in Bergen” visible on every product page. Previously this information was hidden until checkout, creating a cost surprise that triggered abandonment.

P1: Meta In-App Browser Speed

56% of sessions came through Meta’s FacebookApp browser, which has no service worker support, limited caching, and slower JavaScript execution than native Safari or Chrome. Average Meta session duration was 16 seconds. The optimization focused on making the first paint show product image, title, and price within 1.5 seconds:

  • Inlined critical above-fold CSS for the PDP (kept under 14KB for the first TCP round-trip)
  • Deferred non-critical JavaScript (animations.js, media-gallery.js, quick-add.js, share.js)
  • Applied media="print" onload pattern for non-critical CSS (cart drawer styles)
  • Set first product image to loading="eager", all others to loading="lazy"
  • Constrained mobile product images to width: 800 instead of full-size
  • Added preconnect to cdn.shopify.com and optimized Poppins font loading with font-display: swap

P2: Savings Percentage Badges

Every product card showed a generic “Salg” (Sale) badge. Since 100% of products had compare-at prices set, the badge was meaningless visual noise. Replaced with a calculated savings percentage: (compare_at_price - price) / compare_at_price * 100, displayed as “-42%”. Products below 10% discount show no badge at all, making the remaining badges more meaningful.

P2: Condition Tags and Urgency on Cards

Condition badges on collection cards. Rendered the condition metafield as a colored pill overlay on each product card. Green/amber/grey matching the PDP badges. Shoppers can now scan a collection page and immediately see the condition of each piece.

“Kun 1 igjen” urgency labels. When inventory_quantity == 1 (which is every product since they are one-of-a-kind), show a stock urgency label. This is not manufactured scarcity. It is communicating a genuine inventory characteristic: if they wait, the piece will sell to someone else.

“New in store” label. Products created within 14 days get a “Ny i butikk” badge. Encourages repeat visits and creates a sense of freshness.

P2: Cart Trust Elements

The cart drawer had zero trust signals and no shipping cost visibility. Added a trust bar between the totals and checkout button showing secure payment, 14-day return policy, and payment method icons. Added shipping cost disclosure directly in the cart: “Home delivery 990 kr, PostNord 590 kr, Free pickup in Bergen.” Hid the quantity selector in cart for single-unit items (static “1” instead of +/- controls). Removed the order notes field to reduce friction.

The cart drawer went through multiple design iterations (3 full rebuilds across 10+ commits) to achieve a luxury-grade layout appropriate for 15,000 NOK furniture.

P3: About Us Redesign

Clarity recordings showed users visiting the About page multiple times. This is classic trust-seeking behavior: they want to buy but need to know who they are buying from. The original page failed the “skeptic test” with no company org number, no showroom photos, and no founding story.

Built a new fully-editable About section with schema blocks for: showroom photo (image picker), founder story (rich text), “How we work” process steps (repeatable blocks), and company details (text settings including org number). All editable by the client in the theme editor.

P3: Homepage Restructure

Replaced the AI-generated hero images and redundant slideshow with a single static hero using a real product photo. Restructured the homepage as a trust-first conversion funnel: announcement bar with rotating trust messages (“Quality-checked by experts”, “14-day return policy”, “Free pickup in Bergen”), followed by featured products, then social proof.

Removed the purple brand colors and replaced with a black/white Scandinavian aesthetic that matches the furniture being sold.

Reviews Section on PDP

Built a customer reviews carousel section that renders on home, product, and about pages. Reviews are entered as repeatable blocks in the theme editor (no external app dependency). Each block contains reviewer name, star rating (SVG star system), review text, and date. The client populates reviews from SMS and Google review screenshots. Social proof was the final trust gap identified in Clarity recordings.

FAQ Page with Structured Data

Built a reusable FAQ accordion section with FAQPage JSON-LD schema auto-generated from the block content. Deployed on both the dedicated FAQ page and the contact page. Default content covers the 6 most common buyer questions in Norwegian: condition categories, shipping, returns, payment methods, Bergen pickup, and inspection process. Schema validates in Google Rich Results Test.

Additional Implementation

  • FAQ accordion styling matched to existing PDP accordion design
  • Customer reviews carousel section added to home, product, and about pages
  • Premium dark footer with 5 tiers: trust bar, newsletter, navigation, payment icons, legal
  • All filter labels translated to Norwegian (Availability, Price, etc.)
  • Lightbox zoom with proper fit-to-screen on all devices
  • Return policy contradiction in FAQ fixed (found during QA)

Technical Constraints Followed

Every commit followed these rules:

  • No !important in CSS. Solved specificity correctly.
  • Vanilla JavaScript only. No jQuery, no external libraries.
  • Lightweight transitions only. No heavy keyframe animations.
  • All text in Norwegian. All prices via | money filter.
  • Every new section fully theme editor editable with {% schema %} blocks.
  • One task per commit, one commit per push.

Key Takeaway

The 0.11% conversion rate was not a traffic problem or a product problem. It was a trust and friction problem diagnosed precisely by Microsoft Clarity data. 56% of mobile interaction was wasted on popups. 21% of visitors never saw the ATC button. Zero trust signals existed on the PDP. Shipping costs were hidden until checkout.

The fix was not a redesign. It was a systematic, data-directed sprint: remove the friction blocking interaction (popups), move the purchase action into view (sticky ATC + layout fix), build confidence at every decision point (trust grid, condition badges, Klarna, shipping costs), and give the collection pages information density that helps shoppers evaluate items faster (savings percentages, condition badges, urgency labels).

87 commits. 10 tasks. Every change traceable to a specific data point from the CRO audit. For the technical details on sticky ATC implementation, popup conversion impact, and savings badge Liquid code, see the linked blog posts.

For comparable trust-led work on other premium catalogs, see the Enea Studio engagement for technical SEO and Core Web Vitals on luxury jewelry, or the WD Electronics audit for high-ticket UTV accessories with checkout sticker shock.

Phase 1 Results (Mar 14 - Apr 12 vs Feb 10 - Mar 12, 2026)

The 87-commit sprint moved every funnel metric.

Metric Change
Add-to-Cart +41%
Checkout +40%
Total Sales +51%

Add-to-cart and checkout roughly track each other, which means the cart and checkout flow worked: the buyers who got past the popups and reached the ATC went on to convert at the same rate they always could. The 51% sales lift came from removing friction at the top of the funnel, not from any one heroic checkout fix.

Phase 2: Traffic Quality (April 2026 onward)

After Phase 1 closed the on-site leaks, the data exposed a new bottleneck: traffic quality.

  • 61% of traffic from Meta with only 17 seconds average engagement.
  • 48.6% of all sessions arrive through the Facebook in-app browser (FacebookApp). Casual scrollers, not buyers.
  • 13.5% of sessions confirmed bot traffic.
  • Google referrals, by contrast: 72.7% engagement rate, 1m 6s average time, highest conversion rate.

The site is no longer the bottleneck. The campaign is. The Meta campaign was likely optimized for link clicks rather than purchases, which causes Meta’s algorithm to send the cheapest (lowest-quality) traffic. Phase 2 was scoped as project-based work to move budget from cheap traffic into qualified buyers.

Phase 2 scope

Workstream Type Why it matters
Meta Ads Audit & Restructure One-time Single biggest leak in the funnel. Audit objective, audiences, placements, creative-to-LP alignment, bot traffic elimination.
Google Ads + Merchant Center Audit One-time Google visitors already convert higher than Facebook. Audit 3 existing Google Search campaigns, fix 33 Merchant Center products (25 limited, 8 not approved), repair Enhanced Conversions tracking errors.
SEO Foundation One-time Organic search delivers 9.4% of traffic but the highest-quality visitors. Build a long-term, free traffic source.
Sales Funnel Monitoring Monthly retainer Weekly funnel tracking via Shopify Analytics + GA4 + Microsoft Clarity. Catch problems early, measure every change.
Coaching Sessions Monthly retainer Owner wants to understand the why and how, not just have the work done. Build the merchant’s ability to read dashboards independently.

The recommended starting point bundles Meta + Google Ads work as the fastest revenue impact. SEO Foundation runs in parallel since organic compounds over months, not weeks. The two retainers (monitoring + coaching) keep the merchant in the loop on every change and surface the next-highest-impact item every week.

What Changed for the Merchant

The cookie consent and Omnisend popup fix alone freed up 56% of mobile interaction for actual shopping behavior on the same day it shipped. The mobile PDP rebuild moved the ATC button into the first viewport so the 21% of visitors previously dropping off before they ever saw the CTA now had a path to convert. Combined with the trust grid, condition badges, Klarna installment messaging, and shipping cost transparency on every PDP, the store now has the trust scaffolding a 5,000 to 30,000 NOK furniture buyer needs in order to commit on a one-of-a-kind piece they cannot touch first. Phase 1 results: ATC +41%, checkout +40%, total sales +51%. Phase 2 takes on the upstream traffic-quality problem so the rebuilt site stops getting filled with bots and casual scrollers.


Running a high-ticket or used goods Shopify store with conversion challenges? Book a free strategy call. I specialize in the trust and friction problems that standard CRO advice does not cover.

Frequently Asked Questions

Why do used furniture stores have extremely low conversion rates?

Used furniture combines high price points ($800-3,000+) with product uncertainty. Every item is one-of-a-kind, condition varies, and buyers cannot see or touch the product before committing. Without condition grading, multiple high-quality photos, trust signals, and BNPL messaging, customers default to in-person shopping or established platforms like 1stDibs. A 0.11% CVR is typical for stores that have not solved this trust problem.

How did Microsoft Clarity data diagnose the conversion problem?

Clarity scroll heatmaps showed that 21% of mobile visitors dropped off before reaching the Add to Cart button at 30% scroll depth. By 50% depth, a third were gone. By 85%, only 14% remained. Click heatmaps revealed that 56% of ALL mobile taps were spent dismissing cookie consent modals and email popups instead of interacting with the product. These two data points alone explained the conversion failure and directed the entire implementation strategy.

What is a condition grading system for used goods on Shopify?

A condition grading system uses standardized criteria stored in Shopify metafields to categorize each product as Excellent, Very Good, or Good. Each grade has defined criteria covering surface wear, structural integrity, and cosmetic imperfections. The grade renders as a colored badge on both product cards and the PDP. This approach, modeled on how 1stDibs handles used luxury goods, sets buyer expectations before purchase and reduces the subjective guesswork that suppresses conversion.

How do you implement a sticky add-to-cart bar on a Dawn theme?

Using an IntersectionObserver that watches the main ATC button. When the button scrolls out of the viewport, the sticky bar slides in from the bottom using CSS transform. The bar delegates its click to the real ATC button (no duplicate form), syncs price via a MutationObserver when variants change, and uses env(safe-area-inset-bottom) padding to avoid the iPhone home indicator. On the Dawn Sense 2.2 theme, this required careful z-index management to avoid conflicts with the cart drawer.

How do savings percentage badges replace generic Sale badges?

Instead of showing a generic Sale label on every discounted product (which becomes meaningless when 100% of products show it), calculate the actual savings: (compare_at_price - price) / compare_at_price * 100. Display the result as a badge like -42%. This gives shoppers real information to identify the best deals and creates differentiation across the catalog. A minimum threshold (10%+) prevents trivial discounts from displaying.

What is the impact of cookie consent popups on mobile conversion?

On this store, Microsoft Clarity showed that a full-screen cookie consent modal consumed 23% of all mobile taps (Accept button) plus 10% more (Decline button). Combined with the Omnisend email popup (23% of taps), 56% of all user interaction on product pages was spent dismissing overlays instead of shopping. Switching to a small bottom-bar cookie notice and disabling email popups on product pages eliminated this friction entirely.

Book Strategy Call