Skip to main content
Solved

Exit Offer for KMP

  • July 10, 2026
  • 1 reply
  • 36 views

Forum|alt.badge.img

Hi RevenueCat team,

We’re currently using RevenueCat Paywalls in a Kotlin Multiplatform app and noticed that automatic Exit Offer paywalls are still not supported in the KMP presentation layer.

Do you have any updates on whether Exit Offer support for KMP is on the roadmap and whether there is an estimated timeline?

Replacing the entire integration with separate native implementations would likely add significant complexity without necessarily solving the problem cleanly, especially on iOS. Your answer would help us evaluate which path to take.

In the meantime, we’re considering two options:

  • Implementing a custom exit-offer flow in KMP by intercepting the initial paywall dismissal and displaying a separate RevenueCat Offering.

  • Accessing the native RevenueCat Paywall presentation APIs from the platform-specific KMP source sets while keeping the existing shared purchase configuration.

Any guidance or examples would be appreciated.

P.S. pls also add KMP tag 🙏

Best answer by matt-heaney

Hey ​@timur-3c8ac5,

 

Thanks for reaching out! I'm Matt from RevenueCat, and I'd love to help here.

 

You're right, automatic Exit Offer paywalls aren't supported in the KMP presentation layer today. This has come up in a few recent discussions, but unfortunately I don't have an ETA to share at the moment. If that changes, I'll be sure to let you know.

 

I've also passed your use case along internally so it's on the team's radar.

 

However, I'm determined to help you get up and running with Exit Offers without needing to make major changes on your end.

 

Both of the approaches you're considering are viable. Let's break each down.

 

Option 1: Implement your own exit-offer flow in KMP (probably the lighter approach)

If you're presenting your paywall using PaywallDialog, you can intercept the dismissal via dismissRequest. On the first dismissal attempt, present a second PaywallDialog backed by your Exit Offer Offering (configured in the RevenueCat dashboard). After it's been shown once, allow the original paywall to dismiss normally.

 

This is effectively how native Exit Offers work under the hood. Because the presentation layer controls the dismissal flow, Exit Offers aren't supported with the embedded Paywall composable. In KMP, though, you can recreate that behavior yourself while keeping the rest of your purchase logic in shared code.

 

If you use this approach, make sure to test cases such as the paywall being dismissed after a successful purchase.

 

Option 2: Use the native presentation APIs

You could also keep your Purchases configuration in shared KMP code and use expect/actual (or platform-specific source sets) just for presenting paywalls.

 

That would let you use the native APIs that already support Exit Offers:

  • Android: PaywallDialog or PaywallActivityLauncher

  • iOS: presentPaywall or presentPaywallIfNeeded

 

This gives you automatic Exit Offer handling on each platform, but it does mean maintaining a small amount of platform-specific presentation code.

 

Hopefully one of those approaches helps for now. If you'd like to dive deeper into either approach, just let me know and I'd be happy to help.

 

Also, we've added the new KMP tag to your post and updated your question to use it!

 

Thanks!

1 reply

matt-heaney
RevenueCat Staff
Forum|alt.badge.img+6
  • RevenueCat Staff
  • Answer
  • July 10, 2026

Hey ​@timur-3c8ac5,

 

Thanks for reaching out! I'm Matt from RevenueCat, and I'd love to help here.

 

You're right, automatic Exit Offer paywalls aren't supported in the KMP presentation layer today. This has come up in a few recent discussions, but unfortunately I don't have an ETA to share at the moment. If that changes, I'll be sure to let you know.

 

I've also passed your use case along internally so it's on the team's radar.

 

However, I'm determined to help you get up and running with Exit Offers without needing to make major changes on your end.

 

Both of the approaches you're considering are viable. Let's break each down.

 

Option 1: Implement your own exit-offer flow in KMP (probably the lighter approach)

If you're presenting your paywall using PaywallDialog, you can intercept the dismissal via dismissRequest. On the first dismissal attempt, present a second PaywallDialog backed by your Exit Offer Offering (configured in the RevenueCat dashboard). After it's been shown once, allow the original paywall to dismiss normally.

 

This is effectively how native Exit Offers work under the hood. Because the presentation layer controls the dismissal flow, Exit Offers aren't supported with the embedded Paywall composable. In KMP, though, you can recreate that behavior yourself while keeping the rest of your purchase logic in shared code.

 

If you use this approach, make sure to test cases such as the paywall being dismissed after a successful purchase.

 

Option 2: Use the native presentation APIs

You could also keep your Purchases configuration in shared KMP code and use expect/actual (or platform-specific source sets) just for presenting paywalls.

 

That would let you use the native APIs that already support Exit Offers:

  • Android: PaywallDialog or PaywallActivityLauncher

  • iOS: presentPaywall or presentPaywallIfNeeded

 

This gives you automatic Exit Offer handling on each platform, but it does mean maintaining a small amount of platform-specific presentation code.

 

Hopefully one of those approaches helps for now. If you'd like to dive deeper into either approach, just let me know and I'd be happy to help.

 

Also, we've added the new KMP tag to your post and updated your question to use it!

 

Thanks!