Week 4
Live and taking orders
A custom Stripe-powered storefront where there had been none. One coffee, one hardcoded price, checkout that worked. Strangers could buy without knowing anybody — the thing word of mouth could never do.
Case 01 / Ecommerce Platform
Mendivil Coffee is a roaster in Walnut, California that had no way to sell online — orders arrived by word of mouth. I built them a custom Stripe-powered storefront from nothing: live in four weeks, then owner-managed two weeks later. They now create, price, archive, and restore their own coffees, and customers buy several bags in one order with a grind chosen per bag.
01 — Where it started
There was no online storefront. Not a thin one, not a marketplace listing — nothing. A customer who wanted a bag had to know someone. The business was getting off the ground and every order came through word of mouth, which caps how far it can travel.
So the brief was not a redesign or a migration. It was a storefront that did not exist yet, built to sell real coffee to real strangers on the first day it went live.
02 — Shipping first, then stepping out
Week 4
A custom Stripe-powered storefront where there had been none. One coffee, one hardcoded price, checkout that worked. Strangers could buy without knowing anybody — the thing word of mouth could never do.
Week 6
The catalog became theirs. Products created on demand in Stripe, priced, archived, and restored from an admin they run themselves, with a durable cart, per-bag grind selection, and deploy status they can actually read.
The first launch deliberately hardcoded a single coffee to one Stripe price. That was the right place to stop: it got them selling weeks earlier, and price changes were rare enough that routing them through me cost almost nothing. The second stage removed me from that loop before the catalog grew enough to make it a real bottleneck.
03 — Decisions that mattered
You cannot edit a price in place. An owner price change creates a new one-time USD price, promotes it to the product's sole active purchasable price, and retires the previous one. Existing checkout sessions and stored order line items keep their historical price naturally, so past orders stay accurate without extra bookkeeping.
A saved cart line stores the Stripe product ID, never the mutable price ID. On checkout the server resolves each product against the active catalog and selects the current price. A cart saved before a price change is still valid afterward, and it charges today's price rather than a stale one.
The server rejects empty carts, duplicate products, unknown or archived products, quantities other than one, unsupported grind preferences, and every client-supplied price or amount. The client expresses product intent; the server determines commercial truth. That split keeps the checkout surface small and the trust boundary obvious.
Discontinuing a coffee flips the Stripe product's active status. IDs, prices, metadata, the generated label image, and order line items all survive, so historical fulfillment records stay intact and a seasonal coffee can be restored later without being rebuilt.
04 — What it runs on
Stripe holds commercial truth; Postgres holds the operation ledger that serializes catalog changes; blob storage holds generated label images. Nothing here is exotic, which is the point — the owners inherited a store their next developer can read.
05 — Common questions
Mendivil Coffee is based in Walnut, California. I work with businesses across the San Gabriel Valley and remotely.
Start a project