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.

- 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.

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.

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.