Get help with your SDK implementation.
Recently active
We are now getting reports from some users complaining that they paid, but nonetheless don’t have premium access. This seems to be happening on IOS in particular.The are getting the following error-message: Apple Subscription Key is invalid or not present. In order to provide subscription offers, you must\nfirst generate a subscription key.\nPlease see https://docs.revenuecat.com/docs/ios-subscription-offers for more info. Apple Subscription Key is invalid or not present. I find this to be confusing because:1: We have added a subscription key (so it should be present)2: It doesn’t seem to happen to most users If something is wrong with the Apple Subscription Key, shouldn’t this affect all users trying to make an IOS purchase through that particular app?3: It seems to have popped up on its own accordI’m not aware of this problem having been here for a long time (even though we started using RevenueCat in 2022). It also doesn’t seem like this issue started popped up right after we made a
how to buy a product?I’m following this guide but I cannot buy my productshttps://www.revenuecat.com/docs/getting-started/displaying-productsI created an offering, which has two packages, the voice has the one time purchase products from apple and google.how do I find the voice product to buy? with the package identifier?```try {const productToBuy = //how to find the product?;if (!productToBuy) {console.error("No product identifier found");return;}```or should I buy the package? const { customerInfo } = await Purchases.purchasePackage(offering.all["Voice"].availablePackages);I thought revenuecat was supposed to be simple
So I recently started seeing more and more users starting to get issues fetching products and this is the error they get after calling Purchases.shared.getOfferings:There is an issue with your configuration. Check the underlying error for more details. There's a problem with your configuration. 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). More information: https://rev.cat/why-are-offerings-empty After investigating it, from what I've seen, it only is happening for users on iOS 17.3.1. For all other users, it seems to be okay and has been working successfully.I’m wondering if anyone knows what could be causing this / also happening to them?
when i try to purchase its throwing error .this is the log,but its printing product details. D/EGL_emulation(11680): app_time_stats: avg=273.33ms min=5.91ms max=6435.79ms count=25D/[Purchases] - DEBUG(11680): ℹ️ Vending Offerings from cacheD/[Purchases] - DEBUG(11680): ℹ️ Checking if cache is stale AppInBackground falseI/flutter (11680): 152.17968I/flutter (11680): Product{identifier: test_01, description: this is test product description, title: test product (lauramonk.app.hotdealsgemet.prod (unreviewed)), price: 152.17968, priceString: ₹152.18, currencyCode: INR, introductoryPrice: null}D/[Purchases] - DEBUG(11680): ℹ️ Vending Offerings from cacheD/[Purchases] - DEBUG(11680): 💰 Purchase started - product: com.revenuecat.purchases.models.ProductDetails@e5f3361e - offering: test_01D/[Purchases] - DEBUG(11680): 💰 Purchasing product: test_01D/[Purchases] - DEBUG(11680): ℹ️ Checking if cache is stale AppInBackground falseD/EGL_emulation(11680): app_time_stats: avg=534.12ms min=14.29ms
My app and pawwall is in landscape. I want the payflow, when I click ‘subscribe’ in my paywall to come in landscape too. However, it is coming in portrait. How do I change? Here’s my code #ifndef PAID_APP-(IBAction)premiumButtonPressed:(id)sender{ NSLog(@"premiumButtonPressed"); // Start Progress [progressIndicator startAnimating]; #ifndef PAID_APP [FIRAnalytics logEventWithName:@"ShopViewController" parameters:@{@"ShopPremiumButtonPressed": @"Monthly"}];#endif // TEST HARNESS //[self processPremiumSubscriber]; //return; // TEST END NSLog(@"RevenueCat - Purchase monthly product called"); [progressIndicator startAnimating]; [[RCPurchases sharedPurchases] purchaseProduct:rcStoreMonthlyProduct withCompletion:^(RCStoreTransaction *transaction, RCCustomerInfo *customerInfo, NSError *error, BOOL cancelled) { //if (customerInfo.entitlements.all[@"your_entitlement_id"].isActive) { // U
Hi there, I just wanted to check if I’m missing something obvious here… I am adding support for Google prepaid subscriptions to my app. I am trying to find a way of knowing if the entitlement the user has is a prepaid (non-renewing) subscription. The docs suggest that we should be using Entitlements and not ActiveSubscriptions of CustomerInfo. However the only clue I can find is that checking the active subscription product identifier will contain whether the active entitlement is prepaid or not, it doesn’t seem to be included in Entitlements anywhere. I would have expected that willRenew would be false, as the subscription will indeed not renew, but it seems to return true. Am I missing something or is this a mistake? Many thanks!
Hello RevenueCat, I am using React Native version 0.73.1. I have installed react-native-purchases: 7.21.0. It works fine on the emulator, but when I deploy it to TestFlight, the app crashes immediately upon opening.
I'm currently using RevenueCat for my native Android app. I'd like to add an iOS version and I'm considering Kotlin/Compose Multiplatform Mobile in order to reuse much of my Kotlin code. It's still early days for KMM, but I was wondering if there were plans to add a KMM SDK. And if not, how would you recommend I manage subscriptions in this case? Thanks!Sam
Hi,Our app is a subscription streaming with Monthly and Yearly package.The current flow we want to use with RC are:1) . Subscription Purchase but the user not login yet to the app. So still as a guestGuest > Purchase > Successful Is it correct if we use this const { customerInfo, created } = await Purchases.logIn(guest_id); ?Then we will force them to login before can use the full features of the app.Login > successfulBecause its already logged in, then we can get the actual subscriber_id for that user,Is it correct if we use this const { customerInfo, created } = await Purchases.logIn(subscriber_id); ?So in RC, the app_user_id will be updated with the latest one which is subscriber_id, whilst the original_app_user_id is still the original Anonyomous ID.Then later, this user can login to any device / platform and still can get the same status of the subscription.Is it my understanding on how to implement is correct?Thank you
testing
Hello, I’ve added `Purchases.addCustomerInfoUpdateListener` to listen for changes to `CustomerInfo`. Now, I know it works because it gets fired when I make a subscription purchase with Purchases.purchasePackage.However, I do not see it firing when a user cancels their subscription from Google Play or when it automatically expires. I have Google Developer Real-time notifications set up, tested and working. I can also see the RevenueCat Customer History Dashboard get updated with the cancellation/expiration event, but it never propagates back to the listener. If I call `getCustomerInfo()` directly though, I can see the changes.Curious if this broken, or expected behavior? By the looks of it it says it should fire when it detects any changes to CustomerInfo, so in theory it should fire, but it doesn't. Using Capacitor SDK v7.4.0 Thanks!
Hello RevenueCat team and community!I’m trying to integrate Stripe with RC and so far i’ve been following the steps of this documentationAfter receiving both checkout events in my backend server: customer.subscription.created and checkout.session.completed I send a POST request to the receipts endpoints. Every time I send a request the response I get is the following:{ "code":7103, "message":"The receipt is not valid."}Even if I try to send manual requests from the terminal using cURL i will get the same response. Here is an example:curl -X POST \ https://api.revenuecat.com/v1/receipts \ -H 'Content-Type: application/json' \ -H 'X-Platform: stripe' \ -H 'Authorization: Bearer strp_xxxxx' \ -d '{ "app_user_id": "my_app_user_id", "fetch_token": "sub_xxxxx" }'I took the Authorization token from the Stripe App Public API KEY created in the RC dashboardSome additional info:I’m not the owner of the RC project, neither the Stripe account. Yet I have admin privileges in both accou
Hi.I left an inquiry on the ticket, but I also wrote it here.Since November 2023, we have been using this service well and there have been no problems.However, there is a problem that the webbook is not called when some Android users call Pursances.purchaseStoreProduct api from about 10 to 15 days ago.Fortunately, we also got a device that had the problem and checked the log with the device that was working normally, and found that only one log was differentIn the normal log, there is "CustomerInfoUpgraded, sending to listener," but the above log does not appear in the log of the problematic device.I wonder if there were any similar tickets or inquiries like this, and if you already know, I wonder how to fix it.Thank you.
I want to automate my revenuecat process. I test using StoreKit, but entitlements are not reset. How do I achieve this? let session = try? SKTestSession(configurationFileNamed: "storekitconfig")session?.resetToDefaultState()session?.disableDialogs = truesession?.clearTransactions()customerInfo.entitlements["Pro"]?.isActive == trueThis code returns true. How do I make it return true if I just made a purchase?
Hello,I recently explored the guide on transitioning a paid iOS app to a subscription model as outlined in your article at RevenueCat. While insightful, it doesn't entirely address our specific requirements.Our application is initially free to download, offering in-app purchases (IAP) to access additional functionalities. We're considering introducing a paid version in select markets to evaluate its performance. For this purpose, I'm seeking an effective method to verify whether a user has made a purchase to download the app (not based on the app version).I've come across the possibility of locating a receipt within the app bundle that could potentially provide this information. Could you advise on the reliability of this approach and how to implement it effectively?Thanks for your help.
Please tell the specific gradle version for revenuecat version 7.5.2.
following the docs but react native with expo doesn’t recognize purchaseshttps://www.revenuecat.com/docs/getting-started/quickstart#4-using-revenuecats-purchases-sdk ERROR ReferenceError: Property 'Purchases' doesn't existThis error is located at: in App (at withDevTools.js:18) in withDevTools(App) (at renderApplication.js:57) in RCTView (at View.js:116) in View (at AppContainer.js:127) in RCTView (at View.js:116) in View (at AppContainer.js:155) in AppContainer (at renderApplication.js:50) in main(RootComponent) (at renderApplication.js:67), js engine: hermes ERROR ReferenceError: Property 'Purchases' doesn't exist
I am successfully making a purchase in IOS sandbox environment and returning the customerInfo object shown below. However once the user is automatically logged in i check their subscription status and it is empty.The user does not show up in my sandbox customer list in revenue cat and the only way i can find them is by manually searching their user ID. When i call the login function there is no active purchases so my app will not authenticate them once they try to re login, or if they want to view their active subscriptions. I am not sure why I am returning a successful purchase object but their account has no record of a purchase?Here is the customerInfo object after making the subscription purchase 'customer INFO: ', { firstSeen: '2024-02-16T03:51:30Z', entitlements: { active: { pro: { willRenew: true, ownershipType: 'PURCHASED', productIdentifier: 'sportyMonthly899', originalPurchaseDateMillis: 1708095600000, latestPurchaseD
I have a paywall in my new flutter app and it has processed two payments so far, so seems to be workign well. But I noticed a crash in my Android Developers Console and when I went through it I saw this line: Caused by ga.i0: There is no singleton instance. Make sure you configure Purchases before trying to get the default instance. More info here: https://errors.rev.cat/configuring-sdk Do we need to configure the purchase beforehand? I would think yes, and maybe I am configurign mine in an odd way which is why its been working. But maybe I need to clean up my code a little. I created a revenuecat provider with: class RevenueCatProvider with ChangeNotifier { CustomerInfo? _customerInfo; CustomerInfo? get customerInfo => _customerInfo; RevenueCatProvider() { initPlatformPurchaseStateRevenueCat(); } Future<void> refreshCustomerInfo() async { try { _customerInfo = await Purchases.getCustomerInfo(); notifyListeners(); } on PlatformException catch (e) {
I am super disappointed to find that this expected functionality (at least for iOS) is not available in Revenue Cat. This has caused us a huge issue - we’re almost finished migrating to RC for payments as we add a new platform to our stack (Web) with the last part of our migration being updating the iOS app - ALL of the backend work has been completed for this and only now are we finding out that this basic functionality is not available. It’s not exactly sign-posted either and so not picked up during initial investigation of RC - mainly because this doesn’t seem like something you’d need to actively validate is possible! Surely this is on your roadmap? I can see many people have been asking for this - if there’s a timeline for this please let me know or it seems impossible that we can move forward with RC as a solution.
I’m trying to integrate the paywall into my VisionOS app, which creates a volumetric WindowGroup. When the paywall attempts to present itself, I get the error “Presentations are not currently supported in Volumetric contexts.” Using Xcode 15.3 Beta 3 with Apple Vision Pro (1.1) simulator. import SwiftUIimport RevenueCatimport RevenueCatUI@mainstruct Sheila_VisionOSApp: App { init() { Purchases.logLevel = .debug Purchases.configure(withAPIKey: "XXXXXXXX", appUserID: nil) } var body: some Scene { WindowGroup { SheilaAppView() .presentPaywallIfNeeded( requiredEntitlementIdentifier: "access", purchaseCompleted: { customerInfo in print("Purchase completed: \(customerInfo.entitlements)") }, restoreCompleted: { customerInfo in // Paywall will be dismissed automatically if "pro" is now active. pr
I’m new to React Native, Expo, and RevenueCat so this is likely very basic but can’t find an answer to this anywhere. I’m following this guide.I’m not familiar with the lingo yet but I’m pretty sure I’m using the “managed workflow” version of Expo. In terms of development and testing, the only setup I’m currently familiar with is Expo Go -- in other words, running “npm start” on my dev machine, opening Expo Go on my device and connecting, then updating/editing code. This is the only way I know how to write code for my app. Then when I’m ready for full testing on a device, I run an EAS build and download it to my device, but at this point I have absolutely no more visibility into the code, it’s a complete black box -- it’s just a standalone running app on my phone.My understanding is that the RevenueCat modules do not work with Expo Go. If I try to include them I get a “Invariant Violation: Your JavaScript code tried to access a native module that doesn't exist” error. First question is
Hello,So I have my app set up and working very nicely using revenueCat, however there is one tiny issue that I hope someone here can help with.I have a subscription management page where I am displaying some details, where ‘next billed amount’ is one of them, that is displaying the amount billed string that I can only find in the offerings object.So far I have been fine with just comparing the productId found in the offering object with the id in the active subscriptions from the customer info object. The thing is, if the user purchases that product on an android device but then switches to iPhone, then I can’t currently get the billed amount, because the offering is now returning the product Id of the iPhone product which is different to the android one. So comparing the two returns falsy and therefor an undefined amount. So I am wondering how others may have gone around this. One solution I do have in mind is naming the identifiers for android and iOS products exactly the same, but w
Hello,I have followed official revenue cat react native facebook ads tracking integration tutorial.It seems like I am setting the facebook anonymous ID to the customer:But when I actually make a purchase from my sandbox account, I see no events being triggered. Here is how I am implementing my code: useEffect(() => { const configurePurchases = async () => { Purchases.setLogLevel(Purchases.LOG_LEVEL.VERBOSE); if (Platform.OS === "ios") { await Purchases.configure({ apiKey: APIKeys.apple, }); // Automatically collect the $idfa, $idfv, and $ip values Purchases.collectDeviceIdentifiers(); const anonymousId = await AppEventsLogger.getAnonymousID(); Purchases.setFBAnonymousID(anonymousId); } if (Platform.OS === "android") { await Purchases.configure({ apiKey: APIKeys.google, }); } }; configurePurchases().catch((error) => { console.error({ configurePurchasesError:
When I open the app everything works fine but when i close it and reopen it from the home screen it crashes on TestFlight.Here's the crash log of the thread its crashing on:Thread 0 name:Thread 0 Crashed:0 libswiftCore.dylib 0x00000001847363fc _assertionFailure(_:_:file:line:flags:) + 264 (AssertCommon.swift:144)1 PurchasesHybridCommon 0x00000001019af1a4 closure #1 in variable initialization expression of static FatalErrorUtil.defaultFatalErrorClosure + 64 (FatalErrorUtil.swift:15)2 PurchasesHybridCommon 0x00000001019a73a0 fatalError(_:file:line:) + 60 (FatalErrorUtil.swift:27)3 PurchasesHybridCommon 0x00000001019a73a0 static CommonFunctionality.sharedInstance.getter + 84 (CommonFunctionality.swift:21)4 PurchasesHybridCommon 0x00000001019a73a0 static CommonFunctionality.customerInfo(fetchPolicy:completion:) + 84 (<compiler-generated>:405)5 PurchasesHybridCommon 0x00000001019a73a0 specialized static CommonFunctio
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.