What you’ll build
A fully functional online store for handmade jewelry with a browsable product catalog, persistent shopping cart, Stripe-powered checkout, order management, and automated customer notifications. Customers can browse collections, filter by category, add items to their cart, pay securely, and receive order confirmation emails with tracking details.Tech stack
| Technology | Role |
|---|---|
| Next.js + TypeScript | Frontend framework and server-side rendering |
| Supabase | Database (products, orders, users), authentication, and file storage for product images |
| Stripe | Checkout sessions and payment processing |
| SendGrid or Resend | Order confirmation and shipping notification emails |
| Google Analytics | Conversion tracking and traffic attribution |
| Netlify | Production deployment and custom domain |
Architecture overview
The store follows a straightforward data flow:- Browse: Customers explore products pulled from Supabase, with images served from Supabase Storage.
- Cart: Selected items are stored in a client-side cart that syncs to Supabase for logged-in users.
- Checkout: The cart is sent to Stripe Checkout for secure payment processing.
- Order saved: On successful payment, a Stripe webhook writes the order to Supabase and updates inventory.
- Notification: An order confirmation email is sent through SendGrid or Resend with order details and estimated delivery.
- Analytics: GA4 tracks product views, add-to-cart events, and completed purchases for conversion analysis.
How long does it take?
| Phase | What you’re building | Estimated time |
|---|---|---|
| Setup | Project, Supabase, catalog | 5-10 minutes |
| Storefront | Products, cart, checkout | 10-15 minutes |
| Payments | Stripe integration | 5 minutes |
| Post-purchase | Emails, order history | 5-10 minutes |
| Launch | Analytics, deploy | 5 minutes |
| Total | Complete store | 30-45 minutes |
Step-by-step build
Start your project
Open Rocket and describe the full scope of your store so it can scaffold the right structure from the beginning.Rocket generates the full project structure, page layouts, navigation, and placeholder product data.
Connect Supabase and set up the product catalog
Connect your Supabase project and ask Rocket to create the database schema for your store.
Seed your products table with 8-12 sample items so you have real data to work with while building. You can ask Rocket to generate sample jewelry data with realistic names, descriptions, and prices.
Build product listing and detail pages
Replace the placeholder data with live Supabase queries and build out the shopping experience.
Add order management and history
Give customers visibility into their past orders and current order status.
Set up email notifications
Send customers an email when their order is confirmed.
If you want to add shipping notification emails later, you can ask Rocket to send another email when the order status changes to “shipped.”
Customization ideas
Add inventory management
Add inventory management
Track stock levels and show “Out of Stock” badges when inventory runs out. Ask Rocket to add an admin page where you can update inventory counts and receive low-stock alerts.
Add discount codes
Add discount codes
Let customers apply promo codes at checkout for percentage or fixed-amount discounts.
Add product reviews
Add product reviews
Let customers leave ratings and reviews on products they have purchased.
Add a wishlist
Add a wishlist
Let logged-in customers save products to a wishlist for later.
Add an admin panel
Add an admin panel
Build a back-office dashboard for managing products, orders, and customers.
Troubleshooting
Cart loses items on page refresh
Cart loses items on page refresh
If guest cart items disappear after a refresh, make sure the cart state is being written to
localStorage on every update. Check that the cart provider reads from localStorage on mount. If you are using React state alone without syncing to storage, the cart will reset on every navigation.Stripe webhook not creating orders
Stripe webhook not creating orders
If orders are not appearing in Supabase after payment, verify these three things: (1) The webhook endpoint URL matches what is registered in your Stripe dashboard. (2) The webhook signing secret in your environment variables matches the one Stripe generated. (3) Your webhook handler is returning a 200 response, otherwise Stripe will retry and may create duplicate events. Check the Stripe dashboard under Developers > Webhooks for delivery logs and error details.
Product images not loading
Product images not loading
If images show as broken, confirm that your Supabase Storage bucket (“product-images”) has public read access enabled. Go to Supabase > Storage > product-images > Policies and make sure there is a SELECT policy allowing public access. Also verify that the URLs stored in the products table match the actual file paths in the bucket.
Checkout total does not match cart total
Checkout total does not match cart total
If the amount charged in Stripe differs from what the cart shows, make sure you are calculating prices on the server side when creating the Checkout session. Never trust client-side price values. Fetch product prices from Supabase in your checkout API route and use those to build the Stripe line items.
What’s next?
Build a SaaS app
Follow the SaaS recipe to add subscription billing, team workspaces, and admin dashboards to your next project.
Build an AI-powered app
Learn how to integrate OpenAI, Anthropic, or Gemini into a Rocket app with the AI recipe.
Stripe integration docs
Explore advanced Stripe features like subscriptions, invoices, and customer portals.

