v26.4.240May 12, 2026
Pricing pages now use a single source of truth for plan names, prices, and CTAs. "Request Access" and "Waitlist" copy is removed; all plans link directly to signup with the plan pre-selected.
New
- Pricing source of truth (
constants/plans.ts): newCANONICAL_PLANSexport — the single source of truth for plan display names, monthly/yearly prices, CTA labels, and signup URLs. Prices derive fromPLAN_PRICES; feature lists derive from the entitlement registry. Marketing pages and onboarding import from here instead of duplicating values. - Fixture invariant tests (
tests/unit/seed/seed-fixture-invariants.test.ts): enforces that demo persona seed data contains no known placeholder titles, correctly credits collaborators (no Tim White identity collision in Calvin demo), and has consistent Spotify ID + artwork pairing. (JOV-2077, JOV-2078) - Screenshot player timestamp invariants (
tests/unit/product-screenshots/screenshot-player-timestamps.test.ts): enforces uniqueplayerTimestampvalues across all marketing screenshot scenarios that show a visible audio player, and validates the timestamp format (M:SS/MM:SS). (JOV-2087) - Pricing contract tests (
tests/unit/pricing/pricing-source-of-truth.test.ts): 16 tests enforcing plan IDs, prices, CTA copy (no banned phrases), and signup href?plan=params all flow from canonical sources. playerTimestampfield onScreenshotScenariotype; Tim White profile mobile variants (listen, pay, live, subscribe) now declare unique timestamps.
Improved
- Pricing pages (
/pricing,/launch/pricing): removed "Request Access", "Waitlist", and "Paid plans open from the waitlist" copy. CTAs updated to "Claim your profile" (free) and "Start Free Trial" (Pro/Max). Availability changed toInStockin JSON-LD structured data. MarketingPricingPlanscomponent: removedisMarketingPlanActive/getMarketingPlanCtaLabel/getMarketingPlanHrefhelpers; CTA labels and hrefs now come directly from the data layer.data/marketingPricingPlans.ts: replacedteam/enterpriseplans withmax; replacedactiveCtaLabel/waitlistCtaLabelwith singlectaLabel/ctaHref; prices now referencePLAN_PRICES.