Get help with your SDK implementation.
Recently active
Hi, I’m trying to implement a subscription system with multiple tiers in a Unity cross-platform app.My concern is if there is a way where a user that has activated a subscription in a platform can upgrade the subscription from a different platform.I have also seen that there is a “managementUrl” that can be used to guide the user to the correct portal in case that he wants to manage a subscription, but I cannot find that url in the Unity Revenuecat SDK.
I have an app that offers annual, monthly and lifetime subscriptions. They all access the same ‘premium’ entitlement. If a new in-app user account is created and I restore purchases, I am able to successfully transfer entitlements between users, provided that the parent App Store Sandbox account is the same. I’m using web-hooks, so whenever a ‘transfer’ event is fired, I can update my database to make sure it is in-sync with RevenueCat. I remove any subscription information from the ‘transferred_from’ user, and apply it to the ‘transferred_to’ user. This is working perfectly for restoring monthly and annual subscriptions. But there are issues for lifetime purchases. Purchase a lifetime subscription using App Store account ‘x’. Sign out of Sandbox account ‘x’, and sign into a completely new, unrelated Sandbox account ‘y’ with no purchase history. Create a new in-app account using the new Sandbox account. Call restorePurchases. I would expect that nothing should happen, since Sandbox
Let’s assume I change my Terms of Service.At app start, I prompt each user to accept the new terms. Users who reject the new terms shall be denied access to the app.How do I handle users with a paid auto-renewing subscription?Is there a way to cancel this subscription? Or prevent auto-renewal? It seems illegal to deny access to my app, but continue to charge them. Not sure if it’s relevant for this question, but I use react native.
I have a question about the syncPurchases function when I have two users of my app on one Apple Id. What happens when I call syncPurchases after then calling logIn with another App User Id? I know that the restorePurchases function throws an error that the receipt is already in use (if I set transfer behaviour to not transfer), but syncPurchases does not do that. In fact, it doesn't do anything and I don't know what exactly is going on. Is it safe to call syncPurchases when users sign in to the app? Not on every startup but while calling my backend sign in function.
Hi folks,In the {{ product.price_per_month }}/mo section in Paywall V2, the price data always stays in USD currency. even though I have localized paywall for countries, the currency section is not localized according to the prices and currencies in the countries. But when I select the subscription package in paywall and continue, the currency is localized without any problem in the last confirmation section. Where do you think the problem is coming from? If you want I can show you in detail with screenshots?(I am trying all process on real device in testflight).
I just made a change to my v2 Paywalls, and the badges that I have are no longer rendering their backgrounds. This was working fine today, until I made and published an unrelated change, so it seems something may have broken today. Everything looks fine when viewed in the online editor. Images below - the ‘33% OFF’ text is the badge - the text can barely be seen in the after, but the purple background is no longer there. Before: After:
We're currently testing the new Paywall v2 feature in our React Native frontend. Everything works as expected except for the badges. We've tried all possible configurations—rectangle, pill, image background, colored background, etc.—but none seem to render correctly. The discrepancy between the Paywall Editor and the actual rendered Paywall on iOS persists.Has anyone else encountered this issue? Any insights or workarounds would be greatly appreciated!Current versions:"react-native-purchases": "^8.6.1","react-native-purchases-ui": "^8.6.1"“react-native”: "0.76.7" "expo": "52.0.36"Attached is a screenshot of different approaches in the Paywall Editor preview and how it gets displayed on device.
What could be the reason that I cannot access my Google Play subscription’s free trial offer from the SDK by calling `aPackage.product.subscriptionOptions?.freeTrial`? It is always null.This is a new subscription product which I created after reading through your migration guide from 5.x -6.x. It was suggested there that I should create new subscription products, so I did. I used to have two products, one annual and one monthly. I created a new single subscription with 2 base plans and an annual which has the free trial offer. With the old setup and 5.x version this worked, but now I cannot see the free trial in the new base plan at all. Any help is appreciated. All base plans and the new offer are active in Play console and the products have been added to RC packages. Also this annual base plan looks to be “backwards compatible”.This happens with the latest 6.3.0 version of the purchases SDK.
We are trying to implement hard paywalls with the flutter SDK, not luck so far.We have tried: RevenueCatUI.presentPaywallIfNeeded()RevenueCatUI.presentPaywallAnd honesty WE don’t see a big difference between them.Any of you have found a workaround?If anyone is interested the app is called Petme.https://www.petme.social/ https://apps.apple.com/us/app/petme-social-with-your-pet/id1663635642 https://play.google.com/store/apps/details?id=com.zerosgroup.petme&pli=1
I am adding a new package to our default offerings. An awkward situation I ran into is that my released version is designed to show all packages under my offerings, so that even when I’m still developing and change the ui for the new package, users can already see the new package in the released version.Of course I can workaround this issue, change my code to not show all packages first → after that is released → develope my new package. I was wondering it makes sense to add developer mode to offerings, and wondering if other people share similar thoughts.
In the iOS SDK the `StoreTransaction` type has the `jwsRepresentation` field but it’s marked internal. So I can’t access it. I want this value so that I can send it to my server and verify the transaction with apple. Then our backend can run any necessary updates to the user it needs.Is there a reason this is marked internal whereas most of the other properties are public?
I have the following code:``` Tab ("Passport", systemImage: "airplane.departure", value: "passport") { NavigationStack(path: $path) { if displayPaywall { PaywallView() .onPurchaseStarted({ package in print("Purchase started") }) .onPurchaseCompleted { customerInfo in self.displayPaywall = false print(customerInfo) } .onRestoreCompleted { customerInfo in self.displayPaywall = false print(customerInfo) } } else { ScanMRCView(path: $path) .environment(settingsStore) } } }```none of the callbacks und
Hi there,this is kinda serious I think. The onPurchaseCompleted is not being called whenever I test in sandbox. Since this is the function recommended on the forum by other revenuecat staff, it kinda of shakes my confidence in RC unfortunately, especially when in other posts it was said “the team is investigating the issue”Could someone kindly help out? var body: some View { // This view immediately triggers RevenueCat's paywall presentation. PaywallView(displayCloseButton: false, performPurchase: nil, performRestore: nil) .onPurchaseCompleted { res in print("YAY! THANK YOU") print("res = \(res)") onPurchaseCompleted() } .onPurchaseFailure { error in print("purchase error \(error)") } .onRequestedDismissal { } } the `onPurchaseCompleted` and `onPurchaseFailure` are never called but `onRequestedDismissal` is.
I am using the React Native package with RevenueCat, and everything is working as expected on iOS (thanks for your hard work on the great RN package, by the way).There is still an issue with Android though, and I have been struggling with it for a few days. Initially, I thought it was because I did not have a release published on a test track, but that has now been rectified (approved by Google) yesterday, and I’m still getting the “The product is not available for purchase” on Android.Things I have tried:Make sure the app is published on the “Closed Testing” track (it is): Ensure that both the app ID and SKUs for the products are the same (they are). Ensure subscriptions are active in GPC (they are): Does anyone know what else I can try, as it’s a bit annoying since the app is finished, but I’m blocked from testing.Thanks in advance for any help, and all the best for 2022!Ben.
Hello,I’m trying to set the paywall dynamically inside of my app, and I have certain offers that do not yet have paywalls created.I was trying to create a fallback in this case, to prevent user error on our end, in the case we do not have a paywall setup for a specific offer, so that we dont present the user with a black paywall screen.I noticed there wasnt any event that triggers in this case that ` RevenueCatUI.PaywallError 0 ` fires.Wondering if there is a way to react to this error being fired, so I can handle it. Thanks
In the Xcode Simulator, I enter my sandbox email and password and press ok. To be clear, I use the same email and password to log into iCloud for this sandbox account.I get the following in the console. The Paywall is not dismissed and nothing else happens:Purchase did not return a transaction: Error Domain=ASDErrorDomain Code=530 "(null)" UserInfo={NSUnderlyingError=0x600000cfe9a0 {Error Domain=AMSErrorDomain Code=100 "Authentication Failed The authentication failed." UserInfo={NSMultipleUnderlyingErrorsKey=( "Error Domain=AMSErrorDomain Code=2 \"Password reuse not available for account The account state does not support password reuse.\" UserInfo={NSDebugDescription=Password reuse not available for account The account state does not support password reuse., AMSDescription=Password reuse not available for account, AMSFailureReason=The account state does not support password reuse.}", "Error Domain=AMSErrorDomain Code=0 \"Authentication Failed Encountered an unrecognized authenti
Greetings, Initial purchase (Plus; our low tier) is successful. Upgrading (Pro; our high tier) is successful. Upon opening the paywall for Plus to perform a downgrade, it says WARN: User is already subscribed to this product. Ignoring Which is weird, since I have upgraded! Thought revenuecat would revoke the old entitlement and set it to unactive or delete it…. so I waited 5 minutes for it to expire (pre-set by xcode).. and when attempting to downgrade to plus once again, it initially shows the paywall and says it has been successfully purchased and will take an effective after the current (Pro) subscription has ended. Then immediately followed by this error:- [purchases] ERROR: � Product purchase for 'plus_1_year' failed with error:Error Domain=RevenueCat.ErrorCode Code=8 "The receipt is not valid. The purchased product was missing in the receipt. This is typically due to a bug in StoreKit."UserInfo={rc_backend_error_code=7712, rc_response_status_code=422,NSLocalizedDescription=The re
Hi RevenueCat Community,I’m currently developing a React Native app and using a custom paywall implementation. We’re now considering switching to the SDK’s paywall if one is configured for the user's current offering. However, we’ve encountered a challenge: the RevenueCat API response doesn’t seem to include an explicit flag or property indicating whether a paywall is configured for an offering. If showing the UI Paywall without a paywall configured, a default, rather bland screen is shown.At the moment, we rely on naming conventions (e.g., identifiers like "sandbox_no_paywall" vs. "sandbox_offer") and occasionally custom metadata fields, but this approach feels hacky and a bit fragile.I’m curious:Is there a built-in or recommended way within RevenueCat to detect whether a paywall is configured for an offering? Are there any best practices or plans to support a native flag (e.g., "hasPaywall": true) in the API response? If not, what do you recommend as the best approach to distinguish
Hi all,In flutter project, we are using the syncPurchases method to automatically sync transactions when users launch the app. However, we are encountering an issue where the login prompt always appears when calling syncPurchases in the sandbox environment. This issue was resolved when I created and logged with Apple Store sandbox account.The documentation mentions using syncPurchases instead of restorePurchases to perform a silent sync without triggering any prompts. Below is the code snippet we are implementing, which runs when the app launches. bool reloadData() async { try { await Purchases.syncPurchases(); await fetchProducts(); return true; } catch (e) { return false; } }I have the following questions:In what specific cases does calling syncPurchases trigger the login prompt? In the release version on the App Store (not sandbox), will calling syncPurchases still display the login prompt? Since this is an urgent matter, I hope the team can review and
Hello,I’m running into issues trying to add RevenueCat to my SwiftUI multiplatform project (iOS and macOS) using Xcode 15.2. I’ve tried adding the package via Xcode’s Swift Package Manager interface, but it stays stuck at “progress” without completing. I also tried integrating RevenueCat through CocoaPods, and while the pod appears to install, I still receive the following build error:No such module 'RevenueCat'I’ve tested multiple versions of RevenueCat, including the latest (5.16) and older releases like 4.0.0, 4.33.0, and 4.25.2, but the problem persists. I’ve also cleared DerivedData and performed clean builds to no avail.Does anyone have any insight into what might be going wrong? Are there known compatibility issues with multiplatform projects or Xcode 15.2? Any guidance would be much appreciated.Thanks!
My paywall layout overlaps with iOS’s top bar and this looks awful, why don’t you give an access to a wider options of starting a paywall view with ability to disable ignore safe area??
Can someone please give me some clarification on the following scenario regarding anonymous users and the restorePurchases method. I’ve been chasing my tail on this for a week.Here’s the scenario:My app lets users use and subscribe to the app anonymously. RevenueCat creates an anonymous App User ID, when the user first opens the app. When the user subscribes, that anonymous ID is linked to the purchase. Webhook events list this anonymous ID in both the app_user_id and original_app_user_id fields.Now, let's assume the user gets a new phone:They download and open the app, generating a new anonymous App User ID for the new device. The user clicks "Restore Purchases," and I call restorePurchases() from the SDK. The restorePurchases() method returns a CustomerInfo object containing an originalAppUserId field.My questions are:What value will be in the originalAppUserId field of the CustomerInfo object after the restore? The anonymous App User ID from the first device that originally purchase
There appears to be a problem created in part by Apple where in a multi-scene app such as a Catalyst app with multiple windows, the StoreKit UI sheets show in the wrong window which is quite problematic. The user flow doesn’t work right because they start a purchase in one window and the sheet appears in another which may be hidden. The challenge is that Apple introduces APIs to allow us to specify the correct scene - as well as SwiftUI modifiers to do this correctly for you - but as a user of RevenueCat it does not seem to be possible to use these without forking the RevenueCat SDK because Purchases is final and the internals are private. Please see this issue for details. I feel stuck by RevenueCat without a good solution for this problem in the app I’m about to ship on Mac. Github issue
I am using RevenueCatUI.presentPaywall to display Paywall on ANDROID, How I can close paywall by auto when user make Pruchases process, the Paywall close just if user click on X icon, I need to close it automatically by RevenueCatUI SDK
In my app I use the webhook from RevenueCat to keep my backend in sync with customer entitlements and enforce the entitlement check on every request from the app.I know that webhooks are async and there might be some lag, so what I do is check the database first for the active entitlement, and if it is not found or inactive, I hit the RC API as a fallback.My question is on the front end - in the React Native SDK, when the promise resolves on the purchasePackage() method, can we assume at that point everything is in sync between the App Store or Play Store and RevenueCat? Even if the first webhook were delayed a little, would I immediately find the user’s active entitlement via the API in my fallback check? Hopefully this makes sense.
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.