Discussion and help from anything related to RevenueCat.
Recently active
Hello, I don’t understand how could I organize offerings with multiple subscription groups. I want my user to be able to subscribe to different subscription plans and it’s possible that he could have two subscriptions at the same time. For example: Plan 1 (subscription group):monthly subscriptionyearly subscription Plan 2 (subscription group):monthly subscriptionyearly subscription It’s possible for user to be subscribed to 2 plans at the same time.Now when I get offerings I do like this:const offerings = await Purchases.getOfferings();offerings.current.monthly.product.priceStringHere I get current offering with the monthly price. But how could I modify this code and revenuecat configuration to be able to get current offering for another plan as well? Is this possible?I tried to add another monthly product to the offering, but it allows only one per offering. I think it needs subgroups under offering, one per each subscription group so that it would be easier to experiment and change
transferring app to another google play store and app store account with revenue cat without any income loss.
I’ve updated my subscriptions/products in Google Play and restarted my app, but RevenueCat Purchases.getOfferings() never updates with updated titles, descriptions, or pricing. How do I bust the cache to get subscription/product updates?I have a Flutter app and am running the purchases_flutter: ^3.6.0 package.
Hello,In our Firebase Crashlytics reports, we have noticed a recurring exception being faced by our users related to in-app billing.This issue has 37,775 crash events affecting 1,549 usersHere are the error details:Fatal Exception: java.lang.IllegalStateException: Too many bind requests(999+) for service Intent { act=com.android.vending.billing.InAppBillingService.BIND pkg=com.android.vending cmp=com.android.vending/com.google.android.finsky.billing.iab.InAppBillingService (has extras) } at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:2115) at android.app.ContextImpl.bindService(ContextImpl.java:2024) at android.content.ContextWrapper.bindService(ContextWrapper.java:870) at com.android.billingclient.api.BillingClientImpl.launchBillingFlow(com.android.billingclient:billing@@5.1.0:52) at com.revenuecat.purchases.google.BillingWrapper.startConnection(BillingWrapper.kt:122) at com.revenuecat.purchases.google.BillingWrapper.startConnectionOn
We would like to receive App Store Transaction IDs when calling the REST API https://api.revenuecat.com/v1/subscribers/app_user_idI have seen other posts where developers request this, and the response from ReveneCat has been to use the Webhook.I am aware that the ID is provided in the Webhook and we are using this, however, this is not a completely satisfactory solution.Issue 1: Missed Webhook CallbacksIf for whatever reason our server does not receive/process the webhook callback then we will never know the transaction/order ID. We have logic in our app and on our backend servers that calls the RevenueCat API’s to refresh/sync user’s subscriptions. Without a transaction ID we cannot guarantee the uniqueness of a subscription.Issue 2: Legacy MigrationWe are migrating from native implementations of our app to Flutter. In that effort we identified RevenueCat as a great solution. However, we still have legacy customers and our backed depends on using the transaction Id’s from the App Sto
Hi,we have internal test servers where we would also like to develop our webhook endpoints on so we can test receiving events from the RevenueCat API. Those servers are obviously only accessible from our internal network by default.To make the webhook URLs accessible for RevenueCat, I’d like to know what IP range the requests would be coming from, so I can configure our firewall accordingly.Thanks a lot,Markus
I’m using react native to fetch the packages and looking at the logs: const offerings = await Purchases.getOfferings(); const packages = offerings.all["default"].availablePackages; console.log("Paywall Currency", packages[0].product.currency_code)Looking at the logs, the products inside the package has the price in USD. But the phone I am running the code on is set to Australia for the region of the account. I went to Settings > Account name > Media & Purchases > Country Region > Set to AustraliaAm I doing something wrong here?
Hi there,I’m trying to fetch my consumable offers on my iOS simulator but I get empty products. I have performed the following steps.Set app credential from app store connect to revenue cat Enable IAP on XCode Follow https://www.revenuecat.com/docs/apple-app-store and created storekit file and uploaded to revenuecat Create product on revenue cat On iOS simulator iPhone 13, when I call fetch offers I get the error ```flutter: PlatformException(23, 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).This could be due to a timeout, or a problem in your configuration.More information: https://rev.cat/why-are-offerings-empty, {code: 23, message: 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).This could be due to a timeout, or a problem in your configuration.More information: ht
I have few apps and I would like possibility to share subscriptions between them. So if a user is subscribed in one app they would have possibility to use pro features in other apps as well. Is it possible now with RevenueCat?
Hello! I am architecting the backend for a mobile application and despite reading through a lot of documentation posts, I feel I’m going in circles trying to grasp some subtle points and would love to get some answers before committing a lot of development. So I understand the basics of user IDs and anonymous user ids. Our app will ONLY allow users to login (and get an explicit User ID recorded in our database) AFTER a purchase.No problem: users get an anonymous ID, they sign in and we assign them a new, unique App User ID, which we record, and use login() to associate with their RC account. The question happens when the same user logs into a fresh device (or reinstalls). They get a new anonymous ID upon starting up, but then what happens when they “Restore purchases”?My hope is that we would be able to get access to the previously assigned App User ID. However, the documentation for Restoring Purchases mentions:If an anonymous ID restores and the owner of the receipt is an identified
Hello,I am testing in app subscriptions in my app. Actually it’s been working really fine till today. I cancel and restart muy subscription many times to test the features. Today when i try to subscribe to app i have this message below;PurchasesError(code=PurchaseInvalidError, underlyingErrorMessage=Error updating purchases. DebugMessage: Expired Product details. Please fetch product details again and use it to retry the call.. ErrorCode: DEVELOPER_ERROR., message='One or more of the arguments provided are invalid.') I am fetching product informations correctly (like price ...etc). What should i do?
I am currently working on a Flutter web application that utilizes the Firestore ID and I am experiencing difficulty in retrieving the user's status. The code I posted below works when I paste in the userID string. But, its throwing various errors when I am retrieving it from firebase. Are there any suggestions or recommendations on how to fix the errors I am facing?ChromeProxyService: Failed to evaluate expression 'xhr.onError.first.then': InternalError: Expression evaluation in async frames is not supported. No frame with index 14.. var userID = await DatabaseService().getUid(); // loginWeb(userID);Future<http.Response> fetchPost(userID) { var url = "https://api.revenuecat.com/v1/subscribers/$userID"; var headers = {"accept": "application/json", "X-Platform": "ios", "Content-Type": "application/json", "Authorization": "Bearer **************"}; var response = http.get(Uri.parse(url), headers: headers); return response;}loginWeb(userID) { try { fetchPost(userID).t
We’ve had requests from Android and iOS users on wanting to buy a subscription on behalf of another user (e.g., buy monthly or annual plan for their friend). Didn’t see any gifting option in RevenueCat’s documentation.We’re not familiar with the normal native implementations to support this either, so any documentation in general that you think is relevant can be helpful for our team!
I am trying to use Purchases in an expo project.If I build with xcode, everything is fine. However, we rely on the expo development build during development. Because ain’t nobody got time for xcode. If I try to run with the expo dev server (npx expo run:ios) then I get the error ERROR Invariant Violation: `new NativeEventEmitter()` requires a non-null argument., js engine: hermes this happens at the time of import of Purchases (import Purchases from “react-native-purchases”).I followed the standard installation and usage for expo.It looks like this might be some sort of incompatibility with NativeViewGestureHandler because that also starts generating errors only when I try to import Purchases.Note that I know that purchases probably won’t work in this mode, at least on the simulator, but it shouldn’t crash the app. That makes for some really challenging dx.
I’ve encountered an issue using Xcode 14 beta 4. Updated to RevenueCat 4.9.0 and still seeing the issue. If I use a StoreKit config file with an iOS 16 simulator, when I attempt to make a purchase, the iOS pay dialog never appears and I get RevenueCat.ErrorCode Code=1 "Purchase was cancelled." If I switch to an iOS 15 simulator, it works fine. If I switch to a different scheme that doesn’t use StoreKit, I get the iOS dialog to sign in. If I try this on my own iOS 16 device, it works fine. It seems to only be an issue while using the simulator with iOS 16. Here is what I get when I print out the error.Error Domain=RevenueCat.ErrorCode Code=1 "Purchase was cancelled." UserInfo={source_file=RevenueCat/SKError+Extensions.swift:33, source_function=asPurchasesError, readable_error_code=PURCHASE_CANCELLED, NSLocalizedDescription=Purchase was cancelled., NSUnderlyingError=0x7f85d1a9e2e0 {Error Domain=SKErrorDomain Code=2 "(null)" UserInfo={NSUnderlyingError=0x7f85d1a9e260 {Error Domain=ASDErro
Hello!I know that by developers locally its possible to clear the Purchase History on the Sandbox Testers section in AppStoreConnect. But how to clear the Purchase History for TestFlight testers that are not necesary connected to the Mac with cable and XCode?Is it posible? Where do I see the purchases I’ve made?Thanks in advance,Paolo.
is there any way to check if the user already took the trial? I want to know this information to stop showing the ad for the trial because already took it one time
Hi,While testing my subscriptions on IOS with a sandbox account i found a strange behaviour of getCustomerInfo(), needing to call it twice in order to get the correct data.The way i’ve set my app is to call getCustomerInfo on appLaunch and on appResume, to check for updates. The scenario is the following:I purchase a subscription and get back info that the entitlement is active and my expirationDate is 5min from now (because of the sandbox account). Then i minimize the app and wait 6 mins, after which i can see the sub renewal transaction appearing in rc dashboard and in the customer details screen. I open the app, which triggers getCustomerInfo, but it’s returning the same data i got from when i first purchased the sub. Then when i minimize the app and open it again, triggering getCustomerInfo for the 2nd time, it return the correct updated data with the new expirationDate.Is this the expected behaviour? Is this because of Sandbox? Or am i doing something wrong?P.S. it’s a flutter app
I have tried to hit the https://api.revenuecat.com/v1/subscribers/{userId} endpoint and I receive data back, as the https://www.revenuecat.com/reference/subscribers api docs show: Get OR create a subscriberIf the provided app_user_id doesn't exists, a new subscriber will be created with the App User Id. However, when I go to my customers page I do not see that customer having been created. How can I achieve this? What I’m ultimately trying to achieve is to provide a user with access to my app without them needing to make a purchase, however in order to set a promotional entitlement it would appear the user needs to already be created.Any ideas?
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
Hi everyone, Is there a simple way that Revenue Cat can manage app discount codes? We’d like to share regular discount codes for specific groups to make the app free for some users. Thanks, Louise
I’m considering using RevenueCat for my iOS app for subscriptions.However, my customers are coming from all over the world - a lot from Asia.I’ve read on the forum that api.revenuecat.com isn’t reachable from China (and eventually other countries as well). Is this still the case? - If so, what’s the solution for it?Also, is there a list of areas where RevenueCat is not working/operating?
I’m using Ionic with Capacitor.The RevenueCat documentation recommends using a cordova plugin, but Ionic has been in the process of migrating away from Capacitor for the past few years, and this is now the only Cordova plugin in my app.There’s already a capacitor plugin on github but I was wondering if there are any plans to release an official Capacitor plugin as well.
I had an initial functioning setup to get offerings and make a purchase. It worked : I could make a test purchase.The code was in a ‘shop’ page, and I decided to move the RevenueCat initialisation to main.dart as initial entry point. But maybe this wrong because it screwed everything up, and the app crashed on loading (error below). So I put it back to what it was.The app now loads and all screens function EXCEPT I am now getting the same error when I open the shop page. Even though it was working before.*** Assertion failure in +[RCPurchases sharedPurchases](), RCPurchases.m:160*** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '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'*** First throw call stack:(0x183586754 0x19804d7a8 0x1834883f8 0x1848afa6c 0x1009762f4 0x1009f2d34 0x100cb7bc0 0x100cb5b04 0x10109ea60 0x100dafd7c 0x1010b
Hi,I am currently using RevenueCat to manage user subscriptions in my Flutter app.For now, I am using entitlements, but I want to improve this process because I have created a backend. Each user is connected to an account linked to this backend, and I want only the backend to handle users' subscription statuses.To achieve this, I want to use RevenueCat webhooks so that the backend is always aware of each user's subscription status. With this setup, my backend can control access and allow or deny certain actions accordingly. The information from webhooks will be very sensitive because it will determine each user's subscription status.My first question is: Is this the right approach to achieve this with RevenueCat?And my second question is: I want the webhook endpoint to be very secure for the reasons mentioned above, so I created an x-api-key value to use it. Is there a way to add this to the RevenueCat webhook? I saw there is an Authorization header, where I tried to add x-api-key {val
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.