Directlee
Directlee

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:

DimensionTypical valueNotes
Monthly new leads cap300Counting is enforced against your user’s monthly usage counter.
Active automations cap3How many automation rules you can have on at once.
Broadcast recipients25 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 appliesConfigured 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

DimensionTypical value
Monthly leads1500
Automations20

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 keyMonthly leads fallbackAutomations fallback
free3003
pro150020
elite050

Your live account may differ if the CMS row overrides these.