Get help with your SDK implementation.
Recently active
We received feedback from Apple’s app review.Our app is designed with RevenueCat’s “Transferring purchases seen on multiple App User IDs” setting set to “Keep with original App User ID”, which prevents users from making in-app purchases without registering an account. However, Apple’s review guidelines prohibit requiring user registration before allowing content purchases. We would appreciate any suggestions for the best workaround to comply with Apple’s guidelines while maintaining a seamless purchase experience. References:• RevenueCat Documentation: Keep with original App User ID Feedback from Apple:Guideline 5.1.1 - Legal - Data Collection and Storage We noticed that your app requires users to register with personal information to purchase in-app purchase products that are not account based. Apps cannot require user registration prior to allowing access to app content and features that are not associated specifically to the user. User registration that requires the sharing of perso
HiI create one subscription with two base plans(both with free trial offer).one is backwards compatible(monthly),other is non backwards compatibleAnd I created a default offering with three packages,(monthly, yearly, lifetime)when I called getOfferings() to get all available packages I only get monthly and lifetime ,can’t get yearly(non backwards compatible) package.I tried RevenueCatUI.presentPaywall(); It also get only two packages.btw I tried this:https://community.revenuecat.com/tips-discussion-56/google-play-store-non-backward-compatible-not-being-fetched-3888?tid=3888&fid=56 Not workingWhat can I do to solve this problem? Thank u!purchases_flutter: 8.6.1 (I also tried 8.6.0 and 8.3.1)Flutter: 3.27.1com.android.application:8.9.0 (also tried 8.8.0)gradle: gradle-8.12.1-all.zip
Hi everyone,Is anyone here a member of the Play Pass program? We're trying to figure out how to configure RevenueCat to support it properly.Specifically, we’d like to know how we can check if a user is a Play Pass member and, more importantly, how to detect when a user is no longer a member.Any insights or experiences would be greatly appreciated!Thanks in advance!
Getting error from some users around %2Error Code : A network error has occurred. An SSL error has occurred and a secure connection to the server cannot be made.
Hi, quick easy question from a newbie. What I have to use to get the Appstore country used to fetch the Appstore purchases ? Is that in packages? if let packages = offerings?.current?.availablePackages { … Also I need to be able to show the price in the Appstore country Currency , not the locale country, how to achieve that? Thank you.
I’m using Web Billing and want to make sure upgrades work for my customers, without having the possibility they could be paying for two subscriptions at the same time.I have one entitlement (premium) and two products (annual and monthly). I want to allow customers to switch, and have that switch happen at the end of the current period (i.e. end of the month for monthly, or year for annual). Is there a way to do that with web billing? If it must be done by canceling and re-subscribing, and they canceled with time left on the period, are they able to immediately re-subscribe? For instance, a monthly customer is set to renew on March 15, 2025. They want to switch to Annual. Can they cancel and immediately subscribe to annual, but not get charged until March 15, 2025? Or get charged immediately, but have their entitlement extended to March 15, 2026 anyway?Or, is there a way that I can let a Monthly customer subscribe to Annual and then automatically use the API to trigger a cancellation of
My paywall is displaying the default formatting for the android paywall, rather than my custom UI. IOS displays perfectly but I understand it is less opinionated in terms of config.I have put in DEBUG logs but the android one doesn’t appear to get any warnings - maybe failing before it gets to show any warnings. the IOS one gets the following warnings, which may be helpful?LOG [RevenueCat VERBOSE] Looking up localized configuration for ["en-GB", "it-GB"], searching for ["en-GB", "en", "it-GB", "it"] LOG [RevenueCat VERBOSE] Found localized configuration for 'en-GB' LOG [RevenueCat DEBUG] ℹ️ Looking up localization but found no strings LOG [RevenueCat WARN] Could not determine price format because price string is incompatible. LOG [RevenueCat WARN] Could not determine price format because price string is incompatible. LOG [RevenueCat WARN] Could not determine price format because price string is incompatible. LOG [RevenueCat WARN] Could not determine price format because price st
Is there any specific configuration needed for the Flutter V2 Paywall to be displayed on Android?Our Paywall displays correctly on IOS: But it is blank on Android: We hava a very simple flutter code to show the Paywall: Widget getRcPaywall(BuildContext context) { return SafeArea( child: Center( child: Container( color: context.colorsTheme.backgroundColor, // RevenueCat Paywall, this will use the default paywall configured on RevenueCat and render it here child: PaywallView( onPurchaseCompleted: onPurchaseCompleted, onPurchaseError: (PurchasesError error) { scaffoldKey.currentState?.showSnackBar(SnackBar( backgroundColor: MFColor.destructiveRed, content: Text('Unable to make Purchase. Error code: ${error.toString()}'), )); }, onRestoreCompleted: (CustomerInfo info) async {
SDK: RevenueCat 4.0.0-beta.xOperating System: iOS 15.1.1After successfully activating a subscription in the sandbox, calling `getCustomerInfo` and querying the relevant entitlement in `purchaseInfo.entitlements` on the returned `PurchaserInfo` object yields an entitlement with `isActive` set to false.Is this the expected behavior for entitlements when working in the sandbox, or should the relevant entitlement’s `isActive` property be set to `true` after successfully completing a sandbox purchase?
Is this possible thru the paywall builder? Or is this something that needs to be custom created?Thanks!
The response from the "Get Purchases" endpoint (https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/purchases) isn’t ordered by the customer's purchase time. Is this expected? It’s weird that the Customer History is ordered by time in the dashboard, but it’s not in the REST API.
Hey folks! I've just tried using Paywalls v2 instead of my own custom paywall and I find a few things confusing that I couldn't clarify in the documentation or repo. I would love to know how things are supposed to work:If I press "Restore" when there is nothing to restore, I don't get either onRestoreError or onRestoreCompleted callbacks triggered. Nothing happens on the UI - the button changes to a loader for a few seconds and then just goes back to normal. I find it confusing and would expect something to happen to at least notify the user about what's happening. Does the paywall close by itself after a successful purchase? I see navigation happening twice after migration from custom code, where I had a manual navigation call. But when I removed it, my testers said that in TestFlight the paywall didn't close, and moreover they couldn't close it themselves via the close button; only reloading the app helped. I also noticed a new crash that appeared only on the commit adding custom pay
I am trying to set the ‘Fit mode’ for paywall background image to fit but when the paywall is displayed it shown in fill mode. I am trying to check this on simulator and even after restarting the simulator the image is not displayed as expected. Can you please advise on this issue?
Hello!I'm using iOS SDK and I need to send my event reporting metric depending on the purchase or start of a trial period. Can you please tell me if there is a property based on which I can implement the functionality I need? If someone has some developments in the form of Swift code I will be very happy to help.
I’m building a Paywall using the v2 builder and don’t understand how to make the “Restore Purchases” link functional. I was expecting a variable for this that I could drop into into the URL field.I checked the templates that contain “Restore Purchases” and all of them were just a text element with no functionality. Please explain. Thanks
Hi everyone, I’m integrating RevenueCat into my Flutter iOS app, but I’m encountering an issue when trying to fetch products from the App Store. Here’s the error message I’m getting: code: 23, message: There is an issue with your configuration. Check the underlying error for more details. 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). await Purchases.setLogLevel(LogLevel.debug);await Purchases.configure(PurchasesConfiguration("correct key"));try { final offerings = await Purchases.getOfferings(); print('Offerings: $offerings'); if (offerings.current != null) { await RevenueCatUI.presentPaywall(); } else { print('No available offerings.'); }} catch (e) { print('RevenueCat Error: $e');}purchases_flutter: ^8.6.1purchases_ui_flutter: ^8.6.1Setup Details:• SDK: RevenueCat (latest version)• App Store Connect: Subscriptions are set up • Product IDs: They match exactly be
I switched to V2 Paywall, I want to print “Try 7 Days Free & Subscribe” on the purchase button and I tried it like this: Try {{ product.offer_period_with_unit }} Free & Subscribe. This is not working, I want this variable to say 7 Days when monthly package is selected and 14 Days when annual package is selected.
This happens in the sandbox (I haven’t tested it in a production environment yet).Since I’m also using Superwall, I identified the user in the purchase controller on initialization (client) like this: Purchases.configure({ apiKey: REVENUECAT_API_KEY, appUserID }); I’m doing some tests, so I subscribed and I wait for the renewal events to arrive: Why does the first renewal arrive with an anonymous ID, and then it gets fixed in the subsequent event? Is this a sandbox issue?What other info can I provide to help debug this?
I want to do A/B testing for subscription prices on iOS. The revenuecat docs recommends to “Use distinct Subscription Groups on the App Store for each RevenueCat Offering when testing new prices”. Here’s what I would then setup:Price 1 subscription group:Annual - $39.99 Monthly - $7.99Price 2 subscription group:Annual - $19.99 Monthly - $3.99 I start the experiment, some users are being shown the first subscription group, some others the second. A week lapsed, price 1 group is the clear winner, yay! I stop the experiment. The faq says the following: When I end an Experiment, what Offering will be served to the customers who were enrolled in that Experiment? When an Experiment is ended, all customers previously enrolled in it will be served the Default Offering the next time they reach a paywall in your app. Therefore everyone is now presented with the same offering that corresponds to the price 1 subscription group on my paywall. Let’s suppose someone from the retired price
I’m testing my app for which I’ve configured a v1 paywall offering choice of subscriptions and a single lifetime price.The paywall sheet is displaying fine but the offering variable is not translated.I’m seeing offering panels like:First {{ sub_offer_duration }} free, then $7.99/yr ($0.67/mo). I will get around it for now just hard-coding in the values but it looks like a bug.Using SDK via SPM ver 5.19.0cheersAndy
Hi!I’m experiencing an issue (or possibly a missing feature) in Paywall 2.0. In Paywalls templated (v1), everything works as expected.When I tap anything in the paywall that requires a progress view (e.g., purchase or restore), nothing appears. It just leaves me waiting until the pay sheet pops up (for purchases). For restores, nothing appears and then the paywall dismisses. This could make users think their tap didn’t register, they need a loading indicator to know some stuff is happening. Do I need to adjust how I’m initializing the paywall, or is this a bug/missing feature? iOS version: 18.2.1Purchases SDK version: 5.17.0 Here’s how I’m presenting the paywall:PaywallView(displayCloseButton: true) .onRequestedDismissal { self.showPaywallView.toggle() Task { await self.purchasesManager.processInfo() } }BTW, I tested presenting the paywall in different ways (e.g., using `.presentPaywallIfNeeded`), but I got the same behavior.Would appreciate any guidance on this. Th
I am developing a Flutter app using Revenuecat Paywalls V2, my understanding is that Paywall V2 are only available on iOS for flutter, however I found this comment on a post last month saying it will be available at the end of last month, is there any update on this?
.sheet(isPresented: $paywall.displayPaywall) { PaywallView( offering: paywall.selectedOffering ?? Offering(identifier: "default", serverDescription: "default", availablePackages: []), displayCloseButton: true) .onPurchaseCompleted({ customerInfo in analyseFood() }) .onRestoreCompleted({ customerInfo in analyseFood() }) .ignoresSafeArea() }iOS 16.7.10RevenueCat 5.16.0The iOS version is a bit old but I use a separate phone with a sandbox account for testing purchases though. These callbacks are never called onPurchaseCompleted and onRestoreCompleted, also after test/sandbox purchase the Paywall doesn’t dismiss itself and stays on the screen. I have another screen written with UIKit and everything is OK with the Paywall UI invocation but SwiftUI version has weird problems
Hello, We noticed that all our users on RevenueCat dashboard have “Transfer to new App User ID” as a transfert behavior, is it normal?I’m wondering if we are doing something wrong here. Thank you for your help!
I use Webhooks to register purchases and unlock premium features for the account that purchased the product. I have made a purchase with one Account, lets call it User A. After the subscription expired, I logged in with a different Account, lets call it User B. Of course I called Purchases.logIn(UserB.id) in my app. I then purchased the subscription again and confirmed that it uses User B’s id as the app_user_id in my app. However in my Dashboard and my Webhook it still shows that User A made the purchase.This happend in a Sandbox environment and I used the same Apple Id for both purchases. My RC Project uses the Restore behavior “Block restores”.Can someone explain this behavior to me? I had expected that the Customer Id in my Dashboard is always the app_user_id that makes the purchase in the frontend. Is that not the case? I’m really confused and couldn’t find anything about this behavior in the docs.
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.