What you’ll build
A project management SaaS where teams can create workspaces, organize tasks on Kanban boards, invite collaborators, and upgrade to a paid plan. The finished product includes user authentication, a free tier with limits, a Pro subscription via Stripe checkout, transactional email notifications, and one-click deployment to Netlify. By the end of this recipe you will have a production-ready app that you can customize, rebrand, and launch as your own product.Tech stack
| Service | Role |
|---|---|
| Next.js + TypeScript | Frontend framework and API routes |
| Supabase | User authentication, PostgreSQL database, file storage |
| Stripe | Subscription billing (free and Pro plans) |
| Resend | Transactional emails (welcome, invites, receipts) |
| Netlify | Production deployment and hosting |
Architecture overview
Here is how the pieces connect:- A visitor signs up using Supabase Auth (email/password or social login).
- After signup, they land on a dashboard where they can create a workspace and start adding tasks (stored in Supabase).
- The workspace owner can invite team members by email. Resend delivers the invitation.
- When the team is ready to unlock higher limits, the owner opens the pricing page and completes a Stripe Checkout session to subscribe to the Pro plan.
- Stripe webhooks update the subscription status in Supabase, and Resend sends a receipt email.
- The entire app is deployed to Netlify with environment variables configured for each service.
How long does it take?
| Phase | What you’re building | Estimated time |
|---|---|---|
| Setup | Project, Supabase, auth | 5-10 minutes |
| Core features | Workspaces, tasks, teams | 10-15 minutes |
| Monetization | Stripe, pricing, billing | 5-10 minutes |
| Communication | Email notifications | 5 minutes |
| Launch | Deploy, go live | 5 minutes |
| Total | Complete SaaS app | 30-45 minutes |
Step-by-step build
Start a new project
Open rocket.new and create a new project. Give Rocket a detailed description of the app so it scaffolds the right pages, layout, and navigation from the start.
Connect Supabase
Go to Integrations in your Rocket project and connect your Supabase account via OAuth. Create a new Supabase project (or select an existing one), then ask Rocket to set up the database schema.
Rocket handles the Supabase connection through OAuth, so you never need to copy API keys manually. Your credentials are encrypted and stored securely.
Build the signup and login flow
Now wire up authentication so users can create accounts and sign in. This prompt connects Supabase Auth to the signup and login pages that Rocket already scaffolded.
Create workspaces and task boards
This is the core of the product. Users create a workspace, then manage tasks on a drag-and-drop Kanban board.
Add team member invitations
Let workspace owners invite collaborators by email. This step introduces the team collaboration flow.
The email notification for invitations will be connected in Step 8 when we add Resend. For now, the invitation logic works through the database.
Connect Stripe for billing
Go to Integrations and connect Stripe using your test mode API keys. Then ask Rocket to build the subscription backend.
Create the pricing page
Build a public-facing pricing page that drives conversions and handles the checkout redirect.
Add email notifications with Resend
Go to Integrations and connect Resend by pasting your API key. Then set up transactional emails for key user actions.
Resend provides a free tier of 100 emails per day, which is plenty for development and early launch. You can upgrade later as your user base grows.
Customization ideas
Once the base product is running, here are ways to extend it.Add analytics with Mixpanel
Add analytics with Mixpanel
Track user behavior to understand how people use your app. Instrument events like workspace created, task moved, member invited, and plan upgraded. Use Mixpanel funnels to measure your signup-to-paid conversion rate.
Add AI features with OpenAI
Add AI features with OpenAI
Let users generate task descriptions, summarize project progress, or get smart suggestions for task assignments using OpenAI.
Add a public API
Add a public API
Expose a REST API so power users can automate task creation, query workspace data, or integrate with external tools like Zapier.
Add an admin dashboard
Add an admin dashboard
Build an internal dashboard for yourself to monitor signups, revenue, and usage metrics without leaving the app.
Add mobile app support
Add mobile app support
Make the app work well on phones and tablets, or generate a standalone mobile app from your Rocket project.
Troubleshooting
Stripe webhook not firing after deployment
Stripe webhook not firing after deployment
Symptoms: Payments complete in Stripe but the workspace plan does not update in your app.Fix:
- Open the Stripe Dashboard > Webhooks and confirm the endpoint URL matches your production Netlify URL (for example,
https://your-app.netlify.app/api/webhooks/stripe). - Check that the webhook signing secret in your Netlify environment variables matches the one shown in the Stripe Dashboard.
- Click Send test webhook in Stripe to verify the endpoint responds with a 200 status.
- If you are still in test mode, make sure you are looking at the test mode webhooks (toggle the mode switch in the Stripe Dashboard).
Supabase auth redirect goes to localhost
Supabase auth redirect goes to localhost
Symptoms: After login or signup on the deployed site, the user is redirected to
localhost:3000 instead of the production URL.Fix:- In your Supabase Dashboard, go to Authentication > URL Configuration.
- Set the Site URL to your production URL (for example,
https://your-app.netlify.app). - Add your production URL to the Redirect URLs list.
- Remove any
localhostentries if you no longer need them for local development. - Redeploy the app on Netlify to pick up the changes.
Emails not sending through Resend
Emails not sending through Resend
Symptoms: Users do not receive welcome emails, invitations, or receipts.Fix:
- Confirm your Resend API key is correct in the Netlify environment variables.
- Check the Resend Dashboard > Logs for delivery status and error messages.
- If you are using a custom “from” domain, verify that DNS records (SPF, DKIM) are configured correctly in your domain registrar.
- During development, Resend only allows sending to the email address associated with your Resend account unless you have verified a custom domain.
Row-level security blocking data access
Row-level security blocking data access
Symptoms: The app loads but the task board or workspace list is empty, even though data exists in Supabase.Fix:
- Open the Supabase Dashboard and go to Table Editor. Check that the data exists in the relevant tables.
- Go to Authentication > Policies and review the RLS policies on the
workspaces,workspace_members, andtaskstables. - Make sure the policies reference
auth.uid()correctly and that the logged-in user has a matching row inworkspace_members. - Use the Supabase SQL Editor to test a query as the authenticated user:
select * from tasks where workspace_id = 'your-workspace-id';

