Get help with your SDK implementation.
Recently active
Hi this is a continuation of the conversation that I missed here.I wanted to find out what are the expected events to come before RENEWAL. Specifically when the webhook sends them to my API.I was thinking that only SUBSCRIPTION_PAUSED can come before RENEWAL but today I got a RENEWAL a day after a SUBSCRIPTION_EXTENDED event. Is this expected? If so, what other event types are expected to come from the webhook before a RENEWAL?Customer History view seems to correctly order these events as well.
Hey team,I'm trying to build an admin view similar to the "Entitlements" card shown in the RevenueCat dashboard (see attached screenshot), but I'm struggling to figure out how to get this same level of detail through the API.Screenshot Here's what I’ve tried so far: API v1 (Get Customer): This gives me a list of all entitlements a user has ever had, but: There’s no connection to their subscriptions. (I cannot find out the different grant periods as in screenshot). It doesn’t tell me if a subscription will renew. (On the dashboard, I see “Will renew in X” — but there’s no equivalent field here.) API v2 (Subscriptions endpoint): I can list the subscriptions and join it with product data to infer durations, renewal status, etc. But promotional entitlements break this: Subscriptions created by granting entitlements don’t have product IDs. The entitlements field in the subscription only includes active entitlements. So if a promotional entitlement expi
Eight days ago, I could still see the subscription details without any issues. Please help me understand why this is happening. Has there been an update or change that could have caused this?"Let me know if you'd like to add more details or adjust the tone!
When I was originally developing using the PurchasesAreCompletedBy.REVENUECAT mode, everything worked fine.However, since I needed to change the GoogleReplacementMode to DEFERRED, I had to switch to the PurchasesAreCompletedBy.MY_APP mode.To support this, I passed a custom purchaseLogic to PaywallOptions via PaywallOptions.Builder.But after switching to this approach, my subscription purchases started showing a “Confirm Plan” prompt, and the subscription would end up being automatically canceled.Even after I manually called Purchases.sharedInstance.syncPurchases(), the issue still persisted.Is there something wrong with my setup? // Implementation of PurchaseLogicoverride suspend fun performPurchase( activity: Activity, rcPackage: Package,): PurchaseLogicResult { onPurchaseStarted(rcPackage) val purchaseParams = PurchaseParams.Builder(activity, rcPackage) .googleReplacementMode(GoogleReplacementMode.WITHOUT_PRORATION) .build() return try { val resul
Hi everyone,I'm encountering a crash in my React Native app that appears to be coming from the react-native-purchases package. The error is showing up in Crashlytics and looks like this:```BillingWrapper.buildSubscriptionPurchaseParamsjava.lang.NoClassDefFoundError - com.android.billingclient.api.zzcecom.revenuecat.purchases.googleBillingWrapper.kt:885```My react-native-purchase version is 8.9.1Doing some search I can see this is related to `com.android.billingclient:billing` but the module should manage this dependence I should not add it Thanks for the help :)
Hi guys, pardon my ignorance but I was wondering why I get this error when doing a production build for ios via eas? There may have been a chance I skipped over a step but I am unsure what it could be. It works fine in eas dev builds and local.
If I paste string with newline in paywall editor and display paywall in UIKit app it will behave like this:Notice the “\” symbol, that is added.If I try to add newline via enter key, and use UIKit to display paywall: If I paste string with newline and use SwiftUI app to display paywall: If I enter newline via enter key and use SwiftUI app, it will show it like this: Seems like there is inconsistency in paywalls behaviour, what should I do? Now I use UIKit mainly, and I just want to add newline without extra symbols.
Hello,To briefly describe, similar to Instagram, where users can subscribe to multiple content creators, our application follows the same approach.We conducted an experiment by creating 2 Subscription Groups on App Store Connect:subs_offer_1 includes two Renewable Subscription plans: A and B subs_offer_2 includes two Renewable Subscription plans: C and DOn the same device (meaning the same Apple ID), I performed the following steps:Created a new account X1 in our system with user_id = X1_id, then called the function: Purchases.logIn(X1_id). Successfully purchased plan A in subs_offer_1. Logged out and called the function: Purchases.logOut() Created another new account X2 in our system with user_id = X2_id, then called: Purchases.logIn(X2_id). Tried to purchase plan D in subs_offer_2 but encountered the following error:PlatformException(7, There is already another active subscriber using the same receipt., {readableErrorCode: RECEIPT_ALREADY_IN_USE, code: 7, message: There is already an
I am getting this error when I try to test subscription thru paywall. PayWall is never displayed.It works fine on iOS.
Hi there, I’m currently calling https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}/purchases for extracting all purchases and then check for a specific one using store_purchase_identifier.Is there a way to avoid extracting all purchases from the server every time I need to find a specific store_purchase_identifier? Thank you,Yury
We updated to the new version of Revenue Cat and suddenly we get a lot of instant Trial cancellations. Meaning the user comes into the App, creates an Account, starts a trial and then instantly (meaning same minute) the Trial is cancelled.You can cancel the trials in the app and are then forced to fill out a questionnaire. But there’s no questionnaire filled out.Meaning people would needed to start the trial and immediately close the app and then cancel via iOS Settings.I find this highly unlikely (but could be true) - anybody else with this problem?
testtest123123
My app is crashing with these error after purchase an item in Paywall and open the paywall again “java.lang.IllegalStateException: Unsupported concurrent change during composition. A state object was modified by composition as well as being modified outside composition.”I load the Offers in my ViewModel, setting it into Paywall composablesetOffering(viewModel.offering.value)and when Paywall get Recomposed the app crash with that error.
I currently have two RevenueCat projects, one containing an older version of my iOS app, and one containing Android. I’m currently working on an iOS update, and I’d like to amalgamate both of these apps into one project, but I can’t see how to do this. I can set up a new iOS app in the same project as the Android one, which means that all new subscribers will end up there, but is there some way of moving existing subscribers?
Reading this section of the docs: https://www.revenuecat.com/docs/customers/identifying-customers#supporting-your-customersIs says > You can retrieve the currently identified App User ID via the Purchases.shared.appUserID property. Unfortunately that doesn’t work for me. `Purchases.shared` is `undefined` even after calling `Purchases.configure({ … })`. Are the docs outdated? Or am I doing something wrong?
Hello guys, I am fairly new to RevenueCat and attempting to integrate paywalls into my app using react-native-purchases-ui. I want to set up a Freemium model where the user can be to remove ads or watch a rewarded ad to move on. I am just trying to work out the flow to enable this. So far my plan for potential implementation, I have a button within the WYSIWYG editor that navigates to a deep link within the app that triggers the reward ad to show, I however need to also dismiss the paywall on this action. There doesn’t seem to be any way to programatically close or abort the paywall? Or alternatively perform both a deep link action and dismiss action through a button within the paywall?Is there any way to achieve this flow that I am missing or do I need to reach for manual implementation of the paywall and loose the benefits of your paywalls feature?
Hi,I have setup revenue cat for my flutter app. I have double checked product IDs aligned to play store and my revenue cat paywall works for debug mode on my Android emulator. It also works for my iOS device without any issues.However, when I try testing the subscription through (Android) play store closed beta testing link and download the app, I get the error indicating a configuration issue. This is strange because if I run the app in debug mode in my android emulator it still works, and I can make test transactions. Error 23: There is an issue with your underlying configuration. Check the underlying error for more details.Any issue why this could be happening?
I’m building an app using KMP (Kotlin Multiplatform) with a shared UI (Compose Multiplatform). When I test my iOS app via a TestFlight build, the paywall looks completely different from what I designed on the dashboard—it appears very primitive. However, when I test the Android version, it matches the dashboard design perfectly.How can I ensure the iOS version aligns with my intended paywall design?library version:purchases-kmp = "1.7.2+13.26.0"purchases-core = { module = "com.revenuecat.purchases:purchases-kmp-core", version.ref = "purchases-kmp" }purchases-ui = { module = "com.revenuecat.purchases:purchases-kmp-ui", version.ref = "purchases-kmp" }on my ios Podfile:pod 'PurchasesHybridCommon', '13.26.0'pod 'PurchasesHybridCommonUI', '13.26.0'iOS version: 18.3.1the ios paywallmy design on dashboard
I realize this is similar to the post here, but was hoping to dig into it a bit more on why we are seeing this failure.We are seeing “The device or user is not allowed to make the purchase.” when attempting to call Purchases.getProducts() or Purchases.getOfferings() from our React Native app. A few notes:We’re on React Native 0.63. (I realize that the docs recommend 0.64 or newer, but it was my understanding that it should still work on this version). We’ve ensured that the emulator we are running has the Google Play Services SDK installed. According to the AVD Manager, we’re using a fairly new Android version: Android 11.0 (Google Play Services) We are logged into an account on the emulator that is registered as a license tester on the Google Play Console. The emulator has been rebooted several times.This error happens in both our main app and a simple test app that we put together for the sake of testing. Is there something else that we are missing in our testing process that cou
We tried implementing a custom font for the paywall screen using Expo React Native, but couldn’t get it to work on iOS despite multiple attempts (trying on simulator just to see if the fonts show). I followed both the Expo documentation and the standard React Native approach for custom fonts, but nothing seemed to work. Is there a reliable way to do this using Expo? Followed the instructions here as well (https://www.revenuecat.com/docs/tools/paywalls/displaying-paywalls#how-to-use-custom-fonts-2), along with the naming conventions. Still seeing the error that my custom font couldn’t be loaded - falling back to system font.For reference, I’m loading in fonts into my app using the `useFont` hook in Expo - https://docs.expo.dev/develop/user-interface/fonts/. Would really appreciate some help here!
I'm experiencing unexpected behavior when using a custom App User ID with react-native-purchases.At app start, I call Purchases.configure exactly once (on every login) and immediately provide the Cognito sub as appUserID: const cognitoSub = await Storage.getUser(); Purchases.configure({ apiKey: ..., appUserID: cognitoSub, }); However, when calling await Purchases.logIn(cognitoSub) shortly after, the customerInfo.originalAppUserIdstill returns an anonymous ID ($RCAnonymousID...).Even when purchases are restored, the originalAppUserId is still the anonymous ID, not the custom one passed to configure(). This leads to purchases being restorable across multiple user accounts on the same device, which should not be possible.What’s strange is that in TestFlight restoring purchases with a different account on the same device failed, as intended.But in production, any user on the same device can restore the purchase, even with a different Cognito ID.I’m using the latest libraries:"react-native-
Hello, I am working with no anonymous Id’s on Flutter App. Once the user logs in for the first time I call Purchases.configure(PurchasesConfiguration(‘Key’)..appUserId = ‘id’);If a user logs out and another logs back in I call Purchases.login(‘newId’);I have a flag to know when I have called Purchases configuration for the first time in my business logic. However, I do not know if the persistance is going to be the same as with the Revenue Cat package when app is closed, reset, etc. Will it be safe to call Purchases.configure anytime a user logs in regardless if it has been already called? If not, is there a method to validate if Revenue Cat package has been loaded? Thanks
Hi All,I’ve made a very quick and dirty GDScript port of the Purchases Unity SDK to Godot Game Engine here: https://github.com/werdnahull/purchases-godot. Only Android works so far, but iOS is in the works. As I said, it was done quick, so quite a few things are not done the “Godot” way, such as function names and variables. Callback functions were converted to signals, however.
Considering the latest events around Unity, and the community’s backlash, many are exploring OSS alternatives like Godot. Unfortunately non of the alternatives provide stable IAP solutions.Would RevenueCat explore the opportunity to port the SDK to Godot, or provide some guidance how this can be accomplished?I’m particularly interested in a C# port, however GDScript seems better supported. Godot 4 doesn’t build C# to iOS/Android, yet.
Hey everyone,I’ve been working on an Android app using Next.js 13 (with SSR), wrapped in a Capacitor container. I integrated RevenueCat (@revenuecat/purchases-capacitor) to handle subscriptions. The native logs show that the plugin registers successfully and I can fetch product offerings just fine—RevenueCat pulls the subscription details from Google Play (e.g., monthly, annual). However, whenever I tap my “purchase” button, the actual Google Play purchase dialog never shows up.Here’s what I do see in the logs: Capacitor is recognized as running on Android. RevenueCat logs: “Retrieved productDetailsList…” for my monthly/annual SKUs. CustomerInfo gets fetched repeatedly from the cache (no active subscription found). No sign of purchasePackage(...) or the “Launching billing flow” logs from BillingClient. I also tried: Uploading a signed release AAB to the Play Console in an Internal Test track and installing the app from the Play Store with my tester account. Opt-in link is opene
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.