Skip to content
BuildBase

Add paid plans to a v0 app (Next.js App Router, BuildBase sign-in)

One prompt that lets a workspace in a v0 app pick a plan and unlocks a paid feature by its slug, checked on the server, plus where the keys live.

v0 can also connect to BuildBase itself while it builds: Use BuildBase in v0.

A workspace picks a plan in the SDK's subscription screen, pays on Stripe's page, and the feature its plan includes appears without a reload. A route handler checks the same answer, so a person cannot reach the feature by typing its address. This page assumes the app already signs people in with @buildbase/sdk, as the v0 guide sets up. If it signs people in with something else, such as Supabase or Clerk, read keep your existing sign-in first.

Before you start

Stripe connected, a feature with the slug export and a published plan that includes it (Set up billing). Entitlement checks need @buildbase/sdk 1.0.0 or later.

The prompt

v0's docs document no link that opens v0 with a prompt filled in, so copy this into your project's chat.

This app signs people in with BuildBase (@buildbase/sdk), set up as https://www.buildbase.app/guides/add-sign-in-teams-and-paid-plans-to-a-v0-app shows. If it does not, stop and tell me.
Read https://docs.buildbase.app/billing/entitlements.md first and do not invent endpoints. Plans and prices live in the BuildBase console, with a feature whose slug is export.
- In a client component, add an Upgrade button that calls openWorkspaceSettings('subscription') from useSaaSAuth().
- Wrap the export screen in WhenEntitled from @buildbase/sdk/react, with slug "export" and an upgrade card as its fallbackComponent.
- In the route handler that runs the export, call bb().entitlements.check({ workspaceId, slug: 'export' }) from lib/buildbase.ts and answer 402 when allowed is false.
Do not install the Stripe integration from the Vercel Marketplace, and do not store the plan in my database. Never store card data.

Where the secrets go

Your Stripe keys go into the BuildBase console, under Billing, not into Vercel: the app never holds a Stripe key, and card details stay on Stripe's page. BUILDBASE_CLIENT_SECRET stays where the guide put it: the Vercel project's environment variables, with no NEXT_PUBLIC_ prefix.

The v0 trap

v0 installs payment providers from the Vercel Marketplace, Stripe among them, under Project menu > Settings > Integrations, and an installed integration can steer what v0 writes. With BuildBase, Stripe is connected in the BuildBase console instead. Read the change before you accept it: if v0 asked to add the Stripe integration or wrote its own checkout, undo it and paste the prompt again.

Gate on the slug, not the plan name. A check for "is this the Pro plan" breaks the day you rename a plan or sell the feature as an add-on.

Full guides