Subscription Billing
Plan tiers, checkout, and subscription management
Subscription Billing
1 OAK MLS uses Stripe to manage workspace subscriptions. Each workspace can subscribe to one of three plans, each unlocking progressively more features.
Plans Overview
| Agent | Professional | Prestige | |
|---|---|---|---|
| Monthly | $99/mo | $199/mo | $449/mo |
| Annual | $990/yr | $1,990/yr | $4,490/yr |
| Setup fee (monthly) | None | $299 | $499 |
| Setup fee (annual) | None | None | None |
| Listings | 1,000 | 5,000 | Unlimited |
| Templates | 1 (Estate) | 3 (all) | 3 (all) |
| Custom domain | Yes | Yes | Yes |
| Service areas | 3 | 10 | Unlimited |
| Landing pages | -- | 5 | Unlimited |
| Dashboard members | 2 | 5 | Unlimited |
| AI generations | -- | 500/mo | 2,000/mo |
| Brand palette | -- | Yes | Yes |
| Blog | -- | Yes | Yes |
| Map view | -- | Yes | Yes |
| Favorites | -- | Yes | Yes |
| AI search | -- | -- | Yes |
| Automations | -- | -- | Yes |
| Team branding | -- | -- | Yes |
| Custom CSS | -- | -- | Yes |
Annual billing saves approximately 2 months compared to monthly.
How to Subscribe
- Go to Dashboard > Billing (requires Admin or Owner role)
- Choose a plan and click Monthly or Annual
- Complete payment on the Stripe Checkout page
- You'll be redirected back to your dashboard with the plan active
The billing page shows your current plan, features, next billing date, and available upgrades.
Managing Your Subscription
Click Manage Billing on the billing page to open the Stripe Customer Portal. From there you can:
- Upgrade or downgrade your plan
- Switch between monthly and annual billing
- Update your payment method
- Cancel your subscription (access continues until period end)
- View invoice history and download receipts
Charter Partner Overrides
Founding clients and special partners can be granted full Prestige access without a Stripe subscription. This is managed by platform administrators.
Charter partners see a "Charter Partner" badge on their billing page instead of subscription status. They have no Manage Billing button since there's nothing to manage.
To set up a charter override, a platform admin uses the admin API:
POST /api/admin/workspaces/{id}/billing
{
"is_billing_override": true,
"plan": "prestige",
"override_reason": "Charter partner — founding client"
}Grace Period
If a payment fails, the subscription enters past_due status. A 3-day grace period starts from the end of the current billing period. During this time:
- All features remain accessible
- A warning banner appears on the billing page
- The workspace owner should update their payment method via Manage Billing
After the grace period expires, access to plan-gated features is revoked until payment is resolved.
Feature Gating
Each plan defines which features are available. The feature matrix is enforced by the requireFeature() helper, which checks the workspace's subscription against the plan's feature definitions.
Features are defined in packages/billing/src/plans.ts and include both boolean flags (e.g., blog, mapView) and numeric limits (e.g., maxListings, aiMonthlyLimit).
Sidebar Tier Badge
The dashboard sidebar shows a color-coded badge indicating the current plan:
- Agent — Gray badge
- Professional — Indigo badge
- Prestige — Amber/gold badge
- Charter — Plan color with "(Charter)" suffix
If the plan includes AI generations, the sidebar also shows current month's usage (e.g., "12/500 AI").
Related Documentation
- Billing Technical Reference — Architecture, webhook handler, database tables
- API Reference — Billing API endpoints
- Database Schema — Billing table definitions