Billing
Plans & entitlements
Subscription tiers, limits, and where enforcement runs in the platform.
Plan definitions live in @prood/billing (packages/billing/src/plans.ts). Marketing, dashboard billing UI, and runtime enforcement share the same entitlements.
Plans
| Plan | Monthly | Stores | Products | Orders/mo | Seats | Custom domains | Agent Auth | API write |
|---|---|---|---|---|---|---|---|---|
| Free | $0 | 1 | 50 | 100 | 1 | 1 | No | No |
| Grow | $29 | 1 | 500 | 1,000 | 3 | 3 | Yes | Yes |
| Scale | $79 | 1 | Unlimited | Unlimited | 10 | Unlimited | Yes | Yes |
| Agency | Custom | 10+ | Unlimited | Unlimited | Unlimited | Unlimited | Yes | Yes |
All organizations default to plan_id = 'free' until Stripe subscription billing ships.
Enforcement (live)
| Limit | Where enforced |
|---|---|
maxProducts | POST /v1/admin/products |
maxOrdersPerMonth | POST /v1/carts/{id}/place-order |
maxTeamSeats | Dashboard team invite (pre-flight) |
maxCustomDomains | Dashboard add domain action |
agentAuthEnabled | API Agent Auth resolution |
apiWriteEnabled | API keys with admin scope |
See ENFORCEMENT.md in the repo for implementation details.
Not enforced yet
maxStores(agency portfolio)removeBrandingcustomAdminDomain(admin white-label)
Stripe billing (planned)
Checkout, webhooks, and organization.stripe_* columns will map Stripe Price IDs to PlanId. Until then, upgrade CTAs are informational.