Skip to content

The person who sells is the person who stocks, so the admin is a page, not a system

A small storefront where adding stock, browsing the catalog and taking payment all live in one application, because at this size a separate admin system is overhead nobody has time for.

Loam & Kiln
Search the shop Cart StockroomNA
This week at Loam & Kiln

Four pots, seven lines. Thrown in Asheville, shipped Tuesdays.

Signed in as Nell · shop view
Everyday Mugfrom $34.00
12 oz, thrown and trimmed by hand
25 in stockMoss · 2 left
Bud Vasefrom $26.00
Two heights, one stem each
17 in stockIn stock
Noodle Bowl$42.00
Wide and deep, 28 oz
8 in stockIn stock
Pour-over Set$68.00
Dripper and cup, fits a #2 filter
1 in stockInk · 1 left
Beneath the shop, for owners: the stock table the shelf above is drawn fromSame application · same table · nothing to sync

Stock · all 7 lines

51 units · 2 running low · low at 3 or fewer
LineSKUPriceIn stockStateOn the shop
Everyday Mug· OatMUG-OAT$34.001414 in stock/shop/everyday-mug
Everyday Mug· MossMUG-MOSS$34.002Low · 2 left/shop/everyday-mug
Everyday Mug· InkMUG-INK$34.0099 in stock/shop/everyday-mug
Bud Vase· TallVASE-TALL$28.0066 in stock/shop/bud-vase
Bud Vase· SquatVASE-SQUAT$26.001111 in stock/shop/bud-vase
Noodle Bowl· OatBOWL-OAT$42.0088 in stock/shop/noodle-bowl
Pour-over Set· InkPOUR-INK$68.001Low · 1 left/shop/pour-over-set

The brief, in specifics

Industry

E-commerce & Retail

Duration

10 weeks

Cooperation model

Fixed price

Services
Storefront engineeringInventoryPayments
Integrations
Hosted authenticationPayment webhooksTransactional emailImage hosting
Technologies
Next.jsReactStripeHosted AuthTailwind CSS
Team
1 Project lead1 Full-stack engineer1 Product designer

Client name withheld under NDA. Engagement details are shown to the extent our agreement permits.

Introduction

What we were brought in to do

A two-person shop selling a small, changing range. We built the storefront, the cart and checkout, and the stockroom page they add products from, all in one application.

A two-person shop with a small, frequently changing range, running on a platform designed for a merchandising team. The catalog was permanently a week out of date, and the cause was arithmetic, not neglect: adding a product took ten minutes in an admin built for someone whose whole job that is, and neither of the two people had ten minutes.

Full-Stack Engineering

Where the old way broke

  • Small retailers get sold platforms built for large ones, then spend their week in an admin designed for a team that doesn't exist. The real cost isn't license fees. It's that adding a product becomes a job instead of a two-minute task, so the catalog goes stale.

    The cost was never the license fee. Every extra field on the product form was a reason to do it later, and later never came, so the storefront showed things the shop no longer had and left out things it did. A separate admin system also meant a sync, and the sync's occasional failures were a class of bug a two-person shop had no capacity to chase.

    One application, with the stockroom as a page behind sign-in. Adding a product takes about as much attention as writing a label, and the catalog updates immediately because there's nothing to sync.

01

The stockroom is a page

Adding a product happens inside the storefront: no second system, no sync, nothing extra to learn.

The stockroom is a route in the same application behind sign-in. There's no separate admin product with its own login, its own vocabulary and its own sync. Adding a product writes to the same database the storefront reads, so the catalog is current the moment the form is submitted. Nothing to publish, nothing to reindex, and nothing to reconcile when it fails.

What shipped
  • A route in the same app, behind sign-in
  • Writes to the database the storefront reads
  • Nothing to publish, reindex or reconcile
Loam & Kiln
Search the shop Cart StockroomNA
Stockroom Behind sign-in

/stockroom · a route in the shop's own application, writing the table the storefront reads

View the shopAdd a product

Lines

7

4 products on the shop

Units in stock

51

Worth $1,708.00 at shop prices

Running low

2

At or below 3 units

Last change

Order #1042

2:14 PM · moved 2 lines

Syncs

None

Nothing to publish or reindex

All lines

Edit a count in place · saved straight to the shop
LineSKUPriceCountShelfState
Everyday MugOatMUG-OAT$34.001414 in stock
Everyday MugMossMUG-MOSS$34.002Low · 2 left
Everyday MugInkMUG-INK$34.0099 in stock
Bud VaseTallVASE-TALL$28.0066 in stock
Bud VaseSquatVASE-SQUAT$26.001111 in stock
Noodle BowlOatBOWL-OAT$42.0088 in stock
Pour-over SetInkPOUR-INK$68.001Low · 1 left

Stock changes today

Orders and edits, one log
Everyday Mug· MossSold · Order #1042 · 2:14 PM-24 → 2
Bud Vase· TallSold · Order #1042 · 2:14 PM-17 → 6
Noodle Bowl· OatStock added · Nell · 11:52 AM+62 → 8
Pour-over Set· InkSold · Order #1041 · 10:30 AM-12 → 1
Bud Vase· SquatProduct added · Rafe · 9:05 AM+110 → 11
Everyday Mug· OatSold · Order #1040 · Wed 4:40 PM-216 → 14

Running low 2 lines

A line is low at 3 or fewer
Everyday Mug· MossDropped to 2 with order #1042Low · 2 leftAdd stock
Pour-over Set· Ink1 left since order #1041Low · 1 leftAdd stock

Where this page writes

No second system
/stockroomwrites
One stock tableone database
/shopreads
On screen

The stockroom: one page behind sign-in in the same application, all seven lines with counts edited in place, two running low, today's orders and edits in one log, and the one table it writes that the shop reads.

Loam & Kiln
Search the shop Cart StockroomNA
Add a product

/stockroom/new · five fields · live on the shop the moment you save

Back to the stockroom

New product

Everything else can wait until it is live
5 of 5 fields · ready to save
Name
Speckled Tumbler
Price
$24.00
QuantityBecomes the stock count
12
PhotoOne is enough
tumbler-oat.jpg1600 × 1600 · cropped square for the shelf Replace photo
Description
A handleless 8 oz tumbler in speckled oat. Thrown on the wheel, glazed inside and halfway down.
Saves to the table the shop readsCancelSave · live on the shop

Shop preview

As it will sit on the shelf
Speckled Tumbler$24.00
A handleless 8 oz tumbler in speckled oat. Thrown on the wheel, glazed inside and halfway down./shop/speckled-tumbler12 in stock

Taken off the first screen

Web addressDerived from the name
Low-stock markDefaulted to 3
VariantsAdded after it is live
Shipping sizeDefaulted to small parcel
Extra photosAdded after it is live
On screen

Adding a product: name, price, quantity, one photo and a description, with the shop preview beside it and the things taken off the first screen listed as derived, defaulted or added later.

02

A short add form

A long form is why catalogs go stale. This one takes about as long as writing a label.

The add form asks for name, price, quantity, one photo and a description, and nothing else. Long forms are the reason small catalogs go stale (every optional field is a reason to do it later), so everything that could be derived, defaulted or edited afterward came off the first screen. It takes about as long as writing a shelf label.

What shipped
  • Five fields; everything derivable taken off the first screen
  • Long forms are why small catalogs go stale
  • About as long as writing a shelf label
Loam & Kiln
Search the shop Cart4Sign in
Your cart

Change quantities here · stock checked against the shop's own table at 2:31:04 PM, and again before payment

Keep shopping

In your cart · 4 items

Checked 2:31:04 PM
You asked for 3 Moss mugs and 2 exist.We set the quantity to 2 before you paid, not after.

Everyday Mug

Moss · $34.00 each

Low · 2 left3 requested · 2 available

2Most you can have

$68.00

Save for later

Noodle Bowl

Oat · $42.00 each

8 in stock

2Up to 8

$84.00

Save for later

Quantity lives here, not on the product page: this is where people change their minds.

Saved for later

