StoreKit purchase cancelled after app backgrounding during bank authentication (3D Secure)

Hello,

We are experiencing an issue with StoreKit purchases on iOS.

Some users are required by their bank to complete an additional authentication step (3D Secure / banking app validation) during an in-app purchase subscription flow.

The purchase starts correctly and StoreKit displays the purchase sheet. When the user temporarily leaves the app to validate the payment in their banking application and then returns, StoreKit eventually reports the purchase as cancelled.

No transaction is delivered to StoreKit observers, no entitlement becomes active, and restoring purchases does not find any completed transaction.

Steps to reproduce:

  1. Open the app.

  2. Start an auto-renewable subscription purchase using StoreKit.

  3. Authenticate with Apple ID if requested.

  4. When the bank authentication screen appears, leave the app and open the banking application.

  5. Approve the payment in the banking application.

  6. Return to the original app.

Observed result:

StoreKit reports the purchase as cancelled and no transaction is received.

Expected result:

The transaction should continue processing after bank authentication and eventually complete successfully.

Environment:

  • Xcode 26.3 (17C529)

  • macOS Tahoe 26.3

  • iOS 26.2.1

  • Physical iPhone device

Question:

Is this expected StoreKit behavior when a user leaves the app for external banking authentication, or is there a recommended StoreKit integration pattern that should allow the purchase flow to continue successfully?

Thank you.

No transaction is delivered to StoreKit observers, no entitlement becomes active, and restoring purchases does not find any completed transaction.

Are you implementing StoreKit 1 or StoreKit2?

StoreKit reports the purchase as cancelled and no transaction is received.

That is the expected behavior. See Testing an interrupted purchase.

Approve the payment in the banking application.

Can the user confirm whether they weren't charged?

Hi,

We are using StoreKit 2 through RevenueCat (react-native-purchases 9.15.2).

The user was not charged.

However, we now have additional information from RevenueCat's engineering team.

RevenueCat investigated the transaction and confirmed:

  • the initial purchase never reached RevenueCat,

  • Apple returned a receipt,

  • the receipt did not contain any subscription record,

  • the subscription never appeared under Settings > Apple ID > Subscriptions,

  • therefore no entitlement could be granted.

RevenueCat's conclusion is that Apple appears to be cancelling the subscription before it is created.

Apple Transaction ID:

705593352482713602

Could you help determine why this transaction is cancelled after successful bank authentication and why no subscription record is created?

Thank you.

The user was not charged.

Again that is the expected workflow in your workflow. You can test it by following steps described in Testing an interrupted purchase. No purchase took place and the user must come back to your app and initiate a purchase again.

I understand that an interrupted purchase should not create a transaction until the user completes the flow.

However, in this case the user did complete the bank authentication step and returned to the app.

What is confusing us is that RevenueCat was able to observe an Apple receipt associated with transaction ID 705593352482713602, but the receipt contained no subscription record and no subscription was ever created.

Can you clarify whether Apple generated this transaction ID and receipt as part of a normal interrupted purchase flow, or whether this indicates that the purchase progressed further and was later cancelled by Apple's systems?

We are trying to understand why a transaction ID exists while no subscription record was ever created.

Thank you.

Hi,

Just following up on this thread.

I am still trying to understand how this situation fits the interrupted purchase flow.

RevenueCat was able to observe an Apple receipt associated with transaction ID 705593352482713602, even though the receipt contained no subscription record.

If no transaction took place at all, could you clarify how a transaction ID and receipt were generated by Apple’s systems?

Does this indicate that the purchase progressed beyond the normal interrupted purchase state and was later cancelled internally by the App Store?

Thank you for any additional insight.

Does this indicate that the purchase progressed beyond the normal interrupted purchase state and was later cancelled internally by the App Store?

The purchase didn't progress. It was interrupted so the customer could complete their payment information outside of your app. The App Store recorded a transaction, albeit one that wasn't successful - no purchase took place. The customer can come back to your app to start the purchase process - will be a new transaction. In StoreKit 2, you can use APIs to determine which products the customer is entitled.

Thank you for the clarification.

However, this is not a one-off interrupted transaction.

The transaction ID we provided was only one example. The actual issue is that this happens consistently for our production subscription purchase flow whenever the user is required to complete bank authentication outside the app.

The user flow is always:

  1. The user starts the subscription purchase in our app.
  2. The App Store payment sheet opens.
  3. The user is required to complete bank authentication / 3D Secure in their banking app.
  4. The user successfully approves the payment in the banking app.
  5. The user returns to our app.
  6. StoreKit reports the purchase as cancelled/interrupted.
  7. No subscription is created.
  8. The subscription never appears under Apple ID > Subscriptions.
  9. Retrying the purchase produces the same result.

So the practical result is that users with this payment flow cannot subscribe to our app at all.

We understand that an interrupted purchase may require the user to start a new transaction. The problem is that starting a new transaction does not resolve the issue — it fails again in the same way after bank authentication.

Could you please clarify what the app is expected to do when the user has already completed the external bank authentication, returns to the app, and StoreKit still reports the purchase as cancelled every time?

Is there any additional StoreKit integration requirement for production purchases that involve external bank authentication / Strong Customer Authentication?

For context:

  • We are using StoreKit 2 through RevenueCat.
  • RevenueCat investigated and confirmed that Apple returned a receipt for the example transaction, but the receipt contained no subscription record.
  • No entitlement can be granted because no subscription record is created.
  • This prevents affected users from purchasing our subscription at all.

Thank you.

StoreKit reports the purchase as cancelled/interrupted.

Be sure to finish this cancelled transaction.

Could you please clarify what the app is expected to do when the user has already completed the external bank authentication, returns to the app, and StoreKit still reports the purchase as cancelled every time?

