Get help with your SDK implementation.
Recently active
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
On iOS paywallViewControllerWasDismissed is not called when the paywall gets dismissed.There should also be a way to stop the paywall from being automatically dismissed when the user completes a purchase.No SwiftUI. UIKit.Most up-to-date version. My configuration is fine. Testing on device.
purchases_flutter: latest in_app_purchase: latest Platform: Android Framework: FlutterProblem: After adding purchases_flutter to a Flutter project that already used in_app_purchase, this call queryProductDetails() freezes indefinitely and never resolves:final ProductDetailsResponse response = await InAppPurchase.instance .queryProductDetails(productIds);
Hi, I’ve seen a few open issue more than a year ago. Can we expect it sometime soon?
Since I know manage user IDs, then when a user logs out and logs in with a new user, then I will have two users with unique IDs but the same idfv/gpsAdId. What should I do? They might be the same user logging in or creating a user through a different login, but they also might be a completely new user.What should I do?
If anyone else is struggling with RevenueCat not exposing Google Play's OneTimePurchaseOfferDetails (like Launch Offers or region-specific discounts for In-App products on Android), here is a bulletproof workaround we implemented in production.The Problem: Google Play added oneTimePurchaseOfferDetailsList in Billing Library v6 for in-app products, but purchases_flutter (and the underlying purchases-hybrid-common) currently drops this array when serializing the Native ProductDetails into the Dart StoreProduct. So storeProduct.price just returns the un-discounted base list price.The Workaround: Use the official in_app_purchase package strictly as a "read-only scanner" to fetch the real JSON natively, and keep using RevenueCat for the actual purchase. Add the dependency Add in_app_purchase: ^3.2.0 to your pubspec.yaml. We won't use it to buy things, only to query the Google Play API directly. Create a quick Extractor Service This queries the Google Play Billing Library and finds the low
https://api.revenuecat.com/v2/projects/${project.id}/charts/actives?realtime=false&start_date=${dateStr}&end_date=${dateStr}I want to get the result for a single specific app from the link above.How do I do that?
I have been using revenue cat for over 6 months now and I just started my first price point experiment yesterday. I went to open the paywall today and my app froze. It also froze in my development build and I was able to find the following log. DEBUG [RevenueCat] ℹ️ API request failed: GET '/v1/subscribers/user_1234/health_report' (500): There was an unknown backend error. Internal server error.Request-ID: <DEPRECATED>; Amzn-Trace-ID: <DEPRECATED> ERROR [RevenueCat] 😿‼️ There was an unknown backend error. Internal server error.Code: construct.js 2 | var setPrototypeOf = require("./setPrototypeOf.js"); 3 | function _construct(t, e, r) {> 4 | if (isNativeReflectConstruct()) return Reflect.construct.apply(null, arguments); | ^ 5 | var o = [null]; 6 | o.push.apply(o, e); 7 | var p = new (t.bind.apply(t, o))();I quickly stopped the price point experiment and after a min or two, the error disapp
I beleive I have everything configured properly but testflight shows this when paywall is prompted to show
Environment:SDK: react-native-purchases ^9.8.0 Platform: iOS (Expo SDK 54, React Native 0.81.5) Testing on: TestFlight (physical iPhone + iPad) Bundle ID: com.withim.app API key prefix: appl_Products:com.withim.app.grace_monthly1 (Auto-Renewable, 1 month, 7-day free trial) com.withim.app.grace_annual1 (Auto-Renewable, 1 year, 7-day free trial) com.withim.app.grace_lifetime1 (Non-Consumable) All 3 products are "Waiting for Review" in App Store Connect RevenueCat offerings configured: $rc_monthly, $rc_annual, $rc_lifetimeProblem: When calling purchasePackage(), it immediately throws error code 16 (UNKNOWN_BACKEND_ERROR) with no readableErrorCode or underlyingErrorMessage. The native Apple payment sheet never appears.What works:getOfferings() returns correct products with real prices from Apple (e.g., $3.99/month displays correctly) Purchases.configure() succeeds Purchases.getCustomerInfo() works Purchases work when running via Xcode debug build on physical deviceWhat doesn't work:Any pur
All subscription prices are correctly configured in App Store Connect for all countries and regions. We are currently testing on devices configured for India, where the device region, App Store region, and Apple ID are all set to India.However, during testing in TestFlight, we are seeing inconsistent currency behavior: In our custom paywall UI / RevenueCat paywall, the prices returned from RevenueCat offerings appear in USD ($). When the Apple in-app purchase sheet opens, the price is displayed correctly in INR (₹). Current flow: Paywall (RevenueCat offerings): $ USD Apple Purchase Sheet: ₹ INR (correct) This creates a confusing experience because users initially see USD on the paywall, but the actual purchase sheet shows INR.We have verified the following: Pricing is correctly configured in App Store Connect for all regions. Device region is set to India. Apple ID region is set to India. The behavior occurs on multiple devices using TestFlight. Since the pricing configuratio
Hi, I am using Draftbit (React) with the latest RC SDK (9.11.2) but still get the error specified API Key is not recognized when I am running it on ExpoGo on iOS. What could possibly cause this??? if(uuid) conf['appUserID'] = uuid; if(Constants.executionEnvironment == 'bare') { // check for ExpoGO console.log('Using RevenueCat Test Store'); conf['apiKey'] = APIKeys.revenueCatTestStore; } else if (Platform.OS == 'android') { console.log('Using Android Play Store'); conf['apiKey'] = APIKeys.google; } else { console.log('Using AppStore'); conf['apiKey'] = APIKeys.apple; } await Purchases.configure(conf);The error log:Using RevenueCat Test Store[RevenueCat] 😿‼️ The specified API Key is not recognized. Ensure that you are using the public app-specific API key, which should look like 'appl_1a2b3c4d5e6f7h'. See https://rev.cat/auth for more details.
I saw several messages about how to setup the fonts. I guess the documentation is deprecated, it still mentions that the user needs to put the font in the app directly… but the error message I’m getting on Android with my Expo app points toward some download/caching process. When I try to display my paywall on my android emulator, the log get “Unable to create cache directory for remote fonts” and the app crashes. The emulator might have a low free memory. Is there anything specific (like a permission to grant) to get this fixed on Android? Or is it only the emulator memory that I should flush? If it’s the memory issue, I think some users with low end devices might get an abrupt crash as well.Edit: I can’t reproduce it every time, so that seems to be a memory issue.
Is there a way to show a discounted paywall when user cancels just before purchasing a subscription (not on dismissing it)?Similar to what there is transaction abandon paywall in superwall
Hello everyone,I have a mobile only app in the Google and Apple stores. I have subscriptions set up for Google, but not yet for Apple. Before I finish this, and turn on subscriptions, I’d like to double-check my assumptions.My plan is to turn on subscriptions so that we gain some income, and to then build out the web back end so that our customers can log into the web version and see their data their too. This also provides a back up of their data so that it doesn’t just live on their mobiles.I’m assuming that I can capture unique IDs for each customer as they subscribe, and then use that to create web accounts for them, and then email them details. Does this make sense? I’m not expecting this to be straight forward, but would like to confirm it’s possible. I’d rather start to get revenue in sooner rather than later if possible. I’m hoping this works. But maybe I’ve missed something, or someone’s done this before and can point out ‘gotcha’ points to beware.Thanks in advance.Bruce
Please delete
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
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.