Skip to content

v1.66.0 - #810

Merged
rob-gordon merged 2 commits into
mainfrom
dev
Jul 22, 2026
Merged

v1.66.0#810
rob-gordon merged 2 commits into
mainfrom
dev

Conversation

@rob-gordon

Copy link
Copy Markdown
Member

v1.66.0

New: 30-Day Pro Pass — a $9 one-time purchase granting 30 days of full Pro access, never auto-renews (#809).

  • Pricing page ticket, checkout callout, FAQ, and paywall/sandbox secondary CTAs
  • Entitlement derived live from Stripe PaymentIntent metadata (no webhooks, no DB); refunds and disputes invalidate
  • Pass holders get Pro AI limits via their PaymentIntent id; fixed lapsed-subscriber AI credential precedence en route
  • Account page pass section; pass-specific success page + new_pass_holder Loops event
  • New api + app unit suites and pass.spec.ts e2e coverage

Pre-merge checklist (done):

  • ✅ Live Stripe price created: price_1TvqmIK9wlDh9Gkw13amhRm3 (product prod_UviCrc5jWnUpt2)
  • STRIPE_PRICE_ID_PASS set in Vercel production (+ preview/development)
  • ✅ Soak-tested end-to-end on dev.flowchart.fun with a test-card purchase: checkout → success → entitlement → account display → pass-holder checkout state; test customer cleaned up after

🤖 Generated with Claude Code

rob-gordon and others added 2 commits July 22, 2026 03:06
Adds a never-renewing, one-time-payment pass granting 30 days of full
Pro access, aimed at episodic users who won't subscribe. Priced above
monthly ($6) so it can't undercut subscriptions.

Backend (no webhooks, no DB — matches the live-Stripe-lookup pattern):
- create-checkout-session accepts plan "pass": mode "payment",
  PaymentIntent metadata ff_pass, invoice_creation on, attaches to the
  existing Stripe customer by email so a new pass-customer can't shadow
  subscription history
- customer-info also lists PaymentIntents and returns an active pass
  (latest valid expiry; refunds and disputes invalidate) via _lib/_pass
- AI endpoints accept a pass PaymentIntent id as the bearer token;
  bogus tokens now fall through to the free tier instead of throwing

Frontend:
- useHasProAccess/useIsProUser honor an active pass; useProAiToken sends
  the sub id only when active/trialing (a lapsed subscriber with a pass
  previously would have sent the dead sub id)
- Pricing page ticket below the plan comparison, checkout callout below
  the trust box, FAQ answer, paywall + sandbox-warning secondary links
- Pass-specific /success variant + new_pass_holder Loops event
- Account shows a pass section; subscription-only sections gated on
  subscription presence
- FAQ strings converted to lazy t`` arrows (locale-timing fix)

Tests: api jest suite for the pass predicate; app hook/component tests
with new customer fixtures; e2e pass.spec.ts (CI-safe redirect checks +
full-purchase block gated on a dedicated TESTING_EMAIL_PASS account).

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
flowchart-fun Ready Ready Preview, Comment Jul 22, 2026 3:27am

Request Review

@rob-gordon
rob-gordon merged commit de95b0c into main Jul 22, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant