Get help with your SDK implementation.
Recently active
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 });The paywall renders correctly. I have a restore button that restore the purchase correctly, but it does not dismiss the paywall. The user is often left confused as to whether the restore worked or not. How can I get the paywall to dismiss automatically after a restore? There’s no `dismiss()` method on `RevenueCatUI` either, and I would like to not use `<RevenueCatUI.Paywall />` component as that has several scroll issues when used in a bottom sheet to mimic similar behavior of `RevenueCatUI.presentPaywall()`
In Figma, my Package component has 2 variants (Default and Selected) with the stroke correctly applied only to the Selected variant. The component works visually in Figma, but the state-specific styling doesn't carry over correctly in the Paywall Builder. Thanks for help!
I used a pre made template for my paywall but how do i change the price?
> using the `purchase()` function from RevenueCat’s React integration> has domain setup in Stripe> apple pay not visible when calling `purchase()`> viewing on physical iPhone with Apple Pay setupare there any troubleshooting guides available for this integration?
Hi, This post never got an update, and it was closed for comments. AFAIK we still don't have countdowns on iOS <26. Can we know more about this?
I am trying to grant an entitlement - by testing in dev from my server, expecting the Sandbox to be granted the entitlement. However, nothing seems to achieve this:communicate with customer records & items via Secret API keys - starts with sk_*** use the Sandbox API key to make the purchase - starts with rcb_sb_*** if I use the Sandbox key as Bearer for REST api, like customer look ups it fails. OK, use the Secret key for everything except purchase. But then using the Sandbox key to purchase it fails. RevenueCat webhook received:{ eventId: '***-***', eventType: 'NON_RENEWING_PURCHASE', appUserId: '***-***', environment: 'PRODUCTION', productId: 'rc_promo_entitlement_custom'} What do I need to do to grant an entitlement in a sandbox?
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
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.
I have problems finding the platform specific API key, there is no path such as:Project Settings > API keysBut I can see API keys on the left side (image attached) but I can not find the API key need it to submit the app for review or production release
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 am working on an existing application where i have to get back the customer ↔ subscription relation.As far as i understand, the transfer event is available only from the webhook (transfered_from / transfered_to).The API offers a way to “create” a transfer, through `POST | customers/{customer_id}/actions/transfer`.But there is no way to get this transfer information / history in the API.Am i correct here ?While browsing the original user profile on the dashboard, i can see in “Customer history” the information:`Got their purchases transferred to new_user_id`So the transfer information seems to be present, but cant find a way to get it through the API.Currently considering a dashboard scraping to get this information, but i certainly miss something. How to get the new user id from the API, when i only know the old/original user id ?
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
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"
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.
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
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”
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
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.
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?
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" }}
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!
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.
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.