Get help with your SDK implementation.
Recently active
Seems the Android Paywalls show Material3 Alert Dialog. Are there plans to make these customizable or disable them so we can show the errors in style that matches the rest of our App? Only way we have found to do this, is to resume(false) in onPurchasePackageInitiated and then taking over the entire purchase flow, but we would prefer to let the Paywall do the work.Even if we keep the default dialogs, their body seems to use non-localized Strings for the error message. Which also makes them bad for non-english users. https://github.com/RevenueCat/purchases-android/blob/de4475520fb0353daddbae2fccf2f402332688ea/purchases/src/main/kotlin/com/revenuecat/purchases/errors.kt#L56
I have an introductory offer applied to a one time purchase on the google play console with legacy compatibility checked. Whilst the UI in the app shows the discounted price when I click to purchase it and the google billing bottom sheet surfaces, its showing the full price. Is this a gap in your SDK to support introductory offers for one time products?
Hello RC team,I have a question regarding the format for App User ID. From my understanding, the default app user id is prefixed with $RCAnonymousID However, on from my webhook log, I am seeing this value where the id is base64. This makes my backend code not working because this value doesn’t exist in my database and I am only using UUID v4 as the id.app_user_id :"na68yjrqU3LzQbk6h4Cwchw8l4pgILy5id9LAAGCaW4="aliases: ["na68yjrqU3LzQbk6h4Cwchw8l4pgILy5id9LAAGCaW4="]original_app_user_id: "na68yjrqU3LzQbk6h4Cwchw8l4pgILy5id9LAAGCaW4=" My dart code looks something like this.configuration.appUserID = appUserId;await Purchases.configure(configuration);From RC dashboard, I can identify the correct customer after user provided their email address and I have to transfer the entitlement to the correct customer if this issue happen.This issue happened once in a while and has happened for a few months. So far, only happened on Play Store purchases. Is there any docs talking about this base64 id?T
Hi RevenueCat community,I'm integrating RevenueCat into an iOS App Clip (targeting iOS 16+) and I'm running into credential validation issues. I'd love some clarity on the recommended setup.My setup:Main app bundle ID: com.mycompany.appname App Clip bundle ID: com.mycompany.appname.Clip Both should use the same in-app purchase products defined in App Store Connect App Clip is embedded in the parent app (as Apple requires) Using RevenueCat SDK v5.x (StoreKit 2)What I tried: I created a separate app entry in RevenueCat for the Clip bundle ID com.mycompany.appname.Clip, uploaded the same IAP key (.p8) and shared secret as the main app. RevenueCat validation returns: "The key is not valid or is not compatible with the Bundle ID of your app."The build with the Clip has been successfully uploaded to TestFlight, so the bundle ID definitely exists in App Store Connect but inside the mother app (not as a single standard app).My questions:Should I use a separate RevenueCat app entry for the Clip
Hi everyone,I'm having major issues with RevenueCat in my beta app (built with Replit).When I try to make a purchase (both subscriptions and consumables), it gets stuck showing “Plans are loading, try again in a moment”.On top of that, on Android (internal testing) I get an error when opening the app saying it can't find the public API.I’ve configured everything: RevenueCat, App Store Connect, Google Play Console, secrets, etc. Other services like Google Maps and Google Sign In work fine.I’ve tried everything I can think of on the code and configuration side but nothing works. I really need purchases working in beta before production.Has anyone faced these exact issues recently with RevenueCat? Any ideas what could be causing this?Thanks in advance for any help!
I’m looking at making an implementation for .NET MAUI to support rendering Paywalls at the MAUI layer instead of trying to wrap the native Android/iOS SDKs to do it (the dependency graph is a bit of a nightmare to sort out for it unfortunately - the core SDKs aren’t too bad and I have working nicely).Is there a spec or schema somewhere that I can get the details for the data returned when requesting paywalls?I see the v2 api has an openapi spec which defines some parts, but there’s stuff like additionalProperties which seems like it could be platform specific.Could you post specs for android/iOS at the very least, to understand more what the api might return? Alternatively, if you actually have a true unified version of the object model for web or flutter or some other framework, a comprehensive and complete spec for that would also be helpful.Thanks
I changed some text. And suddenly my paywall stopped rendering. It’s falling back to RevenuCats default paywall. I’ve tried everything I can think of. It’s kind of a critical moment right now. Don’t know what to do. Any ideas?I removed the badge that I had on a button, since someone said that could give problems, but still the same. The Ai can’t find any problems. It’s the same on iOS and Android
Hi,I'm getting NOELIGIBLEOFFER (statusCode 4) for all 4 subscription products on Android. SDK version 10.1.2, Capacitor plugin.Logs show:- RC API returns 200 for offerings ✅- Products requested: elitemonthly, eliteyearly, promonthly, proyearly- All return: Product Type subs, Reason NOELIGIBLEOFFER, statusCode 4- Error: "None of the products registered in the RevenueCat dashboard could be fetched from the Play Store"What I've confirmed is correctly set up:- Products created May 5 (6 days ago, not a propagation issue)- Base plans are Active- Prices set for CA and US- Internal Testing track has a published APK- Test accounts added as Internal Testers AND in License Testing- Device restarted, Play Store cache cleared- No recent changes to base plansPackage name: com.mi4labs.carnivorexAny idea what I'm missing?
Hello, I am currently testing my app on Testflight and cannot get past the subscription/paywall stage as I am getting this error when attempting to Start free trial / subscription after signing in with Apple ID.Store unavailable Could not load subscription options.I am using iOS 26. Code snippet of how I am loading offerings/products: https://github.com/nelsonng2002/dump-repo/blob/main/purchases.service.tsI added some debugging to my screen and here it is:RevenueCat Initialized: yes, Configured: yes, Key present: yes, Key preview: appl_f...Last action: offerings:fetch _error Current offering: none Offering IDs: none Package IDs: none Last error code: 23 Last error: There is an issue with your configuration. Check the underlying error for more details. More information: https://rev.cat/sdk- troubleshooting There's a problem with your configuration. None of the products registered in the RevenueCat dashboard could be fetched from App Store Connect. For info, I have products set up on App
I’m at the point where I don’t even know what I’m missing anymore.I’ve been trying to get this working for over three weeks now, and I just keep running into the exact same wall. I’ve rebuilt parts of this multiple times, gone through the docs over and over, and I feel like I’m so close — but something is still off and I can’t see it.What I’m trying to do is allow multiple users in my app (each with their own account) to subscribe, even if they’re using the same Apple ID. Basically like how YouTube lets you have different accounts each with their own subscription, but all under one Apple account.So I set things up the way it’s supposed to work. I created multiple subscription groups in App Store Connect (A through H), each with their own products. Everything is approved, live, and has been for weeks. Then in RevenueCat, I created matching offerings for each group and wired them all up properly with entitlements.On the app side, I’m logging users into RevenueCat using their own user ID
We are using RevenueCat SDK with Capacitor on iOS. Our 4 auto-renewable subscription products are in "Waiting for Review" status in App Store Connect (submitted together with the binary).The SDK returns this error: "None of the products registered in the RevenueCat dashboard could be fetched from App Store Connect"StoreKit returns DownloadFailed error and cannot fetch product metadata. RevenueCat logs show WAITING_FOR_REVIEW state for all 4 products.All configuration is correct:Bundle ID matches ✅ Product IDs match ✅ In-App Purchase Key valid ✅ Shared Secret added ✅ StoreKit Configuration: None ✅ Sandbox account configured ✅Is it possible to test purchases while products are in WAITING_FOR_REVIEW status? Or do we need to wait for Apple to approve them first?
Hi RevenueCat Team,We’re currently using RevenueCat to manage subscriptions in our app and had a question regarding real-time updates to CustomerInfo.In our setup, we sometimes grant promotional subscriptions via our backend (outside the client app). While this works correctly on RevenueCat’s side, the updated entitlement is not immediately reflected in the app UI. At the moment, users need to restart the app (or trigger a manual refresh) before the new subscription state is visible.We’re looking for the best practice to ensure the UI updates in real time when CustomerInfo changes(Flutter) due to backend actions.Specifically:What is the recommended way to listen for CustomerInfo updates when changes are made externally (e.g., via backend APIs)?Our goal is to avoid requiring users to restart the app and instead reflect entitlement changes immediately.Any guidance or best practices would be greatly appreciated.Thanks in advance for your help!Best regards,
When can we expect support (react native) for the newly announced monthly subscriptions with a 12-month commitment?
I see that has no real solution. So I wonder if any guide of “how-to” already exist somewhere?
Hi RevenueCat team/community,I'm facing a color rendering issue on Android.Problem: In the RevenueCat dashboard paywall editor, timeline text is configured as white. (both on dark mode and light mode) In the Android app, the same timeline text renders as white for the first step but black for the following steps. This is not related to light/dark mode logic (I've tested both modes and forced configurations). also some text does not respect the size configured Setup: react-native-purchases: ^9.10.4 react-native-purchases-ui: ^9.10.4 Expo SDK : 54.0.33 React Native : 0.81.5 Screenshots :correct paywall on the dashbord what i have on my phone Has anyone encountered this specific timeline text color discrepancy on Android? Any known workarounds or config fixes? thanks,
I created a test store and products/offering using this tutorial. I then checked the products in the dashboard to edit them, but can’t seem to edit the price I’ve initially set. I can only edit the name/customer facing details. Is this intentional?
I’ve set up a paywall by following this tutorial, and with a Test store set up and paywall, I want to use this only in the dev/debug version of my mobile app. Is it possible to serve two versions of paywalls depending on the build of the app?
I am implementing a subscription in a Flutter app for the first time, and this app is a little bit special with the user account. Being logged in is a premium feature. Premium gives you the possibility to download other users published content, backup to the cloud, sync of your data between devices. But… 1. You don’t HAVE to login.2. You have to get premium first to be able to login .So I did what I thought was right, I just use the anonymous id until the user logs in, then they are also logged into revenuecat with their firebase uid. The problem is that they could log out, and then log in with another account. The they’re logged in to revenuecat with the new uid. But I noticed some problems. I did this:1. Get premium2. Login3. Log out4. Log in with another accountAfter step 4 the premium went away and I couldn’t restore it. I’m not loggin the user out from Revenuecat at any point, since that also made me lose premium.Now I’m leaning more towards just skipping logging the user into rev
Hi all,This is an Android issue, I’m currently not targeting iOS. I’m calling GetOfferings and it’s returning the offering, but the offering contains only one product, which is a non-consumable product. I also have two subscriptions which are not returned. I am currently using IapHub to handle my inapp purchases and everything works great there. But I would like to migrate to RevenueCat.The app is running on the closed test track and I am a tester. This is my configuration: Google Play:Non-consumable product. This works Subscriptions. Not working And TLDR:getOfferings only returns the non-consumable product, not the subscriptions Android only, app running in closed test track, I am tester RevenueCat Product ID’s match with Google Play Store (see screenshots) Inapp purchases currently work using IapHub, but I want to migrate to RevenueCatCan anyone spot what is going wrong here?
It seems KMP library isnt compatible with exit offers, is it planned?
I’m using RevenueCat to display paywalls and have created multiple offerings for different targeting groups. In my Flutter app, I want to show different paywalls to different users based on the offering.I’m displaying paywalls using PaywallView from the RevenueCat SDK and passing a specific offering to it. However, instead of showing the selected offering’s paywall, it always displays the default offering’s paywall.I fetch offerings at app launch, and based on debugging, the offerings appear to be valid and correctly retrieved.This setup used to work as expected, but recently it stopped working. I’m currently using the latest version of the RevenueCat SDK (9.15.1).Has anyone experienced this issue or knows what might be causing the SDK to ignore the passed offering and fall back to the default one?
I am trying to test some Android entitlement stuff and Sandbox seems broken.If I use an Android simulator:isActive is false on the entitlement I purchased in the sandbox environment no matter what I do. I can re-call getCustomerInfo or any other method and it will always be false. isSandbox is true, dashboard says sub is active. Confirmed anonymous IDs match.If I use a device:CustomerInfo’s entitlement is null when trying to get it with the entitlement ID.I verified that it is supposed to be active in the RevenueCat dashboard, and it is renewing once or twice. But isActive never becomes true, or on a real device it will always return null for all the entitlements.Yes it is the most up-to-date version.The app has been out for an extremely long time, so it’s not something like “sometimes it takes awhile when releasing an app!” All configuration is correct because everything worked fine before and nothing has changed.This was not happening at some point and nothing has changed on my end.T
I am currently trying to implement family sharing by using tabs on the dynamic paywalls but what I noticed is that the selected package does not change based on which tab the user is on. It remains either the default package on paywall load or until they change it. Is there a way to have a default package for each tab? I really could use someone’s help.
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
Our app offers a single subscription, with a monthly and an annual payment plan (in Google Play terms, one subscription with two base plans). Subscribed users can access the whole content of the app without limitations.For better flexibility, we also offer subscribed users to switch the payment plan. Since this is a single subscription, we have to use the WITHOUT_PRORATION replacement mode. We build our purchase params like so: PurchaseParams.Builder(activity, subscriptionOption) .oldProductId(currentSubId) .googleReplacementMode(GoogleReplacementMode.WITHOUT_PRORATION) .build()Here is the problem: When a user is currently running with a subscription that has been restored (via the Purchases.sharedInstance.restorePurchasesWith(onError, onSuccess) method), it is no longer possible to switch the payment plan. For the “Transferring purchases seen on multiple App User IDs” setting, we use “Transfer to new App User ID”.The Play Store shows an error message “Error: We are unable to
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.