·v1.3.1Latest
One price, everywhere — the founding-rate copy is gone
- Killed every "founding rate / $29 before it lifts to $49 / locked forever" contradiction across the product. The story is now one flat plan, stated identically everywhere: first reading free, first month free, then $29/mo — everything unlocked, cancel anytime.
- Public surfaces aligned: pricing, About, FAQ, /try, /signup, and the /launch letter all carry the same flat-rate line, and the SEO/OG metadata for each was rewritten to match.
- In-app surfaces aligned: the upgrade modal, usage indicator, plan-reminder banner, and the /try paywall counter now say "Subscribe" against one price instead of "Lock the rate."
- Lifecycle emails aligned: the Day-21 blind-read nurture and the prediction-confirmed CTA drop the disappearing-discount framing for the flat $29 offer.
- Terms 7.4 rewritten to describe the single $29/mo plan; the launch page keeps the first-50 初 hanko as a cosmetic collectible, with no pricing strings attached.
- Stripe cleanup: the retired $49 price was deleted in Stripe, so we removed every reference to its now-dead price ID. Both product keys in lib/products.ts resolve to the one live $29 price, and /admin/stripe-check no longer probes the deleted price (no more permanent red row).
- Fixed a Mission Control MRR bug: it previously valued any non-founding paid subscriber at $49, overstating revenue. MRR is now paid count × $29 to match the flat plan.
- Stripe SDK brought current: pinned every client to the 2026-02-25 API version and moved subscription-period reads onto the line item (where Stripe relocated current_period_start/end), so checkout and subscription webhooks stamp the right billing dates again.
- Fixed a silent webhook bug: the webhook_events idempotency table was missing the columns the handler wrote, so the dedupe insert failed and could skip processing. The table now matches the code, making duplicate-delivery protection actually work.
- Upgraded @supabase/ssr and supabase-js to a compatible pair, restoring database type-safety across the app (the server client had been returning untyped queries) and clearing ~2,800 latent type errors.