Skip to content
Commerce SystemsD-01Live in production

Tresoria Beauty

A hair and beauty storefront built for mobile money and mobile data

Timeline
2026 — present
Repositories
2
Role
Design, architecture and implementation
Summary
An online store for a Kumasi hair brand — premium extensions, wigs, accessories and care products — with mobile money as the primary way to pay, honest delivery pricing quoted before checkout, and an admin dashboard the owner runs the shop from without a developer.
31
Application routes
14 storefront, 17 admin
100
Server API routes
49 of them behind the dashboard
15
Data models
counted from the Prisma schema
tresoria-beauty · commerceLive capture
The Tresoria Beauty storefront — wordmark, category navigation and a dark hero panel reading “Hair that holds its shape”

tresoriabeauties.com — the storefront, captured from production

What it is

Tresoria Beauty sells premium hair extensions, wigs, accessories and care products from Kwamo, in Kumasi. Before this, the shop ran on WhatsApp: photographs sent one at a time, prices negotiated in a thread, delivery quoted after the fact, and orders lost whenever a conversation scrolled away.

The store replaces that with two surfaces out of one codebase — a storefront customers browse and pay on, and a dashboard the owner runs the business from. No developer sits between her and a price change.

The constraint that shaped it

Nearly all the traffic is an Android phone on mobile data, and nearly all the money is mobile money. Those two facts decided most of the engineering:

  1. Mobile money is the primary button, not an alternative tucked under card fields. MTN MoMo, Telecel Cash and AirtelTigo go through Paystack alongside cards.
  2. Payment is asynchronous, so the browser is never trusted. The customer approves the charge on their handset, which can take a minute or more. The order is created pending; stock is decremented only when a signature-verified webhook confirms the amount. The webhook is idempotent, because Paystack retries and a retry must not decrement stock or send a second message.
  3. Data-light by default. Posters load before video, media streams adaptively, and nothing autoplays at full quality on a metered connection.
  4. Delivery is priced honestly. Zones are quoted before checkout instead of appearing as a surprise on the last screen.

The dashboard

Seventeen admin screens and forty-nine server routes exist for one reason: the shop owner should never need to ask for a deploy. Products and variants, stock levels, categories, discounts, delivery zones, orders through their lifecycle, customer records, reviews and the site’s own copy are all editable from the browser.

Design

Flat colour, real photography, a serif for product names and tabular numerals for prices. Motion is spring-based rather than eased — drag-dismissible bottom sheets instead of modals, press feedback on everything tappable, skeletons instead of spinners — and all of it degrades to plain fades under prefers-reduced-motion.

Where it runs

A single Nuxt application deployed to a VPS behind nginx as a systemd service, built and shipped by GitHub Actions. An Expo companion app shares the same catalogue API.

Next product
StockFlow

Inventory tracking with a scanner in the loop