← Monetization hub
Offer-stage rescue ladder
Verified handoff · updated 21 July 2026
Code state: original ladder work is integrated in iOS develop through PR #317. The dismissal/presentation correction is pushed on fix/offer-ladder-dismiss-pop at c6305160 and still needs review/merge.
Expected customer flow
- Original/default paywall appears.
- User taps the explicit Close button without purchasing.
- The same presentation replaces its content with the exact RevenueCat
save50 offering. - Close again → exact
save65 offering. - Close again → the paywall dismisses.
- A purchase at any stage resets the ladder to standard.
Why the discount screen was not appearing
- Contextual RevenueCat sheets could be swiped away at the parent SwiftUI sheet level, bypassing RevenueCat’s dismissal callback and therefore bypassing ladder advancement.
- The loader fell back to the normal/current offering when
save50 or save65 was absent. The coordinator could advance internally while the customer saw the same standard paywall. - The actual RevenueCat
save50/save65 offerings and App Store discount products are external configuration and were not yet created.
What commit c6305160 changes
- Disables swipe-to-dismiss for ladder-enabled RevenueCat paywalls.
- Shows an explicit close control so dismissal always reaches the ladder callback.
- Requires the exact discount offering for discount stages.
- Never displays standard prices under 50%/65% discount messaging.
- Safely skips a missing stage and closes if no configured discount stage is loadable.
Important: merging the code fix alone will not make discounted prices appear. The exact RevenueCat offerings and App Store products must exist and return eligible packages.
External setup remaining
- Approve the 50% and 65% price points, eligible plans, eligibility rules, and discount duration.
- Create the required subscription products/offers in App Store Connect.
- Import and attach them in RevenueCat.
- Create offerings named exactly
save50 and save65. - Attach at least one valid package/product to each offering.
- Create and attach the RevenueCat paywall design for each offering, with correct renewal disclosure and localized prices.
- Verify the production RevenueCat SDK key, entitlement mapping, App Store credentials, and webhook.
Release acceptance
- Merge
fix/offer-ladder-dismiss-pop into develop. - Build with Xcode 26.5 and upload a new TestFlight build.
- Fresh user: standard → Close → save50 → Close → save65 → Close → dismissed.
- Confirm no swipe can bypass the sequence.
- Confirm displayed prices really match each discount.
- Purchase independently at all three stages and verify entitlement activation.
- Confirm purchase resets the persisted ladder.
- Test relaunch/resume, restore, ineligible user, network failure, and a deliberately missing offering.
Validation note
The correction passes source/diff checks and is pushed. A clean Xcode 26.5 targeted build was attempted on 21 July 2026, but the machine exhausted local disk space while compiling dependencies; this is an environment failure, not a reported Swift compiler failure in the changed files. The targeted test and live RevenueCat sandbox sequence remain release gates.