all notes
2026-08-12Naman Barkiya

Joshua Trees build postmortem: when no two units in your catalog are the same.

Joshua Trees sells specialty trees and landscaping boulders where no two units are identical — every prior sale ran through a phone call. We shipped a Shopify storefront in two weeks by running two inventory models side by side: one-of-one listings for large, unique stock and standard variants for genuinely interchangeable small stock, organized by species and size.

Specialty trees and boulders, sold by phone, one unit at a time. We shipped a Shopify storefront in two weeks — the hard part was that Shopify's inventory model assumes a SKU has many identical units, and a fifteen-foot Joshua tree has none.

Joshua Trees sells specialty trees and boulders where no two units are the same. Every sale used to run through a phone call. We shipped a Shopify storefront that replaced it with self-serve browsing by species and size, in two weeks. The hard part: what "inventory" means when the product is a living tree.

The brief was not "build a store." It was "let a buyer find and buy a specific fifteen-foot Joshua tree without calling us first." Those are different problems, and the second one broke the default assumption Shopify is built on.

What did the brief actually ask for?

A catalog a buyer could browse unattended, filtered by species and size, with enough photos to trust a purchase they couldn't walk up to in person. No quoting flow, no live chat requirement, no delivery scheduler at launch — the founder was explicit that the phone call wasn't the enemy, the requirement to make it was.

We scoped four things: a species-and-size-organized catalog, a checkout that could carry freight-class shipping logic, an admin the yard staff could update themselves, and a photo standard consistent enough that a buyer trusted what they were looking at. That was the whole build.

Why Shopify and not a custom build?

Because the timeline was two weeks and the problem was catalog and checkout, not novel logic. Shopify's variant and collection system already solves "organize a large catalog by two axes and let someone check out." Reaching for a custom stack would have spent the two weeks rebuilding commerce primitives that were never the hard part of this brief.

The rule: the platform question isn't "what's the most capable tool," it's "what does this specific brief actually require the tool to be capable of." Joshua Trees required catalog and checkout. It didn't require anything Shopify doesn't already do well.

What was the hard part?

Shopify's inventory model assumes a SKU has many identical units. A boulder does not have a twin. A fifteen-foot Joshua tree is not restocked — it is one physical object that either sells or doesn't. We were mapping a one-of-one physical world onto a platform built for repeatable stock.

We solved it by treating each individual tree or boulder above a certain size as its own product listing rather than a variant of a shared SKU — species and rough size became collections, not variants, and each listing carried its own photo set and a "sold" state instead of a quantity count. Smaller, more uniform stock (saplings, small ornamental boulders) kept the normal variant-with-quantity model, because those genuinely are interchangeable units. Two different inventory models, living inside one storefront, chosen per product class instead of forced into one shape.

What did we cut, and would we cut it again?

Three things did not make the two-week build:

Every cut held past launch. None has come back as a support request.

What shipped in two weeks?

A Shopify storefront with two inventory models living side by side — one-of-one listings for large stock, standard variants for small stock — organized by species and size, with a written photo standard instead of custom capture tooling, and a freight-quote step instead of a live delivery calculator. Before, every order started with a phone call. After, a buyer could find, evaluate, and pay for a specific tree without one.

What would we do differently?

Write the photo standard before the first product shoot, not during it. We built it in week one, in parallel with the storefront, which meant the earliest listings got reshot once the standard settled. On a two-week clock, a half-day spent finalizing the standard before any camera came out would have saved a reshoot pass we didn't have slack for.

The inventory-model split, in hindsight, was right on the first try — mostly because we asked "which of these products actually behaves like stock" before touching the data model, instead of after.


What does this build confirm?

The same instinct — ask what a feature actually needs to do before picking the default shape for it — is the one behind how we scope before a line of code gets written.


Written 2026-08-12 by Naman Barkiya.

FAQ

Questions this usually surfaces.

What would you do differently on the Joshua Trees build?
Finalize the photo standard before the first product shoot instead of during it. We wrote the standard in parallel with the storefront build, so the earliest listings needed a reshot once it settled — a half-day spent locking the standard first would have avoided that pass.
How long did the Joshua Trees storefront take to build?
Two weeks, end to end — a Shopify catalog organized by species and size, with two inventory models (one-of-one listings for large unique stock, standard variants for small interchangeable stock) and a freight-quote checkout step.
What does a build like this cost?
Cost scales with catalog complexity, not just page count — a two-inventory-model catalog is a different scope than a standard single-SKU storefront. We scope and quote per engagement rather than publishing a flat number, because the honest answer depends on how much of the catalog is genuinely one-of-one.