Headless Shopify · Case Study
A fictional automotive-interior accessories brand built to show how a headless Shopify storefront can make shopping easier, customization clearer, and the backend simpler to manage — without overwhelming buyers with technical decisions they're not ready to make.
No password needed — the demo is publicly accessible.
The early design leaned on dark backgrounds, repetitive cards, technical fitment language, and floor-mat imagery. It looked credible, but felt more like a catalog than a brand — and it immediately asked visitors for effort they were not yet ready to give.
The central question became: how can customers discover what they want before the storefront asks for technical vehicle details?
A homepage Year, Make, and Model selector asked for effort before visitors understood the catalog or felt any desire for a product.
Messaging and proof repeatedly returned to the floor area, making a broader interior-accessories brand feel like a single-product business.
Custom seat covers, vehicle-compatible products, and ordinary cleaners don't need the same purchase interface — but the storefront treated them identically.
I moved Year, Make, and Model away from the homepage and treated those fields as order customization — collected only on the products that actually need them. The homepage now focuses on aspiration, product discovery, lifestyle, and confidence. Vehicle information appears only at the relevant step.
Most automotive stores open with a compatibility question. DriveCraft opens with desire. The difference is that one asks customers to solve a problem, and the other makes them want the product first.
I began DriveCraft in Lovable because it allowed me to test the visual direction and ecommerce journey quickly. Early iterations revealed several important problems: vehicle information was asked too soon, the brand appeared too narrowly focused on floor mats, and several navigation paths led nowhere.
Once the direction was validated, I rebuilt the storefront using TanStack Start, React, and TypeScript — giving me full control over routing, Shopify data, product filtering, configuration logic, responsive behavior, accessibility, and long-term maintainability.
Built the initial visual direction and ecommerce journey in Lovable to test the concept quickly and surface problems early.
Discovered the homepage asked for vehicle details too soon, category coverage was too narrow, and navigation had dead ends.
Moved vehicle details into individual product steps, broadened the brand, and defined four distinct purchase journeys.
Replaced the prototype with a custom TanStack Start application for deeper control over routing, filtering, and architecture.
Integrated Shopify's Storefront API for products, variants, pricing, cart, and checkout. Structured reusable data with metafields.
Addressed responsive behavior, accessibility, configuration edge cases, and navigation integrity across every entry point.
The product page is a reusable system controlled by Shopify. A single setting on the product record selects the correct experience — no separate pages or custom builds needed for each product type.
Cleaners, care kits, towels, and universal accessories. Simple quantity and add-to-cart — no configuration required.
Products with color, stitching, custom text, or finish options that don't require vehicle information.
Made-to-order mats, seat covers, and cargo liners. Collects vehicle details as production information alongside design choices.
Stocked products where the customer's vehicle confirms compatibility or selects the correct variant for their car.
The homepage leads with aspiration, category discovery, lifestyle recommendations, style inspiration, product storytelling, and customer stories. Vehicle details never appear until a customer picks a product that needs them.
The page speaks to pride of ownership, easier maintenance, personal expression, and the feeling of opening the door to a more intentional interior — before asking for anything in return.
Customers can browse by product category, lifestyle need, interior style, or featured products — or use the assisted option when they're unsure what fits their vehicle.
Asymmetrical cards, cinematic sections, and varied compositions reduce the feeling of a generated template and support a premium brand impression.
Customers can browse independently or use "Get Help Choosing" whenever compatibility or customization creates uncertainty — without leaving the page.
The "Create an interior that feels like yours" section reframes discovery around moods — Luxury, Sport, Adventure, Minimal, Family, and Premium. It's intentionally different from category navigation: category shopping asks what customers need, while inspiration shopping asks how they want the interior to feel.
Each mood card links directly to a filtered catalog showing only the products that match that style. Shopify controls which products appear under each mood — meaning the business can update the catalog without rebuilding the page.
Every category and style entry point — the main navigation, footer, hero section, best-sellers, and inspiration cards — opens a pre-filtered catalog rather than the full product list. The customer arrives at relevant results immediately, without searching.
Clicking "Floor Mats" in the nav opens the catalog pre-filtered to floor mats. Clicking a style mood opens only matching products. No extra searching required.
A customer can browse by style mood and then narrow to a specific category — or vice versa. Changing one filter doesn't clear the other.
Every filtered catalog view can be bookmarked, shared, or copied as a link. The browser back button works correctly. Nothing is stored in hidden session memory.
Which products appear under each mood or category is controlled from Shopify admin. No separate filtered pages need to be created or maintained when the catalog changes.
For custom products, the customer enters the Year, Make, Model, and Trim of their vehicle. That information is saved with the order as a production note — so the manufacturer knows exactly which vehicle the product was made for.
The storefront maps the vehicle to a broad class — Sedan, SUV, or Pickup/Truck. The coverage set, vehicle class, and material choice together select the correct Shopify product variant and checkout price. The variant — not the storefront — controls what the customer pays.
A Toyota Corolla and a Honda Civic can share the same Sedan pricing class while retaining their own vehicle details on the order. There is no separate Shopify listing for every vehicle on the road.
Custom products reveal only the next relevant decision. Standard products skip configuration entirely. Customers are never asked for information the product doesn't need.
Year, Make, Model, and Trim are collected only when the product requires them — as production information, not as a storefront filter.
Front Pair, Full Set, cargo coverage, or another product-specific package option.
A choice that affects pricing, connected to real Shopify variants managed from the Shopify admin.
Colors, stitching, and personalization options sourced from the Shopify backend — no hardcoded lists in the frontend.
A full configuration summary with edit controls and vehicle confirmation before anything enters the cart.
The selected variant and all configuration details pass into Shopify checkout. The business retains full control over checkout and fulfillment.
These are intended outcomes and design goals — not measured production results. DriveCraft is a portfolio prototype built to demonstrate the strategic and implementation decisions behind a scalable headless shopping experience.
I audited the storefront from the customer's perspective, identified cognitive and emotional friction, and reorganized the journey around discovery, desire, confidence, and product-level configuration — leading with aspiration and deferring complexity.
Lovable was ideal for moving quickly during discovery. I used it to test visual direction and ecommerce journey structure, identify friction points, and validate the overall approach before committing to a custom build.
As the product logic became more specialized, I directed a full rebuild using AI-assisted workflows — specifying the Shopify data model, routing behavior, filtering logic, responsive requirements, and QA criteria, and reviewing every decision and output.
This section covers the implementation decisions behind the business outcomes described above. The main case study is intentionally written for nontechnical readers — everything below is for developers or hiring managers who want to understand the architecture.
Both the style and category dimensions are encoded as URL search params on the /products route. TanStack Router's validateSearch defines the shape at the route level — { style: InteriorStyle | undefined, category: CategorySlug | undefined }. TypeScript will not compile if any <Link> to the catalog is missing either param, which enforces consistency across the navbar, footer, hero, best-sellers, and inspiration sections.
Category chips use TanStack Router's function-form search: search={(prev) => ({ style: prev.style, category: slug })}. This preserves the active style filter when the customer changes category. Both dimensions are independent and combinable without any client-side state management library.
Products, variants, prices, and availability are fetched via Shopify's Storefront API using a GraphQL query on the /products and /product/$handle routes. The frontend reads the custom.interior_styles metafield to determine style mood associations. If the metafield is absent, the frontend falls back to product tags so products remain filterable before metafields are fully configured.
Color and stitching options are Shopify metaobjects — reusable entries referenced by any product that needs them. Adding a new color in Shopify propagates to every product that references that metaobject without a code change.
The storefront uses TanStack Start (React 19, TypeScript, Vite) with file-based routing. Product pages use server-side data loading so Shopify data is available on first render without a client-side fetch waterfall.
The help drawer tracks whichever button opened it using a mutable lastHelpTrigger ref, updated at click time. When the drawer closes, focus returns to that element — compliant with WCAG focus management guidelines.
The footer was fully audited and rebuilt. All href="#" dead links, an unconnected newsletter form, unverified payment badge icons, and duplicate navigation columns were removed. Every rendered link has a real destination.
/how-it-works pageA dedicated page explains the difference between vehicle-customized, vehicle-compatible, and standard products — including which ones need vehicle details, the 4-step order flow for custom items, and the return policy difference between custom and standard orders.
Browse the live concept and explore how the homepage, product discovery, inspiration, configuration strategy, and Shopify integration come together.