Discussion and help from anything related to RevenueCat.
Recently active
a user deletes the app and data off their device. They previously purchased some non-consumable items. The reinstall. I run syncPurchases one time in the app delegate. I get this error ERROR: 🍎‼️ The receipt is missing.I expected it to return the non-consumable entitlements in the customerinfo. Any idea what I am doing wrong?
I am using custom promo codes for users of my app. My server checks if the code a user has entered is valid and if so, it sends a request to revenuecat, as stated in the documentation: const options = { method: 'POST', headers: {accept: 'application/json', 'content-type': 'application/json'}};fetch('https://api.revenuecat.com/v1/subscribers/app_user_id/entitlements/entitlement_identifier/promotional', options) .then(response => response.json()) .then(response => console.log(response)) .catch(err => console.error(err));My code is waiting for a “Subscriber” response, to check, if the promotional entitlement was successful. This all works fine, however it often takes around 60 seconds until I receive a response, varying between 10 and 60 seconds. Am I doing something wrong in my code, or is this behaviour expected? Thanks so much already in advance!
We wish to integrate our sales data with ChartMogul. We need to send payloads to ChartMogul with data about every purchase. In section 3 of this link from ChartMogul, it is described: purchase_token - Mandatory - The purchaseToken returned by Google Play as soon as a purchase is completed. This is usually returned within the INAPP_PURCHASE_DATA object in the getBuyIntent() method. How can we access this purchase_token? We are using the webhooks sent from RevenueCat to our backend, to align our userbase with the purchasing events from RevenueCat. However there is no purchase_token field on any of these events. I assume it has been renamed..?
Hi guys,I'm configuring all products for my app. I have all of them imported from google play and my entitlements configured.In the docs you say that offerings are optional, but that's not true, because the sdk can't get product data without offerings and packages. I'm using unity sdk.What's the point of this? If I already have the products, I should be able to get all the data of each specific product, even if I don't have any offering.But right now, for me to get the products data and display them on muy app, I have to create an offering and a package for each product. And to be honest that's horrible, because I'm just duplicating products into packages for no reason at all, and also because the UI to attach products to packages it's very very bad, specially if you have lot's of products.So, is there in the roadmap and update to fix this?If not, at least update your documentation that you HAVE to have products, offerings and packages for revenuecat to work at it should.Thanks!
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
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.