Billing
Stripe handles all payment processing with three subscription tiers.
Plans
| Plan | Monthly | Annual | Features |
|---|---|---|---|
| Free | $0 | $0 | 3 projects, 1 team member |
| Pro | $9 | $90 | 10 projects, 5 team members |
| Enterprise | $29 | $290 | Unlimited everything |
Price ID Configuration
Stripe price IDs are resolved from environment variables at runtime:
Frontend (Vite static replacement):
VITE_STRIPE_PRO_MONTHLYVITE_STRIPE_PRO_ANNUALVITE_STRIPE_ENTERPRISE_MONTHLYVITE_STRIPE_ENTERPRISE_ANNUAL
Backend (Convex env vars):
STRIPE_PRO_MONTHLY_PRICE_IDSTRIPE_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 returnsundefined.
Checkout Flow
- User selects a plan on the pricing page
- Frontend calls
api.billing.startCheckout - Convex creates a Stripe Checkout Session
- User is redirected to Stripe
- After payment, Stripe sends a webhook
- Webhook updates the team’s subscription