Skip to main content
Question

Can the RevenueCat-hosted paywall (RevenueCatUI) detect when a user dismisses the native StoreKit purchase sheet?

  • June 25, 2026
  • 1 reply
  • 1 view

Forum|alt.badge.img

I'm using RevenueCatUI.presentPaywall() (Flutter, purchases_flutter 9.x) to show a hosted paywall. I want to show a "last chance" discounted offering the moment a user cancels — specifically when they open the native StoreKit purchase/confirmation sheet and then close it without buying.

What I'm seeing: presentPaywall() only returns a PaywallResult (e.g. cancelled) when the entire paywall is dismissed. When the user closes just the StoreKit sheet, the SDK simply returns them to the paywall and no result/callback is surfaced, so I can't react to that specific event.

Question:

 Currently we have the exit paywall implemented when user closes the paywall,Is there any way to detect the StoreKit sheet dismissal while using the hosted paywall UI? 

Screenshot attached for refernce. 

1 reply

alejandra-wetsch
RevenueCat Staff
Forum|alt.badge.img+6

Hey ​@harsh-bansal-e93246

Thank you for reaching out! 

This could be due to the way you’re currently presenting the Paywall. As you may know, we currently have 3 ways to present the Paywall

  • .presentPaywall
  • .presentPaywallIfNeeded
  • PaywallView

The first two modes expose a PaywallResult, as you mentioned. This result is returned once the Paywall is dismissed. So lifecycle callbacks are not fired as they happen. 

To receive the canceled callback when the Payment Sheet is dismissed, I recommend using the PaywallView presentation instead. 

Please check the code snippet below for reference:

Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: PaywallView(
offering: _offering,
onPurchaseStarted: (Package rcPackage) {
// User tapped a package and the purchase flow started
},
onPurchaseCancelled: () {
// User cancelled the App Store / Play Store payment sheet.
},
onPurchaseCompleted: (
CustomerInfo customerInfo,
StoreTransaction storeTransaction,
) {
// Purchase succeeded
},
onPurchaseError: (PurchasesError error) {
// Purchase failed with an error
},
onRestoreCompleted: (CustomerInfo customerInfo) {
// Restore succeeded
},
onRestoreError: (PurchasesError error) {
// Restore failed
},
onDismiss: () {
// Paywall wants to close
},
),
),
);
}
}

I hope this helps!