G-Shop: a full-stack store for a paying client
An e-commerce MVP with a customer storefront, an admin dashboard, Stripe payments, shipping labels and AI product tools. I wrote the backend myself, using AI as a coding assistant.
| Role | Full-stack developer, solo. Paid client engagement. |
|---|---|
| Timeline | Sep 10 – Nov 7, 2025 · 400 commits |
| Frontend | React 19, Vite, TypeScript, Tailwind + shadcn, Redux Toolkit, TanStack Query, React Router, React Hook Form + Zod |
| Backend | Node, Express 5, TypeScript, Prisma, PostgreSQL, JWT + Argon2id |
| Integrations | Stripe (authorize, capture, refund), EasyPost (address checks, rates, labels, tracking), OpenAI, image storage |
| How I built it | About half the code is mine, typed by hand, especially the backend and its routes. I used ChatGPT (GPT-4 era) as an assistant for scaffolding and for learning as I went. |






What I built
A real order flow, done safely
Placing an order checks stock, authorizes the card with Stripe, then creates the order and takes the items out of stock inside one database transaction, re-checking stock there so two shoppers can't both buy the last item. Only then is the payment captured and the order's status history recorded. The same service handles refunds and buying shipping labels.
The data model
I designed a Prisma schema of 29 models: products with variants, options and dimensions, collections and categories, carts, orders, transactions, invoices, coupons, reviews, stock movements, addresses and shipping history. A small script I wrote turns the schema into TypeScript types shared by the frontend and backend, so both sides always agree on the shape of the data.
A REST API with permissions
- About 20 endpoints for auth, orders, shipping, uploads, AI and settings, plus a reusable route factory that gives 8 resources (products, collections, orders, users and more) their create, read, update and delete routes.
- Login built from scratch: a JWT in a secure cookie, passwords hashed with Argon2id, and roles for admin, site owner and customer.
- Middleware for authentication, role and ownership checks, CORS and central error handling.
Swappable integrations
Payments, shipping, storage, auth and the database each sit behind an interface with interchangeable adapters. That paid off mid-project: the store started on Firebase, and I moved it to my own Express server and Postgres without rewriting the features.
AI features
- A store-wide shopping assistant that answers questions about the store
- A per-product assistant on every product page
- One-click product descriptions for the store owner in the admin dashboard
Deployment
I deployed the frontend and backend myself: Docker for the API, a hosted Postgres database, and a static frontend host.
What it shows
The commit history shows me learning in public: Firebase, then a payment server because Firebase had no free server functions, then Prisma, Stripe, shipping and Docker, ending in consistent, scoped commit messages. This is the project where I learned how a backend fits together, by building one for someone who paid for it.
What I'd do differently today: add request validation on the server (it's only on the frontend forms), rate limiting, and real test coverage. G-Shop has one test. My later projects are where verification became the center of how I work.