ShopWell: wellness marketplace
An Australian wellness storefront and marketplace scaffold: curated catalogue, buyer accounts, seller and admin areas, and Stripe Checkout with webhook-backed order state. Copy stays lifestyle-oriented (no therapeutic claims).
- Live demo: shopwell-two.vercel.app
- Source: github.com/wencano/shopwell
Problem
A wellness shop needs more than product grids. You need auth, role-aware areas (buyer, seller, admin), AUD pricing, and a checkout flow that still makes sense after Stripe redirects the buyer away and back.
Solution
Next.js App Router with Supabase Auth for sessions and middleware-protected routes. App data goes through server-side Drizzle into Postgres so keys and access stay on the server. Checkout creates a pending order, sends the buyer to Stripe, then finishes the order through signed webhooks.
Impact
- Browse-to-paid flow works end to end.
- Seed data and scripts make local demos easy to repeat.
Lessons learned
- Stripe webhooks need idempotency and signature checks, or order state drifts.
- Keep Supabase auth and Drizzle data access as separate responsibilities from the start.
- AUD pricing and compliance copy are cheaper to decide early than to retrofit.
Tech stack
- Frontend: Next.js (App Router), React, TypeScript
- Auth & database: Supabase Auth, PostgreSQL (Drizzle ORM)
- Payments: Stripe Checkout + webhooks
- Testing: Vitest, Playwright
Screenshots
Storefront