Not in the cart · stock shown as of now
Pour-over Set$68.00InkLow · 1 leftMove to cart
Bud Vase$26.00Squat11 in stockMove to cart
Everyday Mug$34.00Ink9 in stockMove to cart

Summary

Items (4)$152.00
Shipping · Tuesday dispatch$6.00
Total$158.00

Stock check · 2:31:04 PM

Everyday Mug · Moss × 22 available
Noodle Bowl · Oat × 28 available
Continue to secure checkout

You pay on the payment provider’s own page. Card details never reach Loam & Kiln.

Before the card, not after

Checked now, in the cartAgainst the stock table at 2:31:04 PM
Checked again at paymentJust before you are sent to the provider
If a line runs out in betweenYou see it here, before the card page opens
03

Quantity in the cart

On screen

The cart, where quantity is changed: a request for three Moss mugs set to the two that exist before payment, the stock check that will run again at payment, and the saved-for-later shelf under it.

Customers change their minds in the cart, so that's where quantity handling lives.

Quantity lives in the cart, because that's where people change their minds: the decision to buy two comes after the decision to buy. Stock is checked at the cart and again at payment, so a quantity that stops being available says so before the card comes out.

What shipped
  • Quantity handled in the cart, where minds actually change
  • Stock checked at cart and again at payment
  • Unavailability surfaces before the card comes out
Loam & Kiln
Search the shop Cart StockroomNA
Order #1042 Paid at provider

Marisol Vance · Asheville, NC · created from the provider's event at 2:14:07 PM, not from a page loading

Mark as packed

Items

Provider reference PAY-7Q41-K9
Everyday Mug· MossMUG-MOSS× 2$68.00
Bud Vase· TallVASE-TALL× 1$28.00
Subtotal$96.00Shipping$6.00Paid$102.00

How this order came to exist

Thu, 09/17/2026
2:12:40 PMStock checked in the cart
2:13:02 PMStock checked again before handoff
2:13:04 PMCustomer sent to the provider's hosted page
2:13:58 PMCard entered and paid on the provider's pageOn the provider’s page
2:14:06 PMProvider event received and verified
2:14:07 PMOrder #1042 created from the eventNot on redirect
2:14:07 PMTwo stock lines moved

Stock lines this order moved

Written to the table the shop reads

Everyday Mug· Moss

42−2

Low · 2 left

Bud Vase· Tall

76−1

6 in stock
Stockroom now shows 2 lines running low

What this application stored

Payment was a hosted flow
Order #1042Stored
Items, totals and shippingStored
Provider referencePAY-7Q41-K9
Customer recordmarisol.vance@fastmail.com
Card numberNever received
Expiry date and security codeNever received
On screen

Order #1042, paid through the provider and created from its event, independent of the redirect, with the two stock lines it moved on the right and a card number the application never received.

04

No card data

Payment is handed to Stripe entirely, so the application never sees a card number.

Payment is handed to Stripe's hosted flow entirely, so no card number ever reaches the application, and the compliance surface of the whole project stays where a business this size can carry it. The order is created on the webhook, so a customer who closes the tab after paying still gets their order.

What shipped
  • Hosted Stripe flow: no card data touches the application
  • Order created on the webhook, independent of the redirect
  • Closing the tab after paying still produces an order
05

Hosted accounts

Sign-up, confirmation and sign-in are hosted, which is the right trade at this size.

Sign-up, email confirmation, password reset and sign-in are all hosted, which is the right trade at this scale: the failure modes of homemade auth are expensive and the differentiation is zero. The application holds the session and the customer record, and nothing else about identity is its problem.

What shipped
  • Hosted sign-up, confirmation, reset and sign-in
  • No hand-rolled auth to get subtly wrong
  • The app holds the session and the customer record only
Loam & Kiln
Search the shop Cart StockroomNA
Accounts

Sign-up, confirmation, reset and sign-in are hosted · this application keeps the session and the customer record

Sign-in provider settings

The hosted flow

Nothing here is hand-rolled

01Sign upHosted

Email and password, on the hosted page

Create your account · marisol.vance@fastmail.com

02Confirm emailHosted

The confirmation step, sent and checked by the host

Confirmation link sent · confirmed 09/02/2026

