WorkFurniture resale · Shopify Hydrogen

Couchy goes headless: a storefront that knows your nearest branch

A Caldwell, Idaho couch reseller had outgrown its Liquid theme. We rebuilt it as a headless Hydrogen storefront with branch-aware URLs, a ZIP-driven availability system and a data model ready for their own warehouse software.

Couchy homepage on desktop: a yellow header with Couches, Removals and Contact links above a “Check if we deliver · Find your nearest branch” bar, and a hero reading “Like new couches. Not new prices.” over a dark grey sectional, with Shop couches and Remove my couch buttons.
  • 33,791ZIP codes resolvedon the server, from bundled US Census data
  • ~200nsper ZIP lookupbinary search, no third-party API on the hot path
  • 100 mibranch radiusbeyond it, a waitlist lead instead of a dead end
  • 5MB → 300KBremoval photoscompressed in the browser before upload

The challenge

Couchy sells professionally cleaned, like-new couches out of Caldwell, Idaho, with free pickup at the branch and $50 delivery across the Treasure Valley. Every item is one of a kind: a couch is listed, someone buys it, and it’s gone. The catalogue turns over constantly, and the question every shopper asks first isn’t “how much?” but “can you get it to me?”

The Liquid theme couldn’t answer that well. Location was a line of copy, not something the store understood. URLs carried theme-era prefixes that meant nothing to shoppers or search engines. And Couchy was building its own staff software, CouchyOS, to track every couch from collection to sale. A theme had no clean way to share a data model with it.

What we did

We rebuilt the storefront on Shopify Hydrogen, hosted on Oxygen. Shopify still runs products, checkout and orders; the front end became a React application we fully control. Three pieces of work defined the build.

URLs built around place. Catalogues live where people expect them: /couches for the whole range, /idaho/couches for the region and /idaho/caldwell/couches for a branch. Every catalogue URL comes from one function, and a branch only resolves under its real parent region, so /oregon/caldwell/couches is a 404, not a duplicate page. Theme leftovers like /pages/contact and /collections/all now 301 to clean equivalents such as /contact and /couches. The navigation links to the final URL directly, so menus never send shoppers through a redirect. Anything else still falls back to redirects managed in Shopify admin.

Couchy catalogue on desktop: a filter rail with colour counts (Gray 19, Brown 11, White 7), brand and price filters, beside a grid of second-hand sectionals and chairs, each priced and tagged “Free pickup in Caldwell”.
Filters live in the URL, so every filtered view can be shared and is rendered on the server. One canonical page sits behind all of them.

Filters work the same way. Colour, brand, condition, shape and price are query parameters, so a filtered view is a shareable, server-rendered link. The facets come straight from Shopify’s Search & Discovery, so the client adds a filter in the admin and it appears on the site with no code change. Every variation canonicalises to the unfiltered catalogue, so thousands of filter combinations never compete with the page that should rank.

A ZIP code availability system. “Check if we deliver” is a real answer, not a contact form. Shoppers enter a ZIP (ZIP+4 works too) and the server finds their nearest branch. The lookup runs against the US Census Bureau’s ZIP dataset, bundled into the app as a compact index: 33,791 ZIP codes, around 200 nanoseconds per lookup, with no third-party service in the way. For the small share of postal ZIPs the census doesn’t map, a cached geocoder fills the gap. And an outage reads as “not found”, never as “we don’t deliver to you”.

Within 100 miles, the shopper lands on their branch’s catalogue, a URL they can bookmark. The choice is remembered for six months and, for signed-in customers, saved to their account so it follows them across devices. Beyond 100 miles, instead of a dead end they can leave their email to hear when Couchy reaches their area. That lead goes straight into the client’s CRM. Branches themselves are Shopify metaobjects, so opening a new one is content entry, not a rebuild.

Couchy product page on a phone: a breadcrumb trail Home › Store › All Couches above a photo of a taupe six-piece modular cloud sectional in the warehouse, priced $1,799 with a “Last one!” badge.
Product pages lead with what a one-of-a-kind item needs: the photo, the price and the fact that there's only one.

A data model shared with the warehouse. Rather than letting the storefront and Couchy’s staff software each invent their own vocabulary, we built both around the same set of product fields: condition grade, colour, brand, shape and dimensions. CouchyOS uses the exact values the storefront filters on, so a couch’s details mean the same thing at intake, on the product page and in the filter rail. Integration points are already in place: lead capture can publish straight to the warehouse system by configuration, with no code change. That is the closer integration a Liquid theme couldn’t offer.

On a one-of-a-kind catalogue, the first thing a shopper wants to know is whether you can get it to them. The storefront now answers that before they ask.

What it changed

Location now shapes the whole store instead of sitting in a banner. A shopper’s ZIP sets their branch, their branch sets their catalogue, and that catalogue has a clean URL that search engines and shoppers can both use. People outside the delivery radius become waitlist leads. They used to just bounce.

The couch removal service got the same treatment. “Remove my couch” checks the ZIP against the same delivery radius, takes photos that are compressed on the phone from around 5MB to 300KB before upload, and files each request straight into the right pipeline in the client’s CRM.

The client edits their homepage content in a dedicated CMS with click-to-edit preview. Merchandising runs from Shopify admin: new filters, new branches and redirects. And because storefront and warehouse speak the same language, letting CouchyOS drive listings directly is an integration job, not a rebuild.

Start a project

Your store could be the next case study.

Tell us where your store is and where it needs to be. A senior team reads every enquiry and replies within two working days — no account managers, no hand-offs.

  • Shopify Plus Partner
  • London, UK
  • Replies within two working days