Skip to main content
Question

Apple offer code redeemed on account B grants entitlement to previous expired account A

  • June 17, 2026
  • 1 reply
  • 32 views

Forum|alt.badge.img

Hi RevenueCat team,

we are seeing an iOS offer-code redemption issue with account switching and would like to confirm the expected behavior.

Our RevenueCat restore behavior is configured as:

Transfer if there are no active subscriptions

Scenario:

  1. User logs into account A.

  2. User purchases an Apple subscription.

  3. The subscription expires.

  4. User logs out of account A.

  5. User logs into account B on the same device / Apple account.

  6. User redeems an Apple offer code.

Observed behavior:

The offer code is redeemed while account B is logged in, but the entitlement is assigned to account A instead of account B.

Expected behavior:

Since account A no longer has an active subscription, we would expect the redeemed offer-code subscription to transfer / attach to the currently logged-in RevenueCat App User ID, account B.

We saw that RevenueCat recommends avoiding Apple’s in-app offer-code redemption sheet and instead opening the App Store redemption URL, then calling syncPurchases when the user returns to the app:

https://apps.apple.com/redeem?ctx=offercodes&id={apple_app_id}&code={code}

Questions:

  1. Is the observed behavior expected when redeeming an Apple offer code through Apple’s in-app redemption sheet?

  2. Would using the App Store redemption URL plus syncPurchases cause the redeemed offer-code subscription to attach to the currently logged-in account B?

  3. With “Transfer if there are no active subscriptions”, should an offer-code redemption transfer away from account A if account A only has an expired subscription?

  4. Are there any known limitations around Apple offer codes, expired subscriptions, and RevenueCat App User ID switching?

  5. Is the recommended implementation to store a local pending-redemption flag, open the App Store redemption URL, and call syncPurchases once when the app returns to foreground?

We want to avoid a case where a user redeems an offer code while logged into one account, but the entitlement is silently granted to a different previous account.

1 reply

matt-heaney
RevenueCat Staff
Forum|alt.badge.img+4
  • RevenueCat Staff
  • June 17, 2026

Hi there,

 

Matt from RevenueCat here! Thank you for laying everything out so clearly. This is an interesting one! I've dug into this, and your understanding of the expected behaviour is correct.

 

If the user is logged into account B when the redemption is synced, the purchase should be associated with B. Because the same Apple ID already has purchase history under account A, RevenueCat may need to evaluate your restore behaviour and with account A fully expired, that should result in the entitlement attaching to B.

 

What you're seeing isn't typical, but it can happen with Apple's in-app redemption sheet, especially when the same Apple ID already has purchase history under another App User ID.

 

presentCodeRedemptionSheet() has no success/failure callback, so RevenueCat only picks up the redemption once StoreKit surfaces the transaction. Ownership is decided then, not when the user logs in or out. For lapsed subscribers, offer codes often reactivate the same Apple subscription chain, which may stay linked to the original customer until a transfer happens.

 

That lines up with what you're seeing, but it isn't a flow I would recommend when account ownership matters, especially in sandbox, where the in-app sheet can be inconsistent. We call out these limitations in our docs and generally recommend the App Store redemption flow instead: https://www.revenuecat.com/docs/subscription-guidance/subscription-offers/ios-subscription-offers#option-1-in-app-redemption-sheet

 

The App Store redemption URL combined with syncPurchases() is what I'd recommend here. If the user is logged into account B when they return and you call syncPurchases(), RevenueCat should process the receipt under B and apply your configured restore behaviour. With A fully expired, that should attach to B.

 

In that flow: complete Purchases.logIn("accountB") and wait for it to finish, set a pending redemption flag before opening the App Store redemption URL, then call syncPurchases() once when the user returns. Only unlock content once the entitlement appears on the currently logged-in user in fresh CustomerInfo. Additionally, keep a Restore Purchases button as a fallback, and avoid calling syncPurchases() on every launch.

 

App Store redemption flow: https://www.revenuecat.com/docs/subscription-guidance/subscription-offers/ios-subscription-offers#option-2-redirect-to-app-store-app

syncPurchases: https://www.revenuecat.com/docs/getting-started/restoring-purchases#syncing-purchases-without-user-interaction

 

If you'd like us to investigate further, please open a support ticket, reference this community post, and provide the RevenueCat user IDs of the impacted users. We can then dig into exactly how the purchase was processed.

 

I hope this helps!

 

Let me know if you have any other questions!