fix(app): tell trial-paywall code holders where their code goes
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 teston 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
TrialPaywallPagewith 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

Failure class (fixes)
Failure-Class: none
š¤ Generated with Claude Code