fix(app): tell trial-paywall code holders where their code goes

Merged
KO
13m ago
+235-0

What changed and why

People who bought Omi with an included Omi Pro year can't find where to enter their code. Shopify buyers are trial-eligible, so Settings → Plan & Usage → Upgrade opens the trial paywall. That page has no code field, only "Try for $0". Their code actually goes in the "Add promotion code" box on the Stripe Checkout page that opens next. Since Nov 2 every included-year code applies there on the trial checkout.

Intercom, last 30 days: 58 customers had trouble with a subscription code or a prepaid year, and 32 of them wrote after Nov 2. Examples: "I do not find promo code under the plans section, it just looks like I can set up a 7-Day free trial" and "Still nowhere to put the code in: Plan & Usage, Upgrade, Yearly...".

The change adds one muted line under the existing cancel note: "Have an Omi Pro code? Add it on the next screen." It is in all 49 locales via scripts/l10n.py. Nothing else on the paywall changed.

Product invariants affected

none

How it was verified

  • flutter test on test/widgets/trial_paywall_page_test.dart, trial_paywall_navigation_test.dart, trial_paywall_monthly_offer_test.dart, billing_currency_surfaces_test.dart and paywall_router_test.dart: 64 passed, including the new case and the 320pt no-overflow cases.
  • python3 scripts/l10n.py check: ok, 49 locales.
  • Stripe sandbox: a trial Checkout session created by the backend shows the "Add promotion code" button with "Total due today $0.00". That is the screen this line points to.
  • Render below: the real TrialPaywallPage with SF Pro fonts at 430Ɨ932 @3x, iOS platform. It is a widget render, not a running device build.

Tests

app/test/widgets/trial_paywall_page_test.dart: "code holders are told where their code goes, beside the trial terms" (at 320pt, no overflow).

UI evidence

Trial paywall bottom

Failure class (fixes)

Failure-Class: none

šŸ¤– Generated with Claude Code