Billing

Stripe handles all payment processing with three subscription tiers.

Plans

PlanMonthlyAnnualFeatures
Free$0$03 projects, 1 team member
Pro$9$9010 projects, 5 team members
Enterprise$29$290Unlimited everything

Price ID Configuration

Stripe price IDs are resolved from environment variables at runtime:

Frontend (Vite static replacement):

  • VITE_STRIPE_PRO_MONTHLY
  • VITE_STRIPE_PRO_ANNUAL
  • VITE_STRIPE_ENTERPRISE_MONTHLY
  • VITE_STRIPE_ENTERPRISE_ANNUAL

Backend (Convex env vars):

  • STRIPE_PRO_MONTHLY_PRICE_ID
  • STRIPE_PRO_ANNUAL_PRICE_ID
  • etc.

Important: Each env var must be referenced as a literal string in frontend code. Vite replaces import.meta.env.* at build time — dynamic key access returns undefined.

Checkout Flow

  1. User selects a plan on the pricing page
  2. Frontend calls api.billing.startCheckout
  3. Convex creates a Stripe Checkout Session
  4. User is redirected to Stripe
  5. After payment, Stripe sends a webhook
  6. Webhook updates the team’s subscription