Discussion and help from anything related to RevenueCat.
Recently active
I’m using Cordova, in app purchases work perfectly on iOS, however on Android i keep getting the following error when i try to make a purchase:Cannot read properties of undefined (reading 'INAPP')Obviously this is referring to Purchases.PURCHASE_TYPE.INAPP in the code below, but i cannot figure out a solution to this after a ton of googling and whatnot, can someone give me some suggestions/pointers please?async function triggerPurchase(productId) {if (device == "ios") {const { customerInfo, productIdentifier } =await Purchases.purchaseProduct(productId);else if (device == "android") {await Purchases.purchaseProduct(productId,({ productIdentifier, customerInfo }) => {},({ error, userCancelled }) => {},null,Purchases.PURCHASE_TYPE.INAPP);}
You currently do not have analytics endpoints for developers. Do you have plans to add some endpoints for analytics data similar to your Chats dashboard in the future?
In this scenario, users have subscribed to a service using the same Gmail or Apple email on their mobile devices but have logged in with different email addresses and passwords on each device. The objective is to restrict access to the subscription service to only one user at any given time, while preventing others from using the same Gmail or Apple email on multiple devices. To address this, implementing robust user authentication mechanisms, allowing only one active session per user, implementing session timeouts, providing user notifications, offering account management options, and communicating a clear subscription policy are key strategies to ensure that only one user can utilize the subscription at any given time.
How to offer permanent discounts on subscriptions?We currently offer two subscription plans, monthly, and yearly. Everything is setup and works fine so far. What we would like to do, is for our affiliate program, offer a % discount to people are referred to the app using a discount code. We track and setup this separately, so we can pull a different “offer” from revcat. We’re just not sure how to configure this so that users can’t see all of our subscription pricing from the native subscription management pages. I saw that iOS offers “discount codes”, but we aren’t giving unique one-time use discount codes to customers (many customers will show up with the same “referral code”). If someone gets referred to the app, we want to show them a separate set of subscriptions. However, on iOS, it seems like the user can switch between all available subscriptions via the iOS subscriptions manager. We don’t want to show (or allow switching to) these other plans for users that didn’t come
First I want to thank you for the great platform! What happens if an anonymous user purchases on device A, then restores (still as an anonymous user, but presumably with a different anonymous user ID) on device B? The docs say, that if my app “Does not have any login mechanism and only relies on RevenueCat anonymous App User IDs.”, I should choose “transfer purchases”.I want to make sure, that in the case described above, the user has access to the purchase on their Devices A and B (both logged in with the same App Store User that performed the original purchase on device A).So will device A lost access to subscription? Or both devices will have access to the subscription?if so, does this mean that one person can buy a subscription with one account and distribute it?What happens if an anonymous user purchases on device A, then restores (still as an anonymous user, but presumably with a different anonymous user ID) on device B and then restores to device A again?Thank you
In Android, a method called "showInAppMessages" was added from PBL4.https://developer.android.com/google/play/billing/subscriptions#in-app-messagingThis feature allows users to receive notifications once a day during a grace or account suspension period and request payment method corrections within the app.This feature allows developers to restore a certain percentage of users who unintentionally cancel their subscription back to purchasing status.Is there no method in the RevenueCat SDK that calls an equivalent of this method?Or is it possible to use this method while coexisting with the SDK by implementing and calling it natively?
our in app subscriptions was working in develepment and testflight till we got approved on the app storenow it only works in the debug version the app status is ready for sale and all the products are approved the app has been released for 72 hours but the products still come empty i know it may take up to 24 hours for the products to show up but 72 hours is a concerning as i have not seen any one say it took this long is there a way to check if something is wrong or if we are missing any configration ?
Hello all,I have a question about how often I should call getCustomerInfo(). I am setting up RevenueCat in my SwiftUI application like so, based on the Magic Weather SwiftUI sample app @MainActorpublic class RevenueCatSingleton: NSObject, ObservableObject { public static let shared = RevenueCatSingleton() @Published public var customerInfo: CustomerInfo? { didSet { isUserPremium = customerInfo?.entitlements["plus"]?.isActive == true || customerInfo?.entitlements["mega"]?.isActive == true || customerInfo?.entitlements["epic"]?.isActive == true if customerInfo?.entitlements["epic"]?.isActive == true { currentUserSubscriptionLevel = .epic } else if customerInfo?.entitlements["mega"]?.isActive == true { currentUserSubscriptionLevel = .mega } else if customerInfo?.entitlements["plus"]?.isActive == true { currentUserSubscriptionLevel = .plus } } } @Published public var isUserPremium = false @Published public var currentUserSubscription
I have followed the guide for setting up the Stripe integration webhook and the webhook https://api.revenuecat.com/v1/incoming-webhooks/stripe/<my_revcat_app_id> does receive 200’s. However, no handling of the events are taking place on the revenue cat side for the customers involved in the webhook events. I suspect this may be due to revenuecat not being able to identify from the webhook payload which customer the event pertains to. What additionally needs to be done for this webhook to handle customer subscription updates from the stripe event? Is there a way to see why these events are not being handled?Thank you
Hi everyone,we had recently the case that some user registred 20 times in our app, bought in app purchases for each account and canceled the purchase afterwards on google. This worked pretty fine for him (no idea why google doesn´t realize this) and is pretty bad for us since we had costs serving the user but receive nothing since the user has canceld the in app purchase.Unfortunately it´s a no-go to let the user wait 2h or 2days (still not sure what is correct) unitl he receives his purchase.How does the revenue community handle this kind of problem?
Hi, we are having an issue where our offerings are not available. I’m testing on the latest xcode simulator for iOS. I have confirmed the bundle ID in xcode matches with that in revenuecat. I have also confirmed that the product identifier matches with what I am seeing in Apple. Our app is not on the app store and we don’t have a separate prod/dev environment. What could possibly be the issue? I tried going through the steps for the post regarding offerings not showing but I’m unable to figure what is wrong.
If I have an app and I want to use ChatGPT, I know not to put the API key hardcoded in the app. So I put it on my own server. What is the strategy for making sure only allowed users can access my app?For instance, if in my app I require that the user have a subscription to access ChatGPT’s OpenAI endpoint, could I send the anonymous ID to my server, verify that the user is subscribed, and then perform the OpenAI endpoint relay?Or should I be doing some additional signing in, like with Sign in with Apple?Thanks!
The function Purchases.getCustomerInfo() takes anywhere from 3 to 10 minutes to pull data for the first time the app is installed from TestFlight after upgrading to RevenueCat 4.25.9 ( react-native-purchases@6.6.5 ).It works as expected when installing from Xcode directly on device and using a Sandbox user. Not sure if there is an issue in production, but I’m afraid to make a release because of this. Anyone else encountering this problem?
In our test, SDK sometimes crashed. It is a bug of SDK confidently.All information in attachment.
I want to offer the possibility for a user to manage several teams with individual subscriptions for each team. I have read in Apple’s documentation that in order for a user to have several subscriptions for the same app, those subscriptions must be associated with separate subscription groups. But the example they give (different channels) makes it possible to have those subscription groups pre-determined. I can’t do that in my case. Is there a way to support this scenario with in-app purchase subscriptions?
Hey all,I recently created a Paywall for my main offering, and installed v4.26.1 via SPM. RevenueCat and RevenueCatUI dependencies installed correctly. I am using UIKit, not SwiftUI.When I follow the instructions to present an RC paywall from my view controller, the app tries to present something, but the paywall isn’t there. The view controller just gets dimmed and unresponsive. I’m connected to the internet on the test device, and I made the paywall VC an instance variable just in case it was getting garbage collected. Nothing works … any help here would be invaluable.
Hey,My mobile game (I'm using unity SDK) got rejected by the google play store, the screenshot they provided of my paywall shows that the offers weren’t properly shown.We didn’t change the paywall in this submission, and it seems to be working fine on the live version and on iOS.When digging a bit on the potential reasons why, I found out that it is potentially related to the currency info or price property of the packages. I know for a fact, from previous screenshots they sent me, that play store reviewers are sometimes from countries where my subscription offers are not available (India or Pakistan I think).I feel this is conflicting with the fact that my app needs to get access to currency info and package price in order to show the offers.How does revenue cat handle that weird case where the paywall is supposed to show offers that are actually not available to the playstore reviewer given its unsupported country ?Any help appreciated thanks !
The new revenue cat v4 SDK for iOS is very difficult if not impossible to mock for unit testing purposes. Some of the contributing factors that make mocking difficult are:The majority of classes like Offerings, Offering, Package, etc are marked as final so they can’t be subclassed. So something like class MockOfferings: Offerings {} cannot be done. The majority of initializers for classes like Offerings, Offering, Package are internal so they cannot be called from outside the packageThese issues are blocking upgrading to v4 since it breaks all the existing unit tests without a new way to fix them. Is there any sample code available that successfully mocks the RevenueCat SDK?
After tapping on purchase, I am getting this error. Currently, I am using TestFlight.ERROR: The information associated with this PromotionalOffer is not valid.
I’m new to RevenueCat, read the setup docs, watched some YouTube videos, and I got everything working so far. But I ran into a problem after making a test purchase on a real device.A- In viewDidLoad I run fetchCustomerInfo() to check if the user has subscribed or not. When the user hasn’t, the subscribe and restore buttons are shown. I press the subscribeButton and the transaction is successful. I stop the app, and when I restart, the buttons don’t show, which is correct.B- In Xcode I go to Debug > StoreKit > ManageTransactions > I delete the Transaction, and it says No Transaction.C- I stop the app, open the app back up, and the buttons don’t show, but they should show because there aren't any transactions. I check the flow in step 2 again and it still says No Transaction.D- I go to the RevenueCat console, Projects > My Project > iOS > Customers > Active/Sandbox/Non-Subscription/Expired, there aren't any customers in either of them. There is no data whatsoever.E-
I have a React Native app for iOS and Android and I want to show users a yearly subscription option with a 1 week free trial:I don’t want to show different users different options I don’t want to do something different on Android vs iOS I don’t want discounts or promos So far I have:RevCat SDK installed and getting offerings My IAP created on the App Store And on the Play StoreBut I am just so so so lost. The offerings returned, as a json string, is literally 18768 characters long (without any whitespace), and nowhere in this monstrosity can I find:The actual name of my thing* properly included that I can use. ‘product.title’ is wrong. I’m working on Android first and this appends the name of the app. ‘serverDescription’ seems to not be meant for user facing use? And that’s it. hundreds and hundreds of fields...no name? This is despite the fact that I’ve inputted the name of my product in at least four different places (in Google Play, in my product display name, in my offering des
I've been working on adding Stripe Checkout to my existing app (both Android and iOS) for web checkout. Now I need to add a 'Manage Subscription' button within the app for users to easily navigate to where they can manage their subscription.I tested subscribing a user with Stripe but the managementUrl returns null. Is this the expected behavior?If so, it would be nice to make that clear in the documentation.I have a function which I call to create a Customer Portal Session for the purpose of redirecting users to manage their subscription. I'd be curious to know what is the type of link returned if there is one for the Stripe case because I thought we should be generating a Portal Session through our own backend.
How would one go about structuring entitlements in a scenario where a “Premium subscription” will grant access to 10 cake recipes per week. However, if you’d like to get more cake recipes after hitting the limit, you’ll need to make a one-time payment.
Hello, I’m struggling with the RevenueCat update from 5.x to 6.4.0 on Android. I have currently a method to load the weekly subscription, however product doesn’t have subscriptionPeriod any longer. fun loadWeeklyProduct(onPackageLoaded: (Package?) -> Unit) { Purchases.sharedInstance.getOfferingsWith( { error -> // An error occurred }) { offerings -> val annualProduct = offerings.current?.availablePackages?.firstOrNull { item -> item.product.subscriptionPeriod == "P1W" } onPackageLoaded(annualProduct) }}And with this other method I would check if they still are eligible for Trial. Sadly product also no longer has any freeTrialPeriod. private fun fillTrialOrNormal(it: Package) { val hasFreeTrial = !it.product.freeTrialPeriod.isNullOrEmpty() Utilities().checkTrialUsedUp(it.product.sku, hasFreeTrial) { trialUsedUp -> var title = "" var header = "" if (trialUsedUp) { title = "
It’s pretty clear in the docs that iOS offer codes don’t function very well. I think I can handle the scenario manually in a pretty simple way. I’m thinking I’ll have a “redeem” screen in my app where a user can input a code, and that code & the app user id will get fired off in a request to a cloud function that will validate that all is correct, and then utilize the “Grant Promotional Entitlement” feature through the RevenueCat v1 API. Pros to this approach:• Allows me to have more custom scenarios (I would like to sell bulk licenses to businesses outside of app stores and their employees could redeem this way through the app, flexible free trials like 6 months free, awarding free product to influencers, etc.)• Seems like it would work a lot more reliably than the native sheet. Cons:• Reporting is a little funky since I would have a lot of folks with the ‘rc_promo’ active sku’s, so I may have to keep track of the redeemed codes in a different way as well. (Mostly) indie dev here
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.