Billing (cloud mode)

Billing is for hosted deployments only. With BILLING_ENABLED unset (the self-host default), reviews have no quota, the Stripe webhook endpoint returns 404, and the billing page says billing is off.

Plans

When a review is blocked, it is recorded as failed with a Billing: reason, visible on the pull request's review page. Blocked reviews are also counted on Settings → Billing.

Setup (operator)

  1. In Stripe test mode, create a product with a recurring per-unit price. Set its ID as STRIPE_SEAT_PRICE_ID.
  2. Add a webhook endpoint https://<convex-site>/stripe/webhook for these events: checkout.session.completed, customer.subscription.created, customer.subscription.updated, customer.subscription.deleted, invoice.payment_failed and invoice.paid. Set its signing secret as STRIPE_WEBHOOK_SECRET.
  3. Set STRIPE_SECRET_KEY (sk_test_…) and BILLING_ENABLED=true on Convex. Live keys are refused unless BILLING_ALLOW_LIVE=true.
  4. Turn on the Customer Portal in Stripe so admins can manage their payment method, invoices and cancellation.

On Vercel, Stripe can also be provisioned from the Vercel Marketplace. The keys still belong in the Convex environment, because Convex runs Checkout, the portal and webhook handling.

Guarantees