Note that developers (you) cannot change a customer's subscription directly. The app stores do not allow developers to upgrade or downgrade a subscription on behalf of a customer. Only a customer can change their subscription.
There are no code changes required to support upgrades, downgrades, and crossgrades for iOS subscriptions in your app. A customer can upgrade, downgrade, or crossgrade between subscriptions as often as they like.
According to Apple, when a customer changes their subscription level, access to the new product can vary depending on the new product:
Upgrade. A user purchases a subscription that offers a higher level of service than their current subscription. They are immediately upgraded and receive a refund of the prorated amount of their original subscription. If you’d like users to immediately access more content or features, rank the subscription higher to make it an upgrade.
Downgrade. A user selects a subscription that offers a lower level of service than their current subscription. The subscription continues until the next renewal date, then is renewed at the lower level and price.
Crossgrade. A user switches to a new subscription of the equivalent level. If the subscriptions are the same duration, the new subscription begins immediately. If the durations are different, the new subscription goes into effect at the next renewal date.
You can refer to this blog post for more information on how to set up subscription groups in App Store Connect.
In order to perform upgrades and downgrades for Android subscriptions, you need to pass the UpgradeInfo object to either purchaseProduct or purchasePackage. The
UpgradeInfo is a small object containing the
oldSKU (the SKU the user is changing from) and the
prorationMode. Proration modes are documented in the Google Play Billing Library documentation.
Note that RevenueCat currently only supports
IMMEDIATE_WITH_TIME_PRORATION. This mode changes the subscription immediately and the remaining time will be prorated. RevenueCat will assume the default proration mode,
IMMEDIATE_WITH_TIME_PRORATION, for all pricing calculations. If you choose a different proration mode, the subscription status will be reflected correctly, but the RevenueCat price calculation will not be accurate.
When a customer changes subscriptions, you will see a
PRODUCT_CHANGE event in the RevenueCat dashboard. You can ignore this event if you're tracking expiration dates for a subscription. A
RENEWAL (iOS) or
INITIAL_PURCHASE (Android) event will indicate when the new product is in effect.