Learning a Production Stack by Shipping a Paid Directory
I wanted a local business directory where businesses could submit and pay for listings. More than that, I wanted to learn a production stack by actually shipping one, not by following a tutorial.
The challenge
Build and deploy a working platform with payments, user accounts and admin controls, the parts most side projects skip.
What I did
I wrote the spec first, then built it with Claude Code on Astro and Supabase:
- Postgres with row-level security, so each business only sees its own data, plus Edge Functions that send draft-reminder emails through Brevo.
- Stripe subscriptions with Standard and Featured tiers and promo codes.
- Idempotent webhooks. Every Stripe event is logged to a processed-events table, so a retry can never double-process a payment.
- An admin approval workflow, refunds and click analytics.
- Business data pulled in through Apify, with vector embeddings for “similar listings” search.
It’s deployed on Vercel with API and end-to-end tests, across about 100 commits.
What changed
I came out with a working product and first-hand knowledge of how subscriptions and webhooks behave in the real world, including all the ways a payment event can arrive twice.
What I took away
The fastest way to learn a stack is to ship something with money in it. The edge cases teach you more than the happy path.