03Sign inHosted

The host signs the person in and hands back a session

Signed in · session returned to Loam & Kiln

04Reset passwordHosted

Reset links issued and expired by the host

No reset requested on this account

Behind the same sign-in /stockroom

Owners only
NANell ArdenOwnerRORafe OduyaOwner

What this application holds

Customer record + session
MVMarisol VanceCustomer since 03/11/2026Email confirmed
Emailmarisol.vance@fastmail.com
Shipping address22 Hillcrest Rd · Asheville, NC 28804
Orders#1042 · #0987 · #0911
Saved for later3 items
SessionSigned in · expires 10/17/2026
IdentityHeld by the sign-in provider

Not held here

Nothing about identity is this app's problem
PasswordsSet and checked on the hosted page
Confirmation tokensIssued and verified by the host
Reset linksIssued and expired by the host
Card numbersEntered on the payment provider's page
On screen

Accounts: sign-up, email confirmation, sign-in and reset all hosted, the customer record and session the application keeps, and what it deliberately doesn't hold.

What we built together

  1. 01

    Kept the stockroom inside the storefront, with no second application to ship

    The stockroom is a route in the same application behind sign-in, writing to the database the storefront reads, so there is nothing to publish and nothing to sync.

  2. 02

    Made adding a product a short form, because a long one means the catalog goes stale

    The shop added real products during the build, and every field they hesitated over became a candidate for removal. That's how the form reached five.

  3. 03

    Put quantity handling in the cart where customers actually change their minds

    Quantity lives in the cart, where people actually change their minds, and stock is checked again at payment so unavailability surfaces before the card.

  4. 04

    Used hosted auth with a confirmation step instead of rolling our own accounts

    Hosted auth was a deliberate choice: the failure modes of homemade accounts are expensive and the differentiation is zero.

  5. 05

    Handed payment to Stripe entirely, so no card data touches the application

    Handing payment over entirely removed the largest compliance surface the shop would otherwise have carried, for no loss of anything they wanted.

Operational results after launch

1

Applications to run

0

Systems to sync

None

Card data stored

Under a minute

Time to add a product

Applications to run and systems to sync are counts. Card data stored is none, structurally, because payment is a hosted flow. Time to add a product is measured from the shop's own use during the build, from opening the form to the product being live on the storefront.

Client name withheld under NDA. Figures are approximate, drawn from the engagement’s own reporting.

Process

Phase by phase

  1. Phase 1: The Catalogue

    Categories And Products

    Built browse, category pages and product pages on a small catalog model, sized for a range that changes often, with no pretense of scaling to thousands.

    • Catalogue
    • Category Pages
    • Product Pages
  2. Phase 2: The Stockroom

    A Page, Not A System

    Built adding and viewing inventory as a page inside the same application, so there's no second deployment, no sync, and nothing separate to learn.

    • Add Inventory
    • View Inventory
    • Stock Levels
  3. Phase 3: Cart And Checkout

    Where People Change Their Minds

    Built the cart with quantity handling in it, because that's where customers actually adjust, and handed payment to Stripe so no card data reaches the app.

    • Cart
    • Quantity Picker
    • Stripe Checkout
  4. Phase 4: Accounts

    Hosted, With A Confirmation Step

    Used hosted auth, confirmation step included, instead of rolling accounts by hand. For a two-person shop, that's the difference between shipping and not.

    • Sign Up & Confirm
    • Sign In
    • Session Handling
Loam & Kiln
Search the shop CartSign in

Shop / Mugs / Everyday Mug

Everyday Mug

$34.00

Twelve ounces, thrown and trimmed by hand, with a handle that fits three fingers. Dishwasher safe.

Glaze · every variant and its stock

OatMUG-OAT14 in stock
MossMUG-MOSSLow · 2 left
InkMUG-INK9 in stock
Add Oat to cartChoose how many in the cart
Ships Tuesday Paid on the provider’s page Stock as of now
Also on the shelfRead from the same stock table
Bud VaseTwo heights, one stem eachfrom $26.00In stock
Noodle BowlWide and deep, 28 oz$42.00In stock
Pour-over SetDripper and cup, fits a #2 filter$68.00Low · 1 left
On screen

