Get help with your SDK implementation.
Recently active
When i launch paywall as in example - the paywall does not close when the user clicks restore purchase button inside the paywall. @OptIn(ExperimentalPreviewRevenueCatUIPurchasesAPI::class)class MainActivity : AppCompatActivity(), PaywallResultHandler { private lateinit var paywallActivityLauncher: PaywallActivityLauncher private lateinit var root: View override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) paywallActivityLauncher = PaywallActivityLauncher(this, this) } private fun launchPaywallActivity() { paywallActivityLauncher.launch(offering = offering) } override fun onActivityResult(result: PaywallResult) {}}I also tried to use launchIfNeeded() function:paywallActivityLauncher.launchIfNeeded(offering = offering) { customerInfo -> customerInfo.entitlements.active.isEmpty()}This does not close the paywall either. The paywall doesn’t close regardless of the restore result.Is there an option for android
We’re using purchases_flutter (9.12.0) on Flutter web with RevenueCat Billing (Stripe). The flow is:User is on our paywall screen (Flutter UI). User taps Subscribe/Purchase → we call Purchases.purchase(PurchaseParams.package(package)). RevenueCat opens the Stripe checkout in a fullscreen overlay (iframe from pay.rev.cat / Stripe).Issue: On Android Chrome, the overlay shows and the scrollbar appears (content is taller than the viewport), but touch/scroll doesn’t work inside the checkout form. Scrolling works on iOS Safari and desktop Safari. So the overlay knows the content doesn’t fit (scrollbar is visible), but scroll gestures don’t reach or don’t work inside the Stripe iframe on Android Chrome. We reverted our own CSS/JS tweaks (pointer-events, viewport, etc.) and the behavior is unchanged. Environment: Flutter web, RevenueCat Web Billing + Stripe, Purchases.configure(webKey) and Purchases.purchase(PurchaseParams.package(package)). CSP allows frame-src for pay.rev.cat and Stripe. Has
We are having an issue from Sandbox webhook events, where the lookup on API for active_entitlements is [], instead of active.The request body to the webhook looks like (note environment :SANDBOX):{ "api_version": "1.0", "event": { "aliases": [ "my_user_id" ], "app_id": "app_id", "app_user_id": "my_user_id", "commission_percentage": 0.15, "country_code": "US", "currency": "USD", "entitlement_id": null, "entitlement_ids": null, "environment": "SANDBOX", "event_timestamp_ms": 1771460315227, "expiration_at_ms": 1771542723000, "id": "1653F954-2771-4656-8265-B13A9371F9D5", "is_family_share": false, "metadata": null, "offer_code": null, "original_app_user_id": "my_user_id", "original_transaction_id": "2000001123561347", "period_type": "NORMAL", "presented_offering_id": null, "price": 20, "price_in_purchased_currency": 20, "product_id": "ios_monthly_dancer_2000", "purchased_at_ms": 1771456323000, "renewal_number"
Hi,Not sure what information to share to help debug this. It doesn’t happen always, but when trying to load the Paywall component using React Native it freezes randomly (not sure the reason). It makes me wonder if it could be happening in production.I’m sharing the environment I’m using:Component Version react-native-purchases ^9.9.0 react-native-purchases-ui ^9.9.0 PurchasesHybridCommon (iOS) 17.37.0 RevenueCat (iOS native SDK) 5.58.0 RevenueCatUI (iOS native) 5.58.0 React Native 0.81.5 Expo SDK 54 iOS Deployment Target 16.2 Xcode Simulator OS macOS 26.3 (25D125) Architecture ARM-64 (Apple Silicon) According to Claude (after I dumped the crash report from the iOS simulator) it said this: Issue: RevenueCatUI.Paywall causes main thread deadlock on iOS SimulatorThe native SwiftUI paywall (RevenueCatUI.Paywall) triggers a HEIF image decode deadlock on the iOS Simulator, resulting in a 0x8BADF00D watchdog kill.Crash signature:Main thread blocked on __psyn
Hey, I implemented a webfunnel with NextJS. One step is a RC paywall, using the revenuecat js sdk. There is an issue with 3D secure.When a user completes the step, the 3DS bank verification return URL opens the domain root instead of the page where the paywall was initiated. For the user this breaks the flow. Instead of seeing the paywall success screen and after that the screen to download the app, they are being sent to our home page. The original tab stays open, but nobody understands that because they just see the home page. That means the paywall is not usable for anyone using 3d secure.How do I configure the correct return URL for Web Billing? This should be an option in the sdk when presenting the paywall.We use Web Billing with Stripe.Edit: To clarify: This works well with the Stripe Test Card with 3DS. The issue is the banking app of a real card we test this with opens the site root in a new tab.
java.lang.NoSuchMethodError: No static method configure(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Lcom/revenuecat/purchases/common/PlatformInfo;Lcom/revenuecat/purchases/Store;Lcom/revenuecat/purchases/DangerousSettings;Ljava/lang/Boolean;Ljava/lang/String;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/Boolean;Ljava/lang/String;)V in class Lcom/revenuecat/purchases/hybridcommon/CommonKt; or its super classes (declaration of 'com.revenuecat.purchases.hybridcommon.CommonKt' appears in /data/app/~~FYWMBB2RNwMfSGeYJ27sOg==/com.myapp.myapp-4FgKj70kwbLDgFLKHfUN7A==/base.apk!classes5.dex) at com.revenuecat.purchases_flutter.PurchasesFlutterPlugin.setupPurchases(PurchasesFlutterPlugin.java:403) at com.revenuecat.purchases_flutter.PurchasesFlutterPlugin.
The Carousel component has an "Open on" property in the dashboard that sets which page displays first. We'd like the ability to override this at runtime when presenting the paywall programmatically.Use caseWe have different entry points in our app that correspond to different features shown on different carousel pages. When a user taps on a specific feature’s CTA, we want to present the paywall with the carousel pre-scrolled to the relevant page, rather than always starting on the dashboard-configured default.Desired behaviorA new runtime parameter (e.g., `initialCarouselPage` or `carouselStartIndex`) passed when presenting the paywall The carousel renders starting on the specified page/index If the parameter is omitted or out of range, fall back to the dashboard-configured "Open on" value Supported on both iOS and Android SDKs
We'd like an addition to the close button delay feature that gives a visual countdown as follows:1. Counts down for a configurable duration in seconds (not to a target date, like the current countdown component)2. Displays as a numeric second counter inside a circular progress indicator that animates as it depletesUse caseWe use the close button delay to ensure users see our paywall content for a minimum duration before dismissing. However, we want users to see a visual indicator of when the close button will appear, rather than having it appear without warning. The circular progress bar with countdown number gives users a clear signal that the paywall will become dismissible shortly, which we believe reduces frustration and improves the user experience compared to a button that simply appears after an invisible delay.Desired behaviorConfigurable countdown duration in seconds (e.g., 5 seconds) Visual: numeric countdown ("5", "4", "3"...) centered inside a circular progress indicator th
Can we process in-app payments through RevenueCat’s Web SDK?Our app is a React-based PWA distributed on the App Store, Google Play, and the web. Because the core experience runs in a web runtime, we’re looking for the best way to handle in-app purchases for the iOS/Android store builds while keeping a largely shared TypeScript codebase.Does RevenueCat’s Web SDK support this scenario? Any recommendations for a cross-platform setup?
Hey, we have a flutter app for iOS that uses the RC SDK. I now want to build web funnels using RC Web Billing. In the app settings we have a button to “manage your subscription”. I’m wondering what that means for users who purchased a subscription via Web Billing.As I understand, they also have the entitlement (if set up correctly) and the flutter sdk knows about the subscription Can they cancel / change their subscription in Customer Center? If not, what will be displayed for them in Customer Center? Should we then disable the link for them? And how do I do that? Is there a flag available in the customer data I can use to disable the link?Thanks
We have a user who gets false for “canMakePayments()”, and we want to be able to tell the user why. Their device is a Realme Note 60x. They are in Spain. We tried creating a spanish Google account and use VPN and other ways to try to force google play to be in Spain. We also tried Google Billing Lab - with all our tests we got canMakePayments true. She is added to license testing in Google Play and Spain is targeted with its own EUR price, so the Google Play setup looks correct. She has only one Google account tied to that device, so it’s not account mismatch.She did not have any payment methods added - which I thought would be why she is getting false for canMakePayments(), but our fresh new account doesn’t have any either and we get a true.What is weird that after she added a payment method AND installed a new version of the app (payment flow, library version unchanged, the only addition was some extra logging) - it started working for her.This leads me to believe that canMakePayment
Hello,I am currently using two subscription plans in my app: Plus and Pro. Following the guidance in the RevenueCat documentation, I have implemented a custom PurchaseLogic that creates a new PurchaseParams containing the GoogleReplacementMode (for upgrading/downgrading plans).To handle this logic manually, I have also set purchasesAreCompletedBy to MY_APP.Based on the documentation for MY_APP, it states that the app is responsible for acknowledging the purchase. To confirm my understanding: after calling Purchases.sharedInstance.awaitPurchase(purchaseParams), should I then proceed to handle the acknowledgment and the remaining transaction steps directly using the Google BillingClient?Thank you.
I am facing issue in configuration where I have added all things properly but then also I am getting the error “[RevenueCat] 😿‼️ There is an issue with your configuration. Check the underlying error for more details.”. I am using react version “19.1.0” and react-native version “0.81.5” and react-native-purchases version “^9.7.6”.
Hello, I’m using react native (react-native-purchases and react-native-purchases-ui both at 9.7.0) for my iOS-only app. I’m displaying a paywall to my users via const result = await RevenueCatUI.presentPaywall({ offering });I have a video in my paywall, specifically, the offering “Aziz with video”. You can clearly see that the video has audio if you click on the “eye” icon, which will play the video: I’m testing this on my iPhone by clicking on the “Preview in app” button, scanning a QR code, and having the paywall display in the RevenueCat mobile app.
I'm trying to setup retention offers in the Customer Center with this logic:If customer is canceling Active Product X, then offer Product Y Where each product is a different subscription in the App Store with different price points. However, when trying to save this configuration in the Customer Center editor I get the error “Store offer identifier is required for Product Y offer.” I’m not clear on why RC is requiring that I use a promotional offer when all I’m trying to do is offer the customer an entirely different product (subscription) as that is the offer itself. What am I missing here? Is what I’m trying to do bad and not a best practice? My rational is that we already offer Product Y as the back-up offer in our new user onboarding in the Exit Offer, when the user declines our primary product, and so I’d like to do the same here. FWIW, My Product Y, the fallback offer is an annual subscription price at $41.99 that is discounted relative to the default Product X. I understand that
Hi,I’m experiencing an issue I can’t seem to fix.The text color on my paywall appears differently in the iOS simulator compared to what I see on the RevenueCat dashboard. Some text elements don’t have the same color as configured in the dashboard.I’ve tried switching the device appearance between light and dark mode, but it doesn’t change anything.Has anyone experienced this before or knows what could cause this discrepancy?Environment:Flutter: 3.38.7purchases_flutter: ^9.11.0purchases_ui_flutter: ^9.11.0iOS: 17.2Thanks in advance!
Hi guys,I’ve integrated RevenueCat several times in Flutter applications, but this time something strange is going on whenever I try to make a purchase on an actual device using the Apple’s sandbox account.I am charged on Apple and my subscription on Apple is active, but RevenueCat returns an error. The customer on the RevenueCat dashboard doesn’t seem to have an active subscription.I also tried changing the sandbox user, deleted the customer from the RevenueCat dashboard and tried again, but the issue still persists.Debug logs for the errorRequest-ID: '5ad15917-8bbc-423e-af57-473db0f0c502'; Amzn-Trace-ID: 'Root=1-69830dfb-54296ef62baba1f255786ed5'flutter: SubscriptionService: Error purchasing package: PlatformException(8, The receipt is not valid., {readableErrorCode: INVALID_RECEIPT, message: The receipt is not valid., underlyingErrorMessage: The receipt is not valid., readable_error_code: INVALID_RECEIPT, userCancelled: false, code: 8}, null)flutter: PaywallController: Unexpected er
How are we supposed to determine which roles are required for which endpoints? The descriptions for configuring roles via the dashboard are vague and do not match the apis whatsoever.
Hi,is it possible to defer the enrollment to an experiment to a later point of time?I’m using the React-Native SDK. We set up our first experiment a couple of days ago and had a look at the numbers so far. RC experiment stats tell us there were 860 (A: 430 / B: 430) customers so far getting enrolled to our experiment. Our analytics tool however tracks the paywall visit. There only ~300 users made it till the paywall. After a short chat with AI I found out that RC enrolls the user to an experiment variant once the `getOfferings()` has been called. We do call this function, but only in the component which displays the paywall. In RevenueCat on our customers I can see that the customers get enrolled immediately at the same point of time once they were ”first seen using the app”. We initialise the SDK with `Purchases.configure()` directly after the app starts. Between the initialisation and the `getOfferings()` call we only fetch the customer info using `Purchases.getCustomerInfo()` to che
We get the Package identifier, but not the title that we configure in the dashboard. That means we have to use the extremely unwieldy metadata to get human readable titles like “Annual”, “Lifetime” etc.That is a very bad API, as it requires iterating through the offerings and finding keys with the same identifier. Why create a model with so much uncertainty and need for null coalescing all the things that could go wrong?
Hello,I’m testing RevenueCat exit paywalls using the Expo + React Native setup and running into an issue where the exit offer paywall never appears after closing the initial paywall.Environment: react-native: 0.81.5 expo: ~54.0.30 react-native-purchases: ^9.7.5 react-native-purchases-ui: ^9.7.5 Setup details: Using the RevenueCat Paywalls UI Calling presentPaywall() from react-native-purchases-ui Testing in dev environment Using default offering Both: Default paywall Exit offer paywall are created and published Expected behavior: presentPaywall() shows the default paywall User closes it Exit offer paywall should automatically appear Actual behavior: Default paywall shows correctly User closes it Nothing happens — exit offer is never displayed No errors are logged, and the close action completes silently.How I’m presenting the paywall:import { presentPaywall } from "react-native-purchases-ui";await presentPaywall();Questions: Is there any additional confi
I am experiencing a layout discrepancy between the RevenueCat Paywall Editor preview and the actual rendering on iOS devices. (I’m using Flutter.) Image 1: Preview from the RevenueCat Paywall Edit Page.Image 2: A screenshot from the iOS Simulator (The same issue occurs on a physical iPhone 14). As shown in the second image, the height of each membership package card is significantly enlarged compared to the preview. And the badge on the last membership package is being cut off.What could be causing this issue specifically on iOS? Image 1 (RevenueCat Paywall Edit Page.)Image2 (A screenshot from the iOS Simulator)=======================================================================Giving a fixed height to the container made it look disproportionately large on iOS. I resolved this by removing the fixed height and using internal padding instead. And The badge issue has been fixed by applying a margin value to the container.
Discovering the sdk is challenging when it’s not clear if test case is failing because of developer errors or because some functionality is not supported in the Test Store.I’ve found this information is really scattered on a case by case basis. IS there anywhere where we can see what functionality should or shouldn’t work in the Test Store?This page exists - https://www.revenuecat.com/docs/test-and-launch/sandboxHowever it lacks important details - for example, that introductory offers cant be tested in the Test Store.
In the KMP sdk, Price.formatted is showing USD instead of $ on iOS. However, on Android is shows $ as expected. This behaviour is inconsistent and doesn’t match the docsexpected: “$4.99” android: “$4.99” iOS: “USD 4.99”
Currently we only have two options:price.formatted, which uses the period of the offer dividing the price into monthly price, but without access to the currency symbol (only code is offered)How are meant to display something very common like $60.00/year also shown as $5.00/month? fun StoreProduct.priceFormattedMonthly(): String? { return this.period?.valueInMonths?.let { months -> val monthlyPrice = this.price.amountMicros.div(months).div(1_000_000).round(2) return "${this.price.currencyCode}$monthlyPrice/ mo" }}
Already have an account? Login
No account yet? Create an account
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.