Discussion and help from anything related to RevenueCat.
Recently active
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
As per the subject, how is the USD value calculated for the webhook ‘price’ field if the purchase is made in a different currency? Building for both the App Store and Google Play. Thanks
Since I already have subscription products in App Store trying to use the feature “Import Products automatically” but all I get is an error message “App with bundle id xxxxx.xxx.xxx was not found in the store.”. The support seems busy based on their message so I decided to post here.
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!
Hello ! I have an app that we built about months ago. App didnt perform well so we start to update and advertising it. App was like a dead app 0 downloads, 0 interactions. A weird thing happened like 3-4 weeks ago. 4 account have started trial exactly same time from US. Then 2 days later again 4 account started trial and this keep happening occasionally. All of the apps track similar pattern Annual Trial starting > converting to paid > get refund and renewal for weekly > cancel. None of them used app just do this. When I saw first 4 account started trial I contact to apple immediately and tell about situation. They say they will investigate, I keep giving the updates to them and they said me that they investigated the situation and situation is normal. So I decide to give it a go but then 1 week ago Apple e mailed me saying that they detected irregular activities on my account and my payments are on hold now. I contacted them again and there are no responses for 1 week. Are th
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]?) ->
Is it possible to have a multi-step (multi-page) paywall with RevenueCat? Using Superwall, but would prefer a single provider. If so - how would I achieve this? It looks like it’s one paywall page only from playing around in the UI. Thanks
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
Referring to this part of the docs “What happens to customers that were enrolled in an experiment after it's been stopped?”. I want to target users who we’re entered into an experiment with a follow-up experiment. But it states they will see the default offering even though the experiment has ended?https://www.revenuecat.com/docs/tools/experiments-v1/experiments-results-v1 Is it possible to include these users in a new cohort for a new experiment without removing their user records or waiting for lots of new users to make the test useful? Our goal is to price test different offerings. Our first test gave use some good results but we want to continue targeting users who were a part of this first test but did not subscribe.
i can’t relace image for paywall. no interaction after tapping saving changes.
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
I’m using the Web Billing in Product catalog but when I use the production web purchase link (https://pay.rev.cat/[ID]/[USERID]), the form is missing to input the payment info. When I use the sandbox purchase link (https://pay.rev.cat/sandbox/[ID]/[USERID]), it works as expected showing the payment info form.I’m using Stripe as the payment processer I have Products, Offerings, and Entitlements setup Things I’ve tried with same result:Firefox and Chrome browsers Trying valid User ID Try in InCognito
The issue:When testing a Mac Catalyst app built and run from Xcode, I now receive the following Xcode-console-logged errors, in the order listed here, upon attempting a non-consumable in-app purchase using a sandbox user account:No UI context available for payment sheet request. Received error that does not have a corresponding StoreKit Error: Error Domain=SKInternalErrorDomain Code=4 "An unknown error occurred. Please try again." Purchase did not return a transaction: Error Domain=SKInternalErrorDomain Code=4 "An unknown error occurred. Please try again." There was a problem with the App Store. This could also indicate the purchase dialog was cancelled.Potentially relevant additional info:The errors have occurred consistently over a 24-hour period, suggesting that it is not just a temporary problem with Apple’s sandbox server. The errors only occur during sandbox testing of the Mac Catalyst version of the app; they do not occur during sandbox testing of the iOS and iPadOS versions of
I know a company who’s evaluating some options and I was wondering if I refer them to RevenueCat, is there any referral bonus of some sort?
Hi,I was uploading a new version of my app to App Store, but got rejected because the prices in the subscriptions did not match. Upon further investigation, I noticed that the promotional offer that was active, wasn’t being showed properly, it only showed the original price for the subscription. I went to check in RevenueCat, and saw this Could not check label. I do not understand why now it is not working, this promotional offer was added last year and was working with no issue until now. What could have happened?I think I had already added the key, how can I verify that?
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.
While using RevenueCat’s PaywallView (PaywallV2), I’ve noticed that some UI customizations do not reflect on the live preview or actual device.For example: Changes to a text component (e.g., color, content) don’t persist or appear on screen. Similar issues occur with other component edits — it’s as if certain elements are locked or cached Any insights would be appreciated!
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?
My iOS app store submission cannot pass review due to reviewers being unable to pass paywall. Specifically, they said: “App remained on the same page after we tapped Continue”. With the screenshots apple reviewers provided, I can see that they see a“You’re currently subscribed to this.” and then they are unable to pass the paywall Do you know why this is happening?From what I can tell from RevenueCat documentation, I should be able to reproduce this in test environment. However, on both dev builds and TestFlight, subscriptions work fine and I am able to bypass the paywall, so I can’t reproduce it. My reviewer IDs are$RCAnonymousID:dff309041d794b93917e86553d198090 From United States $RCAnonymousID:b787ad4444d74214bb4850824894f8ad From Singapore $RCAnonymousID:73ec69c7c27e4e9aa2671ffba606d8d8 From Ireland I can tell from looking at the RevenueCat Dashboard, that they were all able to start a free Trial, and then convert to paid subscription, so I don’t think it’s a RevenueCat integrat
❓ RevenueCat Anonymous User Confusion — Purchases Made Without LoginHi everyone,I'm currently integrating RevenueCat in a Flutter app and I've run into an issue where a user made a successful purchase anonymously, even though I've explicitly configured the SDK to use Purchases.logIn(userId) after login.📦 My SetupI initialize RevenueCat in main.dart only after the user has logged in. Here's the relevant initialization code: 🔍 My Questions Can I safely call Purchases.logOut() if the user is anonymous? Will it throw or is it a no-op? Does Purchases.logIn(userId) guarantee that the userId will be used for future purchases? Or is there any chance of fallback to an anonymous ID? Why is originalAppUserId still showing an anonymous ID even after calling logIn(userId)? Shouldn't it update to match appUserId after login? Does Purchases.isAnonymous reliably tell me whether the current user is anonymous? 📎 Notes The userId is definitely non-null and only passed after the user has logged
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.