Factory Direct Blinds
6-sprint CRO and development partnership for a US-based custom window blinds store. Mobile PageSpeed 38 to 81, 62% ATC gap diagnosis, measurement protection upsell system, structured data deployment, and GSC recovery audit.
The Client
Factory Direct Blinds is a US-based ecommerce store selling custom-made window blinds and shades. Every product is made to measure, which creates conversion challenges that standard Shopify CRO advice does not address: customers need confidence in their measurements, the product builder must handle complex configurations without overwhelming users, and mobile experience matters because that is where most customers start browsing before committing to a purchase on desktop.
This engagement ran across 6 sprints over 4 months, covering CRO auditing, custom Liquid development, Core Web Vitals optimization, structured data implementation, and organic traffic recovery.
Sprint 1: Full-Funnel CRO Audit
The initial audit uncovered the problems driving the project scope.
62% mobile-to-desktop add-to-cart gap. Mobile shoppers were abandoning the product builder at dramatically higher rates than desktop users. The builder UI was designed for wide screens and became nearly unusable on mobile, with tiny touch targets, options stacked in confusing ways, and pricing information hidden behind extra taps.
22-second mobile LCP. The site took 22 seconds to render meaningful content on mobile. Google’s threshold for “good” LCP is 2.5 seconds. At 22 seconds, the majority of mobile visitors left before the page finished loading.
Mobile PageSpeed score of 38. Desktop scored 48. Both failed Core Web Vitals, which meant the site was not eligible for Google’s “good page experience” ranking signal.
Measurement anxiety as the primary conversion blocker. Unlike standard ecommerce where the product arrives as pictured, made-to-measure blinds require the customer to provide exact measurements. If they measure wrong, the product does not fit. This anxiety was not addressed anywhere in the purchase flow.
Missing structured data. Collection pages had no CollectionPage or BreadcrumbList schema. Blog posts (which drove 52,000+ organic clicks across 233 URLs) had zero Article or BlogPosting schema. Product schema existed but was incomplete.
I delivered an ICE-scored roadmap prioritizing fixes by revenue impact, implementation effort, and confidence level. The roadmap organized work into focused sprints rather than attempting everything at once.
Sprint 2-3: Measurement Protection System
The measurement anxiety problem was the highest-impact item on the roadmap. No amount of checkout optimization or speed improvement would matter if customers were too afraid to commit to measurements.
MeasureSafe Guarantee Upsell
I designed and built a measurement protection upsell system integrated directly into the product builder:
- Checkbox integration at the point of highest friction. The upsell appears during the measurement input step, not as a cart add-on. This is where the anxiety peaks and where the guarantee has maximum impact.
- Trust shield iconography with clear value proposition. The messaging reframes the cost from “additional fee” to “smart protection” by showing the cost of a full replacement without protection versus the small cost of the guarantee.
- Tooltip with full policy summary. Customers can read the complete coverage details without leaving the builder flow. No modal, no page navigation, just an expandable tooltip.
- Automatic cart line item showing which product is protected, with a link to the full guarantee page for customers who want more detail.
- Mobile-responsive design that does not add clutter to the already complex builder interface on small screens.
The guarantee page itself was built as a dedicated landing page with sections covering how it works (3-step process), a cost comparison table (with vs without protection), coverage details in plain language, and an FAQ section targeting anxiety-driven search queries like “what happens if I measure my blinds wrong” and “can custom blinds be returned if wrong size.”
Visual Measurement Guide System
To reduce measurement errors at the source:
- Product-type-specific instructions. Roller blinds, venetians, and cellular shades all have different measurement requirements. Each product type has its own guide with specific diagrams.
- Width and height measurement icons with step-by-step instructions for each product category.
- Modal-based PDF viewer so customers can reference guides without navigating away from the builder.
- Mobile-optimized layout with tap-to-expand sections instead of trying to show everything at once.
Sprint 3: Structured Data Deployment
The blog was the store’s strongest content asset (52,000+ clicks, outperforming collection pages on CTR) but had zero structured data.
What Was Deployed
- CollectionPage + ItemList schema on all collection pages, giving Google structured product lists with names, URLs, images, and positions.
- BreadcrumbList schema on all page types, providing clear navigation hierarchy (Home > Collection > Product).
- FAQPage schema on the FAQ page and relevant collection pages.
- Organization schema with @id referencing for entity consistency across the site.
All schema used @id references to connect entities rather than duplicating data. The Organization entity defined once in the site header was referenced by every Article and Collection schema via @id, building a connected knowledge graph that Google can parse efficiently.
Schema Conflict Resolution
A third-party SEO app (Booster SEO) was outputting its own Organization schema on every page, creating duplicate entities. The app used the older http://schema.org protocol and had empty sameAs arrays, while our implementation used https://schema.org with proper social links. The recommendation was to disable the Booster SEO schema in app settings and keep the custom implementation.
Sprint 4: Product Builder Overhaul and Mobile UX
This sprint directly addressed the 62% mobile ATC gap.
Product Builder Redesign
The core change was implementing progressive disclosure instead of showing all configuration options simultaneously:
- Step-by-step flow. Options appear one at a time: material, color, size, mounting type, extras. Each step is focused and manageable.
- Real-time price updates as customers configure options, so there are no surprises at the end.
- Pricing tooltip showing the cost breakdown without opening a new view or modal.
- Mobile-first layout with proper touch targets (minimum 44px per Apple HIG) and readable text at mobile font sizes.
Mobile Header Cleanup
The site’s header consumed significant above-fold space on mobile:
- Reduced header height to reclaim vertical space for the product builder.
- Simplified navigation for the mobile shopping context.
- Implemented a sticky add-to-cart bar that appears when the main ATC button scrolls out of view.
Safety Lessons Learned
The product builder file (product-template-builder.liquid) was the highest-risk file in the entire theme. It contained 5+ layers of conflicting CSS for gallery images, inline JavaScript for Slick slider initialization, mobile reorder scripts, and CLS prevention code.
Over the course of this project, we documented 8 specific incidents where changes to this file broke the live or staging site:
- Moving
sliderInit()out of asetTimeoutbroke all sliders because jQuery/Slick dependencies were not ready - Changing Slick
asNavForconfiguration silently broke thumbnail navigation - Adding
aspect-ratio: 1/1forced landscape room scene images into square boxes - A pricing tooltip
<div>inside a<p>tag caused invalid HTML that broke layout on both PDP and collection pages - Header spacer doubling from a conflict between JavaScript-created spacers and CSS padding
Each incident was documented with the root cause and a “never do this” rule to prevent recurrence. The principle: additive changes (inserting a new {% include %} call) are safe. Modifying existing CSS or JavaScript in this file is not safe without full cross-browser testing on Chrome Desktop, Safari iOS, and Chrome Mobile.
Sprint 5: Core Web Vitals Optimization
Comprehensive performance optimization that transformed the site’s speed metrics.
Mobile Performance Results
| Metric | Before | After | Improvement |
|---|---|---|---|
| Performance Score | 38 | 81 | +113% |
| LCP (Largest Contentful Paint) | 22.0s | 2.7s | -88% |
| TBT (Total Blocking Time) | 2,290ms | 480ms | -79% |
| Speed Index | 5.9s | 3.5s | -41% |
Desktop Performance Results
| Metric | Before | After | Improvement |
|---|---|---|---|
| Performance Score | 48 | 99 | +106% |
| TBT | 460ms | 0-10ms | Near-zero blocking |
What Was Optimized
Image loading strategy. Above-fold images switched from lazy to eager loading. Proper srcset and sizes attributes added so browsers download the correct image size for each viewport. Hero images constrained to 1200px max instead of serving full 3000px originals.
Third-party script audit. Identified non-critical scripts (analytics, chat widgets, marketing pixels) and deferred them using defer and async attributes. Removed unused app code that was loading on every page type.
CSS render-blocking elimination. Inlined critical above-fold CSS directly in the <head>. Deferred non-critical stylesheets using the media="print" onload pattern with a <noscript> fallback.
Font loading optimization. Implemented font-display: swap with preconnect and preload hints for Google Fonts. Fonts now load asynchronously without blocking first paint.
Conditional asset loading. The product builder JavaScript and CSS were loading on every page type, including collection pages and blog posts where they were never used. Wrapped asset loading in template conditionals so they only load on product pages.
These improvements directly impact both SEO (Google uses Core Web Vitals as a ranking factor) and conversions. Research consistently shows that every 1-second improvement in mobile load time increases conversions by 5-7%.
Sprint 6: GSC Audit and Organic Traffic Recovery
The store’s organic traffic had declined 70%+ over 7 months. The GSC audit identified 5 compounding root causes:
Two core collection pages accidentally noindexed. A prior SEO decision to consolidate ranking power by noindexing two collection pages had the opposite effect. Both pages had significant impression volume. One has since been 301-redirected, the other had its noindex removed and has been re-indexed by Google.
Crawl budget waste. 28% of spot-checked redirect URLs were broken, including paths left behind when a third-party app was removed. Key trust pages (about-us, shipping-information) returned 404 errors. Google was spending crawl budget on dead URLs instead of indexing important content.
Thin pages launched during a core update. 40+ new pages with minimal content were published during Google’s December 2025 Core Update, which likely triggered quality signals.
186 keywords sitting on page 2. These keywords had 2.69 million combined impressions at positions 11-20. Moving even a fraction of these to page 1 would produce significant traffic gains.
No link building since ownership change. The domain had a DA of 38 with 1,500 backlinks while direct competitors had DA 39-44 with 6,000+ backlinks.
I delivered a 30-day prioritized action plan with specific deadlines, owner assignments, and linked spreadsheets for the 404 URL audit (348 URLs), the Crawled-Not-Indexed audit (232 pages that should be indexed), and a full keyword-to-landing-page map (207 commercial + 14 informational keywords).
What Was Already Working
The blog was the site’s strongest content asset: 52,000+ clicks across 233 URLs, outperforming collection pages on CTR (0.73% vs 0.37%). Product schema was driving 45,000+ clicks from 8.6 million impressions via merchant listings. Server performance was excellent (TTFB under 100ms). The foundation was solid. The technical issues on top of it were fixable.
Results Summary
| What | Outcome |
|---|---|
| Mobile PageSpeed | 38 to 81 (+113%) |
| Desktop PageSpeed | 48 to 99 (+106%) |
| Mobile LCP | 22.0s to 2.7s (-88%) |
| Mobile ATC Gap | 62% gap diagnosed and addressed |
| Structured Data | CollectionPage, BreadcrumbList, FAQPage, Organization deployed |
| Schema on Blog | 233 blog URLs now eligible for Article rich results |
| GSC Recovery | 5 root causes identified, 30-day action plan delivered |
| Page 2 Keywords | 186 keywords with 2.69M impressions mapped to landing pages |
Key Takeaway
Made-to-measure products have unique CRO challenges that generic optimization advice does not address. The combination of reducing measurement anxiety (MeasureSafe guarantee), simplifying complex configuration (product builder progressive disclosure), eliminating performance bottlenecks (Core Web Vitals sprint), and fixing technical SEO foundations (structured data + GSC recovery) created compounding improvements across the entire funnel.
Each sprint built on the previous one. The CRO audit informed the builder redesign. The builder redesign exposed the performance problem. The performance fix made the structured data more impactful because Google could now crawl pages efficiently. And the GSC audit ensured the improved pages were actually being indexed and ranking.
For the technical approach behind the structured data implementation, the mobile sticky ATC pattern, and the performance optimization techniques, see the linked blog posts.
Dealing with similar challenges on your Shopify store? Book a free strategy call and I’ll walk through your biggest conversion opportunities.