Discussion and help from anything related to RevenueCat.
Recently active
We are implementing a gift code redemption feature for our app, integrating with Airtable for code validation and RevenueCat for entitlement management. The backend is built with Strapi (Node.js), and the app is Kotlin Multiplatform (Android & ios). We have two plans monthly and annual. **The Flow:** 1. User redeems a gift code in the app 2. App calls our backend `/api/grant-entitlement` endpoint 3. Backend validates the code in Airtable 4. Backend attempts to grant an entitlement via RevenueCat API **The Problem:** We are consistently encountering a **500 Internal Server Error** from our backend (`dev-api.myatlas-health.com/api/grant-entitlement`) when it tries to call the RevenueCat API. **Debugging Steps Taken:** 1. Initially attempted to use RevenueCat v2 grant endpoint with `expires_at` 2. Discovered that RevenueCat does not have a v2 grant endpoint (404 error) 3. Switched to RevenueCat v1 promotional endpoint: `/v1/subscribers/{userId}/entitlements/{entitlementId}/p
We are implementing a gift code redemption feature for our app, integrating with Airtable for code validation and RevenueCat for entitlement management. The backend is built with Strapi (Node.js), and the app is Kotlin Multiplatform (Android & ios). We have two plans monthly and annual.**The Flow:**1. User redeems a gift code in the app2. App calls our backend `/api/grant-entitlement` endpoint3. Backend validates the code in Airtable4. Backend attempts to grant an entitlement via RevenueCat API**The Problem:**We are consistently encountering a **500 Internal Server Error** from our backend (`dev-api.myatlas-health.com/api/grant-entitlement`) when it tries to call the RevenueCat API.**Debugging Steps Taken:**1. ✅ Initially attempted to use RevenueCat v2 grant endpoint with `expires_at`2. ❌ Discovered that RevenueCat does not have a v2 grant endpoint (404 error)3. ✅ Switched to RevenueCat v1 promotional endpoint: `/v1/subscribers/{userId}/entitlements/{entitlementId}/promotional`4. ❌
We are seeing very strange issue in our app where peopple are starting trial of $4.99 product and getting charged for $199 yearly product. We are not able to understand this issue. Is this superwall issue or apple? here is the video explaination - https://www.dropbox.com/scl/fi/9pbt5mvhg0eel46kchwx2/IssueRevenue.mov?rlkey=vlgi5ro274m9u8q0kavlkqm3y&st=yce7hqub&dl=0
I am currently integrating RevenueCat's Web Purchase Links into my Webflow project for handling subscriptions. According to the RevenueCat documentation, I need to append app_user_id as a query parameter to the purchase link to associate the purchase with the correct authenticated user.Here is the link format I am using: https://pay.rev.cat/sandbox/rim********dasa/?app_user_id=897274573489Any guidance or suggestions would be greatly appreciated!
Hello, I’m preparing for affiliate marketing and I’m testing how offer codes work. I created a test one and sent it to someone, and configured a webhook to intercept it.That worked, proved the code was introduced correctly, but I was hoping to be able to find that customer in the customer list by filtering “Latest offer type” is any of “Offer code” OR “Latest offer” IS “CODE REF”The report is empty. Is that expected? Is there a delay? NOTE: I have set up the Appstore Connect API key and everything requested in the app setup.
Hi RevenueCat team,All of my agreements and tax information are already set up and working. I also have other apps where In-App Purchases are working fine. However, with this new app I’m stuck because of Apple’s requirement:“Your first subscription must be submitted with a new app version. Create your subscription, then select it from the app’s In-App Purchases and Subscriptions section on the version page before submitting the version to App Review.”Because of this, I cannot send my IAP for review, and Apple is rejecting the submission under 2.1 - Performance - App Completeness with the note:We found that your in-app purchase products exhibited one or more bugs which create a poor user experience. Specifically, after selecting both weekly and yearly subscriptions an error message is displayed.Review device details:• Device type: iPhone 13 mini• OS version: iOS 26.0At the same time, I get this warning from RevenueCat:[RevenueCat] ⚠️ RevenueCat SDK is configured correctly, but contains
This code checks to see if a customer should be shown the paywall. let customerInfo = try await Purchases.shared.customerInfo(fetchPolicy: .fetchCurrent) let timeInterval = Date.now.timeIntervalSince(customerInfo.firstSeen) let ninetyDays: TimeInterval = 90 * 24 * 60 * 60 return timeInterval >= ninetyDaysThis check is returning false.On the RevenueCat dashboard for this user first seen was 27 June 2024. They never changed their App User ID. However they only seen the paywall today 17 September 2025. Which is much greater than the 90 days. What could be causing the delay in showing the paywall? I appreciate that the customerInfo could be cached but not for over a year.
I am getting the following crashes on Android using revenueCat KMP SDK. And it has increased recently. What could be the issue?The attached two files are of the PaywallState and Purchase click button codes Exception java.lang.IllegalStateException: at com.revenuecat.purchases.kmp.di.AndroidProviderKt.requireActivity (AndroidProvider.kt:83) at com.revenuecat.purchases.kmp.Purchases.purchase (Purchases.android.kt:275) at com.revenuecat.purchases.kmp.Purchases.purchase$default (Purchases.android.kt:266) at utils.PaywallState.purchaseSelectedPackage (PaywallState.kt:29) at pro.ui.paywall.PaywallScreenKt.PaywallScreen$lambda$41$lambda$40$lambda$39$lambda$26$lambda$25 (PaywallScreen.kt:230) at androidx.compose.foundation.ClickableNode.onPointerEvent-H0pRuoY (Clickable.kt:1018) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass (HitPathTracker.kt:436) at androidx.compose.ui.input.pointer.Node.dispatchMainEventPass (HitPathTracker.kt:422) at androidx.compose.ui.input.poin
Looking for a RevenueCat expert to implement our subscription management and in-app purchase system across iOS and Android applications. Need assistance with:SDK integration and configuration for both platforms Product setup with subscription tiers, trial periods, and pricing strategies Webhook implementation for real-time subscription events Analytics dashboard configuration for revenue tracking and cohort analysis Customer lifecycle management including churn prevention and win-back campaigns A/B testing setup for paywall optimization and conversion improvemen
Hi everyone,I have a mobile app that originally relied on $RCAnonymousIDs to manage subscriptions. Now, we’ve introduced mandatory signup, so I’m now working on migrating from anonymous IDs to our own custom user IDs.What’s not clear to me is the best way to handle the transition: How can I merge an existing custom user ID with the old $RCAnonymousID values already in the system? Should this be done via the API, or does the SDK handle it automatically? In some cases, the custom user ID is already listed as an alias of an anonymous ID. How can I “promote” the custom ID so it becomes the original_app_user_id instead of the anonymous one? Has anyone here gone through a similar migration? Any guidance on the best practices would be really helpful.Thanks!
Hi everyone,This is my first time using RevenueCat. I’ve updated an image header on paywall. however on my phone it shows low resolution. it looks perfectly fine on the paywall editor. I have tried PNG and JPG, different resolution, etc. Can somebody shed a light where I can take a look? RevenueCat SDK Xcode [5.39.0]thanks,Wai Hong
Hi everyone,I'm implementing subscription upgrades and downgrades for Android in my React Native app, using react-native-purchases version 9.4.1. I'm currently running into an issue while testing on a physical device using an internal test track.What is happening:When I try to upgrade or downgrade from an active subscription (e.g., "plus") to another plan (e.g., "pro" or "lite"), the purchase flow fails. On Upgrade, I receive the following error from Google Play Billing via adb logcat: [RevenueCat] 🤖‼️ BillingWrapper purchases failed to update: DebugMessage: Requested replacement mode is not supported for this request. ErrorCode: DEVELOPER_ERROR. On Downgrade, I get a more generic Unknown error.. My Implementation:I check if the user already has an active subscription, and if so, I pass a second argument to the purchasePackage call to handle the upgrade/downgrade. Here is a snippet of my code:TypeScript // Using "react-native-purchases": "9.4.1"import Purchases, { PurchasesPackage
I noticed that we had inflated install numbers on RC vs. App Store. I trust Apple more with the installs, so I went on to find the root cause.We have a Flutter app and I call Purchases.logOut() when a user logs out. This sometimes happens automatically. I now read in the docs that logOut will clear the saved appUserID. This will generate a random user id and save it in the cache.Since RC seems to count appUserIDs as installs, each log-out will count as an additional install. Question: Should I even call Purchases.logout when our users log out? They are still on the same device, with the same Apple ID (most likely). Seems to me that this is wrong and inflates our install numbers.
Hi RevenueCat Team,I am using the RC sdk in my flutter app and I am using RC META integration to report purchases/start trial ...etc, events to META.I’ve set up the Meta integration in my RevenueCat project to report purchases to Meta and optimize ad campaigns. I noticed that the payload RevenueCat sends to Meta includes the entry:"action_source": "website" However, I need this to be set as "action_source": "app".My question is: is there a way to update or customize the payload sent from RevenueCat to Meta?Currently, because the action source is set as “website,” I have to create a Custom Conversion in Meta and select “Website” as the Action Source. This, however, requires filling out the Rules section with URL keywords, which doesn’t apply in my case.It would be great if there’s a way to adjust the payload so the events are properly recognized as app events on Meta.Or additionaly, can you explain how to use events sent from RC to create and optimize ad campaigns in meta?Thanks for you
Hi There is offcial RevenueCat dashboard alp for iOS only.There is unoffcial android version but I don't trust it to enter my credentials in. is there any plan in development of Android version? I would appreciate to have one thank you
Hello!I would like to manually send a web-hook event.I use RevenueCat web-hook event log to visualize if all my subscriptions were processed. In case a few couple of events are not, I would like to manually resend them.Stripe has something similar - see the attached screenshot. Implementing ‘ETL exports’ seems very unnecessary and arduous if I need to resend just a couple of events.Thank you!
Bagaimana cara nya
There's a missing content issue with tab elements in the Android version.The LITE tab should show pricing and descriptions (as designed by RevenueCat - see reference image),but on some Android devices like Pixel and Samsung phones, this content doesn't appear at all. The PLUS tab works fine and displays all content properly.
In the paywall editor, I’ve specified a few badges should be overlaid - However, at runtime, the badges don’t appear properly: Any idea what I’m doing wrong?
I’m evaluating RevenueCat for our in-app subscription integration.We have the following requirements:We currently handle web based subscriptions using Stripe.We want to add the option to purchase subscriptions via in-app purchases.We want to see customers subscribed via the app stores in our Stripe dashboard and their subscription status We already integrate our user account system with Stripe and want to do minimal changes, ideally when an app store customer would be created the existing should be able to connect it with the user account without modificationsMy questions:How can we sync app store subscribers to Stripe? I’ve looked at the RevenueCat Stripe app in the Stripe marketplace, but couldn’t figure out how to use it properly, it talks about sending Stripe tokens to RevenueCat. Not sure I understand it correctly, but this sounds like RevenueCat tries to be the single source of truth for Stripe based web subscriptions. As I understand it this is the opposite to what we want.Any h
Hi, I’m trying to access this API endpoint https://www.revenuecat.com/docs/api-v1#tag/entitlements/operation/grant-a-promotional-entitlement When I use my public SDK API key, it says “invalid API key”. But when I use a secret API key for API version 1, I get “"RevenueCat error: {\"code\":7243,\"message\":\"Secret API keys should not be used in your app.\"}\n\n"”Edit: For context, I am not calling the API directly from my app. I am invoking a Supabase edge function, so not sure why I am getting that message
The Flutter project has integrated RevenueCat, and all Android configurations have been completed: Installing the Android APK built locally via flutter build --release can successfully open the Google subscription page, and clicking subscribe brings up the payment options. After uploading the AAB to the closed testing track and downloading it from there, opening the subscription page shows a gray paywall and displays the message:"error 11: there was a credentials issue, check the underlying error for more details", and the subscription items cannot be displayed. In RevenueCat’s dashboard, the following permissions are all correctly set: Permissions to call subscriptions API Permissions to call in-app products API Permissions to call monetization API So my question is: why does the paywall fail to load when using the second method, and where is the problem?
Hello, I have a flutter app that is working fine on Android but can’t fetch offers from Appstore Connect. I have verified all the details, from product id, bundle id, products are approves, agreements signed, bank account added, etc. I can see where the issue lies in any config setting. What else could be causing this problem? I went through the “Why are offerings or products empty?” checklist. I did see where it stated about a shared secret but that was for storekit 1 which is not what we are using. I have done the certificate for storekit 2. This is only on iOS. Any help is greatly appreciated.
Hi, I’m facing an issue in my Flutter app when displaying the paywall.The error says: The Paywall references a package with id '$rc_annual', but Offering 'subscription' does not contain such a package. It has these packages instead: [$rc_monthly]. Either add the missing package to the Offering or remove it from the Paywall. This started happening after I created a new base plan in Google Play Console, imported it into RevenueCat, and updated my Offering. I had an annual plan before but deactivated it and created a new base plan. After that, the paywall can’t find $rc_annual, and only $rc_monthly shows in the Offering. How can I properly link my new annual base plan so that it appears in the subscription Offering and resolves this error?Thanks in advance!
Hello,I plan to use virtual currencies within my app.For me, spending or gaining is straight forward and I will use my backend for such calls.Evaluating the available tokens within the app raises more questions and I tried to understand the official doc here https://www.revenuecat.com/docs/offerings/virtual-currency but I still wonder about some aspects.Exact use case: I need to know within my view models if the user has tokens or not.What should I use: Purchases.shared.cachedVirtualCurrencies or Purchases.shared.virtualCurrencies()?I understand the fact that I need to call the Purchases.shared.invalidateVirtualCurrenciesCache() each time there is a backend transaction, but then what?Is calling Purchases.shared.invalidateVirtualCurrenciesCache() updating the Purchases.shared.cachedVirtualCurrencies? or do I need to fist call Purchases.shared.virtualCurrencies() and then use the cachedVirtualCurrenciesHow about this flow:App launch call Purchases.shared.virtualCurrencies() and store it
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.