The code is written and on #602. This stays open because nothing here has met a real store: the acceptance below cannot be run until the account work is done.
ADR-0024 rules how this lands — the build ships able to sell all three arms, and which arms are live is a RevenueCat setting from then on. RevenueCat assigns the arm, holds the entitlement and reports the revenue; the app keeps its own paywall screens.
Owner's part — what is blocking
Account tasks nobody else can do. The step list is in docs/10-payments.md under Going live checklist.
RevenueCatPaymentsService behind the existing seam; entitlement that can expire, so a lapsed subscription locks the course with no restart; Settings → Purchases as a real screen, with the arm's offer, Restore, and a link out to Apple for a renewing plan. Which plan an owner holds is asked of the store, so it survives a restart or a change made outside the app. InAppPurchaseService is deleted.
The paywall's prices needed no work: paywallViewProvider already fetches products and paywall_view.dart already substitutes {price} and {perMonth}. They render blank today only because the no-op store returns no products.
Acceptance
The code is written and on #602. This stays open because nothing here has met a real store: the acceptance below cannot be run until the account work is done.
ADR-0024 rules how this lands — the build ships able to sell all three arms, and which arms are live is a RevenueCat setting from then on. RevenueCat assigns the arm, holds the entitlement and reports the revenue; the app keeps its own paywall screens.
Owner's part — what is blocking
Account tasks nobody else can do. The step list is in
docs/10-payments.mdunder Going live checklist.one_time,subscription,hybridDone in #602
RevenueCatPaymentsServicebehind the existing seam; entitlement that can expire, so a lapsed subscription locks the course with no restart; Settings → Purchases as a real screen, with the arm's offer, Restore, and a link out to Apple for a renewing plan. Which plan an owner holds is asked of the store, so it survives a restart or a change made outside the app.InAppPurchaseServiceis deleted.The paywall's prices needed no work:
paywallViewProvideralready fetches products andpaywall_view.dartalready substitutes{price}and{perMonth}. They render blank today only because the no-op store returns no products.Acceptance