Discussion and help from anything related to RevenueCat.
Recently active
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();```
Hiwhere can I find the documentation for PaywallView.currently I’m using it like this:PaywallView() .onRequestedDismissal { state = .paymentRequiredInfo } .onPurchaseCompleted { CustomerInfo in state = .ready } .onPurchaseFailure({ NSError in state = .error(StaticErrorMessage("Payment error")) })After Purchase is completed, callback method onPurchaseCompleted is not called. If I try to purchase again I’m getting “already purchased” dialog info.So my question are why onPurchaseCompleted is not called and where is the documentation for PaywallView.Regards
Hey, I have implemented the RevenueCat with my Expo / React Native app. Everything is working correctly except when I invoke the paywall, instead of my published one - I just see the default RevenueCat paywall. I checked logs and it looks like this: 09-27 21:38:21.900 3704 3704 E [Purchases]: Missing string localization for property with id: 'VFL_T8xgne', for locale: 'en_US'.09-27 21:38:21.900 3704 3704 E [Purchases]: Missing string localization for property with id: 'VFL_T8xgne', for locale: 'en_US'.09-27 21:38:21.900 3704 3704 E [Purchases]: Missing string localization for property with id: '0B1RuOuUwn', for locale: 'en_US'.09-27 21:38:21.900 3704 3704 E [Purchases]: Missing string localization for property with id: '0B1RuOuUwn', for locale: 'en_US'.09-27 21:38:21.900 3704 3704 E [Purchases]: Displaying default template due to validation errors.09-27 21:38:21.913 3704 3704 W [Purchases]: Could not process value for variable 'sub_offer_duration' for package '$rc_annual'.
I want to fetch state from API in addition to webhook handling, for improved resilience.My subscriptions are credits based, when there’s initial/renewal event, I assign a number of credits to the user.Not sure how to proceed with the transfer webhook event:The user installs the app on device A: they get id 1. The user subscribes. My backend has id 1 → 10 credits.The user installs the app on device B: they get id 2.Let’s say that the backend for some reason doesn’t receive or process the transfer webhook, so it’s not aware that id 1 → id 2Now device B, with its id 2, triggers a refresh from RevenueCat api: I get that id 2 has a subscription.Since I don’t have the old id, all I can do here is to create a new record for id 2 with 10 credits, as if it was a new user. Which is incorrect, because it’s effectively duplicating the credits for the user, who can now use 10 credits on device A and 10 credits on device B.How can I associate the subscription data to the old id? Also, is the whole r
My wife opened her installation of the app we are developing yesterday and was directed to the paywall page, even though she has an active subscription. I looked at it, very puzzled, and then decided to try the “restore” link in the paywall screen. After a couple of seconds a dialog box came up indicating the restore was successful and after dismissing it the app functioned as expected. My understanding was that the restore link is only necessary when installing the app on a new phone or other similar situation. This occurred under “normal” conditions. It was very confusing to her and I am worried about users encountering this who are not married to one of the developers. Can someone explain to me why this might occur and if there are any steps I can take to avoid it from happening under “normal” circumstances? Thank you.
I am building a Flutter app.I have a subscriptions offering which includes subscriptions.I also have a ‘credits’ offering which has one time purchase products which gives users different amount of credits.Is my understanding correct that I can create 2 paywalls for these 2 offerings? Can I add a link in these a paywalls which takes the user to the other paywall? E.g. a button saying “purchase credits w/o subscription” and “subscribe for better deals”. How can I do this?Thanks a lot for your help!
Hello RC Support:The issue described below is in the latest IOS SDK only. The android SDK does not have this issue. The crux of the issue is that presented_offering_id IS NOT matching the product_id and resulting incorrect understanding of which product the user actually purchased.I’ll explain this with an example.We have a few product_id = Plus , Gold, Platinum. The corresponding presented_offering_id also matches this: i.e. presented_offering_id = Plus , Gold, Platinum.As an example, In IOS when a user purchases a Gold offering on the paywall, we see the following INCORRECT response in the webhook events that we receive. Actual plan purchased by the user: GoldProduct_Id received via webhook: goldpresented_offering_id received via webhook: platinum. In Android, it is functioning properly:Actual plan purchased by the user: GoldProduct_Id received via webhook: goldpresented_offering_id received via webhook: gold. I can share event logs and more via email.
I am using the React Native SDK, and I am getting some PAYWALL_RESULT.ERROR back when users are shown the paywall.I have been searching for what this result means, but I haven’t been able to find many details about this specific error.All I can see is this line from the source code: “If an error happened during purchase/restoration.” I would like to know whether this indicates an error on RevenueCat’s side (such as the server sending 500s) or a store/user error (for example, problems processing the payment).Thanks!
Platform: React NativeSDK Version: react-native-purchases 8.11.6, react-native-purchases-ui 8.11.6Issue: Bold font weight not applying on Android V2 Paywalls (works perfectly on iOS) Problem DescriptionI have successfully configured custom fonts ("Nunito Sans") for V2 Paywalls and they work perfectly on iOS, but on Android the bold weight is not being applied - all text appears as regular weight even when elements are configured as bold in the RevenueCat dashboard. What Works ✅- Custom font "Nunito Sans" loads correctly on Android (showing custom font instead of system font)- All font weights work perfectly on iOS- Regular font weight displays correctly on Android What Doesn't Work ❌- Bold font weight on Android (appears as regular weight)- Text configured as bold in dashboard renders as regular on Android only Technical Configuration Environment- React Native: 0.76.9 (bare workflow, NOT Expo)- RevenueCat SDK: react-native-purchases 8.11.6- RevenueCat UI: react-native-purchases-ui 8.11
I’m facing an issue with RevenueCat integration in my app. On iOS Simulator, using StoreKit configuration, the purchase flow works correctly when I tap the purchase button. On a real iOS device (via TestFlight), tapping the purchase button does nothing — there is no response or error shown. On Android (both emulator and real device), everything works fine. So the problem only occurs on a real iOS device through TestFlight.Has anyone experienced this before? Why would the purchase button not trigger anything on TestFlight, even though it works in the simulator?Any guidance or suggestions on what I should check for iOS would be greatly appreciated.
Hello,I am a little bit confused on what timezone RC used in the dashboard.The first image shows a customer renewed the subscription at 02:06 PM UTCCustomer history for renewal However, when i click the event details for the renewal, it is showing 06:06 AM UTCRenewal event detailMeanwhile, my server log shows that the webhook triggered at 02:06 PM MYT (06:06 AM UTC)Could anyone confirm this behaviour? Thanks
I’m trying to replicate the “LTV per paying customers (unbounded)” metric in our data export.However, my results are consistently wrong in reporting LTV by more than 8% (standard deviation) compared to the “LTV per paying customers” chart in the dashboard.Could there be an error in my approach, or is it possible to extract the underlying account IDs from the dashboard’s “LTV per paying customers” chart for validation?cohort Mismatch in % 2025-01-31 5.10% 2025-02-28 4.16% 2025-03-31 2.65% 2025-04-30 -4.40% 2025-05-31 6.42% 2025-06-30 1.61% 2025-07-31 7.87% 2025-08-31 11.92% 2025-09-30 -5.34% WITH subscriptions AS ( SELECT MIN(start_date) as subscription_start_time, rc_original_app_user_id, MAX(CASE WHEN subscription_status = 'trial' THEN 1 ELSE 0 END) as had_a_trial, SUM(price_in_usd) as realized_ltv, store, subscription_status FROM {{ ref('int_store_transaction_id__renewal_number___w_account_label_filtered') }} WHERE subscriptio
Hi team,I’m trying to set up one-time products within the Android version of my app. I’ve set up the product (with a product id + purchase option in the Google Play Console), but the product simply will not import or show up as “Published” within my RevenueCat product catalog.This worked just fine with iOS and I ran into no issues. Only seeing this for Android, could be related to some of the recent changes Android made with one-time products? I’m using RevenueCat with React Native using Expo.
Dear RevenueCat Community,I am using the RevenueCat SDK in my Flutter application and have implemented App Tracking Transparency (ATT) permission on iOS. When the user grants permission, I call the method Purchases.collectDeviceIdentifiers() to obtain the device's IDFA. This value is correctly set and included in the events sent through the webhooks.In my Flutter app, users can purchase subscriptions using Stripe. For this, a web view is opened for the user to complete the payment. Once the purchase is completed and the user returns to the app, the app submit to this endpoint https://api.revenuecat.com/v1/receipts the subscription ids to upload the purchase to RevenueCat. This is how the user gains access to the app features after the purchase.To receive purchase events centrally in my backend, I have added a webhook in RevenueCat that reports Initial Purchase and Renewal events to my endpoint.I have observed the following: For purchases made within the app (IAP), the IDFA is correctly
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.