Skip to main content
Solved

Allowing Upgrade Or Downgrade from Paywall (iOS)

  • June 26, 2025
  • 1 reply
  • 17 views

Forum|alt.badge.img+7
  • Helper
  • 5 replies

I read Upgrades, Downgrades, & Management where it says:

There are no code changes required to support upgrades, downgrades, and crossgrades for iOS subscriptions in your app. A customer can choose to upgrade, downgrade, or crossgrade between subscriptions as often as they like.

 

I know this is possible externally from the the iPhone Settings “Manage Subscriptions” page.

I want to know if it’s possible internally from the app.

For example, the app presents an annual subscription paywall to a monthly subscriber. If the user tries to subscribe to the annual plan, will it seamlessly switch subscriptions?

In the past, attempting to purchase the same subscription within the same group returns an error. I’m cautiously shipping both approaches: internal paywall and redirect to external settings.

Best answer by guilherme

Hey ​@gas ,

Yes, users can upgrade, downgrade, or cross-grade from inside the app as long as the products are set up correctly. When your monthly subscriber taps the annual SKU via Purchases.shared.purchase(package), StoreKit treats it as an upgrade:

  • Apple shows the built-in “Confirm Upgrade” sheet, prorates the unused monthly time, and starts the annual plan immediately.

  • RevenueCat receives the new transaction, emits a Product Change event, and customerInfo.entitlements.active is updated with the annual entitlement, so no extra code will be required.

The “already purchased” error only appears when someone tries to buy the exact same product ID that is already owned. Switching to any different product in the same subscription group is supported.

A few things to double-check and assure a smooth experience:

  1. both SKUs are in the same subscription group in App Store Connect.

  2. subscription levels are ordered so the annual tier is above the monthly tier.

  3. your UI listens for CustomerInfo updates to reflect the new plan - via getCustomerInfo()

  4. Sandbox tests: monthly -> annual should switch instantly; annual -> monthly won’t switch until the next sandbox renewal. More on Sandbox renewal times here and here.

With those pieces in place the in-app flow will work as expected!

Best,

View original
Did this post help you find an answer to your question?
This post has been closed for comments

1 reply

guilherme
RevenueCat Staff
Forum|alt.badge.img+6
  • RevenueCat Staff
  • 82 replies
  • Answer
  • July 1, 2025

Hey ​@gas ,

Yes, users can upgrade, downgrade, or cross-grade from inside the app as long as the products are set up correctly. When your monthly subscriber taps the annual SKU via Purchases.shared.purchase(package), StoreKit treats it as an upgrade:

  • Apple shows the built-in “Confirm Upgrade” sheet, prorates the unused monthly time, and starts the annual plan immediately.

  • RevenueCat receives the new transaction, emits a Product Change event, and customerInfo.entitlements.active is updated with the annual entitlement, so no extra code will be required.

The “already purchased” error only appears when someone tries to buy the exact same product ID that is already owned. Switching to any different product in the same subscription group is supported.

A few things to double-check and assure a smooth experience:

  1. both SKUs are in the same subscription group in App Store Connect.

  2. subscription levels are ordered so the annual tier is above the monthly tier.

  3. your UI listens for CustomerInfo updates to reflect the new plan - via getCustomerInfo()

  4. Sandbox tests: monthly -> annual should switch instantly; annual -> monthly won’t switch until the next sandbox renewal. More on Sandbox renewal times here and here.

With those pieces in place the in-app flow will work as expected!

Best,


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings