Get help with your SDK implementation.
Recently active
I using a ‘Subscription Renewal Rate’ of ‘Any Renewal Every 2 Seconds’ in Xcode, and what I’m seeing from RevenueCat is very unreliable, both in the behavior of the SDK, and on the web console. Is this renewal rate simply too fast to reliably use? (I’m completely open to the possibility of Apple’s sandbox servers not being efficient enough to support this. In fact, it’s probably true). Here’s an example of what I see (the final ‘Opted-out of renewal’ is expected, I think)
Hello,Despite not having pushed new builds live during this month, yesterday we stared seeing a spike on the attached ANR through Crashlytics. Wondering if anything server-side changed that may have caused this or if the source of the issue its known.Thanks! main (native):tid=1 systid=13134 #00 pc 0x911c0 libc.so (syscall + 32) (BuildId: 02a91a85343debb2911714273ff2b670)#01 pc 0x95f20 libc.so (__futex_wait_ex + 148) (BuildId: 02a91a85343debb2911714273ff2b670)#02 pc 0xfe5c8 libc.so (NonPI::MutexLockWithTimeout + 660) (BuildId: 02a91a85343debb2911714273ff2b670)#03 pc 0x458648 libunity.so (BuildId: 3136b3ea4de05c5c5e8e5c62663529953fcd50fc)#04 pc 0x4584f8 libunity.so (UnitySendMessage + 116) (BuildId: 3136b3ea4de05c5c5e8e5c62663529953fcd50fc)#05 pc 0x4074d4 libunity.so (BuildId: 3136b3ea4de05c5c5e8e5c62663529953fcd50fc) at com.unity3d.player.UnityPlayer.nativeUnitySendMessage(Native method) at com.unity3d.player.UnityPlayer.UnitySendMessage(unavailable:39) at com
I’m working on an app with an auto-renewing subscription. When using Sandbox testing, I can subscribe, and it updates just fine. However, if I cancel the subscription, when I go to get the updated `purchaserInfo`, the `willRenew` property is `true`. Even if I reset the cache, it still won’t be updated.How can I have it properly update?
I’ve integrated RevenueCat’s Capacitor package into our Ionic React Capactior App, and I’m running into an issue getting everything working in Testflight. I’ve added the functions into our app and everything is working as expected when running the app locally, but the app is crashing as soon as it’s opened in TestFlight. Can Anyone Help ? Paid & Free app agreements are updated and Active , What could potentially be the cause of this?
Hello everyone,I’ve been working on integrating promotional offers in Android using RevenueCat within a React Native project, and after a lot of research, I wanted to share some thoughts and open up a discussion. While RevenueCat provides an overview of promotional offers, there is a noticeable lack of practical code examples, especially for Android developers.In particular, when trying to set up promotional offers based on eligibility criteria, the official documentation outlines the concept but doesn’t offer any specific guidance or code snippets for implementation on Android. This gap has made it tricky to move forward seamlessly in a React Native environment.If anyone in the community has successfully implemented these offers or has insights on how to tackle this issue, I’d appreciate your input!For reference, here’s the documentation that lacks code details:RevenueCat Google Play Offers DocumentationLooking forward to hearing your thoughts and best practices!
I’d like to let my new users experiment my app with all the features for X days without enforcing them to subscribe with a free trial and force them to unsubscribe if they don’t like the app. When the X days are over, they have to purchase a subscription in order to continue to use the application. Is the `first_seen_at` a reliable attribute to check in this case? Does it reset if the user remove then reinstall the application (on macOS) or does it internally use the StoreKit `originalPurchaseDate` date?
Our app has had great success using RevenueCat experiments to optimize subscription pricing for an iOS app. We are looking at adding an additional higher service tier, and would like to know if there are best practices given that we have users on multiple subscription groups.In order to prevent users of our main (“plus”) subscription tier from cross-grading to a lower price point offered in a pricing experiment, our experimental price points have all been confined to their own subscription groups. We understand this to be RevenueCat’s recommended best practice.Additionally, in order to avoid negative user reviews, we have not consolidated our users from low-price experiments onto the final higher price. We have subscribers active at several price points in several subscription groups.We now want to add a “pro” service tier at a higher price point. What is the best way to do this without risking users being subscribed to both the “plus” and new “pro” tier at the same time? It seems that
In my Flutter application, I’ve implemented a PaywallFooterView to display subscription offers. I would like to dynamically change the footer text or perform specific actions based on the offer that the user selects. How can I: 1. Detect the currently selected offer from the available options? Any guidance on how to achieve this would be greatly appreciated!
Hi.RC SDK 5.3.4 is used.I upgraded to Xcode 16.0 and macOS 15.0When I install my project to a simulator w/ iOS 17.5, all works fine - no warnings.When I install my project to a simulator w/ iOS 18.0, I get about 30 warnings (same when installed to an iOS 18.0 device).RevenueCatDiagnosticsPostOperation.swiftClass 'DiagnosticsPostOperation' must restate inherited '@unchecked Sendable' conformanceDispatchTimeInterval+Extensions.swiftExtension declares a conformance of imported type 'DispatchTimeInterval' to imported protocol 'Comparable'; this will not behave correctly if the owners of 'Dispatch' introduce this conformance in the futureGetCustomerCenterConfigOperation.swiftClass 'GetCustomerCenterConfigOperation' must restate inherited '@unchecked Sendable' conformanceGetCustomerInfoOperation.swiftClass 'GetCustomerInfoOperation' must restate inherited '@unchecked Sendable' conformance...Can someone confirm this behaviour?Is this an RC, Xcode or iOS issue?
I’ve just noticed that there is now an official Capacitor plugin, having been using the cordova plugin in my Capacitor app for the last few years.Can anyone tell me if this is a drop-in replacement or will I need to do some rewriting?Thanks!
Hi.I am not able to purchase subscription for other user after purchase some subscription on the other account.Steps:User A login + Purchase.logIn(userAId)User A purchased some subscription - SuccessUser A logout + Purchase.logOutUser B login + Purchase.logIn(userBId)User B purchasing some subscripton - Failed - Error, gathering informtion from the server, PG-GEMF-O1. Android, React native, Expo, Google Play, SubscriptionWhy this happend?How to solve it? Please help!Thank you
I got the folloing error after updagting purchases_flutter from 6.26.0 to 8.1.3. I am using Android studio on iMac. How can I fix this errorThe setter 'observerMode' isn't defined for the type 'PurchasesConfiguration'. (Documentation) Try importing the library that defines 'observerMode', correcting the name to the name of an existing setter, or defining a setter or field named 'observerMode'.This is my code:PurchasesConfiguration configuration; if (StoreConfig.isForAmazonAppstore()) { configuration = AmazonConfiguration(StoreConfig.instance.apiKey) ..appUserID = null ..observerMode = false; } else { configuration = PurchasesConfiguration(StoreConfig.instance.apiKey) ..appUserID = null ..observerMode = false; } await Purchases.configure(configuration);} // end
Issue:I have a sandbox subscription that expired over 6h ago, but it still returns in the active entitlements.The expiration date in the customer info from flutter sdk is: expirationDate: 2024-09-28T14:07:31Z. The current date is 2024-09-29T06:00:00Z. However, isActive is still true. I guess possibly a caching issue, but 6h seems a bit long? On the revenuecat website when I search the user it shows the annual package expired as expected. The issue is just with the sdk result.Any ideas on how to fix? Don’t want to push to live if some bug here. Json output:Here is relevant part of the entitlements json: {entitlements: {all: {premium: {identifier: premium, isActive: true, willRenew: true, latestPurchaseDate: 2024-09-28T13:07:31Z, originalPurchaseDate: 2024-09-23T02:20:56Z, productIdentifier: vb_1y, isSandbox: true, ownershipType: PURCHASED, store: APP_STORE, periodType: NORMAL, expirationDate: 2024-09-28T14:07:31Z, unsubscribeDetectedAt: null, billingIssueDetectedAt: null, productPlanIde
Hello,I read the documentation and if I understand well, if the user purchases a subscription then it will be linked to the app user ID.In my case, I do not provide any custom user IDs. What happens if the user uninstalls, then reinstalls the app ? He will lose his premium status since the app user ID won’t be the same.What can I do ?
Is there a fetch policy for getCustomerInfo that translates to,Go to network, get the most recent If network fails, use cache if not stale Return error if cache is staleBasically, “fetchedOrNotStaleCached”, borrowing from the policy names below. Is there any reason this is not supported (so I don’t try to create it through extra code either)? I thought maybe a rate limit is behind this, but not sure now (it seems a rate limit of 5 minutes for this type of policy for example would become effectively “notStaleCachedOrFetched”). public enum CacheFetchPolicy: Int { /// Returns values from the cache, or throws an error if not available. case fromCacheOnly /// Always fetch the most up-to-date data. case fetchCurrent /// Returns the cached data if available and not stale, or fetches up-to-date data. /// - Warning: if the cached data is stale, and fetching up-to-date data fails (if offline, for example) /// an error will be returned instead of the outdated cached data.
Hello. For some reason the purchases work perfectly in sandbox but production it’s not working. I can see the purchase in my revenuecat dashboard, but I don’t see any logs in my server. To make sure I deleted the app and re installed the development build to make another purchase, and it worked perfectly, meaning the purchase appears in the RC dashboard but I also can see the logs in my server.It’s crucial that this works because it’s my server that adds the tokens to the customer’s account. I should mention that the app became available just a couple of hours ago in the appstore, so maybe there is something about that. And that I double checked I entered the RC URL for both sandbox and production in the Apple Appstore app information: Hopefully somebody knows what the problem could be.Thank you for your help
I’m relatively new to iOS/Swift, and completely new to the RC SDK. I’ve made some progress with the SDK purchase flow and Apple sandbox testing. I’m trying to figure out the best practice to determine if a purchase is in progress—something robust that can persist across app re-launch—so the UI can properly reflect that.From the sample app (Magic Weather) code and documentation, Swift try/await format (which I assume is recommended over completion handlers) seems to be the proper way to call purchase(). Is this correct?Managing an isPurchasing property, as in the sample code below, is straightforward; what if the purchase takes longer than user’s patience, and for that (or any other) reason, app is terminated and re-launched before purchase is complete? Is there any API that could return something like “purchase in progress” or similar to help get the fresh app state back on track? Is this something that apps even consider?do { let result = try await Purchases.shared.purchase(package
I received this error when tried to build my app on EAS after installingnpx expo install react-native-purchasesnpx expo install react-native-purchases-ui Run script build phase 'Create Symlinks to Header Folders' will be run during every build because it does not specify any outputs. To address this warning, either add output dependencies to the script phase, or configure it to run in every build▸ ** ARCHIVE FAILED **▸ The following build commands failed:▸ SwiftCompile normal arm64 Compiling\ PurchasesPlugin.swift /Users/expo/workingdir/build/node_modules/react-native-purchases-ui/ios/PurchasesPlugin.swift (in target 'RNPaywalls' from project 'Pods')▸ SwiftCompile normal arm64 /Users/expo/workingdir/build/node_modules/react-native-purchases-ui/ios/PurchasesPlugin.swift (in target 'RNPaywalls' from project 'Pods')▸ (2 failures)** ARCHIVE FAILED **The following build commands failed: SwiftCompile normal arm64 Compiling\ PurchasesPlugin.swift /Users/expo/workingdir/build/node_modules/r
Hello 👋, In our app we show the a 30 day badge next to the offer we show to the user. We also keep that badge after the user has bought the subscription. The user is now allowed to subscribe a second time, so we found ourselves in this situation: - if a user never subscribed, show the period the offer object has, np here- if they subscribed to this offer, use the expiration date minus the last purchase date rounded to the day to show the 30 days. Our concern is now if a user cancels their subscription before the trial ends then resubscribe, will the expiration time and more importantly, the latest purchase date change? I'm not sure a user can purchase a subscription if he's on it's free trial, even if canceled. Didn't find info on this so I'd appreciate any insight that you have. Thank you.
Hi RevenueCat team!I know this issue has about 63 😵 questions posted by a community and they have different reasons, so I guess you could be biased not wanting to solve this annoying bug. However it affects to many users and I just can’t let it live, so I’m seeking for your support. The background:I’m using the latest version your Flutter package `purchases_flutter: ^4.10.0`. I’ve been seeing this issue since upgrade to 4.x.The issue appears only for some android users, the app has about 8000 DAU, and in Crashlitycs there are about 200 daily errors related to that issue. For the rest of android users it seems to work fine. I also never were able to reproduce it internally. The devices distribution is the following:72% - samsung 5% - HUAWEI 5% - TECNO MOBILE LIMITED 3% - Sony 15% - Other (11) The exception is the following:flutter_error_exceptionPlatformException(23, There is an issue with your configuration. Check the underlying error for more details., {code: 23, message: There is
I just made my first iOS sandbox purchase using the RevenueCat Flutter SDK. Then I went to my dashboard and could not find the fake purchase. I looked at the docs and it claims I need to toggle my view sandbox data ON. The issue is that this toggle is disabled. When I hover I get the “not-allowed” cursor. Why would this toggle ever be disabled?
I have the same problem as this post: but im using react native sdk, after completing the purchase onDismiss is called
I am facing an issue with my Flutter app. I have a subscription that includes two products: an annual and a monthly option. Both products are correctly set up in Apple and RevenueCat. However, in my Flutter App when I fetch the offerings the annual product appears, while the monthly product shows up as null. Why is this happening?
Is there a way to add a video to the existing fullscreen paywall in place of the image?
Within a local Xcode testing environment we sometimes run in to the following error (which is received from RevenueCat):Error Domain=RCBackendErrorDomain Code=7638 "There is another request in flight trying to perform the same action."This is the error that we receive back when we try and make a purchase (within the following code block): func purchase(package: Package, completion: @escaping (InAppPurchaseResult) -> Void) { purchasePackage(package) { _, purchaserInfo, error, userCanceled in if userCanceled { completion(.userCancelled) } else if let error = error { completion(.failure(error)) print(error) print(error.localizedDescription) } else if purchaserInfo?.entitlements.all["unlocked"]?.isActive == true { completion(.success) } else { // According to RevenueCat doc it should never happen } } }Even though we receive
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.