Skip to main content

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).

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

ShopWell storefront