Discussion and help from anything related to RevenueCat.
Recently active
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!
I want to generate codes that offer a free year of subscription and use Web Billing for this. Is this possible?
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
setAppsflyerID(AppsFlyerLib.getInstance().getAppsFlyerUID(context))The source code above is used to set the AppsFlyer ID.But it only works the first time. Consider the use case below:The user install the app and open it. The setAppsflyerID is executed, setting the ID to "AAA-AAA" The user uninstall the app The user install the app again The setAppsflyerID is executed, setting the ID to "BBB-BBB"From now on, on AppsFlyer the user is "BBB-BBB", but since the set does not work on RC, it stays as "AAA-AAA", making any type of integration between platform impossible, because they are referring to different users. Does anyone else have the same issue? For some reason is this the expected behavior? If so, what will happen for the use case I mentioned? *The same behavior happens on Android and on iOS.
What would be the best way to give the user a free month if they are already had a subscription? We want to implement a referral reward system in our app and the user can redeem multiple free months separately so we would want them to stack if possible.I’ve seen that both iOS and Androids have Promo Codes we could give to users but those seem to be for new users:https://docs.revenuecat.com/docs/ios-subscription-offershttps://docs.revenuecat.com/docs/android-promo-codesI did see that RevenueCat has an API to extend this as well, but wasn’t sure how that would work. Is RevenueCat that one that tells Apple or Google to charge for the subscription again? If not does it tell Apple or Google to not charge until a certain time? Do they stack? Here is the url to the API:https://docs.revenuecat.com/reference/grant-a-promotional-entitlementThanks for the help!Asher
Is there a way to add user info when they purchase, like email for example?
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 am integrating Stripe with the Pricing Table component for subscription management, but I’m facing an issue: this component doesn't allow passing metadata during the checkout process. Currently, we store the app_user_id value in the metadata of the Stripe Customer.Is there a way to pass this app_user_id or other identification values to RevenueCat after the subscription is created via the Pricing Table? We want to ensure that RevenueCat associates the purchase with the correct user using this data.
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?
is there a way to show dynamic text in my paywall ? For example when user selects the yearly plan they see the text "START MY 7-DAY FREE TRIAL" and for monthly plan they see the "START MY JOURNEY" in the CTA button.Currently when the user selects either of the pricing plan, they see “START MY JOURNEY”
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)?
Hi,Clearly I don't understand what RevenueCat is suppose to do. I must be missing something. I have an App on the App Store and Play Store that already has a number of subscriptions, been live for a year. I’d like to start aggregating data, Rev Cat to the rescue! So I set up the project, the access keys and everything all. I get “Valid credentials”. All seems to be happy days so far! So a tap on Charts and … nada.Cleary I must be too dumb for RevenueCat...
Hey i get an error when i paste in the json file in te android app config. Could not validate subscriptions API permissions Could not validate inappproducts API permissions Could not validate monetization API permissions any ideas where i can read how to troubleshoot? they dont have anything on theyr website (or i cant find it)
How do I create a footer-only v2 Paywall and display it in native Android below another @Composable?
Greetings. We have two account types; one is for regular users (A) and one is for companies (B), and respectively have two subscription groups. Regardless of what transfer configuration I pick in the RC settings, switching account and purchasing a subscription will either transfer subscriptions from account type A to account type B (Transfer to new app user id) or subscriptions made in type B will always be set to account type A (Keep with original app user id).How can I resolve it? Each of these subscriptions cost and behave differently.
Hello RevenueCat,I can see some similar topics, but i didn’t understand clearly the solution. As there are multiple topics on Stack Overflow, discords and more I think no one can find easily a clear solution.ContextI’m inside my test app using the SandBox mode. I’ve set the option ‘Keep with original App User Id’ because I don’t want to let an user the ability to transfer to someone else his subscription. All users have an account and I well use the `Purchases.configure()` and or `Purchases.logIn()` methods to handle that. I’ve 2 google accounts on my Android Emulator (ex: bob-example@gmail.com and alice-example@gmail.com). My app have a subscription mode to let creators access some premium contents. ScenarioI open the app and I login to bob-example@gmail.com, then I open the RevenueCat Paywall to buy a subscription. It works well, bob got his subscription.I logout bob.I login alice-example@gmail.com and I open the RevenueCat Paywall, as alice has no subscription. I try to buy a subs
I don’t understand how this is possible. I have got my ios app(flutter) published in app store some time ago. Before I tried some purchases with sandbox account (german). And they are listed in sandbox purchases without issues. I also had some production purchases as well. Then it stopped.Today when I check my sandbox account, I see some american accounts made in app purchases. It is definitely not me as I have only 1 sandbox account and it is german account.Firebase also reports in_app_purchase events.I thought RC detects prod vs debug environments.Am i overlooking something? Did anyone experienced something like this before?I build my app for app store with: flutter build ipa --release
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 am trying to implement the new RC v2 paywall into my app without bothering my usual developer friend. I can get the paywall to load perfectly in xcode preview but when I try running in the simulator I keep getting an error message stating that “purchases has not been configured”. Any ideas?
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}
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.