Discussion and help from anything related to RevenueCat.
Recently active
Hi RevenueCat Team, We are using RevenueCat only for non-subscription in-app purchases (e.g. consumables). We currently handle reward distribution exclusively via webhook events on our backend. However, we’ve encountered some cases where a purchase fails (e.g. credit card limit exceeded or other payment method failures), but the frontend has no way to detect this and may incorrectly treat the purchase as successful. We’d like to ask: For non-subscription products, is there any way on the client side (React Native SDK) to detect if a purchase has failed immediately after calling Purchases.purchasePackage()? What specific webhook events does RevenueCat send to indicate: a successful non-subscription purchase? a failed non-subscription purchase (e.g. payment declined, card limit, etc)? Based on your answers, we plan to distribute in-app rewards only after receiving the successful purchase webhook. Additionally, we would like to clarify the behavior for “Billing Issues” or “
I wanted to add a social proof carousel to my paywall, and the text inside the carousel didn’t show up! I tried changing the colour of the text didn’t work. There was an emoji in the text, which was visible just fine. Can you help me debug this? I tested on two real devices, and it didn’t work on either of them. I also tried a different style of the carousel, but still the same problem.
The upper part is cut off. Android. Flutter.This is how it should look (taken from the dashboard). This is what I’m calling in Flutter.RevenueCatUI.presentPaywall(displayCloseButton: true);What could be the issue that cuts off the upper part as seen in the first screenshot?
I’ve seen this issue reported already, but there’s specific context which seems to justify opening a new one.It appears on Sentry (Android, Kotlin Multiplatform) and it seems always triggered by Google Play’s automated testing (note however that the app is not live yet, so reports in general are limited).I’m not using `PaywallActivity` in the app. I’m not using a pre-configured paywall, but my own views + SDK functions.RevenueCat is initialized early in app’s lifecycle, as instructed.# I: There is no singleton instance. Make sure you configure Purchases before trying to get the default instance. More info here: https://errors.rev.cat/configuring-sdk**Issue ID:** 69094325**Project:** pivot**Date:** 08/10/2025, 14:03:31## Issue SummaryPurchases SDK not configured before use in PaywallActivity**What's wrong:** The **Purchases SDK** is not configured before use. This occurs in **PaywallActivity**.**In the trace:** The issue occurs after the app enters the foreground and **PaywallActivity**
Hi I’d like to check whats the best practice / what are developers doing to figure out what people actually payed for after using the paywall.I have two products users can choose from.A one off payment to pay for “tokens” (Consumable) A monthly subscriptionWhen a Customer pays for something, this triggers an event on `addCustomerInfoUpdateListener` To figure out If they subscribed I check ‘activeSubscriptions’ .. If a subscription is in the array then I know thats what they bought But if they choose a consumable, im looking at `nonSubscriptionTransactions` I can see a purchaseDate for each one. Do I look at the date to figure out if they just made the purchase? Whats best practice here? Thanks
Hello! I am trying to get my tabs to fill the width of their parent container. Everything in the stack is set to fill width, but it’s still not working. Can you please help?
Recently I have released a new iOS which has no user login, and it generates and stores unique App User ID on device. Many users reported that they cannot use the app across multiple devices, and I figured it is because of your setting “Transferring purchases seen on multiple App User IDs”. Seems there currently is no setting that would support my use case, which I believe must be quite common.In my other apps, with similar setup, the setting for “Transferring purchases seen on multiple App User IDs” is “Share between App User IDs (legacy)” and there it works well. - Why this setting is no longer supported? 😕I have gone through your docs once again, and it seems you recommend not setting App User ID in setups like this, but without it many things become unusable - I don’t have the same id for user device across all services (e.g. diagnostics, analytics, etc.), some external integrations won’t work, also can I grant an entitlement or set a different offering for an anonymous user?To su
Hi there! I’m Jon. I’m building an app for the Play Store and I was wondering if it’s possible to set up a non-renewing free trial on Android. On iOS, it’s pretty straightforward since I can just create a $0 non-consumable as the free trial. However, I don’t think it’s possible to do the same in the Play Store.I want to post on here to see if anyone else is wondering the same thing as me and what are the different ways I can set up this kind of free trial on Android.Thanks and I look forward to hearing from everyone soon! :D
Please, help. We need the answer for android and IOS.
In App Store Connect, I’ve set up one subscription group that contains the following four auto-renewable subscriptions: PREMIUM – Monthly PREMIUM – Weekly SIGNATURE – Monthly SIGNATURE – Weekly im currently testing my application in Sandbox and Testflight but when user upgrade from one plan to another as long as its not the same plan the auto renew turns off automatically im confused is it just a sandbox and testflight thing? coz the autorenew keep working 5 6 times if its the same subscription but when user upgrade or downgrade to another plan it turns off
I’ve migrated an Android app to RevenueCat that previously used Google Play Billing v5 (or older). The app offered several non-consumable one-time purchases. These were acknowledged, not consumed, and users could restore them via queryPurchaseHistoryAsync() before the migration. My app did not require a user to authenticate and relied completely on Google Play Billing to restore purchases made by users.After integrating RevenueCat, no existing users show active entitlements - even after calling both restorePurchases() and syncPurchases(). New purchases made via RevenueCat work fine.I’ve verified: Old product IDs still exist in Play Console and are added under Products in RevenueCat, mapped to the correct entitlements. Users are using the same Google Play account. No backend was used previously to store purchase tokens. queryPurchasesAsync(INAPP) now returns empty results for these users. It seems older non-consumable purchases may have been acknowledged but are now invisible to t
My Kotlin Multiplatform app (iOS and Android) does not use any form of user authentication or account system, it relies entirely on Google Play Billing and App Store for entitlements. After integrating RevenueCat, I’m using the default anonymous user IDs that are automatically generated on each device install.My concern is whether this setup introduces a risk of users losing access to their entitlements under any of the following scenarios: The app is uninstalled and reinstalled. The user switches devices (but uses the same Google Play/Apple ID). The app data is cleared or restored via backup. The anonymous ID changes for any reason. Since RevenueCat identifies users by this anonymous ID, and my app has no backend or custom user IDs, it seems that if a user’s anonymous ID changes, they could lose their entitlement records unless RevenueCat re-syncs their purchases from Google Play.Questions: Is it safe to rely solely on anonymous IDs when my app depends on RevenueCat for entitlem
Problem Description:I'm experiencing an issue where getCustomerInfo() and getOfferings() hang indefinitely and never resolve, but only on my personal device. The app works perfectly fine for all other users and on all other test devices.What I'm Seeing:The SDK initializes successfully, but when I call getCustomerInfo() or getOfferings(), they never complete:LOG 🔑 [RC] isSDKConfigured: trueLOG 🔑 [RC] Refreshing subscription status...LOG 🔍 [RC] getUserSubscriptionStatus - StartingLOG 🔍 [RC] Checking if SDK is configured...LOG 🔍 [RC] isConfigured: true (took 4ms)LOG 🔍 [RC] Calling Purchases.getCustomerInfo...LOG ⏳ [RC] getCustomerInfo still waiting... 10s elapsedLOG ⏳ [RC] getCustomerInfo still waiting... 20s elapsedLOG ⏳ [RC] getCustomerInfo still waiting... 30s elapsed[continues indefinitely...]Additional Context:Once, early on, I received this error: "RevenueCat.OfferingsManager.Error error 0." but haven't seen it again since The app works fine on all other devices and f
I’ve recently migrated my React Native application from using react-native-iap for handling in-app subscriptions to RevenueCat.I’m wondering how this migration affects existing users who already purchased a subscription through the old react-native-iap setup. Specifically: Will those users automatically retain access to their premium features once I switch to RevenueCat? If not, what steps do I need to take to ensure their previously active subscriptions are recognized in RevenueCat? Do I need to do anything special (such as syncing historical purchases or importing users) for RevenueCat to detect their old subscriptions? Additionally, my app already includes a “Restore Purchases” button that previously worked with react-native-iap.If I now connect that button to RevenueCat’s restore method (Purchases.restorePurchases()), will it correctly detect and restore subscriptions that were originally made before the migration?Basically, I want to make sure that users who paid under the old
I was wondering if there was an option (or if there isn’t, whether an option could be added) to use the in-app browser for app-to-web purchases instead of redirecting users to an external browser?Thanks and please let me know!
Hi,For each transaction of the same customer I get multiple duplicate customers in Stripe that all have the correct rc_customer_id and associated email.I thought a way to solve was to retrieve the stripe customer ID and pass it during the purchase process but i cant retrieve it from RC web billing sdk. Is there any other way ?Thanks for you help !
In our app we have basic and pro subscription and we are showing it with a regular price. Now we want to show a discounted subscription price to those user who is not using our app for a certain period. Maybe we will send a email with deeplink.If user click the deeplink app will trigger and after validating deeplink we will show the discounted price?What is the best way to do that?Currently, in the paywall I can see that there is a option to add promotional offer id. But it is for app store only. But for Android (Google Play Offer) where to set that? Check the below screenshot of Adapty. They have a nice option to add both id. Again clean documentation.Our expectation is two create two paywall or offering.One is regular another is 20 percent discount. For example blackfridayoffering. So in the blackfridaypaywall we want to connect those apple and google offers. We don’t want to use promo code as google promo code doesn’t provide discounted price of the subscription.
Hello! I am using RevenueCat in my React Native app. I have recently started using the custom attribute and targeting features to dynamically show different offering options to subsets of users. I would like to periodically run a reconciliation between RevenueCat and my own backend to make sure that the attributes set on users in RevenueCat are correct, according to data stored in my database. I’m unsure of how I can export custom attribute values for all users in the RevenueCat ecosystem. Things I’ve considered:Scheduled data exports - this seems to be driven by transactions, so users who haven’t made a purchase wouldn’t be included, and if a user’s attributes have changed from the time they last made a purchase, this wouldn’t be reflected. Using the Rest API https://api.revenuecat.com/v2/projects/{project_id}/customers. This endpoint doesn’t appear to return custom attributes, and only returns pages of 100 users. Manually creating a customer list and exporting via email. This seems m
RC is throwing “Must provide product parameter”and when i send pkg it throws “must provide discount parameter” error. both discount and pkg exist.snippet: const offerings = await Purchases.getOfferings(); if (offerings.current?.availablePackages?.length > 0) { const packages = offerings.current.availablePackages; for (const pkg of packages) { if (pkg.product && pkg.product.discounts && pkg.product.discounts.length > 0) { const discount = pkg.product.discounts[0]; // Use the original, unmodified product and discount objects if (discount && discount.identifier) { try { addLog(`Found discount for ${pkg.identifier}. Fetching offer...`); const paymentDiscount = await Purchases.getPromotionalOffer(pkg.product, discount); // Attach the promotional offer to the original package object
Hello,So today I got a notification that a user has purchased an in-app subscription from my app. Everything was fine, until I checked the product that was purchased. To my surprise, it was offered from an inactive paywall (was moved to inactive for more than month now, as I’ve created a new, more enhanced paywall with a totally different products).Does this mean that an inactive paywall may still be visible for some users, and it’s not guaranteed to show only the currently active one?
I am using purchases-kmp, and I keep getting Undefined symbol: _OBJC_CLASS_$_RCCommonFunctionality error when I build on Xcode.
I was wondering if this is intended or not? I have the AppsFlyer integration enabled and it sends events for Android / iOS subscriptions but NOT for RevenueCat web subscription events for my app.
I have a couple of products that require Web Billing :Mobile App (Apple & Android) Mapped app store products for RC Web Billing with the Stripe integration, but using RevenueCat Web to handle the user flow. RevenueCat has the “Stripe Account” in my project ✅ The products “disappeared” from Stripe when I upgraded the stripe environment. As far as i can tell, everything is working… I see the subscription active in my user’s sandbox details within RevenueCat NOW, I am adding a new tier of products - for WEB ONLY - there is no mobile app reference for this I did not setup products in Stripe because it seems to work without it. However, I noticed these docs expressing that i have to have products in Stripe In order for Stripe subscriptions to unlock entitlements, you must set a Product Identifier in the desired Offering to match a Stripe product ID exactly.So - what is the real answer?Yes you have to have products in stripe No you don’t need them, but it’s a recommended
My paywall is displaying completely fine. The issue is that the images I used on the dashboard are not populating on the actual paywall on my device. The images are blank. Not sure how to fix… any help is appreciated.
The documentation says this about the Test Store API key: Switching between Test Store and Real StoresTest Store uses a separate API key from your real store API keys. This allows you to control which store your app communicates with:Test Store API Key: Use during development and testing Platform Store API Keys (iOS, Android, etc.): Use for production buildsYou can find both types of keys in Project Settings > API keys in the RevenueCat dashboard. Switch between them by changing which key you pass to the SDK configuration. However, I can only see the “SDK Api Keys” here, not the Test Store API Key.Am I looking in the wrong place?
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.