Free, Pro, and Lifetime Plans
Leave Localhost ships with a three-tier plan structure that covers the most common SaaS billing models.
Leave Localhost ships with a three-tier plan structure that covers the most common SaaS billing models.
Plan Structure
| Plan | Key | Interval | Checkout | Capabilities |
|---|---|---|---|---|
| Free | free | — | No | None |
| Pro Monthly | pro_monthly | Month | Yes | Full Pro |
| Pro Yearly | pro_yearly | Year | Yes | Full Pro |
| Pro Lifetime | pro_lifetime | One-time | Yes | Full Pro (never expires) |
Free Plan
The Free plan is the default for every new workspace. It has no capabilities, which means:
- No access to
feature.progated features - Cannot invite members (
workspace.members.invitemissing) - No billing portal access
No checkout is needed — Free is the absence of a paid subscription.
Pro Plans (Monthly / Yearly)
Pro plans are recurring subscriptions. They grant:
feature.pro— unlock Pro featuresworkspace.members.invite— invite team membersworkspace.members.limit.10— up to 10 members per workspacebilling.portal— access the provider's customer portal
Grants from subscriptions have an expiresAt set to the current billing
period end. When the subscription renews, a new webhook event refreshes the
grants with the new period end.
If a subscription is canceled:
cancelAtPeriodEndis set totrue- Grants remain active until the period ends
- At period end, the subscription webhook revokes the grants
Pro Lifetime
The lifetime plan is a one-time purchase. It creates grants with
expiresAt: null, meaning they never expire.
For Stripe, lifetime purchases are handled via payment_intent.succeeded
events (not subscription events). Polar and Lemon Squeezy handle lifetime
through their subscription mechanisms with appropriate status mapping.
Lifetime Refunds
If a lifetime purchase is fully refunded (Stripe charge.refunded event),
the grants are revoked via the syncBillingGrants revoke action.
Billing State
The app computes a BillingState for each organization:
| Status | Meaning |
|---|---|
free | No subscription, no grants, provider configured |
active | Active subscription or active grants |
trialing | Subscription in trial period |
past_due | Payment failed, grace period |
canceled | Subscription canceled |
incomplete | Checkout started but not completed |
unconfigured | No billing provider configured |
Plan Display in the UI
The sidebar footer shows a badge with the current plan name (e.g. "Pro" or
"Free"). Users with billing.read permission see this badge. Users with
billing.manage permission can access checkout and the customer portal.
Next Reads
- Billing Catalog — customizing and adding plans.
- Entitlements and Grants — the grant system.
Billing Catalog
The billing catalog defines every plan available in your product. It lives at packages/backend/convex/billing/plans.config.ts.
Entitlements and Grants
The billing system uses a grant-based entitlement model. Instead of checking subscription status or provider-specific fields, the app checks for capabilities.