Discussion and help from anything related to RevenueCat.
Recently active
One of our customers opted out of automatic renewal. She subscribed previously to a yearly subscription, and after a couple of days opted out of renewal. This means her entitlement to that yearly subscription should still be active, just the `willRenew` property of the entitlement should be false. However, the `isActive` property of the entitlement was false. Only after asking her to restore her purchases, the entitlement was isAcgive again. Code for checking if subscribed:Purchases.shared.getCustomerInfo { (customerInfo, error) in if let customerInfo = customerInfo { if let entitlement = customerInfo.entitlements[PurchasesManager.entitlementPremium] { if (!entitlement.isActive) { // Not subscribed, but was subscribed? if (premium.premiumFromAppStore) { // Logic for ubsubscribing user and informing they're unsubscribed } } } }} Code for restoring purchases:func restorePurchase() {
hi,is there a way to get the country of the subscriber with a api request like:https://api.revenuecat.com/v1/subscribers/$RCAnonymousID...
Just switched to RevenueCat and added some code (React Native) to sync past purchases. It works great, but synced customers don’t have all of the attributes I’ve set up for new purchases.First thought was to check if syncPurchases returns something, and use that to call Purchases.setAttributes.purchaseInfo = await Purchases.syncPurchases();if(purchaseInfo){ console.log(purchaseInfo); }For me, it’s only returning “undefined”. Does it return something if there’s a valid receipt? If not, can I just throw in a Purchases.setAttributes before or after calling syncPurchases, so that these synced users get the proper identifiers?
Hello, I’m looking to run an experiment that offers a free trial for the first time. I just released an update that includes verbiage on my paywall about the free trial if one exists on a package.What will users who don’t have my latest update experience when I start the experiment? Will the experiment be served to the non-latest version of the app? I do not want the offering with a trial served to existing users because it’s not a true experiment without the updates to my paywall.
I have setup a enterprise and team account system in my flutter ios and android app. I have used AWS Cognito for the user accounts and i am linking the enterprise accounts user_id to their purchased subscription in revenue cat. Now when an enterprise user creates a team account i have it so that a lambda function uses the rest api from revenue cat to add the team accounts user id as an alias of the enterprise accounts subscription. This all works correctly and gives the team account the same subscription as the enterprise account. Now here is where the problem comes in. If an enterprise user deletes a team account I can’t find a way to also delete that alias for the team account that I created from the lambda function that calls revenue cats rest api. Since there is a limit of 50 aliases on a subscription this means if the enterprise user created 50 team accounts and deleted all of them these aliases would still exist and they can’t link anymore accounts to there subscription anymore.
I have an offering containing a monthly and a weekly subscription option.I want to test replacing weekly with yearly so I created yearly products with Apple and Google and attached them to RevenueCat.Then I created a new offering with my existing monthly and added my new annual. However, the annual product is not showing up as a part of my offering from the client (both by checking `.yearly` and `.availablePackages`.The store status is listed as “Ok” for the associated product.
Dear RevenueCat Support,I am currently developing a React Native application that uses the react-native-purchases library for handling in-app purchases. I have encountered an issue where the session related to the purchases remains active even after a user logs out.I am using Firebase to authenticate, and the SDK is not generating anonymous ID like (RC: …). But the same ID stored in (originalAppUserId: '8NG2...') which is the same as the firebase User, is forever stored in the cache unless the app is deleted and redownloaded. I am wondering what the best practice is that is not .logOut, due to creating anonymous ID. I am aware of restorePurchases but I am gearing away from a button to pass the conditional renders. Also, is it appropriate to leave the .logIn in the authStateChange function for logging in with saved authentication data or to use the login just during the initial login part of the code. Thanks for your guys help. I hope to hear back soon! APP.js function onAuthStateChang
When I try to query Purchases.getOfferings it results in an errorconst getPackages = async () => { try { const offerings = await Purchases.getOfferings(); if ( offerings.current !== null && offerings.current.availablePackages.length !== 0 ) { setPackages(offerings.current.availablePackages); } } catch (e) { Alert.alert('Error getting offers', e.message); }};getPackages();What have I done so far?I have my EAS local device & simulator build with bundleIdentifier: com.myapp.dev this includes installing the RevenueCat SDK I have TestFlight App setup with my bundleIdentifier : com.myapp.production Following the Product setup Guide, inside TestFlight App, I have my subscription group "Core" setup Inside Core subscription group, I have my "Subscriptions" added: Monthly & Annual which show in "Ready to Submit" status I setup my Revenue Cat API Inside Revenue Cat, I added Product. I was able to use the automate
Hi all,Hi all,Today, I installed an SDK in my brand new project. After receiving the app API, I configured the instance of Purchases:Purchases.logLevel = .verbose Purchases.configure(withAPIKey: "my app api here")During my first few runs, I noticed that the console outputted a lot of information, which was good. However, after I added the following code, the console stopped outputting anything:// Using Swift Concurrencydo { let offerings = try await Purchases.shared.offerings() // Display current offering with offerings.current} catch let error { // handle error}// Using Completion BlocksPurchases.shared.getOfferings { (offerings, error) in if let offerings { // Display current offering with offerings.current }}I added print functions in all brackets as a test to see if they would output anything, but they did not. Additionally, all the output that I had seen at the beginning was absent as well. I removed the second block of code (the one with concurrency) to see if
We currently have a single Project on our Account but plan to add a second, in order to have separate apps with separate subscriptions.I have seen a post which says that MTR is tracked at an Account level, not per app, but I’m not sure how Projects fit in.We will have one Account, with two Projects.Each of those Projects will have two Apps (one iOS, one Android). Is MTR tracked at an Account level or a Project level?
I want to test and offer discounts to user that previously had subscription and now are expired, but are still using the app. I only want to give discount once (sanse of urgency and also I dont't want to spam user all the time).Is there any way I can track if I have shown discount offer to user using just RevenueCat iOS SDK?
purchased_at_ms The time is not accurate We found a problem and ask if the value purchased_at_ms is correct. We tested purchases-ios SDK version 3.14.4 and found the problem. We tested an iPhone 13 Pro Max, iOS 15.1, without a SIM card. With iOS 17.1, purchases-ios SDK 4.31.6 has the same problem ”event_timestamp_ms": 1704269598747, "expiration_at_ms": 1737447173000, "purchased_at_ms": 1705824773000, three times are incorrect. Test Procedure Set the system time to 2024-1-21. A subscription purchase succeeds. purchased_at_ms's time is 2024-01-21 16:12:53 Using version 3.14.2 purchased_at_ms is 2024-01-03 15:35:06 Would you like to ask what is the problem caused by this? This one uses version 3.14.4This one uses version 3.14.2
We have been using RevenuCat Paywall 4.31.5. Not able to see Close button on Paywall.Please help on it. It happens only on Landscape mode. Portrait is good.
Hi guys, I'm trying to understand how to deal with "App User ID" and user accounts. All good if I have the next flow:A user downloads an app. The user register in the app Based on the registered user account, I can generate an "App User ID" and send it to RevenueCat. Then, based on the registered user account, I always have access to the user "App User ID" because it is stored in my database and mapped to the registered user account. Later on, users can restore purchases anytime after they log in to the app. Because again, I have his "App User ID" stored in my database.But what should I do if I have no user registration in the first place? Is it possible? For example:A user downloads an app. I generate some random "App User ID" based on the device UUIDD The user goes through onboarding screens with a PayWall in the end. The user makes a purchase. All that I have now, it's his "App User ID" mapped to his device UUID, and that is it. If the user changes the phone or tries to log in on
Hello there,I am trying to implement RevenueCat on my Android app which does not have a Login system.I was wondering in this case how do I manage the UserID to stay the same throughout app deletion, re-installations and across devices? On my iOS app I used NSUbiquitousKeyValueStore, so that it’s connected to the Apple ID and it works perfectly, but I can’t find a way on Kotlin. I tried the Auto Backup APIs, but while it works on the same device if I delete and re-install the app, it does not work across different devices with the same Google Account. I know that even if a new User ID is created the purchase will be transferred cause there is only one receipt, but is it correct that it sort of creates different users that bounce the purchase around? Thank you,Giada
Hi,When testing the subscriptions i noticed that on the subscription management page on the play store (Android) there is no option to choose a different subscription tier. In comparison on IOS if you go to the store to manage the subscription you have all tier options to choose from (pic below).Is there any setting to enable this on Android also or is it not possible at all to do this on android?
Hello Team,So getting straight to the point, I was managing (storing, updating) entitlements manually, i.e when user makes a purchase from my app, I retrieve all the entitlement ids and store it in firestore -> users collection in unlocked_entitlement field. Now I realised that client (my app) should not be used to update purchase details. I learnt about webhooks recently and thought of integrating it with firebase and use it as SSOT to detect purchases. How do I store all the customers data that have already made a purchase?
Hello,I am using revenuecat sdk for flutter, and i configure the sdk using the android and ios public sdk keys and the user id corresponding to the user.I am trying to understand what will be the impact if someone decompiles my app and gets hold of the public/private keys? Could they connect to the revenuecat on my behalf and make operations like cancel subscription or request refunds..etc? From my understanding there is nothing holding them back to perform these operations.Also I am interested to know, if in our systems we identify the user with a standard auto increment primary key like 1,2,3...etc, could this be an issue for someone to mess with us if they also have the private/public keys? I am thinking decompile the app, retrieve the public keys, initialise the sdk with random ints that represent the app users ids and try to cancel, refund their subscriptions. Is this something that would be possible?Thanks!
Hello, just new here, I would like to know, how is the monthly money transferred in my app transferred to my bank account?Do I have to add my bank? and how can I do this?
My apps have a family subscription which allows users to share subscriptions to other users and it’s not restricted on a platform i.e users can share subscriptions to anyone be in Android or iOS. Is there a way to manage entitlements for users who have had their subscriptions shared by someone else. TIA!P.S I do have a backend API managing these apps so the user who is sharing a subscription will hit an endpoint to create a share a subscription to another user. I just want to know if there is a way I can use the API to create an entitlement for the shared user
I’m migrating an iOS app with a legacy user ID system. Currently, the user IDs are stored locally on-device (in the keychain), and I will be introducing a way to create a real account that can be used across devices (it will be Firebase Auth). I think I have a migration path designed, but want to check I’m not misunderstanding anything. Here’s how it would work:User launches new build of the app containing the new accounts implementation. If they are an existing user with a legacy device-local ID, I log them in to RevenueCat with that ID for continuity until a future point where they decide to create an account. If they are a new user as of the introduction of the new accounts implementation, I log them into RevenueCat as anonymous. They can subscribe and do whatever they want while in the anonymous state. When a user comes to create an account, I create it using Firebase Auth, immediately log them into RevenueCat using the new user ID, and then call `syncPurchases`.My assumption on th
Hello,I have an app with multiple creators and users can subscribe to many creators individually. Each creator is a separate subscription group in the App Store, so multi-sub support shouldn’t be an issue on Apple’s side. Each creator may have multiple products (monthly, annual, promotional, etc). Here is my setup:Creator A Apple: group_A with product_A RevenueCat: offer_A with monthly package containing product_A and entitlement_A Creator B Apple: group_B with product_B RevenueCat: offer_B with monthly package containing product_B and entitlement_B When a user purchases A, they see product_A in Apple and I see entitlement_A in RC. When a user purchases B, they see a success message on their device. Users sees both product_A and product_B in Apple, but I don’t see entitlement_B in RC. Only entitlement_A is in RC.What am I doing wrong? Is my RC setup wrong?
tl;dr: Is there any way for me to turn off the auto-renewing, so the subscription ends after a month? Hello,I have a pretty small app, so I’m still pretty new to RevenueCat.I get slack messages when certain things happen in my app such as new accounts created, subscriptions or trial starts, accounts deleted, etc. I got a notification that user xyz created an account. Great. Then they started a monthly subscription. Even better! Then I got a notification that they deleted their account. I was going to get their email from firebase to let them know they started an auto-renewing subscription, but since they deleted their account I don’t have any way of contacting them. I don’t want this person to waste a few dollars a month on an app that they don’t even have an account for anymore. Is there any way for me to turn off the auto-renewing, so the subscription ends after a month? I am also afraid of this user realizing this after a few months and leaving my app a poor review.ThanksBrad
Hi,I’m trying to setup RevenueCat to handle my google play subscriptions, i have followed all the instructionss and everything is good,but i’m stuck on creating Play service credentials: I followed every step in this tutorial https://www.revenuecat.com/docs/creating-play-service-credentialsand also tried the Troubleshooting the credential validation section on this tutorial but the issue is still present. what can i do?
I would like to create a discount for my annual subscription, so in play console I did something like this:As you can see, "yearly-autorenewing" is my basic subscription and "yearly-autorenewing-discount" is a discounted price.And my question is what am I doing wrong here by adding discount to my subscription as a product:Does this have to do with the fact that the discount is "nested" in the basic offer?
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.