How to safely handle resubscribe event on apple

  • 6 November 2023
  • 3 replies

Badge +5

After an apple subscription has expired, the iOS user can go to subscriptions and resubscribe there in the OS without going into the application directly. This usually takes a few seconds to complete, since immediately after resubscribe when going into the application the customerInfo() still does not show any active entitlement until after about ~30s.
During those 30s the application will show a subscribe screen. What happens if the user tries to make another purchase in the app during those 30s (either same product or a different one)? Will they get double charged and how would the developer know?

I am not sure if this is the same situation on Android yet.

3 replies

Userlevel 3
Badge +6

Hey @vic-a563d7 !


On iOS, if the products are in the same subscription group and the user tries to make a purchase during this time, the user wouldn't be able to subscribe twice. There would be a message displaying that you already own the product. Theoretically if you have multiple subscription groups, the user could subscribe to a different product in a different subscription group and have multiple subscriptions. The only work around for this would be to make sure that you dont have similar products in different subscription groups. 


Hope that helps! 

Badge +5

Got it.

I do not have similar products but they are same product for different prices. Like in the RC documentation it suggests to do it this way to charge more for users based on attribution (where they came from). So if I want to do the same, it seems like both prices (cheaper and more expensive) are available under iOS Subscriptions. Is this a loophole where the user can just purchase what the application displays (expensive) and then go into OS and change to the cheaper version in the same “class” ?

Badge +5

I have also test out this scenario and seems like there is not error like you mentioned “you already own the product”.  It just goes into the PRODUCT_CHANGE flow.


  • subscribe to “6 month” product
  • let it expire
  • close the app
  • reopen the app to see offerings
  • go into iOS Edit Subscriptions sandbox and pick the “1 month” product
  • go back into the app
  • on the offerings screen purchase “12 month” product
    • note that even if calling cusomerInfo() here it is still stale/cached
  • result is PRODUCT_CHANGE webhook
  • go back to iOS Edit Subscriptions sandbox and now you see “12 month” selected

Does this seem confusing?