Get help with your SDK implementation.
Recently active
Hi there,I saw a post 6 months ago saying customising fonts for Flutter Paywalls was on the list and can see that it is an option in the paywall editor, just not accessible/working for Flutter. Is this now updated? I can’t seem to customize my fonts for my paywall at all
We’re working on migrating our in app purchase code to StoreKit 2 and to stop using “receipts” for purchase verification on iOS. We manage this ourselves so we can update information in our backend when a purchase is made. But I want to send the transaction to RevenueCat. The documentation for `v1/receipts` is not 100% clear to me. Does the `fetch_token` support both the legacy receipt and a `jwsRepresentation`?
“RC doesn’t automatically cancel a subscription if a user purchases a different IAP (e.g., lifetime package). For Apple, though, developers aren’t allowed to change a user’s subscription, so you should instead notify your user to cancel their annual subscription if they purchase lifetime as well.”Sorry for the long post but with the above context, but I have some questions around my iOS App.Do you mean we should detect the above activity after user has purchased and then notify them to cancel?Can we notify the user about this when the user is about to buy an IAP inspite of having a subscription and vice-versa? If we are using the configurable paywall v2 - presentPaywallIfNeeded - will this case be handled automatically? Apple servers are down today so unable to check this scenario.I have gold monthly, gold yearly, and platinum lifetime, all configured under 1 entitlement and showing up on the paywall and I am relying on the configurability of the paywall to handle this type of scenario
I saw this post in which RC says that paywalls generated by RC must always be swipe-down-able, or dismissible.That means it’s not possible to use a RC paywall as a hard paywall that cannot be dismissed?I’m sorry but that’s whack.Can you please change this and allow paywalls to exist as full screen experiences that cannot be dismissed?
Hello team!I’m configuring a Paywall with the new v2 version. For iOS I’ve managed to make it work perfectly.Now, on Android it seems to be all correct, but the paywall shown is not the one I have configured, it seems a basic default one.I’ve checked and I have the correct Products and Offerings, as I always check it with the getOfferings function in the app.What I can do, do you know what could be the problem?Thanks!
In my Android Jetpack Compose app I am using com.revenuecat.purchases:purchases 8.14.0 and com.revenuecat.purchases:purchases-ui 8.14.0. The paywall is displayed like this: import com.revenuecat.purchases.CustomerInfoimport com.revenuecat.purchases.models.StoreTransactionimport com.revenuecat.purchases.ui.revenuecatui.Paywallimport com.revenuecat.purchases.ui.revenuecatui.PaywallListenerimport com.revenuecat.purchases.ui.revenuecatui.PaywallOptions...Paywall( PaywallOptions.Builder({}) .setListener(object : PaywallListener { override fun onPurchaseCompleted( customerInfo: CustomerInfo, storeTransaction: StoreTransaction ) { if (customerInfo.entitlements.active.containsKey(ENTITLEMENT_ID)) { setShouldPaywall(false) } } override fun onRestoreCompleted(customerInfo: CustomerInfo) { if (customerInfo.entitlements.active.containsKey(ENTITLEMENT_I
HiI implemented RevenueCat in my Flutter app. Now I am testing on my real Android device. It usually works, but sometimes not as expected.My greatest concern is that sometimes SandBox data and Play Store data aren’t synchronized. I made a purchase and it renewed 5 times as I can see on Play Store, but on Sand Box Revenue data it says it renewed only 2 times (once it was 4 times, and in other occasions it was 5 times as it should be). What does this mean? If user renews subscription, user will see he is subscribed on Play Store, but he won’t have premium access since I only rely on RevenueCat regarding someone is premium or not. How is this possible to not have full synchronization? This is major bug.
I just started using the Paywall editor to test the new Paywalls, and even though I have set text color of white in multiple instances (CTA button, text inside Paywall), the text has different color when I test it in the android emulator. I am using the Paywall composable as suggested by the docs (code is in kotlin for Kotlin/Compose multiplatform projects). Is this an SDK problem? Does anybody know? val options = remember { PaywallOptions(dismissRequest = { navigator.pop() }) { shouldDisplayDismissButton = true } } Paywall(options)I want to include an “Edit Text Field” where the user can type a discount code, and activate therefore another offering by clicking a button after they have typed the correct code. Is there a way to do that with the Paywall SDK?Thank you.
Hi guys,Our Google Cloud API usage by service credential given to RCis very high and we are trying to figure out how to optimize this.The first thing we notice from our Google Cloud dashboard is that RC is calling two similar APIs but with different versions:androidpublisher.SubscriptionPurchasesService.Getandandroidpublisher.SubscriptionPurchasesV2Service.GetThe failure rate of the first one is 100% and we are getting over 100k requests of this per day.How can we turn this off?If not, then is there a good reason for having this?
I am trying to keep track of which consumables have been awarded to the player and need to track it with a unique identifier for each purchase. In the Unity SDK, the StoreTransactions that I get in the CustomerInfo.NonSubscriptionsTransactions have a property called TransactionIdentifier. However, this does not match the transaction_id I see online in RevenueCats front end.Question 1: Why does the TransactionIdentifier not match the tranaction_id that i see in RevenueCat online?Question 2: Since I cannot access the tranaction_id in Unity, is the TransactionIdentifer that right way to uniquely track a consumable purchase and will this value persist for the lifetime of the user?
About ¼ of our users’ attempted subscription purchases on iOS are failing with errorcode 2 (store problem). There are no underlying errors that we can see, but this error message in the logs is present for almost all of them (PID is different each time):Product purchase for 'pro_plan_quarterly_24' failed with error: systemError(Error Domain=NSCocoaErrorDomain Code=4097 "connection to service with pid 13290 named com.apple.storekitd" UserInfo={NSDebugDescription=connection to service with pid 13290 named com.apple.storekitd})We’ve found this difficult to reproduce on our own devices. We’ve found that when it does happen, then if we press the button to start the subscription purchase again then it does usually work the second time.Our integration involves AppsFlyer, Superwall, and Amplitude.We put in additional logging to try to catch whatever the problem is. Since then we are seeing this happening across iOS 18.3.1 and 18.1.1, but it’s happened on other versions before then.
I am upgrading to use the RevenueCat’s own configurable paywall (most likely going to use V2 so I dont have to upgrade later). I am currently using custom hardcoded UI for various versions of the paywall in my app.I am wanting to use slightly different messaging on my paywall depending on where in the app it is opened from - for example one when you initially introduce a premium offer, vs one where someone is trying to access content that is only available in the premium offer. I have one offering. Is this possible?
I'm integrating the RevenueCat Web Billing SDK into my web app, and I'm experiencing an issue where the Stripe checkout iframe does not fully display.Issue Details:When I click "Start Free Trial", the RevenueCat paywall opens as expected. After entering my email, the next screen (where Stripe should load the secure checkout UI) only shows the title and a grayed-out "Start Trial" button—but no credit card form appears. The Stripe iframe is present in the DOM, but its height remains 2px, and its opacity stays 0. I tried putting height at auto, didn’t change anything. (see screenshots below)What I’ve Tried:Verified that the user appears in the RevenueCat dashboard after authentication. Ensured that the correct offering and products are configured in RevenueCat. Checked browser console logs—no specific errors related to Stripe, but I randomly get 400 Bad Request errors from https://e.revenue.cat/v1/events. Confirmed that RevenueCat properly initializes and fetches offerings before triggeri
Hi team, I saw there are new templates for Paywalls v2, so what templates are good for one-time-purchase (Non-Consumable IAP)?
How do I create a footer-only v2 Paywall and display it in native Android below another @Composable?
I’ve integrated RevenueCat into my Flutter app, and subscriptions are working perfectly in local development (tested on a real device using StoreKit). However, when testing the same build on TestFlight and Production, in-app purchases fail.What I Have Tried:✅ Verified that the same bundle ID is used across development, TestFlight, and production. ✅ Checked that RevenueCat is correctly initialized with the right API key. ✅ Ensured that the App Store "Paid Apps Agreement" is accepted in App Store Connect > Agreements, Tax, and Banking. ✅ Created and assigned sandbox accounts (iOS 18 moved this to Settings > Developer > Sandbox Account). ✅ Removed the StoreKit configuration file from the Release Scheme in Xcode to ensure real App Store purchases. ✅ Checked that my in-app purchase products are approved and in "Ready to Submit" or "Waiting for Review" state in App Store Connect. ✅ Ensured the App-Specific Shared Secret is added to RevenueCat.✅ Tried waiting a few hours in case purc
I’m unable to get the onPurchaseCompleted handler working while testing the purchase. This handler manages the post-purchase UI updates. I am using paywall version 2 PaywallView().onPurchaseStarted{ _ inprint("onPurhaseStarted: ")}.onPurchaseCompleted{ _ inprint("onPurchaseCompleted: ")isPaywallPresented = false}.onRestoreStarted {print("onRestoreStarted: ")}.onRestoreCompleted{ _ inprint("onRestoreCompleted: ")isPaywallPresented = false}.onPurchaseFailure { error inprint("purchase error \(error)")isPaywallPresented = false}.onRequestedDismissal {print("onRequestedDismissal: ")isPaywallPresented = false}.onDisappear {print("ModalView dismissed") // Action when dismissed}
Hello,The question is about Flutter SDK on iOS.I noticed the following behaviour for RevenueCatUI.presentPaywallIfNeeded and RevenueCatUI.presentPaywall:- If the app was in the background, and I call “await RevenueCatUI.presentPaywall(...)” right after the app is resumed, the call never returns (awaiting forever).- Everything works if I add 500-1000 ms delay after the app is resumed.Could someone explain why is this happening? How can I wait for the SDK to be ready to show the paywall without adding an explicite delay?I tried:- await Purchases.getCustomerInfo();- await Purchases.getProducts();- await Purchases.getOfferings();Nothing from this list helps, only the actual delay does.Thank you.
Hello,We have started using Revenue Cat to manage in-app purchases, but we are having trouble recovering purchases that were not made via RevenueCat on Android. We login the user via SDK using Purchases.sharedInstance.logInWith("our-custom-user-id"). We wait for a successful response and if the user is logged in for the first time, we call Purchases.sharedInstance.syncPurchases() to sync the purchases not made via RevenueCat. The problem is the "timeline" of events. See screenshot.The webhook for the purchase was sent with an anonymous user ID because an alias was not created at the time. We are unable to sync purchases on our backend with an anonymous user id. Since the "SUBSCRIBER_ALIAS" webhook is deprecated, we are unable to wait for this webhook and sync purchases after that. Please help. Do you have any solution for this?Thank you in advance for your reply.
Hi,How can I check if a user has canceled a subscription or trial?If a user has canceled a subscription, his status is active until its expiration date. It's the same with the trial period. Is it possible to determine it was canceled, but at the same time it is still valid? Thanks
Hi!The product (Flutter) I’m currently building has users both on a web app and in a mobile app.One use case I’m struggling with currently is that a user might buy a premium subscription from the web app through Stripe and then open the mobile app which might have cached the CustomerInfo object for at ~5 minutes.Due to the caching, the user will not immediately see the subscription in the app which is not ideal as it can cause confusion. What are the best practices to deal with something like this?Edit:I know about the invalidateCustomerInfoCache() function. I’m interested to know if there is a recommended way to use that function. Any help and tips are appreciated!
I have the following code, but only the paywallViewControllerWasDismissed method is being called. Other PaywallViewControllerDelegate methods are not triggered. Any solution for this? import Foundationimport RevenueCatUIimport RevenueCatimport UIKit class RevenueCatManager: NSObject { static let shared = RevenueCatManager() private override init() {} func presentPaywall(from viewController: UIViewController, offeringID: String) { Purchases.shared.getOfferings { (offerings, error) in guard let offering = offerings?.offering(identifier: offeringID) else { print("⚠️ Error fetching offering with ID: \(offeringID) - \(error?.localizedDescription ?? "Unknown error")") return } DispatchQueue.main.async { let paywallVC = PaywallViewController(offering: offering) paywallVC.delegate = self paywallVC.modalPresentationStyle = .fullScreen viewController.p
I'm using getCustomerInfo on the splash screen to check the subscription status when the app is opened for the first time (where the cache is empty). However, I’ve noticed that getCustomerInfo sometimes takes 10-20 seconds to fetch data, which is too long for a smooth user experience.Since I’m not using a server-side solution, what are the best practices to speed up this process purely on the client side? Would pre-fetching, background loading, or specific configurations help reduce the delay?Any insights or recommendations would be greatly appreciated!
I am only using ios products currently. The information pulled is incorrect and there are multiple errors. For example, one product is a yearly subscription of $12.99, but the price is $11.88 and there are prices for monthly and weekly subscriptions. I can’t complete testing with the inaccurate data, but I have found no issues in the xcode files or apple store.
Hello, We are seeing a weird behavior for some of our users: after purchasing a subscription they are not premium. To actually become premium, they need to do a restore of the purchase. Do you know what could be the issue? Thanks!
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.