BoilerPrompt
v0

v0 prompt to build a SaaS starter app

This prompt has v0 scaffold the entire skeleton of a subscription product: marketing page, auth flow, and a workspace-scoped app shell with team, billing, and settings screens. The multi-tenant data model is specified up front, so workspace filtering is baked into every query instead of retrofitted later.

Last updated

Prompt
Build a SaaS starter in Next.js with shadcn/ui: marketing site, auth screens, a workspace-scoped app shell, and {{addon}} built in from the start.

Screens:
1. Landing page: hero with product name and one CTA, three feature cards, pricing with Free and Pro tiers, footer.
2. Sign up and log in: email and password forms with inline validation errors under each field.
3. /app dashboard: left nav (Home, {{resource}}, Team, Billing, Settings), top bar with a workspace switcher and avatar menu.
4. /app/{{resource}}: table of rows with create and edit in a Dialog, plus an archive action with confirmation.
5. /app/team: member list with role badges (owner, member) and an invite form that validates email format.
6. /app/settings: profile form, and a danger zone where deleting the account requires typing the workspace name.
7. /app/billing: current plan card and an upgrade button calling a stubbed checkout function with a TODO comment where Stripe would be wired.

Integrate {{addon}} using the shell's conventions: user-facing surfaces get a left-nav entry and screen, preferences get a control on /app/settings, and third-party credentials come from env vars with a stub path when keys are absent. Where it overlaps a screen above, extend that screen rather than duplicating it.

Data model for {{database}}: users, workspaces, memberships (userId, workspaceId, role), {{resource}} rows carrying workspaceId, and any tables {{addon}} needs, scoped the same way. Every read and write filters by the active workspace, and switching workspaces changes what the table shows.

Behaviors: visiting any /app route unauthenticated redirects to log in, then back after success. A new workspace is seeded with one example row so first login never shows an empty table. Log out clears the session and lands on the marketing page.

States: forms keep user input on failure; empty tables show a create prompt; a failed save raises a toast naming the action.

Styling: restrained and product-grade, single accent color, consistent radius, no marketing gradients inside /app.

Customize it

Runs in your browser. Nothing you type here is sent anywhere.

Your customized prompt
Build a SaaS starter in Next.js with shadcn/ui: marketing site, auth screens, a workspace-scoped app shell, and input validation built in from the start.

Screens:
1. Landing page: hero with product name and one CTA, three feature cards, pricing with Free and Pro tiers, footer.
2. Sign up and log in: email and password forms with inline validation errors under each field.
3. /app dashboard: left nav (Home, users, Team, Billing, Settings), top bar with a workspace switcher and avatar menu.
4. /app/users: table of rows with create and edit in a Dialog, plus an archive action with confirmation.
5. /app/team: member list with role badges (owner, member) and an invite form that validates email format.
6. /app/settings: profile form, and a danger zone where deleting the account requires typing the workspace name.
7. /app/billing: current plan card and an upgrade button calling a stubbed checkout function with a TODO comment where Stripe would be wired.

Integrate input validation using the shell's conventions: user-facing surfaces get a left-nav entry and screen, preferences get a control on /app/settings, and third-party credentials come from env vars with a stub path when keys are absent. Where it overlaps a screen above, extend that screen rather than duplicating it.

Data model for PostgreSQL: users, workspaces, memberships (userId, workspaceId, role), users rows carrying workspaceId, and any tables input validation needs, scoped the same way. Every read and write filters by the active workspace, and switching workspaces changes what the table shows.

Behaviors: visiting any /app route unauthenticated redirects to log in, then back after success. A new workspace is seeded with one example row so first login never shows an empty table. Log out clears the session and lands on the marketing page.

States: forms keep user input on failure; empty tables show a create prompt; a failed save raises a toast naming the action.

Styling: restrained and product-grade, single accent color, consistent radius, no marketing gradients inside /app.

Same task in other tools

Questions about this prompt

Is the auth real or scaffolding?

Scaffolding with real redirect logic. v0 builds the forms, session gate, and route protection, but you connect an actual provider afterwards. Follow up with "integrate Supabase auth into the existing forms" or wire Auth.js yourself after moving the code into a repo.

Seven screens is a lot for one generation. Will quality suffer?

The shell holds up because all screens share one layout, but expect the least-described screen to come out thinnest. Generate this spec first, then spend follow-up messages on whichever screen your product actually lives in, one screen per message.

New features keep forgetting workspace scoping. How do I stop that?

Restate it in every follow-up: "scope this query by the active workspaceId like the others." v0 applies the pattern when reminded but does not reliably infer it for tables and endpoints you add in later iterations.

Related prompts