feat(billing): pricing redesign — annual plans, Enterprise tier, richer quotas#83
Open
smakosh wants to merge 1 commit into
Open
feat(billing): pricing redesign — annual plans, Enterprise tier, richer quotas#83smakosh wants to merge 1 commit into
smakosh wants to merge 1 commit into
Conversation
…er quotas - Add annual billing (10× monthly = two months free) end-to-end: shared tiers carry `priceUsdAnnual`; API checkout takes an `interval`; dashboard + marketing get monthly/annual toggles - Bump quotas so unit economics improve up the ladder: Growth 8k→12k responses & 8→10 seats; Scale 25k→50k responses, 15→20 projects, and unlimited seats (UNLIMITED sentinel + `isUnlimited` for display) - Add display-only Enterprise "Contact sales" tier (SSO/SAML, DPA, SLA, white-glove onboarding, self-host support contract) — anchors the page - Marketing pricing page: cadence toggle, Growth highlighted, Enterprise band, mental-accounting price framing, 14-day money-back-guarantee / risk-reversal copy, new FAQs (new client island PricingPlans.tsx) - Wire STRIPE_PRICE_*_ANNUAL (env.d.ts, .env.example, ploy.yaml); metered overage prices unchanged (overage meters monthly regardless of cadence) - Keep the "promise = enforced reality" contract: every advertised limit still comes from the shared BILLING_TIERS table - Update shared + dashboard tests for the new numbers and call signatures Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
✅ All deployments successful!
Deployed with Ploy |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What & why
A redesign of Clanker Support's pricing — keeping the bootstrapped constraints intact (paid-only, free self-host, no per-seat fees) while fixing the weak spots in the current Starter $19 / Growth $89 / Scale $299 structure and adding the highest-leverage missing pieces.
Monthly prices are unchanged ($19/$89/$299), so existing Stripe monthly prices keep working and current customers only gain (more generous quotas). Everything advertised still comes from the shared
BILLING_TIERStable, so the promise, the enforced reality, and the displayed price never drift.The plans
Per-response value now drops as you climb ($0.0095 → $0.0074 → $0.0060), so upgrading is the rational move and overage on Growth makes Scale the obvious step past ~30k/mo.
Changes
Shared model (
packages/shared)priceUsdAnnualon every tier (10× monthly);BillingIntervaltype;UNLIMITEDsentinel +isUnlimited()helperENTERPRISE_TIERdisplay constant (sold, not self-served — noPlanvalue, resolves tonone)API (
apps/api)planPrices(vars, plan, interval)selects monthly vsSTRIPE_PRICE_*_ANNUAL; checkout acceptsinterval(defaults monthly). Overage prices unchanged.env.d.ts,.env.example,ploy.yamlMarketing (
apps/marketing)PricingPlansclient island: monthly/annual toggle, Growth highlighted, mental-accounting price framing, Enterprise band, risk-reversal strippricing.md+ JSON-LD updated;SALES_EMAILconstantDashboard (
apps/dashboard)startCheckout(ws, plan, interval, returnTo); cadence-aware prices; unlimited-seat formatting; money-back-guarantee notePsychology applied
Good-better-best with a pre-anchored "Most popular"; Enterprise anchors high (door-in-the-face); annual default-nudge for cash flow; charm pricing kept; 14-day money-back guarantee kills regret aversion; per-day reframe; 3 tiers + Enterprise to respect Hick's Law.
STRIPE_PRICE_{STARTER,GROWTH,SCALE}_ANNUAL. Until set, annual checkout returnsbilling_not_configured(monthly unaffected).NEXT_PUBLIC_SALES_EMAIL(defaults tosales@clankersupport.com).Test plan
pnpm test(all suites, incl. updated billing tests),pnpm lint,pnpm buildall greenplanEntitlements("enterprise") === none🤖 Generated with Claude Code