fix(pricing): strict-≥80%-margin redesign — Team is finite, not unlimited - #188
Merged
Merged
Conversation
…mited" CEO directive (2026-06-05, LOCKED): retire every "unlimited" tier claim and show the real finite plans.yaml caps. Hard-caps only. Team stays GATED (this PR does NOT touch the checkout/CTA gate) — copy-only. - PricingPage.tsx: Team column was `unlimited` on every limit; now renders the finite caps (50 GB PG/100 conn, 1.5 GB Redis, 40 GB Mongo/50 conn, 40 GB queue, 30 GB vector, 300 GB storage, 100k webhooks, 100 deploys, 1000 vault). Pro queue 10 GB → 5 GB, anon/hobby queue 1 GB/5 GB → 64 MB/2 GB. Removed the `UNLIMITED` cell helper. Growth blurb de-"unlimited"-ed. - PricingGrid.tsx (dashboard upsell) + MarketingPage.tsx: Team feature bullets changed from "unlimited X" to the finite caps + "need more? contact sales". - BillingPage.tsx LIMITS fallback: team Infinity → finite; growth mongodb/webhooks Infinity → finite; growth deploys 5 → 50 (display-accuracy). - public/llms.txt: anon NATS 1024→64 MB; Team "unlimited everything" → finite caps + Enterprise-above-Team. Keeps the "not yet a self-serve tier" gate marker (llmsContract.test.ts). NOTE (pre-existing, out of scope): MarketingPage Team CTA still points at the self-serve /app/checkout?plan=team path which the server gate 400s — flagged in a code comment for a follow-up gate-reconciliation PR (not changed here). Rule-22 synchronized pricing redesign (strict-80%, retire unlimited) — see docs/sessions/2026-06-04/PRICING-MARGIN-MODEL-AND-TEAM-REDESIGN.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
mastermanas805
enabled auto-merge (squash)
June 5, 2026 14:24
size-limit report 📦
|
mastermanas805
added a commit
that referenced
this pull request
Jun 5, 2026
* feat(pricing): add Enterprise "contact us" wall above Team (#56) The strict-≥80%-margin redesign (#188) made Team a finite self-serve tier. Anyone who breaches Team's caps — or needs dedicated/isolated infra, multi-region, or compliance (SOC2/BAA/SSO/SLA/custom DPA) — now has a home: an Enterprise column to the right of Team plus a dedicated "contact us" card. GTM surface ONLY — no api changes, no Team un-gating, no plans.yaml row, no dedicated-infra build. Enterprise is quote-based: no price, no checkout. PricingPage: - new `enterprise` TierKey + a 5th column (headline "Custom" / "let's talk", CTA = mailto:sales@instanode.dev?subject=Enterprise%20inquiry — matches Team's contact address). - every ROW grows to a 5-tuple; Enterprise cells read "Custom" (capacity) or "Contact us" (SSO/SAML, SLA). No numbers, no "unlimited" (retired word). - dedicated Enterprise callout card with trigger criteria + Contact-us CTA. - grid widened 5→6 tracks; tier-scroll allowlist + section copy updated. Docs contract: - public/llms.txt gains a standalone `**Enterprise**` line so agents introspecting tiers see the wall. - llmsContract.test.ts pins the Enterprise line + sales address (rule 18/22). - fetch-content.mjs requireMarkers gains '**Enterprise**' so a content sync missing the line preserves the local copy until the content PR lands. Tests: +6 PricingPage assertions (column renders, CTA is sales mailto not checkout, "Custom" headline no $, callout card present, trigger criteria surfaced, zero "unlimited" anywhere on the page). npm run gate green (tsc + build incl. prerender + 1127 vitest passing). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test(pricing): cover requested-tier scroll path for Enterprise (?tier=enterprise) diff-cover flagged PricingPage.tsx:305 (the validated-tier allow-list now including 'enterprise') uncovered — the existing per-tier-id test renders without a tier param so the requestedTier useEffect returns early. Add a render with ?tier=enterprise that executes the path. 100% patch coverage. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
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.
Rule-22 synchronized pricing redesign (strict-80%, retire unlimited) — see
docs/sessions/2026-06-04/PRICING-MARGIN-MODEL-AND-TEAM-REDESIGN.md.CEO directive (2026-06-05, LOCKED): retire every "unlimited" tier claim across the customer-facing surfaces and show the real finite
plans.yamlcaps. Copy-only — Team stays GATED; this PR does NOT touch the checkout/CTA gate.unlimitedon every limit → now the finite caps (50 GB PG/100 conn, 1.5 GB Redis, 40 GB Mongo/50 conn, 40 GB queue, 30 GB vector, 300 GB storage, 100k webhooks, 100 deploys, 1000 vault). Pro queue 10 GB→5 GB, anon/hobby queue 1 GB/5 GB→64 MB/2 GB. Removed theUNLIMITEDcell helper. Growth blurb de-"unlimited"-ed.Infinity→finite; growth mongodb/webhooksInfinity→finite; growth deploys 5→50 (display-accuracy).llmsContract.test.ts).Verify
npm run gateGREEN —tsc --noEmit0,npm run build+ prerender OK (121 static files),vitest run1120 passed / 3 skipped.Known follow-up (NOT in this PR)
MarketingPage Team CTA still points at the self-serve
/app/checkout?plan=teampath which the server gate 400s — flagged in a code comment for a follow-up gate-reconciliation PR (the strict-margin task is copy-only and must not touch the gate).Companion PRs: api #262, common #46, content.