Get help with your SDK implementation.
Recently active
Hi,Thanks for your blog post: Converting a Paid iOS App to Subscriptions. It was very helpful! I have a few follow-up questions: Is all the code and information in the post still up to date after a few years? Regarding the syncIfNeeded function: it checks the info returned from RevenueCat, and if that fails and a receipt exists, it attempts to sync. But what happens if the receipt doesn't exist, or syncing isn’t sufficient? Is that a possible scenario? How should we handle users in that situation? In such cases, should we fall back to calling restorePurchases, which might trigger the system sign-in prompt? The article doesn’t mention this. Also, I noticed that appStoreReceiptURL is now deprecated, and Apple recommends using the AppTransaction API. I've tried this in my app, but in some cases, I can't access the original app version or purchase date unless I explicitly call AppTransaction.refresh(), which often causes a sign-in prompt. This seems similar to RevenueCat’s restorePurch
I'm running into an issue when using the PaywallViewControllerDelegate with the RevenueCat iOS SDK version 5.22.2.I’m presenting the paywall manually using the following code:extension AppPaywallBuilder { func build() -> UIViewController { let viewController = PaywallViewController(offering: subscriptionManager.offering) viewController.delegate = self viewController.modalPresentationStyle = .fullScreen return viewController }}extension AppPaywallBuilder: PaywallViewControllerDelegate { func paywallViewController(_ controller: PaywallViewController, didStartPurchaseWith package: Package) { print("aaaa") } func paywallViewController(_ controller: PaywallViewController, didFinishPurchasingWith customerInfo: CustomerInfo) { print("aaaa") } func paywallViewController(_ controller: PaywallViewController, didFinishRestoringWith customerInfo: CustomerInfo) { prin
I added the SDK initialization in my code. But when I launch the application, it crashes and shows this error Your app just crashed. See the error below.java.lang.NoSuchMethodError: No static method configure(Landroid/content/Context;Ljava/lang/String;Ljava/lang/String;Lcom/revenuecat/purchases/PurchasesAreCompletedBy;Lcom/revenuecat/purchases/common/PlatformInfo;Lcom/revenuecat/purchases/Store;Lcom/revenuecat/purchases/DangerousSettings;Ljava/lang/Boolean;Ljava/lang/String;)V in class Lcom/revenuecat/purchases/hybridcommon/CommonKt; or its super classes (declaration of 'com.revenuecat.purchases.hybridcommon.CommonKt' appears in /data/app/~~S6Gdua0r00AvocmBAY814g==/com.heavenmobile.app-Nfa1Ti6hbTxWjSgfJhC-wg==/base.apk!classes8.dex) com.revenuecat.purchases.react.RNPurchasesModule.setupPurchases(RNPurchasesModule.java:95) com.facebook.jni.NativeRunnable.run(Native Method) android.os.Handler.handleCallback(Handler.java:942) android.os.Handler.dispatchMessage(Handler.java:99) com.fa
Hi all, I have a little question about localizing price strings. In English the variable {{ product.price_per_period_abbreviated }} returns $9.99/mo which is perfect but I can’t find in the docs what variables are localized so would that translate automatically for users in other locals? or should I provide the abbreviation myself (in this case Chinese) {{ product.price_per_period }}/月Thanks so much
With macOS Tahoe released today, I wanted to see how my app ran on it. But I ran into a compile error when using the RevenueCate Flutter package:Swift Compiler Error (Xcode): Protocol 'StoreKit2PurchaseIntentType' requires 'id' to be available in iOS 16.4 and newerbut I wanted to post my issue here to get the ball rolling on using RevenueCat with the new OS 26 versions.This error was within the StoreKit2PurchaseIntentListener.swift file.I am using this purchases_flutter: ^8.10.1
I want to be able to change the trial period on a product, or the grace period, and I’m realizing none of this is editable in the RevenueCat dashboard. Does it have to be set when the product is created, and then I need to create new products every time I want to make a change? I ask because: We have a field in our DB that stores if a customer is annual or monthly (which are two products at the moment), and we are getting this info from the customer info in the Web SDK. The only place there we can identify the subscription duration is from the product name. But, if we need to change product names regularly to change things like trial period, we need to make code changes on our side every time. It’d be nice if we either could modify products, or if the Web SDK could return duration in the customer info.
Hi - I’m working on adding Paywalls (V2) to our iOS app, and I sometimes run into a built in skeleton loading screen. The skeleton doesn’t match the app’s design, so I’d love to hide it, or ideally be able to observe the loading state of the paywall in some way and display custom UI until it’s ready.I noticed this prior post asking a similar question:In my case, the paywall is being shown after offerings have synced. (It doesn’t always appear, but it does frequently enough I’d like to handle the loading state a little differently.)I’m using PaywallViewController, via “custom” display logic. (I’m using the initializer that takes an offering identifier, and presenting the view controller manually.)Any chance anyone can provide guidance about how to suppress the UI / observe when the paywall is ready to go?
Important Notes When Testing Google Play Sandbox – Account Conflict Issue I’d like to share my experience in case others run into a similar issue during Google Play sandbox testing.This unexpected behavior took quite a bit of time to figure out. Problem Summary If multiple Google accounts are signed in on the test device, the system may reuse a previous purchase receipt from one of those accounts. It seems that Android treats the first (oldest) signed-in account as the default, and continues referencing its purchase history even in sandbox mode. In my case, I had a real subscription purchase on main@gmail.com (used in production), and although I was testing with test.sandbox@gmail.com, all attempts were rejected with the message: “You are already subscribed”. How I Solved It Remove all unnecessary Google accounts → Only keep the test account (test.sandbox@gmail.com) on the device. Use only the test account → Sign in with just the sandbox test account before running your tes
Hey there, I have one paywall that has annual-monthly-weekly subscription. I want to have another paywall that has lifetime subscripton and uses same entitlement that my initial paywall has. I want to show user my lifetime paywall after the user dismiss our initial paywall. How to achieve that in UIKit? Is there a way? I can’t find in the docs etc.
I know this has been discussed hundred of times, but while I suppose the reason is he same as in previous threads, that is: reviewer is failing to fetch products because they are not accepted, the response I got from him seems to opose this premise. Quote:The in-app purchases do not need to have been previously approved to confirm they function correctly in review.It would be appropriate to review your in-app purchases to make sure they have been appropriately configured for review in the Apple-provided sandbox environment.It is the first release of this app. The subscriptions had “Waiting for Review” status but after the app rejection their status changed to “Developer Action Needed” while the translations of them to “Rejected”.On RevenueCat everything seems to be configured correctly, with product fetched automatically and their statuses correctly reflecting what is displaying in App Store Connect.Meanwhile the Android version using the same codebase is happily on prod with zero issu
Very strange, never had this issue before. It’s occurring in production as well. Tested it on several different phones and accounts, it appears to be happening to one of my co-workers on both prod and Testflight. I’m using react-native-purchase v7.27.3happens when calling Purchases.getOfferings Seen there was a post from a year ago talking about it, but it doesn’t seem like there was a solution to the issue.
I am getting this error from sandbox and the app in app store =>flutter: PlatformException(8, The receipt is not valid., {code: 8, userCancelled: false, readable_error_code: INVALID_RECEIPT, underlyingErrorMessage: The receipt is not valid., message: The receipt is not valid., readableErrorCode: INVALID_RECEIPT}, null)Also I’ve checked this stepsApp Store Connect App-Specific Shared Secret is correct My public api key is correctWhat is the solution?
Hello,I have my React Native app fully functioning on iOS. I am currently testing my app under a closed testing group on the Play Store. I have found that selecting restore purchase on Android will automatically give my test users premium (without having made any previous purchase). This is something that doesn’t happen on iOS so I’m wondering is it because it’s under closed testing?
Hi. Whenever I supply custom metadata in my Web SDK purchase call (as described here https://www.revenuecat.com/docs/web/web-billing/custom-metadata), the Event Data for the purchase shows a “metadata” value of null, and the webhook request body for that event then also shows a “metadata” value of null. I’m using a web billing app.The exact request I’m making is: const { customerInfo } = await Purchases.getSharedInstance().purchase({ rcPackage: pkg, metadata: { org_id: "01970d2a-3f5b-724c-b306-5aca641ffba3", event_id: "01972cdb-f765-756b-ae95-203f516ff6e6" },});I can see the metadata being set correctly in the POST request to https://api.revenuecat.com/rcbilling/v1/checkout/start, it just never seems to actually be stored and associated with the event once the checkout is completed.I’m using the @revenuecat/purchases-js library on version 1.4.3. Is there something I’m doing incorrectly or am I missing something? Or is there just a bug with processing this metadata on the b
With macOS Tahoe released today, I wanted to see how my app ran on it. But I ran into a compile error when using the RevenueCate Swift package: Protocol 'StoreKit2PurchaseIntentType' requires 'id' to be available in macOS 14.4 and newerI know RevenueCat just got their hands on the new SDK today, but I wanted to post my issue here to get the ball rolling on using RevenueCat with the new OS 26 versions.This error was within the StoreKit2PurchaseIntentListener.swift file.
Hi,I just wanted to get to know, what to implement additionally in my Flutter App for iOS introductory offers. I am not using the RC Paywall, but my own screens inside the App and I have already implemented IAP subscriptions for my App & the App is active inside the AppStore.The plan is to have a trial period of 3 days before the full price is charged. My app uses an App Extension that needs to know the expiration date and refers to the in-app-purchase page of my Flutter App if a subscription expires. Therefore I absolutely need to make sure that I get the Trial Period from RC:My expectation would be that when the User subscribes and is eligible for the trial period, I get a price of 0.0 USD for the product and an expiration date of 3 days from RevenueCat. Additionally, the introEligibilityStatusEligible flag is returned, so I can show a corresponding text to the user.Is this correct ? Do I additionally also get the effective price that is charged after the Trial period ends ?How i
I created a paywall, started testing and everything worked fine. But then I deactivated the offer in Google Play and added a new one and after that errors started appearing in the window and now the basic screen is displayed. I have already recreated the offer, but nothing has changed. I’m used Flutter and packages purchases_flutter: ^8.9.0 & purchases_ui_flutter: ^8.9.0W/[Purchases](10485): The Paywall references a package with id '$rc_monthly', but Offering 'new-default' does not contain such a package. It has these packages instead: [$rc_lifetime, $rc_weekly, $rc_annual]. Either add the missing package to the Offering or remove it from the Paywall.W/[Purchases](10485): Displaying default template due to validation errors.W/[Purchases](10485): Could not process value for variable 'sub_offer_duration' for package '$rc_lifetime'. Please check that the product for that package matches the requirements for that variable. Defaulting to empty string.W/[Purchases](10485): Could not proc
Looking over the consumer proguard rules for the purchases library on Android, I noticed the first line is `-keep class com.revenuecat.** { *; }` which ends up causing most of the SDK to be kept when using R8. This totals over 9100 methods (as of the latest version). Is there a reason that the entire SDK is kept? Can you relax the rules so that some of the unused code can be stripped?
I tried out the metrics API and I noticed something strange:All my revenue is in GBP, yet for the item “Monthly Recurring Revenue in GBP”, the value is returned as 0 and the unit still shows as $. Only the “Monthly Recurring Revenue” item returns a value, but it’s in $.My account “Date and Region” set up also has GBP selected, but I’m getting £0 as my MRR. Is there a way to get the actual value of GBP back? I don’t really want to do a conversion as it will be inaccurate due to currency fluctuations (and that means a conversion to USD and back to GBP which can cause even bigger discrepancies).As an example, if I had £100 in revenue and RevenueCat uses a rate of 1.31 to convert it to USD (Monday’s rate), it would show in the API as $131. If I convert it back to GBP using a rate of 1.35 (today’s rate), the value of $131 would convert to £97. As I will be receiving my funds in GBP, this is quite inaccurate and I want to find something that can tell me my actual revenue instead of a do
Hello,We are in the process of developing a so-called “web2app” onboarding for our iOS app.Currently, all purchases are handled by Apple using IAP:s. Soon, some purchases will be handled by a third party, before the user has even opened our app. In this case, the user will go through a web flow to create their account and pay for our product, after which a webhook is posted to us with some information about the user and their purchase. At this point we will create a record for the user in our system.Now, to my question:The 3rd party payment processing entity will generate a user id, which they will use when posting information about the premium purchase to RevenueCat and to our system (using webhooks). After the user downloads the app, they will be able to authenticate as the user we have created in our system. However, we want to alias the user id given to RevenueCat (generated by the 3rd party), with the user id in our system.Is there a way to achieve this using the RevenueCat iOS SD
The RevenueCat SDK (5.25.3) cannot be built in Xcode 16.4.The error message is as follows:```Failed to find a suitable device for the type IBSimDeviceTypeiPad3x (com.apple.dt.Xcode.IBSimDeviceType.iPad-3x) with runtime iOS 18.5 (18.5 - 22F77) - com.apple.CoreSimulator.SimRuntime.iOS-18-5```
I am participating in the bolt.new hackathon and working to integrate RevenueCat into my React Native Expo mobile app, however I am encountering issues. Primarily, if I understand correctly, the Expo Go app does not include support for `revenue-cat-purchases` library, so I would need to create a development build of the app to integrate RevenueCat into the app. Part of the hackathon terms are to primarily use Bolt.new to build the app, and I don’t believe bolt supports expo development builds (only Expo Go). Has anyone had luck building a subscription based app in Bolt.new? I greatly appreciate any guidance or suggestions.Thank you!
I have created 4 products weekly, monthly, annual and custom. when i try fetch it only gets custom one i cant get them all. what should be problem? I have one “default” offering and add them all in.
I’m using @revenuecat/purchases-js within React Native for Web, and I’ll trigger RevenueCat’s purchase page to be displayed, which has a back button. If I press that back button, the purchase page disappears, but most of my app is covered by a black div, with the exception of my header. Weirdly, I can’t select the div with the element selector in developer tools. Is there a way to address this? Is there an option to open the purchase page in another window, by chance? I couldn’t find one in the docs. Thank you.
Hello, Im having issues with opening Paywall V2 inside Expo app (Android). On iOS it works totally fine but on Android the app crashes (the screen becomes black).Here is the code for my modal:```import { useRouter } from 'expo-router';import { View } from 'react-native';import RevenueCatUI from 'react-native-purchases-ui'; export default function Paywall() {const router = useRouter(); return (<View className='flex-1'><RevenueCatUI.Paywalloptions={{displayCloseButton: true,}}onDismiss={() => {router.back();}}/></View>);}```Deps:```"expo": "^53.0.9","react-native": "0.79.2","react-native-purchases": "8.10.1","react-native-purchases-ui": "8.10.1",```Important note: It also didn't work on Expo SDK 52 and RN 0.77
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.