ADR 0152 — Funnel pricing and trial decisions: annual Pro $390, 7-day Pro-only trial, Founders unchanged
Status: Accepted
Date: 2026-10-31 UTC
Deciders: Kristerpher Henderson (operator decisions for the first-run funnel, 2026-10-29 UTC); recorded under card #4820
Scope: The prices, billing intervals, trial and intro offers for Free, Pro and Pro+ on web and iOS, and the paywall defaults. Decision record only: no code, and no Stripe or App Store Connect configuration (that is #4836).
Supersedes: The Pro price and annual figures in docs/marketing/pricing-v2.md (Pro $29 per month) and docs/marketing/pricing.md (Pro $29 per month, $290 per year), and the 2026-05-19 "paid on signup, no trial" posture as it applied to Pro. That posture still holds for Pro+ and for Founders.
Refs: Epic #4818; cards #4821, #4830, #4831, #4832, #4834, #4836; ADR-0007 (iOS billing via in-app purchase); ADR-0071 and ADR-0075 (Queue is the billing authority); ADR-0016 and Founders Promo epic #204 (see section 2.6).
1. Context
The first-run funnel (epic #4818) adds a paywall after signup. Eighteen cards build web, iOS, copy and analytics surfaces that all quote prices and trial terms. Until this record, the numbers lived in three places that disagree:
docs/marketing/pricing-v2.mdstill says Pro at $29 per month and treats Founders as a time-based paper-trading engagement loop.docs/marketing/pricing.md(v1) still says Pro $29 per month and $290 per year.- The operator lock of 2026-05-19 said "paid on signup, no trial" for every plan.
The operator decided on 2026-10-29 UTC to offer annual Pro at launch and a 7-day trial on Pro only. This ADR is the single authoritative record of those numbers. Cards read prices and offers from here; vendor ids are written back here (section 3).
2. Decision
2.1 Tiers and monthly prices
| Tier | Monthly price | Notes |
|---|---|---|
| Free | $0 | Always free. |
| Pro | $39 per month | |
| Pro+ | $79 per month |
Founders is the Pro+ introductory offer: $29 per month for the first 6 months, then $79 per month. It is explicitly not a tier. Its entitlement tier is pro_plus; founders is a billing and cohort label only. This is unchanged by this record.
2.2 Annual Pro
Annual Pro is offered at launch at $390 per year ($39 x 10, about 2 months free). It needs a Stripe annual price and an App Store Connect annual subscription product in the existing subscription group; setup is tracked in #4836.
No annual price for Pro+ is decided here. The app.raxx.ios.proplus.annual mapping in backend_v2/api/services/entitlement.py is forward-compatibility only; no such product or price is to be created or sold under this record.
2.3 Which offer applies to which product
| Product | Billing interval | Price | Free trial | Intro offer |
|---|---|---|---|---|
| Free | n/a | $0 | n/a | none |
| Pro | monthly | $39 per month | 7 days | none |
| Pro | annual | $390 per year | 7 days | none |
| Pro+ | monthly | $79 per month | none | Founders: $29 per month for 6 months, then $79 |
| Pro+ | annual | not decided | none | none |
The trial applies to both Pro prices. Pro+ has no trial; its one intro-offer slot is Founders. The Founders offer never attaches to Pro, and the trial never attaches to Pro+. On web, the Founders discount coupon must never be applied to a Pro price: it is a fixed $50 off and would take Pro $39 to zero. A test in #4831 asserts this.
2.4 Trial mechanics
| Web (Stripe, Queue is billing authority) | iOS (StoreKit 2) | |
|---|---|---|
| Trial | 7-day trial on the Pro monthly and Pro annual prices. Card required at checkout. | Apple introductory offer (free, 7 days) on app.raxx.ios.pro.monthly and app.raxx.ios.pro.annual. |
| Eligibility | Decided server-side by Queue. | isEligibleForIntroOffer, never inferred from local state. The offer is shown only when eligible. |
| What the customer sees | Price, charge date and a cancel link. | The Apple-provided, localized price and period strings; never hard-coded. |
| Cancel | One confirm click on /account/billing. |
Apple subscription settings. |
| Reminder | One day-5 email, sent only if the trial was not cancelled, from the customer-facing sender. | No Raxx-sent reminder for Apple-managed trials (per #4831). Apple's reminder behavior for free trials is not documented as a guarantee, so none is assumed; #4832 and #4836 verify it in the sandbox, and a missing Apple reminder is an open question for PM. |
| State | Queue billing_subscription: status trialing and trial_end. |
Entitlement mapped from the product id (app.raxx.ios.pro.* maps to pro). |
Cancelled before the trial ends (web). Default, recorded as the decision: Pro access continues to the trial end date and the customer is not charged. Cancelling stops the conversion to a paid subscription; it does not end access early. At the trial end date the entitlement drops to Free. #4831 follows this record for the access end date.
Day-5 reminder timing. The reminder is promised on day 5 of 7. Stripe's built-in trial-ending event is documented to fire 3 days before the trial ends (day 4), so the day-5 send needs its own scheduled send keyed on the trial end date, or the copy changes. #4831 confirms which.
2.5 Paywall defaults
- The paywall sells Pro by default (preselected), monthly or annual. Pro+ and Founders are a secondary choice; Founders is shown as a note on Pro+, not as a tier. No trial is shown for Pro+.
- "Continue with Free" has equal visual weight to the primary action (same size and prominence class), so the paywall never dead-ends. Choosing it, or dismissing the paywall, lands the user in the app as Free.
- Prices are read from one price config, not duplicated in components. This record is the source for that config; #4836 verifies it against the two billing systems.
- No countdown or urgency copy.
- With
onboarding_paywall_v1OFF the paywall is not shown and the user continues as Free. No customer sees the trial or the annual price before that flag is ON, and its ON prerequisites are listed in epic #4818. This record adds no flag.
2.6 This trial is not the Founders Promo engagement loop
Two different things have been called a "trial" in this repo. They must not be conflated in code, copy or cards.
| Pro 7-day trial (this ADR) | Founders Promo window (ADR-0016, epic #204) | |
|---|---|---|
| What it is | A subscription trial on a paid Pro plan. A card is on file, and it converts to a paid subscription at day 7 unless cancelled. | A time-based engagement window designed in April 2026 for the Founders cohort (founder_trial table, FounderTrialService, daily sweep with 30, 14, 7 and 1 day warnings, grace, lapse), originally free Pro-tier paper trading with no card. |
| Current status | Decided 2026-10-29; built by #4831 and #4832. | The free-window model was retired by the 2026-05-19 pricing lock. Founders is now a paid Pro+ intro offer; the 6-month period is a price window, not a free window. The design remains in docs/architecture/founders-trial-engine.md; no founder_trial code exists on develop. |
| State store | Queue billing tables. | Raptor founder_* tables (design). |
| Who gets it | Any eligible public signup choosing Pro. | The Founders cohort only. |
| Customer wording | "7-day free trial". | Not "trial". Existing Founders copy already calls the 6-month period a "pricing window" (frontend/getraxx-landing/src/pages/PricingPage.jsx, FAQ). Wording is not fixed here (section 2.7). |
Nothing built for the Pro trial reuses the Founders warning ladder, scheduler or tables, and nothing in the Founders design implies a card-on-file trial.
2.7 Customer copy
This record fixes numbers and mechanics, not wording. Copy is owned by marketing-strategist and cleared through #4835 where attorney-gated. Customer copy names no broker, payment processor or data vendor. On iOS, the platform-required subscription-management wording is the only place Apple is named.
3. Product and price ids (ids only, no secrets)
Ids already present in the repo are recorded now. Rows marked "pending #4836" are written back by #4836 when the objects exist; that card does not close until they are recorded here.
| System | Item | Id or config name | Status |
|---|---|---|---|
| App Store Connect | App record | 6778650155 |
exists |
| App Store Connect | Subscription group "Raxx Pro Subscriptions" | 22164259 |
exists |
| App Store Connect | app.raxx.ios.pro.monthly ($39 per month) |
record 6781305735 |
exists; 7-day intro offer pending #4836 |
| App Store Connect | app.raxx.ios.pro.annual ($390 per year) |
record 6781305904 |
draft, missing metadata; closest available price point to $390 per year and 7-day intro offer pending #4836 |
| App Store Connect | app.raxx.ios.proplus.monthly ($79 per month; Founders intro) |
record 6781305906 |
exists; no trial; Founders intro unchanged |
| Stripe | Pro monthly price ($39) | pending #4836 | id recorded by #4836 |
| Stripe | Pro annual price ($390 per year) | pending #4836 | test and live ids recorded by #4836 |
| Stripe | Pro+ monthly price ($79) | price_1Tnfq0I3o3OLvhqqrRTiSeNn, config STRIPE_PRO_PLUS_PRICE_ID |
exists; unchanged |
| Stripe | Founders intro coupon (6-month repeating, on the Pro+ price only) | config STRIPE_FOUNDERS_COUPON_ID |
exists; unchanged |
4. Consequences
- The paywall (#4830, #4832), checkout (#4831) and setup (#4836) cards build from section 2. A change to any figure is made here first.
- Apple's documented rule is one introductory offer per subscription group per customer. Pro and Pro+ share the "Raxx Pro Subscriptions" group, so on iOS a customer who takes the Pro trial may not be eligible for the Founders intro on Pro+, and the reverse. Neither the paywall nor copy may promise both. #4836 verifies this in the sandbox, and #4832 relies on
isEligibleForIntroOffer, which reflects it. Web is unaffected: Founders is a coupon on the Pro+ price and the trial is on Pro only. - On web, the trial and the one-click cancel both land on
/account/billing, which is gated byFLAG_ANTLERS_BILLING_SELF_SERVICE. A trial a customer cannot cancel is not acceptable, so the trial is not offered while that flag is OFF. - The Pro refund window is not changed by this record.
- Lapse and downgrade data-access policy: appended here by #4821 once its audit confirms it (any GET of the customer's own journal, trades and history stays readable after lapse or downgrade).
- Stale statements elsewhere in
docs/that this record supersedes carry a banner or an inline note pointing here.
5. Alternatives considered
Form: a new pricing doc under docs/marketing/. Rejected. The marketing pricing docs are research artifacts with their own anchors and unverified competitor data, and two of them are exactly what went stale. A third doc invites the same drift. An ADR is indexed in docs/architecture/adr/INDEX.md, is cited by number from cards, and sits beside ADR-0007, ADR-0071 and ADR-0075, which govern the billing paths these decisions constrain.
Not decided here (future cards): annual Pro+ pricing, a trial on any other plan, and a paywall-ordering experiment (before or after first value) after launch data.