Get help with your SDK implementation.
Recently active
Hi everyone,I’ve seen older posts about RevenueCat working on Paywalls UI support for Unity, but nothing concrete has been released yet. Our app is built in Unity, and right now managing paywalls requires developer work every time we want to test or update something.Does anyone know if there’s an official timeline for Unity Paywalls UI (similar to what’s available on iOS/Android/Flutter)? Has there been any word from the team recently, or are there recommended workarounds in the meantime?Thanks in advance!
We recently upgraded `react-native-purchases` from `^7.4.0` to `^9.1.0` in order to comply with the **latest Android billing policy changes**. Since then, on **iOS 18 (EAS build, Expo Managed Workflow)**:- In-app purchases succeed- App Store receipts are received correctly- BUT transactions **do not show up on the RevenueCat dashboard**- Entitlements are **not unlocked** ⚠️ Android is working fine — purchases are tracked correctly and entitlements are unlocked as expected. No changes were made to our RevenueCat dashboard configuration. --- ### Environment:- "expo": "^51.0.0"- "react-native": "0.74.5"- "react-native-purchases": "^9.1.0"- Build: EAS Build - Expo Managed Workflow - Platform: iOS 18 The issue started **immediately after upgrading the SDK** and deploying via EAS build on iOS 18. We’d appreciate guidance on whether additional configuration is required for SDK v9 on iOS 18.
Copied Hi, I am facing an issue with the iOS version of my react native app. As the title suggests, when I perform an action in the app which causes the paywall to open (subscription paywall), it closes itself after a second or two of being visible with PAYWALL_RESULT of CANCELLED. Versions:"react-native-purchases": "^9.6.0","react-native-purchases-ui": "9.6.0",I cannot seem to find any other people who have documented experiencing this issue, and there are no warnings or errors thrown in xcode or the metro terminal which can give me any further clues.If you require any more information from me in order to help, do not hesitate to ask for it!Updated: also same issue on physical device as well Ipad, simulator and emulatorVideo recording link: Thanks very much.
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’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**
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
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 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.
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.
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
Hi team 👋I’m using RevenueCat for both subscriptions and consumable credits.My backend receives webhook events, and the frontend/flutter has a listener which when gets triggered calls getUserProfile() (which hits the be endpoint which calls RevenueCat API) whenever the user opens the app.I want to make sure my backend always has the latest purchase info instantly, even if a webhook is delayed or missed Should I: Use both webhooks and the RevenueCat API (as a fallback) to sync the latest transactions? Always update the stored store_transaction_identifier based on the latest transaction from the purchases associated with customer API? Just want to confirm the best practice to ensure no missed updates across subscriptions and one-time purchases.Thanks!
Hi!I’m currently building an iOS app using React Native and RevenueCat for handling subscriptions.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 I have a few questions regarding how upgrades and downgrades work within this setup, especially when using the Purchases.purchasePackage(pkg) method in RevenueCat. Question 1 – Upgrading Between Monthly PlansIf a user is currently subscribed to SIGNATURE Monthly and decides to upgrade to PREMIUM Monthly (both within the same subscription group and both having the same time duration - 1 month): Will the upgrade take effect immediately, or only after the current billing period ends? Does iOS handle this automatically, or do I need to write any additional code to manage upgrades (similar to Android)? In other words, does RevenueCat automatically trigger the upgrade and reflect the entitlement
Hey guys,I have a bit of a weird situation: I have one offering configured in RC, containing two products:monthly Sub lifetime itemWhen testing, everything seems to work properly. Especially the lifetime item works as expected.Funnily, when I hit the purchase button in my app for the Sub on Android and DO NOT purchase the item, I throw the correct error at the user, but the user still gets access to the premium features somehow.This does not happen on a lifetime item.When I checked my app behaviour, I found, that the difference in my app is, that on a monthly sub I already send the apps userID to RC before doing the purchase (which I do not on the lifetime item).As I use FlutterFlow for my app (with the RC integration), I added some custom code before the purchase action.This is the code I call: await Purchases.configure(PurchasesConfiguration(publicApiKey)); await Purchases.logIn(userId);Could that be the culprit?Am I doing something wrong here? Should I call this AFTER the purchase
Hi everybody,I’m implementing a setup where a custom subscription offering should be shown to users when they enter a specific key (referral code).Here’s my setup: • The custom offering (referral_offering) includes a package with two products — one for iOS and one for Android. • I’m using Flutter and calling Purchases.getOfferings() after setting a customer attribute (referrerCode) with Purchases.setAttributes(). • On iOS, getOfferings() works perfectly — 2 offerings are returned, and I can use the correct one from the map. • On Android, however, getOfferings() only returns the default offering. The referral_offering never appears in the JSON response.Things I’ve already tried: • Verified that the Android product in the custom offering is active, imported correctly, and linked to the right entitlement. • Confirmed that both the default and referral offerings are active and visible in the dashboard. • Tested with clean installs, cache deletion,
Dear RevenueCat Community,I am using the RevenueCat SDK in my Flutter application and have implemented App Tracking Transparency (ATT) on iOS, requesting the user’s permission before a purchase. When the user grants permission, I call Purchases.collectDeviceIdentifiers() to obtain device identifiers such as the IDFA.In my Flutter app, users can purchase subscriptions via 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 submits the subscription information to https://api.revenuecat.com/v1/receipts 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 behavior: For in-app purchases (IAP), in the RevenueCat dashboard > Recent Transactions > Customer
Hey, I have 2 different Paywall Screens (coded myself).One: You Subscribtion is paused, click here to Resume (deeplink to playstore)Other One: Resubscribe, choose between those plans.But at the moment I dont know how i should decide which screen i should show. Any Ideas? Webhook and RestAPI are not a option for me. I just want it from the Client SDK.Thanks in advance!
I’m using .presentPaywall() and I tried to use RevenueCatUI.Paywall component, but it’s always on this “Sheet View”, with that weird margin. How can I fix it? Also, the RevenueCatUI.Paywall component is crashing my app on Android.
Is there any way to achieve this?in documentation it states that default proration mode is WITHOUT_PRORATION, is it stays the same in case of using paywall builder? even in case of downgrading to less expensive tier?
i am not using purchases_ui_flutter anymore i had it and then i deleted it but in the google console i am getting this crash report on the version that doesn’t include purchases_ui_flutter is this crash has any connection with the purchases_ui_flutter package or there is another reason for this crash.Exception java.util.ConcurrentModificationException: at java.util.LinkedHashMap$LinkedHashIterator.nextNode (LinkedHashMap.java:1061) at java.util.LinkedHashMap$LinkedKeyIterator.next (LinkedHashMap.java:1084) at com.revenuecat.purchases.paywalls.FontLoader.addFileToCache (FontLoader.kt:119) at com.revenuecat.purchases.paywalls.FontLoader.access$getFontInfosForHash$p (FontLoader.kt:27) at com.revenuecat.purchases.paywalls.FontLoader.access$addFileToCache (FontLoader.kt:27) at com.revenuecat.purchases.paywalls.FontLoader$startFontDownload$1.invokeSuspend (FontLoader.kt:90) at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33) at kotlinx.coroutines.Dispat
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.