Revert pricing page to pre-Feb-2026 design, restore $4/$24, feature the 30-Day Pass - #813
Merged
Merged
Conversation
…ture 30-Day Pass New subs collapsed from ~55/mo to ~4/mo starting the week of 2026-02-10, when the pricing page redesign (#794) and price change (#796: monthly $4→$6, annual $24→$48) shipped. Pricing→purchase fell 3% → 1% while Stripe Checkout itself kept converting, so this restores the page that converted and the prices that sold, and gives the $9 30-Day Pass (the only SKU currently growing) first-class placement instead of a footnote. - Pricing2: restore the pre-#793 page (video hero, feature slideshow, logo row, purple theme). Keep Helmet meta, #pass hash handling, and the Tone Row cross-links footer. Add a hero "30-Day Pass for $9" link and a #pass callout that preselect the pass and scroll to checkout. - Checkout: pass is a third selectable plan card (Yearly $2/mo, Monthly $4, Pass $9 once); the CTA switches copy per selection. Selection lives in a small zustand store so deep links (/pricing#pass from paywalls) and the hero link can preselect it. Single `effectivePlan` derivation falls back to yearly for active pass holders. posthog `checkout_started` event for measuring click-through. - API: create-checkout-session refuses a second pass for an active pass holder (no webhooks, so this is the only server-side guard). - FAQ: pre-#794 questions back (lazy t kept), pass answers added, $4/$24. - FeatureBreakdown/Testimonials/index.css: purple accents and pricing CSS restored from 9c0ca47^ (green.300 hard-coded to the old hex). - All hard-coded $6/month copy → $4/month. - e2e pass.spec + Checkout unit tests updated; locales re-extracted. Requires flipping STRIPE_PRICE_ID / STRIPE_PRICE_ID_YEARLY to the still- active $4/$24 prices and adding the $6/$48 IDs to OTHER_VALID_STRIPE_PRICE_IDS (done for dev/preview; prod is a manual step before merging to main). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
This was referenced Aug 17, 2026
Merged
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.
Why
New subscriptions collapsed starting the week of 2026-02-10 (prod Stripe, subs created per month):
That week shipped #793 (site aesthetic pass), #794 (pricing page redesign) and #796 (monthly $4→$6, annual $24→$48). PostHog:
/pricing → /successran ~3% through 2025 and ~1% since March. Stripe Checkout itself is not the leak (last 60d: 24 sessions started, 13 paid) — people stop on the pricing page. Annual was ~40% of new subs (~20/mo; 241 of 410 actives are on $24/yr) and is now 2–3/mo. Meanwhile the $9 30-Day Pass (#809) sold 4 in its first 3 weeks and is outselling the subscription in August — while sitting at the bottom of the checkout as a dashed footnote.What
Decisions: prices back to $4/mo + $24/yr; faithful revert of the pre-#793 page (purple — accepted inconsistency with the blue header, since #793/#794 shipped the same day and can't be separated); pass as an equal third plan card.
Pricing2.tsx— restored from9c0ca47^(video hero, feature slideshow, logos, FeatureBreakdown, Testimonials, FAQ, purple checkout band). Kept:Helmetmeta,#passhash handling, Tone Row cross-links (feat: cross-link other Tone Row apps (TeamSort, Docugram) #807, moved to a footer below the purple band). New: hero "or get a 30-Day Pass for $9" link + a#passcallout card, both preselect the pass and scroll to#checkout.Checkout.tsx— three cards: Yearly$2/mo(Save 50%), Monthly$4, 30-Day Pass$9 once(One-time badge). CTA label switches (Get Pro Access Now/Get a 30-Day Pass — $9). Selection inlib/usePricingPlanStore.ts(zustand, module-level so deep links / hero link can preselect). SingleeffectivePlanderivation: an active pass holder never sees the pass card and a stale"pass"selection falls back to yearly for label + request.posthog.capture("checkout_started", { plan }).api/create-checkout-session.ts— refuses a second pass for an active pass holder (getActivePasson the resolved customer). No webhooks exist, so this is the only server-side double-charge guard.FAQ.tsx— pre-Redesign pricing page #794 questions back (lazyt()kept), free-trial answer now points at the pass, pass question kept, $4/$24.FeatureBreakdown.tsx/Testimonials.tsx/index.css— purple accents + pricing CSS from9c0ca47^;.feature:nth-child(2)hard-coded to the oldgreen.300since the green scale changed. Note: icon/avatar chips in those two components usebg-blue-*/bg-green-*and render with the current scales (tailwind config not reverted) — intentional.$6/monthcopy →$4/month(SandboxWarning, paywallCopy, LoadFileButton, EditWithAI, ImportDataUnauthenticatedDialog, Pricing.tsx).pass.spec.ts(pass-plan-button+checkout-button),Checkout.test.tsx(+2 tests, store reset), locales re-extracted/translated/compiled.dev → mainConsumers:
api/create-checkout-session.tsandapi/_lib/_validStripePrices.ts→api/customer-info.ts(a sub is Pro only if its price ID is in[STRIPE_PRICE_ID, STRIPE_PRICE_ID_YEARLY, ...OTHER_VALID_STRIPE_PRICE_IDS]). If the $6/$48 IDs are not appended toOTHER_VALID_STRIPE_PRICE_IDS, the ~31 subscribers on those prices lose Pro._validStripePrices.tsdoessplit(",")withouttrim().Dev + preview are already done: new test-mode prices
price_1U5R2IK9wlDh9GkwqMzaApvM($4/mo) andprice_1U5R2IK9wlDh9GkwzvlaqFyq($24/yr); test $6/$48 IDs appended to dev/previewOTHER_VALID_STRIPE_PRICE_IDS(the e2e pro account is on the $48 test price and stays Pro).Testing
pnpm -F app check,pnpm -F api check✅ ·pnpm -F app test25 suites / 564 passed ✅ ·pnpm -F api test✅vercel dev):not-logged-in.spec✅,pass.specall 3 CTA tests ✅ (free user → pass card → Stripe shows $9.00 / 30-Day Pass),logged-in.spec✅. Some reruns hit the pre-existing webpack error overlay on/l(Monaco CDN workerimportScriptsfailure in headless Chromium) — unrelated to this change./pricing#pass(the paywall/sandbox deep link) preselects the pass and scrolls to the callout; hero link preselects the pass; light/dark, desktop + 390px.After release
Watch
checkout_startedper day and/pricing → /successweekly. Baseline ~1%; the old page ran ~3%.🤖 Generated with Claude Code