Discussion and help from anything related to RevenueCat.
Recently active
I’m using RevenueCat’s new paywall components with the Flutter SDK (flutter_purchases ^9.2.0). On Android, the paywall displays localized prices correctly using {{ product.price_per_year }} and {{ product.price_per_month }}. On iOS, those same variables are always blank when the user navigates to the paywall.Here’s what I’ve already verified: The app is live in production on the App Store (not TestFlight). The subscription product is approved, cleared for sale, and has U.S. pricing active. All legal agreements in App Store Connect are signed and up to date. The product belongs to a valid subscription group, and product identifiers match across App Store Connect, RevenueCat, and the app code. Only base price variables ({{ product.price_per_* }}) are used, since there are no introductory offers configured. The RevenueCat dashboard shows the iOS product as active (not missing). Verified on multiple real iOS devices with different Apple IDs. The issue persists on all devices.
Hello, I have a Flutter Project where we are using Paywalls to display RevenueCat offerings to customers.For Android, on my Google subscription I have multiple offers under a single Base plan as seen below:Is there a way to pick specific offer(s) when using Paywalls?
Same code, works on iOS, not working on Android."react-native": "0.79.5""expo": "~53.0.20"Android:“activeSubscriptions": []iOS"activeSubscriptions": ["hey_roar_cinema_pass", "hey_roar_creator_pass", "hey_roar_unlimited"]
I’m attempting to make my flutter app available on MacOS as well as iOS and currently use the RevenueCat paywalls with the purchases_ui_flutter package.Unfortunately the purchases_ui_flutter package does not support MacOS, is there a plan to add RC paywall support in the near future? If not is the recommended way to continue using RC paywalls for MacOS to build via a Catalyst app instead of direct MacOS?
really love using revenue cat but there is one foundational feature missing which is super annoying for us. we are using it in our native app and our nextjs web app and created separate offerings. we need discount codes to set up our partner program and hand out special discounts in email campaigns. as i see it, this doesn’t exist yet which is a dealbreaker for any serious b2b company. so requesting you guys to add this asap. the mvp of this would be just linking discount codes to a given product. stripe offers this as well so api changes shouldn’t be so hard.
Use case:I have a product priced at $71.99 per year in the App Store. On my paywall I am using the variable {{ product.price_per_month }} to display the product's price per month. However, the paywall is rendering $6.00 when I want it to display $5.99.I do not want to hardcode $5.99 on the paywall because then the price will be shown in USD even if the user non-USD, which is not good.Desired Solution: Support for conditional logic directly within the template to show text or values only for specific currencies, such as displaying a hardcoded value but only for USD users.
I love the WebBilling feature, but thought it would be even more powerful to be able to embed the products of a offering as part of my webpage.So for example when a user clicks on a package it would navigate directly to the checkout page.This would make the integration more seamless for users checking out my webpage being able to see the different packages and purchase right away; for example from a landing page.It will also give developers more tools to customize how the packages are shown.
Is there an issue with displaying Paywalls specifically with an offering and or in the sandbox environment with Xcode builds?If I use this is shows the paywall instantly PaywallView()however if I use an offering its blank (as if offering is nil). If I swipe app up to open the app switcher on iOS the paywall is actually loaded and is showing when app re-enters foreground. So wondering if this is a known Xcode sandbox debug issue..fullScreenCover(isPresented: $hasToShowPayWall) {if let offering = offering { PaywallView(offering: offering, displayCloseButton: true) } else{ Text("offerings is somehow nil") }}offerings a awaited and fetched before triggering the fullScreenCover. so offering passed in cannot be nil yet it claims it is @State private var offering: Offering? = nilif let offering = await availableOfferingWithIdentifier("default") { await MainActor.run { offering = offering withAnimation { hasToShowP
Hello,I am sending purchase and trial start events to Meta using the RevenueCat Meta Ads integration. Currently, I can see the events in Meta, but when I check the event details, Meta reports that no event parameters were detected.In my Flutter app, I am calling Purchases.collectDeviceIdentifiers() after the Purchases SDK is initialized and after the user accepts the App Tracking Transparency permission, in order to collect the advertiser ID.Additionally, after initializing the Purchases SDK, I call a method to get the Facebook Anonymous ID and pass it to the Purchases SDK using Purchases.setFBAnonymousID(fbAnonymousID).I am not sure if there is anything else I need to do. My goal is to see the advertiser ID as an event parameter in Meta.Also I am not sure why I cant see any other parameter for the StartTrialComplete event, what parameters RC sends to META? Thank you for your guidance.
Hello,I’m providing a free trial on my weekly plan and I want to check if a user is eligible for the trial. The goal is to display a text (e.g., “3 Day Free Trial”) based on eligibility.How can I check if the user has already availed the free trial or not?I tried this code, but it’s not working: val freeTrialText = if (pkg.storeProduct.subscriptionOptions?.defaultOffer?.freePhase != null) "3 Day Free Trial" else "" println("3 day trial text: $freeTrialText")This always returns empty.On iOS, the payment popup correctly shows the 3-day free trial, but in the app it doesn’t reflect.Any ideas on what I might be missing?
I am on the latest version of iOS SDK, and set delegate for observing for active entitlements and then updating the observable object. It makes it self-contained and effective for a SwiftUI app.My problem is that its method is called when initializing the SDK, but not when the purchase is done, also not when restored purchases.I have set it up the same way in my other apps, and they are on older versions of SDK, where it worked. I hope this is fixed quickly, don’t want odd workarounds in the code.
Before showing paywall I want to check if any purchase already made from a google play or apple account. My app will not support account transfer so if the user already purcahse for any account and user logged in with different account we don’t want to purchase with the same google play or apple account. We want to show a message like “Please change your google play or apple account as another user already using that.”. To show this message I need to know from any account a purchase has been made or not. I can do that by Google Billing client but I want to know more generic way using revenuecat.
In my app’s onboarding flow a user can claim a referral code, which changes their offering via WinWinKit. On the next step of onboarding purchase screen is shown, but the old offering is shown.I figured that offerings are loaded and cached at initialization of the SDK, but why can’t I clear the cache or force load them?I tried using invalidateCustomerInfoCache and checked its implementation, but it won’t do the thing.Also found similar questions in the community, both marked as resolved, but can’t find a solution for myself.
Hello,I’m trying to add a hard paywall in a Capacitor project.All is working as intended on Android, the paywall is displayed full screen, while on iOS it’s displayed as a sheet.I don’t see any way to choose whether to use sheet or full screen.I tried adding a close button and removing it but it’s the same.Any ideas ?Thanks
When you add a text in the Paywalls editor you can add a mailto: link in the text. Is there a way to include the subject in that link? The editor seems to not store any parameters of the mailto links.Along the same lines it would be super nice if instead of creating a whole different offering, paywall and targeting for iOS and Android just to have one link be different there were a way to just provide a different link for each environment.
I only recently updated Xcode to 26.0. While adding some features to my app, everything was running fine in the simulator. But when I tried to run it on an external device running iOS 26, I start getting this error:Concurrency is only available in iOS 13.0.0 or newerI’ve tried to Clean Build Folder to no avail.Now when trying to run in simulator I’m getting this error.Stored properties cannot be marked potentially unavailable with '@available' Any suggestions?
Hey everyone,I’m integrating the Meta SDK with RevenueCat and I have a question about how to handle FBAnonymousID.Right now, I grab the FBAnonymousID from the Meta SDK and then pass it manually into the RevenueCat SDK in my code. From what I understand, this value is generated per device.In my login flow, I set the appUserId in RevenueCat based on a value from my backend.Here’s the part I’m not sure about: When a user logs in, I update the appUserId in RevenueCat. The FBAnonymousID, however, stays the same (since it’s tied to the device). My question is: is it okay that different RevenueCat users on the same device share the same FBAnonymousID? Or should I be re-generating a new one during the login process to avoid mixing analytics?Has anyone else run into this or figured out the best practice?
im getting Associated Entitlements but im not getting Associated Offerings in revenue cat subscriptions android app i got entitlement already but not the offerings!! while on ios it is working fine!im stuck here from few weeks couldnt get how to do?this is what i face in app[RevenueCat] ₹!! Error fetching offerings ⁃ PurchasesError(code=ConfigurationError, underlyingErrorMessage=There are no products registered in the RevenueCat dashboard for your offerings. If you don't want to use the offerings system, you can safely ignore this message. To configure
Hi, so currently I have a few TestFlight users who have subscribed to my app through the sandbox. When I push the app to the iOS App Store, I would like these same users to retain their memberships.Is this the default or do I have to do something behind the scenes to allow this to happen?Thanks!
If I am not mistaken, the GDPR requires apps to delete personal data after a set period of inactivity (e.g. 1 or 2 years), because of the Storage Limitation principle. I wonder how other apps handle this, and if this means I would need to track users with an in-app user_id, and save each time they open the app on a backend to delete them after being inactive for 1 or 2 years.
Hi everyone,I’m currently integrating RevenueCat with Firebase Analytics and Google Analytics 4 (GA4). The setup seems fine, but after checking in Firebase Analytics and GA4, I don’t see any RevenueCat events coming through.A couple of questions: Is there a list of the event names that RevenueCat sends to Firebase/GA4? How long does it usually take for events to appear after integration? Is there any specific configuration required on the Firebase or GA4 side (other than linking the SDKs)? I couldn’t find any documentation that clearly lists which events RevenueCat pushes to Firebase/GA4, so any guidance or experience would be appreciated.Thanks in advance!
Hello everyone,I am currently working on paywall and am having some difficulty displaying the paywall correctly. Currently, I display the paywall as follows:ContentView() .presentPaywallIfNeeded( requiredEntitlementIdentifier: Constants.ENTITLEMENT_ID, purchaseCompleted: { customerInfo in [...] }, restoreCompleted: { customerInfo in [...] } )However, it is displayed as a sheet dialog and can be easily closed. A paywall that can be easily closed is not a wall—it's just a door that can be kicked in :)Now I can use the alternative: PaywallView. However, I now have to implement the logic myself to determine whether PaywallView should be displayed or not. Right?Is there an SDK function that allows me to decide whether to display it or not, as with the sheet dialog? The documentation has no info about it.I want the user to be unable to close the paywall. He has to pay or close the app, but the paywall must be impossible to over
I’ve been staring at the Firebase integration docs page for couple of days and I cannot make any sense of it. To put it simply, I want my SwiftUI app on user’s device to be informed when their subscription changes (renewes, is cancelled etc. etc.). I use the anonymous userId provided by RevenueCat, my users are not authenticated, they don’t login with any method. If at all possible, I’d prefer to not store any customer data. All I want is a simple “Hey, your subscription changed!” notification so I can refresh entitlements and check what subscription level user has. Right at the beggining of https://www.revenuecat.com/docs/integrations/third-party-integrations/firebase-integration it says that FirebaseAuth and FirebaseStore are optional and then 2 senstences later that “The Firebase Extension portion requires this step to be completed.’ with a code snippet that clearly uses FirebaseAuth. So is it, or is it not required for me to use FirebaseStore and FirebaseAuth? Is there any document
I’m hitting what looks like a gap in the RevenueCat v2 API and wanted to sanity-check with others + give RC more visibility.Context I rely on canonicalizing App User IDs across anonymous IDs and migrations. The Dashboard correctly shows: Original App User ID All App User IDs (aliases) Webhooks also include original_app_user_id and a full aliases[] array. Problem (v2 API) GET /v2/projects/{project_id}/customers/{id} returns a minimal customer object. No original_app_user_id No aliases Calling GET /v2/projects/{project_id}/customers/{id}/aliases with a non-canonical alias often returns only that same ID (i.e. not the full alias graph the Dashboard shows). Result: the Dashboard and webhooks have the correct graph, but the v2 “Get customer” read doesn’t expose it, and the aliases endpoint behaves as if it’s scoped to the ID you queried rather than the canonical grouping. Expected Either GET /customers/{id} includes original_app_user_id (and optionally aliases), or
## Description Getting "Invalid API Key" error when initializing RevenueCat Flutter SDK despite using valid API keys. **Error:**```RevenueCat Platform Exception: There was a credentials issue. Check the underlying error for more details. Invalid API Key. (Code: 11)``` **Code:**```dartawait Purchases.configure(PurchasesConfiguration(apiKey)); // Test the connectionfinal customerInfo = await Purchases.getCustomerInfo();```
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.