Discussion and help from anything related to RevenueCat.
Recently active
SDK version: 9.15.1androidMinSdkVersion = 29androidCompileSdkVersion = 35androidTargetSdkVersion = 35We are facing nullpointer crash in FontLoader. Fatal Exception: java.lang.NullPointerException: at kotlin.UnsafeLazyImpl.getValue(Lazy.kt:81) at com.revenuecat.purchases.paywalls.FontLoader.getCacheDirectory(FontLoader.kt:36) at com.revenuecat.purchases.paywalls.FontLoader.ensureFoldersExist(FontLoader.kt:163) at com.revenuecat.purchases.paywalls.FontLoader.access$getContext$p(FontLoader.kt) at com.revenuecat.purchases.paywalls.FontLoader.access$ensureFoldersExist(FontLoader.kt) at com.revenuecat.purchases.paywalls.FontLoader$startFontDownload$1.invokeSuspend(FontLoader.kt:76) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:104) at kotlinx.coroutines.internal.LimitedDispatcher$Worker.run(LimitedDispatcher.java:111) at kotlinx.c
Using variables such as {{ product.relative_discount }} or {{ product.price_per_period }} seems to work in the paywall editor, however it does not work in development builds. I have attached two screenshots, one of the editor and one of my running dev build. As you can see, the percentage is missing from the dev build, as well as the price period. What am I doing wrong?
Hello,I have a working subscription system with revenuecat for a jazz education app. I wanted to be able sell individual lessons. I heard from many customer that they would want individual lesson purchases that is unlocked for life. I have 42 lessons in the app now and I plan to add more. It will be around 150-180 lessons total. So, What is the best practice here? Do I need to create 150 SKUs ?I have 6 categories and that number will be 10 categories soon.Every lesson in each category will have the same price. However, I will need to track who bought which lesson? So could I somehow have 10 categorical prices to simplify things down and still track 150 lessons with it? Thanks..
Hey everyone,At our company, we currently ingest RevenueCat data through a webhook setup that sends events into our internal pipeline. We’re now considering whether to keep this approach or switch to pulling data directly into S3 (for example, via the API or an ETL process).I’d love to hear what RevenueCat recommends here — and what other teams have found works best — especially regarding: Data reliability and completeness over time. Ease of scaling and maintaining the integration. What’s the setup you’d suggest or have seen work best for production environments?Thanks in advance for any insights!
Hi,Just wondered if anyone else has had similar problems to this? Its a new app and so as far as I understand, when I make a change/try to fix monetisation i must resubmit a new binary with it as well. Problem is they keep rejecting the monetisation side of things. specically App Store Localization. (I see a rejected status next to each Localisation) My app is available for europe and the us. Ive provided Localization for UK and US. I dont get any feedback from the reviews to tell me what the problem is. Anyone else had this before? Thanks
Our paywall on iOS works perfectly fine right now. It fetches the products/offerings and displays the paywall UI.However on Android we are only showing the offerings and not the paywall UI. Was curious if anyone knows the solution/problem?We are running RC:react-native-purchases - 9.7.0react-native-purchases-ui - 9.7.0expo: ^54.0.19We are displaying the paywall via: <RevenueCatUI.Paywall>
I current offer subscriptions through the App Store, Google Play, RC Web Billing, and Stripe directly.I’m investigating implementing the Customer Center and see that it fully supports managing App Store & Play Store subscriptions and promo offers for win backs but it’s not clear to me if it supports management of subs from RC Web Billing and Stripe.My specific questions are:If a customer has a RC Web Billing sub: Can they cancel/manage it from the Customer Center? Do they still have to re-auth from the email magic link? Can I configure win back promo offers? If a customer has a subscription through Stripe directly, can they manage it from the Customer Center, ideally by linking to the Stripe Customer Portal? I’m fine without promo offers on Stripe but it is important that my existing Stripe subscribers can continue to manage their subscription directly from my app, via the RC Customer Center.Thanks!
In my flutter app on Android, paywall is not showing for one user, with endless loading. I have not received any other reports on this problem. The user is detected as from Russia, which might be an issue, but Google seems to support that for subscriptions, at least there is a price. I don’t see any exceptions (there is an analytics event supposed to be thrown if revenue cat paywall fails), so I guess it is just freezing forever SDK version 9.8.0video:https://drive.google.com/file/d/1v5rkR5kP6tsm22T4iCYIN3SbAdHzpScA/view?usp=sharing
We can honour entitlements that were purchased on other platforms by calling login(appUserId).What if someone purchases a package on ios, then logs out of the app, then creates a new appUserId.Wouldn’t this create a scenario where multiple appUserId’s have an entitlement from a single purchase?
I created my paywall in the paywall builder. Initially, before connecting to the appstore and when I had no offerings it was fine. After I connected, and when I tried to publish there were 3 errors regarding packages not supposed to be empty, I then clicked on the error message which resulted in it taking me directly to the package that was affected. I then repeated this for the other errors and clicked publish. However, now it shows me in the paywall creation UI it shows me the correct one until I click/select on the package - where it reverts to its original template state as it was added as a component. It isnt only a paywall creation UI glitch as it has resulted in some of the default template being displayed on the paywall on device (I used the revcat mobile app to check). I have tried changing colours, text saving them and then republishing but nothing works and it seems it has forced the template to show no matter what. I believe the issue may have been caused by the direct clic
Hi all, I have a question about RevenueCat-Mixpanel integration. Through this integration, we’re able to get purchase-related events such as rc_initial_purchase in our Mixpanel dashboard. However, all of our sandbox data are also included in these events, making our Mixpanel charts inaccurate for analysis.So I’m wondering if there’s a way to exclude these sandbox events when being sent to 3rd party tools like Mixpanel.Thanks!
I choosed the Exit Offer on my main Paywall but it doesn’t appear after click “X” button(Navigate Back action). My packages versions are "react-native-purchases": "^9.6.10","react-native-purchases-ui": "^9.6.12".
We want to use the remote paywalls in our app and as there is no problem with iOS we encountered layout issues on bigger screens (e.g. iPad).Is there a way to define a safe area for the paywall? We’re not presenting it as a sheet since we need to embed in the parent view that swaps the views based on the state.If it’s not possible to have a safe area defined the only way of doing so is to change the sizes to fit and set paddings so that the view is hugging the actual size?What we’d like to achieve looks something like this what was mentioned in this post:
Hello RevenueCat Support Team,We are integrating RevenueCat Web SDK (@revenuecat/purchases-js) with Stripe Checkout for our web subscription flow.We are passing customerEmail during purchase, like this: await Purchases.configure(WEB_BILLING_PUBLIC_API_KEY, appUserId); await Purchases.getSharedInstance().purchase({ rcPackage: selectedPackage, customerEmail: subscriptionData?.email, }); Expected behavior: Email field should be hidden or pre-filled for all users (since we already pass customerEmail). Current behavior: For most users, the email field is hidden / pre-filled, which is correct. For some users (e.g., kavita@flunzy.ai, kruti@flunzy.ai), the email field still appears on the subscription screen. We understand that Stripe Checkout controls whether the email field is displayed in some cases, such as existing customer state or session differences.Questions / Request: Can you confirm whether this behavior is expected and controlled by Stripe Checkout? Is there any supported way t
I've asked a question here but it never got answered (probably because the original post got answered and I asked after) so here's a new post to try to get my answer on this topic. If we want to only override "promo" placement with an experiment, we still have to re-define every other placements in the experiment? Or if we just keep the "All Other Case" to "No Offering" it will fallback on the targeting? Not so long ago we used to have this, which was creating a fallback on targeting-defined placements. Re-defining all of them (not only the tested placements) seems very error-prone and cumbersome.
Im extremely stuck on submitting my app to the app store.I tried to submit my app to the app store - but it got rejected based on the paywall screen erroring.Im using a custom screen. I have a few questions.Do I have to submit the app and the subscriptions together?Surely this leads to a catch 22 - where the paywall screen will not ever serve the subscriptions since they are still in review…Ive been waiting for my subscriptions to get reviewed now for like 4 days - I’m wondering if i need to submit the whole APP again for review - to get them to review the whole app again and therefore review the subscriptions (?).If I use my prod revenue cat key - i get a similar error appearing…@app/mobile:dev: WARN [RevenueCat] ⚠️ RevenueCat SDK is configured correctly, but contains some issues you might want to address@app/mobile:dev: @app/mobile:dev: Warnings:@app/mobile:dev: • Your products are configured in RevenueCat but aren't approved in App Store Connect yet. This prevents users from mak
Hi all, we’ve integrated Mixpanel, and are sending events such as initial purchase.We also have implemented our own Mixpanel events for each purchase, which means there are two (supposed-to-be) identical events being sent to our Mixpanel when a user makes their purchase, like below:purchase_subscription (our own Mixpanel event, sent via Mixpanel SDK) rc_initial_purchase (event from RevenueCat integration) The problem is, the number of two events never match. Sometimes the number of events from RevenueCat integration is higher, and sometimes not. I do understand that there may be some (slight) discrepancies, but the gap sometimes is as large as 20%. (viewed daily) What could be the cause? We’ve been trying to find if there’s any pattern in the discrepancies, but couldn’t find any. Thanks in advance! P.S. If this info could help: We’ve counted the number of rows in the transactions page in RevenueCat mobile app, which we believe is the source of truth, and the numbers still don’t match.
I get this error when trying to create my second targeting rule:
Hi,See attached. How is it possible that this user has two active subscriptions for the same entitlement? Wouldn’t Apple flag this as “you’re already subscribed”?My project ID is: proj173c3791The userID is: firebase:DFdWBg4eukQtSZkzmMMSNDp82YC2Thanks,Toby
I’ve seen these two threads: and And the blog post announcing the availability of paywall support for (non-flutter) web sdk here: https://www.revenuecat.com/blog/company/paywalls-on-the-web/ It would be very helpful to know if you have specific plans to add paywalls for web to the flutter SDK, and if so what the timeline might look like, so I can figure out whether I need to roll my own ahead of time or wait for a supported version.
For a lot of users, we’re seeing the following in the dashboard at the end of their trial:Had their subscription of Weekly Premium With Trial (weekly_subscription_499_with_trial) expire2026-01-03 at 07:03 AM UTC Had their subscription of Weekly Premium With Trial (weekly_subscription_499_with_trial) cancelled due to not agreeing to a price increase2026-01-03 at 07:03 AM UTC Last opened the app2025-12-31 at 06:23 AM UTC Created a new alias (...)2025-12-31 at 06:23 AM UTC Started a trial of Weekly Premium With Trial (weekly_subscription_499_with_trial) from offering premium_wmy_with_trial_offering2025-12-31 at 06:21 AM UTC First seen using the app2025-12-28 at 03:01 AM UTCThis is despite us never having raised subscription prices, especially not during the 3-day window. We’re concerned this is costing us conversion.The “cancelled due to not agreeing to a price increase” event has the following data:{ "app_id": "...", "app_user_id": "...", "cancel_reason": "PRICE_INCREASE", "country_c
RevenueCat’s existing integrations send real-time subscription events out to supported platforms like OneSignal or Customer.io automatically via their integration UI, without needing your own webhook backend. A native Sendbird integration would let you: Sync subscription lifecycle events directly into Sendbird Trigger messaging flows without your own glue code Push events into chat/notification workflows in Sendbird Since it’s not currently listed, it’s not yet supported - so please consider this as a feature request.
Hello, I'm currently trying to set up my app with Rev Cat and set up the subscription. I'm currently not able to see the subscription when I move over to the official API key from the official app store. I attached screenshots, and the code that I'm using. In the screenshot, it's showing that developer action is needed because I submitted it, and it didn't show correctly. Which is why when I got my developer's profile to the project, on the comments it said it's fine, and that it still should be visible. // expo-app/components/Paywall.tsx{loading ? ( // ... loading spinner ...) : !currentOffering || currentOffering.length === 0 ? ( // This is what you see if RevenueCat returns nothing <View style={{ padding: 20, alignItems: 'center' }}> <Text style={styles.loadingText}>No subscriptions available.</Text> <TouchableOpacity onPress={onClose} style={{ marginTop: 10 }}> <Text style={{ color: colors.primary }}>Close</Text&g
Can we change the close button color in Flutter await RevenueCatUI.presentPaywall(displayCloseButton: true);
Is it possible to log in users anonymously?Currently we are facing an issue. We user Firebase in our apps and in order to send notifications we need to store push tokens in our database. So, we sign in users anonymously to Firebase, and then we can store this info under their user ID.The problem arises when we then call Revenuecat’s login function. We do this so that if a user contact’s us we can match them between Firebase ID abd Revenuecat.However, the problem arises in that now Revenuecat treats the user as signed in. So, same user trying to access the app on two devices will not be able to do so, as the purchase is constantly transferred from one user to the other.Hence a question - is there a way to provide anonymous alias? So that we can search users by their firebase id, but tell Revenuecat “this one is not signed in, so apply anonymous behavior to purchases transfers”.Alternatively, this could be sorted by allowing us to search customer by their user properties. We could set “F
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.