← All projectspersonal product2025Under the hood ↓
FitGuild
The storefront was the easy half. The ERP behind it is the reason I built this.
A storefront with a real back office behind it: nine admin surfaces covering stock, a ten-state order lifecycle, customer records and a sales funnel — the operator's half most shop demos skip.
- Role
- Personal product · solo
- Stack
- DjangoReactPostgreSQLStripeChannels
- Result
- 9back-office surfaces, from stock ledger to sales funnel
A Screens
The storefront was the easy half
Browsing, cart and checkout are the part everyone builds. It is here to set up what sits behind it.
Complete, or not at all
Payment, stock and the order row commit together. A failure part-way through leaves nothing half-written to reconcile by hand.
The half most demos skip
Revenue, stock movement and order flow from the operator's side. A storefront without this is a catalogue, not a business.
Nine back-office surfaces
Stock, suppliers, purchase orders and returns. The ERP behind the shop is the reason this project exists at all.
Under the hood
FitGuild
Under the hood
FitGuild
B Architecture
Why the stock number can be trusted
Nothing changes stock quietly. Every movement, whether a sale or a manual correction, is written down with the quantity before it and the quantity after, and who caused it.
How stock stays honest
Every movement of stock is written down. The quantity before and after each change is kept, so the number on the shelf can always be explained.
- What people use
- Code I wrote
- Where it is kept
- Someone else's service
Stock that can always be explained
A product is not one thing: it is a set of sellable variants, each with its own stock. Every change to that stock is written to a ledger with the quantity before and after, so the number on the shelf is never a mystery.
C Decisions
The calls that made the difference, and what each one bought.
The admin panel is an ERP and a CRM, not a settings page: stock with low-stock thresholds, orders across ten states, promotions, and customer records carrying new, repeat and returning buyers.
Sales leads are measured, not guessed. Every product view, cart add and checkout start is an event, so the funnel down to purchase, average order value, fulfilment and return rates all come out of real traffic.
The full Stripe post-purchase loop lives server-side — payment, order transitions, inventory — and status changes push over WebSockets instead of being polled for.
D What it runs on
- Django
- React
- PostgreSQL
- Stripe
- Channels
live site, repo private