When the user returns to your app after completing the banking workflow, they should tap on the purchase button to buy your product. In StoreKit, when you call purchase(options:) or purchase(confirmIn:options:) on the product instance, the purchase workflow begins.

Thank you. That distinction helps.

To clarify the production behavior we are seeing:

  • If the payment method does not require external bank authentication, the subscription purchase completes successfully.
  • If the payment method requires external bank authentication / 3D Secure, the user completes the bank approval, returns to the app, and StoreKit reports the purchase as cancelled/interrupted.
  • If the user then taps the purchase button again, the same flow repeats and the purchase is cancelled/interrupted again.

So this is not just one interrupted attempt. For affected users/payment methods, retrying the purchase does not resolve the issue.

You mentioned: “Be sure to finish this cancelled transaction.”

Could you clarify what “finish this cancelled transaction” means specifically in a StoreKit 2 flow?

We are using StoreKit 2 through RevenueCat in non-observer mode, so our app does not call finishTransaction manually. RevenueCat normally manages StoreKit transaction finishing.

We have now added a targeted recovery path for this exact case: when the app went to background during the purchase and StoreKit reports the purchase as cancelled/interrupted, we force a RevenueCat receipt/transaction resync, then re-fetch CustomerInfo and check the entitlement again before allowing another purchase attempt.

Is this the correct expected recovery pattern for a StoreKit 2 purchase interrupted by external bank authentication?

Or is there another StoreKit 2 API/pattern that should be used to finish or clear the interrupted transaction before retrying?

The key issue is that purchases without external bank authentication work, but purchases requiring bank authentication consistently fail after returning to the app.

Thank you.

We implemented the recovery pattern and tested again in production.

After StoreKit reported the purchase as cancelled/interrupted following the external bank authentication flow, our app forced a RevenueCat receipt/transaction resync and then re-fetched CustomerInfo before allowing another purchase attempt.

The recovery path executed successfully, but no subscription entitlement was recovered.

Relevant logs from the production app:

01:16:26.513 purchase.premium.tap 01:16:26.532 purchase.premium.package_found {“productId”:“com.newundercover.app.premium.monthly”,“price”:“5.99 €”} 01:16:26.533 purchase.premium.purchase_call_started 01:16:29.133 purchase.premium.app_background 01:16:39.303 purchase.premium.app_foreground 01:17:00.950 purchase.premium.cancelled_after_background 01:17:00.951 purchase.premium.sync_after_cancel_start 01:17:02.394 purchase.premium.sync_after_cancel_done 01:17:32.214 purchase.premium.restore_after_cancel_start 01:17:32.243 rc.restore {“active”:false} 01:17:32.244 purchase.premium.restore_after_cancel_result {“active”:false}

So the app now does attempt to resync after the interrupted/cancelled transaction, but the subscription is still not created and no entitlement becomes active.

This confirms the issue is not just that the app failed to retry/resync after the interrupted transaction.

Can you please confirm what else the app is expected to do in StoreKit 2 after the user successfully completes the external bank authentication but StoreKit still reports the purchase as cancelled/interrupted?

At this point, for affected payment methods, every purchase attempt fails after bank authentication, even after resyncing and retrying.

Thank you.

Hello,

I have an important update regarding this issue.

I created a new production App Store build (1.0.7) and implemented RevenueCat’s official Paywall UI (RevenueCatUI.presentPaywall()) in order to eliminate the possibility that the issue was caused by my custom purchase flow.

The result is exactly the same.

Steps:

  1. Open RevenueCat official paywall.
  2. Start monthly subscription purchase.
  3. App Store redirects to the banking app for 3D Secure authentication.
  4. Bank authentication succeeds.
  5. User returns to the app.
  6. Paywall closes with a CANCELLED result.
  7. No active entitlement is received.
  8. No subscription is created.

Relevant logs:

  • app_background
  • app_foreground
  • paywall result = CANCELLED
  • CustomerInfo = entitlement inactive

This reproduces in a production App Store build using RevenueCat’s official Paywall UI, not only with my custom purchase implementation.

Given this result, do you still believe this is expected StoreKit behavior, or does it suggest that the purchase flow is being interrupted or discarded when returning from the banking application after successful 3D Secure authentication?

Any guidance would be greatly appreciated.

Thank you.

Important clarification:

The issue appears to happen at the moment the app is backgrounded while the external bank authentication / 3D Secure screen is displayed.

The exact visible behavior is:

  1. The App Store purchase sheet appears normally.
  2. The user taps Subscribe.
  3. The App Store sheet completes and disappears.
  4. A 3D Secure / bank authentication screen appears.
  5. The user must leave the app to approve the payment in their banking app.
  6. When the user swipes up to background the app, the 3D Secure screen visibly disappears.
  7. The underlying paywall is shown again.
  8. The user approves the payment in the banking app.
  9. When returning to the original app, the 3D Secure screen is gone and the app is back on the paywall as if the purchase flow had been discarded.
  10. StoreKit / RevenueCat then reports the purchase as cancelled/interrupted.
  11. No subscription is created, no transaction is delivered, and restore does not recover anything.

So the problem is not only that the user leaves the app. The problem is that the 3D Secure authentication UI appears to be dismissed/cancelled as soon as the app is backgrounded, even though leaving the app is required to complete the bank authentication.

Can you confirm whether StoreKit/App Store payment authentication is expected to survive app backgrounding during a required external bank authentication step?

If it is expected to be cancelled when the app is backgrounded, then users whose banks require approval in a separate banking app cannot complete the subscription purchase flow.

StoreKit purchase cancelled after app backgrounding during bank authentication (3D Secure)
 
 
Q