Where limits come from
Your workspace limits (monthly leads, how many automations you may have enabled, and related flags) come from the Plan Settings global in the CMS, then are applied to your user record when Stripe webhooks confirm your subscription price. So the numbers on your account are always tied to the plan row that matches your active Stripe price id.
If you change plans, webhooks update monthlyLeadsLimit, activeAutomationsLimit, plan, and subscription dates.
Starter (Free) — typical defaults
From the shipped default rows in PlanSettings and fallbacks in plan-settings.ts:
| Dimension | Typical value | Notes |
|---|---|---|
| Monthly new leads cap | 300 | Counting is enforced against your user’s monthly usage counter. |
| Active automations cap | 3 | How many automation rules you can have on at once. |
| Broadcast recipients | 25 per send (FREE_PLAN_BROADCAST_LIMIT) | Free plan caps bulk sends; paid plans use the “unlimited broadcast” path in product messaging. |
| Starter trial (in-app) | Often 14 days of Pro-style features when trialStartDate applies | Configured via top-level trialDays in Plan Settings (getTrialDays defaults to 14 when unset). This is separate from a Stripe subscription trial on Pro/Elite. |
Free-tier messages may append small branding (FREE_PLAN_BRANDING constant).
Pro — typical defaults
| Dimension | Typical value |
|---|---|
| Monthly leads | 1500 |
| Automations | 20 |
Stripe trial on Pro is not hard-coded: each plan row can set Enable Trial Period plus Trial Duration (Days)—commonly 14 when trials are used—so Checkout sends trial_period_days only when those flags are on.
Elite — how to read the numbers
The admin seed row for Elite often shows placeholder 0 / 0 for display limits; the code fallbacks when a limit is missing from the row are 0 monthly leads and 50 automations in plan-settings.ts defaults—but what actually matters is what your Plan Settings row + Stripe webhook wrote onto your user. Check Settings / usage in the app for live numbers.
Admin note in CMS: the leadsLimit field description says 0 = unlimited; whether unlimited is applied in every code path is something engineers verify in getLeadsLimit / usage checks. As a user, trust the limit shown in your dashboard after checkout.
Stripe Customer Portal
When you are on Pro or Elite and already have a stripeCustomerId, Settings → Billing exposes Manage billing (implementation: createCustomerPortalAction). That opens Stripe’s Customer Portal where you can update payment method, see invoices, and manage subscription cancellation according to your Stripe portal configuration.
If you never completed a paid checkout, the app may respond with “No billing account” because no Stripe customer id is stored yet.
Affiliate checkout note
Referral commissions and subscription trials interact through Stripe invoice amounts; see the Affiliate program guide. Your plan limits here are independent of affiliate marketing.
Summary table (code defaults when CMS row omits limits)
These are developer fallbacks in src/lib/plan-settings.ts; production values should match Plan Settings after admin configuration:
| Plan key | Monthly leads fallback | Automations fallback |
|---|---|---|
free | 300 | 3 |
pro | 1500 | 20 |
elite | 0 | 50 |
Your live account may differ if the CMS row overrides these.