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

- Client: Couchy
- Sector: Furniture resale
- Platform: Shopify Hydrogen
- Services: Headless build, Integrations, Information architecture
- Year: 2026
- Published: 2026-10-01
- Canonical: https://madeitlookeasy.co.uk/work/couchy/

## Results at a glance

- **33,791** ZIP codes resolved (on the server, from bundled US Census data)
- **~200ns** per ZIP lookup (binary search, no third-party API on the hot path)
- **100 mi** branch radius (beyond it, a waitlist lead instead of a dead end)
- **5MB → 300KB** removal photos (compressed 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”.](collection)
*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.](productMobile)
*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

Tell us where your store is and where it needs to be: hello@madeitlookeasy.co.uk (a senior team replies within two working days).
More work: https://madeitlookeasy.co.uk/work/