A product page carrying every variant and its stock: Oat, Moss and Ink, with Moss low at two, and quantity left for the cart.

About our collaboration

This was a two-person shop, and the whole engagement was scoped around that: one application, hosted auth, and payment handed entirely to a provider. Each of those is a deliberate decision about what not to build.

Ten weeks, fixed, with an explicit rule that any field not needed to sell the product stayed off the first screen. The shop added real products during the build, which is how the form got down to five fields: every one they hesitated over was a candidate for removal.

What it settled

What we'd carry into the next one

  • Small retailers are sold tooling built for teams they don't have, and pay for it in stale catalogs.

    Tooling built for a merchandising team is priced in licenses and paid for in staleness, a cost small retailers absorb without ever tracing it back.

  • If adding a product takes ten minutes, the catalog will be wrong by the second week.

    Ten minutes per product is enough friction to put the task off indefinitely, and a catalog put off for two weeks is a storefront that misrepresents the shop.

  • A separate admin system means a sync, and a sync means a class of bug nobody has time to chase.

    A second system implies a sync, and a sync implies a failure mode someone has to notice. That's exactly the resource a two-person shop lacks.

  • Handing payment entirely to a provider is the cheapest security decision a small shop can make.

    Handing payment entirely to a provider removes the largest compliance surface a small shop would otherwise carry, for no loss of anything they wanted.

One order, cart to stockroom

The shop and its stock can’t disagree when they are the same table.

Follow order #1042 from the cart, through the payment provider, into the stock table and out the other side as the stockroom sees it. Watch the Moss mug trip its low mark, then close the customer’s tab after paying and see that the order still arrives. Switch tabs, or use the arrow keys once one is focused.

Order #1042 · Marisol VanceEveryday Mug · Moss: 4Bud Vase · Tall: 7Lines low: 1 of 7

Two lines in the cart, each checked against the stock table

Everyday Mug · Moss× 2 · $68.00 2 of 4 available
Bud Vase · Tall× 1 · $28.00 1 of 7 available
Subtotal $96.00 · shipping $6.00 · total $102.00 Continue to secure checkout

Quantity is chosen here, where customers change their minds. Nothing has moved yet: a cart isn't an order.

Illustrative: the shop, the order, the stock counts and the times of day are invented to show the mechanism, and the counts step down slowly so the change is visible. Nothing here is a measurement.

Architecture

From a quantity in the cart to the count in the stockroom, inside one application

There's no second system in this path. The only thing handed out is payment, and it's handed out entirely.

  1. 01 · Trigger
    Cart with quantityQuantity is handled in the cart, where customers change their minds, and stock is checked there first.
  2. 02 · Handoff
    Stripe hosted checkoutStock is checked again at payment, so unavailability surfaces before the card. The card is entered on the hosted page, never in the app.
  3. 03 · Order
    Webhook creates the orderThe order is created on the webhook, so a customer who closes the tab after paying still gets their order.
  4. 04 · State
    One databaseThe stockroom writes to the database the storefront reads. Nothing to publish, nothing to reindex, nothing to reconcile.
  5. 05 · Delivery
    Shop + stockroom routeOne application: the storefront, and the stockroom as a route behind hosted sign-in. The catalogue is current the moment a product is saved.

Right count, no card, one truth

Overselling, card liability & a shop out of step with its stock

Stock is checked twice

Once in the cart and again at payment, so a quantity that stops being available says so before the card comes out.

No card number reaches the app

Payment is Stripe's hosted flow entirely, so the compliance surface stays where a business this size can carry it. The order is created on the webhook, so a closed tab still produces it.

The shop reads what the stockroom writes

The stockroom is a route in the same application, writing to the database the storefront reads. With no second system there is no sync to fail and nothing to reconcile.

Running a small shop from an admin built for a team you don’t have? Scope your build in 3 minutes.

Scope your build
Have a project?

Let's talk

Running a large platform, shaping a first MVP, or getting a product ready for a funding round? Tell us where you are. We'll shape the process around it, and stay with you after launch.