Get help with your SDK implementation.
Recently active
I’m using RevenueCat Experiments and would like to clarify how targeting rules interact with experiment variants. I’ve reviewed the documentation here: RevenueCat Targeting FAQ, which states that experiments are evaluated before custom targeting. However, based on my testing, it appears that RevenueCat respects targeting rules first before applying any experiments.My setup: I’ve defined a custom subscriber attribute called subscription_type, which can be either "Free" or "Premium". For the appLaunch placement, I’ve added the following RevenueCat targeting logic: If subscription_type == "Free" → show a paywall. If subscription_type == "Premium" → no paywall/offering should be shown. I’ve also created an experiment on the same appLaunch placement that tests two different paywall variants. What I’m observing: Users with subscription_type == "Free" are correctly entered into the experiment and see one of the A/B tested paywalls. Users with subscription_type == "Premium" do n
Hi all In my app I am able to make purchases. That is working fineHowever the users who have not yet purchased but interacted with the app including going to the paywall are not showing up under customs in RevenueCat.I am using Flutter flow.What could I be doing wrong?
The new Customer Center doesn’t seem to be showing the userID. In the previous version, the userID was visible in the Purchase History. However with the new version it’s nowhere to be found. I can confirm this on both debug and production builds (not sure if these are supposed to be different?).I’m looking at iOS platform and on latest SDK 5.28.1 version.I assumed this was removed on purpose in the new Customer Center so I was just about to add it to my app manually. But after seeing it existed in the demo from the June 2025 launch party, I am not sure if there’s something I have to do on my side to show the userID in the Customer Center? My user’s all have anonymous ids.This is how it looks like:
I need to display the subscriptionPeriod and the price of the currently active subscription directly within the app.My app uses anonymous user IDs (no login or authentication), and I don’t have a backend server involved.What is the best way to retrieve and display this information using the RevenueCat React Native SDK?
I’m trying to follow the docs for the capacitor purchases plugin. I’m migrating my codebase from the awesome-cordova-plugins approach I used with capacitor 2. Incidentally, docs are not entirely clear as sometimes there’s no capacitor example (only cordova). Anyway, my issue isIf I use one of these ...const customerInfo = await Purchases.getCustomerInfo();Purchases.getCustomerInfo().then((customerInfo) => {Then use this ... it tells me there’s no entitlements property …customerInfo.entitlements.activeBut if I double up the ‘customerInfo’ then it doesn’t complain …customerInfo.customerInfo.entitlements.activeNote that these issues are showing up in VSCode editor … I haven’t converted all the code yet, so nowhere near actually building/running this.What’s going on? Not sure if this affects anything but I wasn’t going to uninstall the old plugins until all my new code is written, so all these are still there:"@awesome-cordova-plugins/purchases": "^5.37.3","@revenuecat/purchases-capacit
Hi RevenueCat team,I'm experiencing an issue with the relative_discount calculation in my paywall.Setup- Package 1: 6 months subscription at €59.99- Package 2: 12 months subscription at €55.00 (with 8% OFF badge)Expected behaviorThe annual package should show ~54% discount compared to 6-month package:- 6 months annualized: €59.99 × 2 = €119.98/year- 12 months: €55.00/year- Real discount: (119.98 - 55) / 119.98 = 54.17%Actual behaviorPaywallView displays "8% OFF" which is incorrect.Questions1. How is relative_discount calculated exactly?2. Is this comparing against a different reference price?3. Should I configure something specific in my offering setup?Environment- purchases_ui_flutter: ^8.10.1- Platform: Android/iOSAny guidance would be appreciated!
I am trying to build my app with Xcode 26 beta 1. RevenueCat is generating errors:For many functions, I’m getting this error.“Concurrency is only available in iOS 13.0.0 or newer” Here is an example of the code in Obsoletions. func paymentDiscount(for discount: SKProductDiscount, product: SKProduct) async throws -> SKPaymentDiscount { fatalError() } I am using RevenueCat 4.43.3Is there a way I can avoid these errors - I am not ready to move to RC 5.x yet.My code supports iOS 16 or later.
Hi all, I am trying to set up a new react native app and having trouble with this err: [Error: There is an issue with your configuration. Check the underlying error for more details. There's a problem with your configuration. None of the products registered in the RevenueCat dashboard could be fetched from App Store Connect (or the StoreKit Configuration file if one is being used). More information: https://rev.cat/why-are-offerings-empty]I had this working just last week (paywall was showing up, products fetched properly etc.) but it suddenly stopped working. I have not changed anything in my revenuecat setup, I haven’t changed anything in my app store connect or revenue cat setup (I’ve checked revenuecat audit logs, nothing changed in last 3 weeks). The only potential issue was there was a new app developer agreement for free apps, so I signed and its been over 24 hrs since I’ve signed it but still seeing these issues.I know this is an issue many others have faced, but I have gone th
Hey team - getting this crash on Xcode 26b1 (17A5241e) running on any iOS 26 simulators. I’m on the new v5.28.0 SDK. I can’t repro this in a sample project, otherwise I would’ve posted this to Github as an Issue, not sure if it’s something in my project setup, etc. Things I’ve tried:I commented out any other use of the RC SDK to make sure there wasn’t some race condition happening I’ve tried changing my deployment target to iOS 26 (instead of iOS 17 where I am now) I’ve tried some of the other configure functions including the config builder one, they all crash the same It’s affecting all iOS 26 sims, doesn’t crash on iOS 18 sims I simplified my AppDelegate to the following and still getting the crash (it crashes with a real API key or a fake one in there): import RevenueCat@mainclass AppDelegate: UIResponder, UIApplicationDelegate {}extension AppDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions _: [UIApplication.LaunchOptionsKey: Any]?) ->
Hi,Thanks for your blog post: Converting a Paid iOS App to Subscriptions. It was very helpful! I have a few follow-up questions: Is all the code and information in the post still up to date after a few years? Regarding the syncIfNeeded function: it checks the info returned from RevenueCat, and if that fails and a receipt exists, it attempts to sync. But what happens if the receipt doesn't exist, or syncing isn’t sufficient? Is that a possible scenario? How should we handle users in that situation? In such cases, should we fall back to calling restorePurchases, which might trigger the system sign-in prompt? The article doesn’t mention this. Also, I noticed that appStoreReceiptURL is now deprecated, and Apple recommends using the AppTransaction API. I've tried this in my app, but in some cases, I can't access the original app version or purchase date unless I explicitly call AppTransaction.refresh(), which often causes a sign-in prompt. This seems similar to RevenueCat’s restorePurch
I'm running into an issue when using the PaywallViewControllerDelegate with the RevenueCat iOS SDK version 5.22.2.I’m presenting the paywall manually using the following code:extension AppPaywallBuilder { func build() -> UIViewController { let viewController = PaywallViewController(offering: subscriptionManager.offering) viewController.delegate = self viewController.modalPresentationStyle = .fullScreen return viewController }}extension AppPaywallBuilder: PaywallViewControllerDelegate { func paywallViewController(_ controller: PaywallViewController, didStartPurchaseWith package: Package) { print("aaaa") } func paywallViewController(_ controller: PaywallViewController, didFinishPurchasingWith customerInfo: CustomerInfo) { print("aaaa") } func paywallViewController(_ controller: PaywallViewController, didFinishRestoringWith customerInfo: CustomerInfo) { prin
I added the SDK initialization in my code. But when I launch the application, it crashes and shows this error Your app just crashed. See the error below.java.lang.NoSuchMethodError: No static method configure(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Lcom/revenuecat/purchases/PurchasesAreCompletedBy;Lcom/revenuecat/purchases/common/PlatformInfo;Lcom/revenuecat/purchases/Store;Lcom/revenuecat/purchases/DangerousSettings;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/~~S6Gdua0r00AvocmBAY814g==/com.heavenmobile.app-Nfa1Ti6hbTxWjSgfJhC-wg==/base.apk!classes8.dex) com.revenuecat.purchases.react.RNPurchasesModule.setupPurchases(RNPurchasesModule.java:95) com.facebook.jni.NativeRunnable.run(Native Method) android.os.Handler.handleCallback(Handler.java:942) android.os.Handler.dispatchMessage(Handler.java:99) com.fa
Hi all, I have a little question about localizing price strings. In English the variable {{ product.price_per_period_abbreviated }} returns $9.99/mo which is perfect but I can’t find in the docs what variables are localized so would that translate automatically for users in other locals? or should I provide the abbreviation myself (in this case Chinese) {{ product.price_per_period }}/月Thanks so much
With macOS Tahoe released today, I wanted to see how my app ran on it. But I ran into a compile error when using the RevenueCate Flutter package:Swift Compiler Error (Xcode): Protocol 'StoreKit2PurchaseIntentType' requires 'id' to be available in iOS 16.4 and newerbut I wanted to post my issue here to get the ball rolling on using RevenueCat with the new OS 26 versions.This error was within the StoreKit2PurchaseIntentListener.swift file.I am using this purchases_flutter: ^8.10.1
I want to be able to change the trial period on a product, or the grace period, and I’m realizing none of this is editable in the RevenueCat dashboard. Does it have to be set when the product is created, and then I need to create new products every time I want to make a change? I ask because: We have a field in our DB that stores if a customer is annual or monthly (which are two products at the moment), and we are getting this info from the customer info in the Web SDK. The only place there we can identify the subscription duration is from the product name. But, if we need to change product names regularly to change things like trial period, we need to make code changes on our side every time. It’d be nice if we either could modify products, or if the Web SDK could return duration in the customer info.
Hi - I’m working on adding Paywalls (V2) to our iOS app, and I sometimes run into a built in skeleton loading screen. The skeleton doesn’t match the app’s design, so I’d love to hide it, or ideally be able to observe the loading state of the paywall in some way and display custom UI until it’s ready.I noticed this prior post asking a similar question:In my case, the paywall is being shown after offerings have synced. (It doesn’t always appear, but it does frequently enough I’d like to handle the loading state a little differently.)I’m using PaywallViewController, via “custom” display logic. (I’m using the initializer that takes an offering identifier, and presenting the view controller manually.)Any chance anyone can provide guidance about how to suppress the UI / observe when the paywall is ready to go?
Important Notes When Testing Google Play Sandbox – Account Conflict Issue I’d like to share my experience in case others run into a similar issue during Google Play sandbox testing.This unexpected behavior took quite a bit of time to figure out. Problem Summary If multiple Google accounts are signed in on the test device, the system may reuse a previous purchase receipt from one of those accounts. It seems that Android treats the first (oldest) signed-in account as the default, and continues referencing its purchase history even in sandbox mode. In my case, I had a real subscription purchase on main@gmail.com (used in production), and although I was testing with test.sandbox@gmail.com, all attempts were rejected with the message: “You are already subscribed”. How I Solved It Remove all unnecessary Google accounts → Only keep the test account (test.sandbox@gmail.com) on the device. Use only the test account → Sign in with just the sandbox test account before running your tes
Hey there, I have one paywall that has annual-monthly-weekly subscription. I want to have another paywall that has lifetime subscripton and uses same entitlement that my initial paywall has. I want to show user my lifetime paywall after the user dismiss our initial paywall. How to achieve that in UIKit? Is there a way? I can’t find in the docs etc.
I know this has been discussed hundred of times, but while I suppose the reason is he same as in previous threads, that is: reviewer is failing to fetch products because they are not accepted, the response I got from him seems to opose this premise. Quote:The in-app purchases do not need to have been previously approved to confirm they function correctly in review.It would be appropriate to review your in-app purchases to make sure they have been appropriately configured for review in the Apple-provided sandbox environment.It is the first release of this app. The subscriptions had “Waiting for Review” status but after the app rejection their status changed to “Developer Action Needed” while the translations of them to “Rejected”.On RevenueCat everything seems to be configured correctly, with product fetched automatically and their statuses correctly reflecting what is displaying in App Store Connect.Meanwhile the Android version using the same codebase is happily on prod with zero issu
Very strange, never had this issue before. It’s occurring in production as well. Tested it on several different phones and accounts, it appears to be happening to one of my co-workers on both prod and Testflight. I’m using react-native-purchase v7.27.3happens when calling Purchases.getOfferings Seen there was a post from a year ago talking about it, but it doesn’t seem like there was a solution to the issue.
I am getting this error from sandbox and the app in app store =>flutter: PlatformException(8, The receipt is not valid., {code: 8, userCancelled: false, readable_error_code: INVALID_RECEIPT, underlyingErrorMessage: The receipt is not valid., message: The receipt is not valid., readableErrorCode: INVALID_RECEIPT}, null)Also I’ve checked this stepsApp Store Connect App-Specific Shared Secret is correct My public api key is correctWhat is the solution?
Hello,I have my React Native app fully functioning on iOS. I am currently testing my app under a closed testing group on the Play Store. I have found that selecting restore purchase on Android will automatically give my test users premium (without having made any previous purchase). This is something that doesn’t happen on iOS so I’m wondering is it because it’s under closed testing?
Hi. Whenever I supply custom metadata in my Web SDK purchase call (as described here https://www.revenuecat.com/docs/web/web-billing/custom-metadata), the Event Data for the purchase shows a “metadata” value of null, and the webhook request body for that event then also shows a “metadata” value of null. I’m using a web billing app.The exact request I’m making is: const { customerInfo } = await Purchases.getSharedInstance().purchase({ rcPackage: pkg, metadata: { org_id: "01970d2a-3f5b-724c-b306-5aca641ffba3", event_id: "01972cdb-f765-756b-ae95-203f516ff6e6" },});I can see the metadata being set correctly in the POST request to https://api.revenuecat.com/rcbilling/v1/checkout/start, it just never seems to actually be stored and associated with the event once the checkout is completed.I’m using the @revenuecat/purchases-js library on version 1.4.3. Is there something I’m doing incorrectly or am I missing something? Or is there just a bug with processing this metadata on the b
With macOS Tahoe released today, I wanted to see how my app ran on it. But I ran into a compile error when using the RevenueCate Swift package: Protocol 'StoreKit2PurchaseIntentType' requires 'id' to be available in macOS 14.4 and newerI know RevenueCat just got their hands on the new SDK today, but I wanted to post my issue here to get the ball rolling on using RevenueCat with the new OS 26 versions.This error was within the StoreKit2PurchaseIntentListener.swift file.
Hi,I just wanted to get to know, what to implement additionally in my Flutter App for iOS introductory offers. I am not using the RC Paywall, but my own screens inside the App and I have already implemented IAP subscriptions for my App & the App is active inside the AppStore.The plan is to have a trial period of 3 days before the full price is charged. My app uses an App Extension that needs to know the expiration date and refers to the in-app-purchase page of my Flutter App if a subscription expires. Therefore I absolutely need to make sure that I get the Trial Period from RC:My expectation would be that when the User subscribes and is eligible for the trial period, I get a price of 0.0 USD for the product and an expiration date of 3 days from RevenueCat. Additionally, the introEligibilityStatusEligible flag is returned, so I can show a corresponding text to the user.Is this correct ? Do I additionally also get the effective price that is charged after the Trial period ends ?How i
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.