Build a customized mobile subscription business with RevenueCat. We do the heavy lifting of normalizing subscribers from any source and maintain a single source of truth for subscription status, so you can get back to building your app.
RevenueCat is a powerful, secure, reliable, and free to use in-app purchase server with global support. All you need to get started is an API key.
Hi, How would you handle a situation where the user is already paying a yearly subscription (or any other period sub) and buys a Lifetime subscription? Between different subscriptions you can easily handle this by adding them to the same subscription group. This doesn't seem to be possible when the lifetime subscription is a non-consumable in app purchase. What is the right way to handle this to avoid a user being paying both a subscription and a non-consumable in app purchase? Thanks
Posted by Hector Rodriguez Fornies about 12 hours ago
If I have 2 offerings "Default" and "Sale" and each of them has packages "annual", "monthly" and "lifetime" with all different product identifiers. If I want to show the user "You're current subscription is YEARLY" or whatever duration the package was when the user purchased the app, how can I do it? At the moment the only way I see to check that is to check for a productIdentifier in the purchaserInfo, is there any way to get the current subscriptions duration of a user? Thank you.
Posted by Hector Rodriguez Fornies 3 days ago
I followed all the instructions in the document, including setup a closed track in Google play. But when I download the alpha version from Google play store and tried to make a subscription with the sandbox test account, I got: " The password you entered is incorrect", I'm very sure the password is correct, can anyone give me a direction?
Posted by cloudruan 5 days ago
I'm not sure which documentation to follow: My app is a react native app with both Android and ios. Do i need to install the SDK for android first, using this tutorial: https://support.appsflyer.com/hc/en-us/articles/207032126-Android-SDK-integration-for-developers#introduction then proceed with this tutorial https://support.appsflyer.com/hc/en-us/articles/217108646-React-Native-plugin ? Also the tutorial on npm (https://www.npmjs.com/package/react-native-appsflyer) doesn't seem to be consistent with this (https://support.appsflyer.com/hc/en-us/articles/217108646-React-Native-plugin)
Posted by kamarol 9 days ago
Hi, I was looking for a way to know if I can show the trial information for the subscription to the user and saw that there's a method on the iOS SDK for it: https://github.com/RevenueCat/purchases-ios/blob/fdb0b28c743e6f15b79e8e017379242dc807da52/Purchases/Public/RCPurchases.m#L597 I was wondering if there's an equivalent for this on the Flutter version of the SDK because I couldn't seem to find it. If there isn't an equivalent for it, any chance it could be part of the v3 update of the SDK for Flutter or at least a way to know the same info with the existing parameters in the SDK?
Posted by Sanju V 12 days ago
I used the rest API to get the subscribe info. I am really confused as to the difference between the subscriber -> entitlements [array of items] and the subscriber -> subscriptions [array of items] { "request_date": "2019-11-26T12:50:15Z", "request_date_ms": 1574772615094, "subscriber": { "entitlements": { "Book Add-On": { "expires_date": "2019-11-20T17:31:35Z", "product_identifier": "activities", "purchase_date": "2019-11-20T17:26:35Z" }, }, "first_seen": "2019-11-19T14:48:02Z", "non_subscriptions": {}, "original_app_user_id": "$RCAnonymousID:873474384", "original_application_version": "1.0", "original_purchase_date": "2013-08-01T07:00:00Z", "other_purchases": {}, "subscriptions": { "books": { "billing_issues_detected_at": null, "expires_date": "2019-11-20T17:31:35Z", "is_sandbox": true, "original_purchase_date": "2019-09-09T20:20:15Z", "period_type": "normal", "purchase_date": "2019-11-20T17:26:35Z", "store": "app_store", "unsubscribe_detected_at": "2019-11-20T17:30:42Z" }, } } }
Posted by Ernest Appiah 14 days ago
Your offering looks perfect for me as I convert my existing Paid App to a Subscription Model. In doing so, I will have 3 types of users LEGACY (Previously bought paid version), FREE (New user's without a subscription), and SUBSCRIBER. Before adding the subscriptions, I plan to release 1 or more versions of my app in preparation for the change. I'd like to go ahead and integrate RevenueCat to do the receipt validation _prior_ to defining the subscriptions so I can get original_application_version that will later be used to determine user type. Will this cause any issues? My app is iOS only. TIA, Eric
Posted by Eric Elfner 15 days ago
I am trying to get through Apple's App Review process, but one thing that's stopping me is that when I display the available products on my paywall, the title and description are empty. They are not empty on App Store Connect, but my IAP products are in the "Developer action needed" state. Is that what's keeping RevenueCat from fetching the titles and descriptions? Prices seem to work fine. Do I need to do something to force RevenueCat to re-fetch the data from Apple App Store? I've tried uninstalling and reinstalling the app, same result.
Posted by Magnus W 15 days ago
I'm planning on building support for web payments using stripe. A user is then coupled to an id. When logging in a user on the app itself and activating it with the user id, will there be some sort of method to prevent the user from sharing that identification and then theoretically use it on any device possible or is there a maximum number of devices where the id can be used?
Posted by Lennart Kerkvliet 17 days ago
I'm thinking about modifying the duration of my yearly free trial subscription (from 7 to 3 days) and to remove completely the free trial from the monthly subscription. Will this change affect the users currently in a free trial? Is there a way to do this properly? Thanks.
Posted by Hector Rodriguez Fornies 17 days ago
Using legacy entitlements on Flutter. I had a Play Store subscription called `premium1month` in an entitlement called `premium` before. No real users are using this product yet, but I have bought it when testing in the past, and the test purchase had now expired. Yesterday I moved the product from the `premium` entitlement to a new entitlement called `premium2`. Now, about 15 hours later, I tried purchasing the `premium1month` subscription with the same test user as before. It worked, but when reviewing the entitlements contained in the `PurchaserInfo` object, I noticed that both the `premium` and `premium2` entitlements have `isActive: true`. The old `premium` entitlement was previously expired (`isActive: false`). Is this expected behaviour? Will any entitlement that previously had a product assigned to it also become active when purchasing that product in the future, even if it has been moved to another entitlement? Update: Even when purchasing the product with a "clean" user, both entitlements get activated. Update 2: Could it be that I have an Apple App Store product with the same id, `premium1month`, assigned to the `premium` entitlement?
Posted by Magnus W 19 days ago
Hello! We're loving RC and have a successful integration done with our iOS builds. However, we're having a few issues when building to Android. When initializing RC on a built out APK, we're seeing the following bubble up as a native exception Rejecting re-init on previously-failed class java.lang.Class<com.revenuecat.purchases.BillingWrapper>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/android/billingclient/api/PurchasesUpdatedListener; We're using Gradle, building an AAB (Android Bundle) and have tried a few different things to address. My first instincts are these were dependencies that failed to get merged into the gradle build. However, including the billingclient libs explicitly in the gradle file wound up failing to build out due to duped dependencies (confirming they were present to begin with). I thought maybe they were being stripped out of the build through proguard/minification - so I disabled these in Unity with no luck. I've tried whitelisting the class/namespace in the proguard file - but no avail Any thoughts? Cheers! Jason
Posted by Jason McGuirk 21 days ago
I current have two entitlements, each one is a way to buy my app: 1 - Mac app 2 - iOS app They are separate in-app purchases. If you buy an iOS license, it unlocks the iOS app and you have access to it forever. The same thing happens on Mac with another purchase. Under the 3.0 structure, it seems to me that I would have it set up like this: Entitlement 1 - Mac Entitlement 2 - iOS - No Offerings - Product 1 - Mac in-app purchase (my.app.mac in-app purchase ID) Product 2 - iOS in-app purchase (my.app.ios in-app purchase ID) Is that a reasonable approach? Why/when would I want to insert offerings in this purchase setup? I'm just trying to make sure I understand the structure of things in v3.0. : ) Thank you!
Posted by Clifton Labrum 24 days ago
My iOS app is in the App Store running Purchases 2.6.1. My Legacy Entitlements with their offerings are still intact in the RevenueCat dashboard. Can I safely play with the new Entitlements, Offerings, and Products with Purchases 3.0 in my dev environment without breaking my production app as long as I leave the Legacy Entitlements alone?
Posted by Clifton Labrum 24 days ago
I am currently sandbox testing subscriptions. When I unsubscribe from our auto-renewable subscriptions, and then call Purchases.getPurchaserInfo() without reloading the app, Purchases.getPurchaserInfo() returns an object which states that the active entitlement I just unsubscribed from is still active(after the expired time has gone by of course). Where as if I reload the app, it usually shows the proper subscription data. But if I don't reload the app and I wait a little while and continue to repeatedly call Purchases.getPurchaserInfo(), eventually it returns showing that I am not actively subscribed to the subscription in question. It appears it is caching the subscription info. Is this by design? In your docs it states "Purchases automatically caches the latest purchaserInfo whenever it updates so in most cases this method is pulling from the cache and is run very fast." I wonder that quote is referring to what I'm talking about.
Posted by Chris Dean 25 days ago
I've implemented in app purchases in my app using the RevenueCat Flutter SDK, and even though things seem to work fine, I'm starting to think I've gone about it the wrong way. Right now I'm calling restoreTransactions() on every app launch, but I'm actually not sure if this is needed or correct. I've tried reading the documentation, but I still don't really understand the concept of "restoring transactions" and when or why it would be necessary. More specifically, what is the difference between getPurchaserInfo() and restoreTransactions()? They both return a PurchaserInfo instance. As I see it, there are a few different scenarios that can happen: A. User has installed the app for the first time and hasn't made any in-app-purchases. B. User has installed the app for the first time and made an in-app-purchase (which could either be valid or expired already). C. User has uninstalled/reinstalled the app and hasn't made any in-app-purchases. D. User has uninstalled/reinstalled the app and had previously made in app purchases before uninstalling. A and C should be identical. I'm guessing that restoring transactions has something to do with scenario D, but it's still not clear what would happen if I only call getPurchaserInfo() at this point? Wouldn't the users previous purchases be returned? If not, what would be returned?? I'd be thankful if you can clear this up.
Posted by Magnus W 26 days ago
I have a new app that is "Pending Developer Release". The In App Purchases are in the "Approved" state. The app's RevenueCat implementation works in the sandbox. However, when I download the app from The App Store using a promo code, it doesn't load the in app purchases. Is this happening because the app is still "Pending Developer Release", or is it possible there is an issue with my implementation of RevenueCat or in app purchases that is only appearing in release?
Posted by Robert 26 days ago