Get help with your SDK implementation.
Recently active
I am using Ionic + Capacitor + RevenueCatUI to present Paywalls for my app’s subscriptions. I want to add event listeners so I can handle cases such as:Restore Purchases with no Active Subscriptions DEBUG: Restored purchases successfully with no subscriptions Purchase Error due to Restore Behavior = ‘Keep with original App User ID’ ERROR: 😿‼️ There is already another active subscriber using the same receipt. However, I see that RevenueCatUI only allows listeners for paywallDisplayed and paywallDismissed.I am using:"@revenuecat/purchases-capacitor": "^10.4.0","@revenuecat/purchases-capacitor-ui": "^10.4.0",Is there any way I can handle the cases described above?
hello,Im integrating web purchases with redemption links for a web to app funnelIm seeing that once i redeem the web link, the entitlement goes to the annonimous user Id assigned on the web, rather than to the appUserID in my mobile app SDK here is my full pipelineuser lands on my web funnel and is redirected to revenuecat web checkout Revenuecat web checkout assigns an anonymous appUserID, eg $RCAnonymousID:01 User downloads my app user taps a deeplink, which launches my app. Deeplink example: rc-0000000://redeem_web_purchase?redemption_token=abc ---app launches and runs Purchases.configure--- Purchases.configure assigns an anonymous appUserID eg $RCAnonymousID:02 User gets automatically loged in to Firebase, fiirebase returns an ID eg. abc123 Purchases.login(firebaseID) runs, abc123 becomes an alias for $RCAnonymousID:02. Firebase and RC have matching IDs at this point. ---Web purchase redemption begins--- Validate link received in step 4 and redeem it Entitlement assigned to user w
For the first time I am releasing app into AppStore (with subscription feature). I have setup RevenueCat using .p8 file I have seen that “Valid Credentials” And during testing I could be able to sanbox-purchases. But right now apple confirmed my release with following email:We're pleased to let you know that your app, ..., has been approved for distribution.Please note that it can take up to 24 hours for apps to become available on the App Store after release.If your contracts are not yet in effect, your app cannot be distributed. Check the status of your contracts in the Agreements, Tax, and Banking module in App Store Connect. However when i download the app and trying the load the offerings. RevenueCat returns following error (both in testing and prod): ⚡️ [error] - {"code":"23","errorMessage":"There is an issue with your configuration. Check the underlying error for more details. There's a problem with your configuration. None of the products registered in the RevenueCat dashboard
Hi everyone,I'm getting a persistent warning in my console logs and my app was rejected by Apple Review with Error 23 (Configuration Issue). I believe it's related to subscription metadata, but I need help understanding what I'm missing.**Issue:**- Console shows: `WARN: Empty Product titles are not supported. Found in product with identifier: iradepremiumtest1`- Apple Review rejection: Error 23 - Configuration Issue- Products are loading correctly with prices (₺249.99, ₺899.99)- Both products are in state: IN_REVIEW in App Store Connect**What I've Done:**1. Created subscriptions in App Store Connect (iradepremiumtest1, iradeyillik1)2. Added App Store Localizations (Turkish and English) with Subscription Display Names filled3. Saved all changes in App Store Connect4. Products are configured correctly in RevenueCat Dashboard5. Offerings are loading successfully6. Prices are showing correctly**Current Console Output:**✅ Offerings loaded successfully 📦 Available packages: 2 💰 Product ID:
Hello, I am in the process of developing an app and have integrated RevenueCat for managing subscriptions and in-app purchases.Here is my setup: I have created subscription products in iOS App Store Connect, and all products are at the “Ready to Submit”stage. I have signed the Paid Applications Agreement. All banking and tax information is active and verified. However, whenever I try to access the paywall in the app, I consistently receive the following error:“Unable to load subscriptions.”I have confirmed that my product identifiers match exactly between RevenueCat and App Store Connect.Could you please advise on the possible reasons for this issue and steps to resolve it? I want to ensure that my subscriptions load correctly for testing and eventual release.Thank you for your support.
Hello I’m new to RevenueCat, i like all the cool features there but i have a few questions.I’m testing iOS version recently, I use storekit to simulate purchase, everything works fine, the transaction history does show in the sandbox data in the RevenueCat dashboard. I’m using anonymous app user id.If I reinstall the app on the same device, a new anonymous user id is generated when the app is launched. A new anonymous will be generated also if I debug it on another device. I know this is reasonable, since there is no authentication flow here. I read the document that, if using anonymous app user id, RevenueCat can analyze the receipt and link the apple user with the anonymous id, so when the user logins with the same apple account on another device, or if he or she reinstalls the app, the purchase can be restored.However, I test the “anonymous user id” flow on two different devices, with the same apple account logged in, the purchase record is not retrieved (for example, the “allPurch
ERROR [RevenueCat] 🍎‼️ Error fetching offerings - The operation couldn’t be completed. (RevenueCat.OfferingsManager.Error error 1.)There's a problem with your configuration. None of the products registered in the RevenueCat dashboard could be fetched from App Store Connect (or the StoreKit Configuration file if one is being used). 1. I am working on an expo project on my linux machine2. I have apple developer account3. created the subscription product, it is ready to submit state4. have added the the keys in revenue cat dashboard which imported the product5. the entitlement is attached with the product6. Paywal has both android and ios offeringI have been trying to debug this but i am going no where, please help.
I am testing an iOS app on-device (sandbox environment). I can successfully purchase a subscription and have verified that my “premium” features become available. I was experimenting with allowing the user to launch the paywall at any time to allow for possible upgrade/downgrade opportunities. However, I was surprised that, even after a purchase, the paywall was identical to before -- its state didn’t seem to have changed to indicate that a subscription was already active, etc. Is this normal? Or should I expect the state of the paywall to change to reflect recent transactions?
I’m using RevenueCat’s new paywall components with the Flutter SDK (flutter_purchases ^9.2.0). On Android, the paywall displays localized prices correctly using {{ product.price_per_year }} and {{ product.price_per_month }}. On iOS, those same variables are always blank when the user navigates to the paywall.Here’s what I’ve already verified: The app is live in production on the App Store (not TestFlight). The subscription product is approved, cleared for sale, and has U.S. pricing active. All legal agreements in App Store Connect are signed and up to date. The product belongs to a valid subscription group, and product identifiers match across App Store Connect, RevenueCat, and the app code. Only base price variables ({{ product.price_per_* }}) are used, since there are no introductory offers configured. The RevenueCat dashboard shows the iOS product as active (not missing). Verified on multiple real iOS devices with different Apple IDs. The issue persists on all devices.
Hello, I have a Flutter Project where we are using Paywalls to display RevenueCat offerings to customers.For Android, on my Google subscription I have multiple offers under a single Base plan as seen below:Is there a way to pick specific offer(s) when using Paywalls?
Use case:I have a product priced at $71.99 per year in the App Store. On my paywall I am using the variable {{ product.price_per_month }} to display the product's price per month. However, the paywall is rendering $6.00 when I want it to display $5.99.I do not want to hardcode $5.99 on the paywall because then the price will be shown in USD even if the user non-USD, which is not good.Desired Solution: Support for conditional logic directly within the template to show text or values only for specific currencies, such as displaying a hardcoded value but only for USD users.
I love the WebBilling feature, but thought it would be even more powerful to be able to embed the products of a offering as part of my webpage.So for example when a user clicks on a package it would navigate directly to the checkout page.This would make the integration more seamless for users checking out my webpage being able to see the different packages and purchase right away; for example from a landing page.It will also give developers more tools to customize how the packages are shown.
Is there an issue with displaying Paywalls specifically with an offering and or in the sandbox environment with Xcode builds?If I use this is shows the paywall instantly PaywallView()however if I use an offering its blank (as if offering is nil). If I swipe app up to open the app switcher on iOS the paywall is actually loaded and is showing when app re-enters foreground. So wondering if this is a known Xcode sandbox debug issue..fullScreenCover(isPresented: $hasToShowPayWall) {if let offering = offering { PaywallView(offering: offering, displayCloseButton: true) } else{ Text("offerings is somehow nil") }}offerings a awaited and fetched before triggering the fullScreenCover. so offering passed in cannot be nil yet it claims it is @State private var offering: Offering? = nilif let offering = await availableOfferingWithIdentifier("default") { await MainActor.run { offering = offering withAnimation { hasToShowP
Hello,I’m providing a free trial on my weekly plan and I want to check if a user is eligible for the trial. The goal is to display a text (e.g., “3 Day Free Trial”) based on eligibility.How can I check if the user has already availed the free trial or not?I tried this code, but it’s not working: val freeTrialText = if (pkg.storeProduct.subscriptionOptions?.defaultOffer?.freePhase != null) "3 Day Free Trial" else "" println("3 day trial text: $freeTrialText")This always returns empty.On iOS, the payment popup correctly shows the 3-day free trial, but in the app it doesn’t reflect.Any ideas on what I might be missing?
I am on the latest version of iOS SDK, and set delegate for observing for active entitlements and then updating the observable object. It makes it self-contained and effective for a SwiftUI app.My problem is that its method is called when initializing the SDK, but not when the purchase is done, also not when restored purchases.I have set it up the same way in my other apps, and they are on older versions of SDK, where it worked. I hope this is fixed quickly, don’t want odd workarounds in the code.
Before showing paywall I want to check if any purchase already made from a google play or apple account. My app will not support account transfer so if the user already purcahse for any account and user logged in with different account we don’t want to purchase with the same google play or apple account. We want to show a message like “Please change your google play or apple account as another user already using that.”. To show this message I need to know from any account a purchase has been made or not. I can do that by Google Billing client but I want to know more generic way using revenuecat.
Hello,I’m trying to add a hard paywall in a Capacitor project.All is working as intended on Android, the paywall is displayed full screen, while on iOS it’s displayed as a sheet.I don’t see any way to choose whether to use sheet or full screen.I tried adding a close button and removing it but it’s the same.Any ideas ?Thanks
Hey everyone,I’m integrating the Meta SDK with RevenueCat and I have a question about how to handle FBAnonymousID.Right now, I grab the FBAnonymousID from the Meta SDK and then pass it manually into the RevenueCat SDK in my code. From what I understand, this value is generated per device.In my login flow, I set the appUserId in RevenueCat based on a value from my backend.Here’s the part I’m not sure about: When a user logs in, I update the appUserId in RevenueCat. The FBAnonymousID, however, stays the same (since it’s tied to the device). My question is: is it okay that different RevenueCat users on the same device share the same FBAnonymousID? Or should I be re-generating a new one during the login process to avoid mixing analytics?Has anyone else run into this or figured out the best practice?
Hello everyone,I am currently working on paywall and am having some difficulty displaying the paywall correctly. Currently, I display the paywall as follows:ContentView() .presentPaywallIfNeeded( requiredEntitlementIdentifier: Constants.ENTITLEMENT_ID, purchaseCompleted: { customerInfo in [...] }, restoreCompleted: { customerInfo in [...] } )However, it is displayed as a sheet dialog and can be easily closed. A paywall that can be easily closed is not a wall—it's just a door that can be kicked in :)Now I can use the alternative: PaywallView. However, I now have to implement the logic myself to determine whether PaywallView should be displayed or not. Right?Is there an SDK function that allows me to decide whether to display it or not, as with the sheet dialog? The documentation has no info about it.I want the user to be unable to close the paywall. He has to pay or close the app, but the paywall must be impossible to over
## Description Getting "Invalid API Key" error when initializing RevenueCat Flutter SDK despite using valid API keys. **Error:**```RevenueCat Platform Exception: There was a credentials issue. Check the underlying error for more details. Invalid API Key. (Code: 11)``` **Code:**```dartawait Purchases.configure(PurchasesConfiguration(apiKey)); // Test the connectionfinal customerInfo = await Purchases.getCustomerInfo();```
Hiwhere can I find the documentation for PaywallView.currently I’m using it like this:PaywallView() .onRequestedDismissal { state = .paymentRequiredInfo } .onPurchaseCompleted { CustomerInfo in state = .ready } .onPurchaseFailure({ NSError in state = .error(StaticErrorMessage("Payment error")) })After Purchase is completed, callback method onPurchaseCompleted is not called. If I try to purchase again I’m getting “already purchased” dialog info.So my question are why onPurchaseCompleted is not called and where is the documentation for PaywallView.Regards
I want to fetch state from API in addition to webhook handling, for improved resilience.My subscriptions are credits based, when there’s initial/renewal event, I assign a number of credits to the user.Not sure how to proceed with the transfer webhook event:The user installs the app on device A: they get id 1. The user subscribes. My backend has id 1 → 10 credits.The user installs the app on device B: they get id 2.Let’s say that the backend for some reason doesn’t receive or process the transfer webhook, so it’s not aware that id 1 → id 2Now device B, with its id 2, triggers a refresh from RevenueCat api: I get that id 2 has a subscription.Since I don’t have the old id, all I can do here is to create a new record for id 2 with 10 credits, as if it was a new user. Which is incorrect, because it’s effectively duplicating the credits for the user, who can now use 10 credits on device A and 10 credits on device B.How can I associate the subscription data to the old id? Also, is the whole r
Hello RC Support:The issue described below is in the latest IOS SDK only. The android SDK does not have this issue. The crux of the issue is that presented_offering_id IS NOT matching the product_id and resulting incorrect understanding of which product the user actually purchased.I’ll explain this with an example.We have a few product_id = Plus , Gold, Platinum. The corresponding presented_offering_id also matches this: i.e. presented_offering_id = Plus , Gold, Platinum.As an example, In IOS when a user purchases a Gold offering on the paywall, we see the following INCORRECT response in the webhook events that we receive. Actual plan purchased by the user: GoldProduct_Id received via webhook: goldpresented_offering_id received via webhook: platinum. In Android, it is functioning properly:Actual plan purchased by the user: GoldProduct_Id received via webhook: goldpresented_offering_id received via webhook: gold. I can share event logs and more via email.
I am using the React Native SDK, and I am getting some PAYWALL_RESULT.ERROR back when users are shown the paywall.I have been searching for what this result means, but I haven’t been able to find many details about this specific error.All I can see is this line from the source code: “If an error happened during purchase/restoration.” I would like to know whether this indicates an error on RevenueCat’s side (such as the server sending 500s) or a store/user error (for example, problems processing the payment).Thanks!
Platform: React NativeSDK Version: react-native-purchases 8.11.6, react-native-purchases-ui 8.11.6Issue: Bold font weight not applying on Android V2 Paywalls (works perfectly on iOS) Problem DescriptionI have successfully configured custom fonts ("Nunito Sans") for V2 Paywalls and they work perfectly on iOS, but on Android the bold weight is not being applied - all text appears as regular weight even when elements are configured as bold in the RevenueCat dashboard. What Works ✅- Custom font "Nunito Sans" loads correctly on Android (showing custom font instead of system font)- All font weights work perfectly on iOS- Regular font weight displays correctly on Android What Doesn't Work ❌- Bold font weight on Android (appears as regular weight)- Text configured as bold in dashboard renders as regular on Android only Technical Configuration Environment- React Native: 0.76.9 (bare workflow, NOT Expo)- RevenueCat SDK: react-native-purchases 8.11.6- RevenueCat UI: react-native-purchases-ui 8.11
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.