Get help with your SDK implementation.
Recently active
I am facing the following challenge: My app has a hard paywall, which means at the end of onboarding, users start a subscription with a 7-day free trial before. Everythink works perfectly well with the RC paywall: I just realized that I need to display a different paywall if the user has already used their single free trial. I stumbled upon the checkTrialOrIntroDiscountEligibility method, and have already created a second offering without the trial period configured. However I am lost how I can now call two different paywalls depending on the result of the method. Is it even possible to add a second View modifier (.presentPaywallIfNeeded) with the “no trial” entitlement in combination with checkTrialOrIntroDiscountEligibility?Just for my understanding: RC would automatically handle this case if I had not configured a components-based paywall, am I correct? Thank you in advance*
onReceived or onError call backs not triggering in getOfferings method, when i update my SDK version to 35 and increase some other libraries versions. so i am unable to get prices of offeringsPurchases.getSharedInstance().getOfferings(new ReceiveOfferingsCallback() { @Override public void onReceived(@NonNull Offerings offerings) { } @Override public void onError(@NonNull PurchasesError error) { }});
Hi folks,I’m building an Android app and trying to have 2 paywalls presented (that I have configured in Revneuecat) - one for when user is in trial period and one when trial is over. I'm trying to launch PaywallActivity with a specific offering in RevenueCat SDK 9.0.0, but it always shows the "current" offering from the dashboard instead of the offering I specify.*** Here is our code:```java// BillingManager.java - Method to launch paywall with specific offeringpublic void launchPaywall(String offeringIdentifier, BillingCallback callback) { // First get the offering object Purchases.getSharedInstance().getOfferings(new ReceiveOfferingsCallback() { @Override public void onReceived(Offerings offerings) { Offering targetOffering = offerings.get(offeringIdentifier); if (targetOffering != null) { // Launch PaywallActivity with specific offering Intent intent = new Intent(currentActivity, PaywallActivity.clas
Consider this scenario: the user account is only created in the database after the user subscribes.Since I don't have a user ID initially, I initialize the Web SDK like this:const appUserId = Purchases.generateRevenueCatAnonymousAppUserId();const purchases = Purchases.configure({ apiKey: WEB_BILLING_PUBLIC_API_KEY, appUserId,}); Once the user account is created, I need to associate the existing RevenueCat data (based on the anonymous appUserId) with the newly created user ID. Based on the docs, it looks like I can create a new customer using the new user ID and then use the transfer endpoint.Questions: If the destination appUserId doesn’t yet exist in RevenueCat, will the transfer endpoint create it automatically, or do I need to create it first? Is using the transfer endpoint the recommended approach for this use case? Or is there a better way to handle the transition from anonymous to identified user server side?
The old style paywall did display full screen on ios26 beta3, but the new style paywall does not. Attached image. struct OnboardingFlow: View { let purchases = PurchaseManager.shared var body: some View { VStack { if let offering = purchases.offering { PaywallView( offering: offering, displayCloseButton: true ) .ignoresSafeArea() } else { ProgressView() } } .task { await purchases.fetchOfferings() } }}
not getting any offerings and planson calling await Purchases.getOfferings(); its just keep loading logs: D/[Purchases] - DEBUG(29119): ℹ️ Cleaning previously sent tokensD/[Purchases] - DEBUG(29119): ℹ️ Tokens already posted: []D/[Purchases] - DEBUG(29119): ℹ️ Saving tokens []D/[Purchases] - DEBUG(29119): ℹ️ Tokens already posted: []D/[Purchases] - DEBUG(29119): ℹ️ No pending purchases to syncD/[Purchases] - DEBUG(29119): Request already scheduled with jitter delay, adding existing callbacks to unjittered request with key: BackgroundAwareCallbackCacheKey(cacheKey=[/subscribers/7r34LFyvZVP024pwpErDILSapda2], appInBackground=false)D/[Purchases] - DEBUG(29119): Billing connected with country code: IND/[Purchases] - DEBUG(29119): API request started: GET /subscribers/7r34LFyvZVP024pwpErDILSapda2/offeringsD/[Purchases] - DEBUG(29119): API request completed with status: GET /subscribers/7r34LFyvZVP024pwpErDILSapda2/offerings 304D/[Purchases] - DEBUG(29119): ℹ️ Requesting products from the s
Hey there,The user experience of loading the dynamic paywall is really ugly. You see all these skeleton loaders. Is there a way to avoid this? I rather have it have a short delay of 0.5s vs this weird experience.
I was testing a scenario when the user is on a subscription (e.g. monthly) and decides to purchase a lifetime access while subscribed. In this scenario:user has their monthly subscription that lasts until 31Jul for example (let's assume today is 11Jul) user purchased lifetime access -hen user goes to the settings and cancels their subscription which is still valid until 31Jul but won't renewNow I wanted to show a banner to the user that they must manually cancel their subscription (as far as I know we cannot do it on our own). For this I am checking the willRenew flag that I found inside the customerInfo.subscriptionsByProductIdentifier.What I noticed though during testing in Sandbox that the willRenew flag is not updated and couldn't get a confirmation on RevenueCat's forum if it's just a Sandbox issue or it's also not reliable in Production.I also considered using it together with the unsubscribeDetectedAt attribute, somehow like this:let hasNotCancelledActiveSubscription = customer.
Hello,we have implemented RevenueCat into our app.We are testing the app through TestFlight.Testers see the price for the US in USD in the paywall, while they should see the prices for Germany in EUR. On the Apple Payment screen the price shows correct in EUR.They are located in Germany, have a phone locale and everything set up in German, their App Store account is registered in Germany, and their added credit card is from Germany. No VPN and no previous activity in with US store accounts.We didn't change anything regarding locale in App Store Connect. We use the default US Localization.We are getting prices like this:func getOfferings() { Purchases.shared.getOfferings { offerings, error in if let error { print("Purchases: Error: \(error.localizedDescription)") return } // We are getting prices from availablePackages guard let packages = offerings?.current?.availablePackages else { return } for package in pac
I'm encountering an issue where the in_app_purchase event does not show up in Firebase Analytics, even though the user successfully completes a subscription using RevenueCat on Android. Purchases.configure(PurchasesConfiguration.Builder(context, apiKey).build())Firebase.analytics.appInstanceId.addOnSuccessListener { appInstanceId -> Purchases.sharedInstance.setFirebaseAppInstanceID(appInstanceId)}Other details: I’m using Firebase SDK directly (no third-party wrappers). appInstanceId logs successfully.
With the new Paywalls v2, there is no way to change the GoogleReplacementMode when making a purchase. I would need to set purchasesAreCompletedBy to MY_APPS to be able to set a custom purchase logic for the paywall to change the mode accordingly. Even the community support does not agree that thats even the correct approach to solve this issue (see this thread from 2 months ago)
Hi,so until now I’ve used Apple In-App Subscription only with RC. I have two subscription tiers (entitlements). Now I’m build a web dashboard and want to sync the tiers and give the users to manage their subscriptions and subscribe to a tier. Works fine with web Billing but after some testing I saw that users can subscribe to several tiers (entitlements) the same time in the web billing version. Or is that only because I’m using the Sandbox version and the system has no time to react? Can we allow the user to manage their subscription in the dashboard? As far as I understood correctly, they can manage their payments only via the stripe dashboard (only when subscribed via web). In case the user subscribed via our iOS app, the user can only manage their subscription via the app? Thanks in advance!
Hi, I’m using RevenueCat’s showPaywall() in Flutter on iOS. Plan A: 1-year with 7-day free trial ($89.99) Plan B: 1-year discounted ($39.99), no trial I want users to start the trial, but if they choose the discounted plan during the trial, they should be charged immediately.Instead, RevenueCat on iOS just updates the renewal preference. No charge happens, and if they cancel before trial ends, they’re never charged.Is there any way to force an immediate charge on iOS using the built-in paywall?Thanks!
Hi,I have a separate component responsible for loading the paywall.Purchases.configure is setup in the useEffect in the index.tsx file as that’s the first component it hits.Then, my subscribe button calls a function that loads the paywall.This wasn’t happening prior to updating the the latest expo/expo supported react native that comes built into their latest SDK.For referencePackage.json:"react-native": "0.79.3","expo": "^53.0.11","react-native-purchases": "^8.9.5","react-native-purchases-ui": "^8.9.5", Any suggestions? Thank you.
I’m using RevenueCatUI and have configured the restore button action correctly in the RevenueCat dashboard. It used to work fine, but recently the onRestoreCompleted modifier is no longer being triggered when I tap the restore button that i configured remotely Here’s the code:PaywallView(displayCloseButton: false) .ignoresSafeArea() .onAppear { print("paywall onAppear") } .onDisappear { print("paywall onAppear") } .onPurchaseStarted { package in print("onPurchaseStarted") } .onPurchaseCompleted { transaction, customerInfo in print("onPurchaseCompleted") } .onPurchaseCancelled { print("onPurchaseCancelled") } .onPurchaseFailure { error in print("Purchase failed with error: \(error)") } .onRestoreStarted { print("Restore started") } .onRestoreCompleted { customerInfo in print("Restore completed, checking subscription status") } .onRestoreFailure { error in print("Restore f
I am an administrator on this project, and I connected the RevenueCat extension on Stripe. The Stripe App Integration on RevenueCat was selected by the owner of the project. I am still getting this error:{ code: 7103, message: "The receipt is not valid." }whenever I try to post a call to curl -X POST \ https://api.revenuecat.com/v1/receipts \ -H 'Content-Type: application/json' \ -H 'X-Platform: stripe' \ -H 'Authorization: Bearer strp_XXXX' \ -d '{ "app_user_id": "XXX", "fetch_token": "sub_XXX" }'I also tried using server to server notifications, and the same error occured. What could be other possible issues for this to happen? I have not tried deleting the Stripe integration and doing it again yet.Thank you for your replies,Calda
Hi RevenueCat team and community!How about paywalls that come alive? Animations could breathe life into paywalls and encourage users to buy. I’ve even whipped up a quick Android prototype – just take a look!SDK tech solution - use Lottie animations. This seems to be possible since all platforms (?) are covered:Android: lottie-android (https://github.com/airbnb/lottie-android, Apache 2.0) iOS: lottie-ios (https://github.com/airbnb/lottie-ios, Apache 2.0) Web: lottie-web (https://github.com/airbnb/lottie-web, MIT) React Native: lottie-react-native (https://github.com/lottie-react-native/lottie-react-native, Apache 2.0) Flutter: lottie-flutter (https://github.com/xvrh/lottie-flutter, MIT) Kotlin Multiplatform: compottie or similar (https://github.com/alexzhirkevich/compottie, MIT) Capacitor: Web?Component payload example:{ "fit_mode": "fit", "id": "someid", "margin": { "bottom": 0, "leading": 0, "top": 0, "trailing": 0 }, "name": "", "padding": { "bottom": 0, "leading": 0, "top": 0,
Hi,I am implementing a paywall for our iOS app. The problem is that we are two devs, so our Developer team is not an organization - which means that I need to use different bundle id and team than him. This does not effect other functions of the app, such as api calls to firebase and other, but it seems to affect Revenue Cat. When testing the paywall, do I need to have same bundle id as is set in App Store? Thanks for help! Edit: Also, I should add that the paywall simply crashes (does not retrieve offerings), but on the revenue cat dashboard a new “customer” appears.
Hi,How i can change the bottom color (gray bar) under "restaurar compras" using Flutter?Im using the demo flutter code from docs, but don't have option to change that part.Thanks.
I would really prefer to test and build as much as I can before having to deploy to the app stores and do the whole build process. Is there really no way to test in editor in sandbox mode?
I’m using purchases_ui_flutter 9.0.0-beta.3 with Flutter web support, and trying to get a rough idea of how much effort I should be putting into building a custom paywall, or whether I can wait for support in the SDK.Is there a rough timeline for this that can be shared, or is this not being actively developed? Thanks!
Hi there,I’m trying to get custom fonts working on a Paywall V2 within an Expo project. After following the RC instructions, things work fine on iOS - however I’m not sure what I’m supposed to do to get Android to use the custom fonts. On Android, my Paywall just defaults to a system font rather than the custom fonts (and all variants end up looking the same).My Expo config is as follows:Expo config This creates the following structure my `android` folder when I build the project - which appears right (as in, the fonts are being copied and an xml file is being generated by expo-font):Generated android folder structure from ExpoThe generated XML file looks like this:Generated xml_hind.xml file I’ve also uploaded the fonts to the Paywall of course. However what I’m unsure about is what am I meant to set as my Android resource names in RC? I’ve tried a combo of various things, but none seem to work. In addition the “Learn more” text doesn’t actually link to anything in this dialogue - so
I recently started using multiple app variants workflow as described here https://docs.expo.dev/tutorial/eas/multiple-app-variants/ So basically for development and production it will have have different bundle identifier.For exampleDevelopment Build: com.yourname.stickersmash.devProduction Build: com.yourname.stickersmashI had configured everything and it worked great for com.yourname.stickersmash . So the question is to support both dev/production build with same codebase, how should I configure revenuecat? What’s the good practice?Do i need to create another app in revenuecat dashboard , everything exactly same except the “Google Play package” and “App Bundle ID” ??Note: after building with com.yourname.stickersmash.dev I’m having error, ofcourse it should have error as in revenuecat dashboard is configured as com.yourname.stickersmashThe error : [RevenueCat] 😿‼️ Error fetching offerings - PurchasesError(code=ConfigurationError, underlyingErrorMessage=There's a problem with your co
Hi there, I have an iOS app with auto-renewable subscription. Previously, we used to store the purchases in our server database and open features inside the app based on it. Now, we are trying to move to RevenueCat and opening the features using the below code instead of relying on our server side subscription status.CustomerInfo.entitlements["Pro Access"].isActive After user update the new version with RevenueCat, will you get the active subscription automatically from Apple Receipt and enable entitlements or should we call syncPurchases programmaticaly so that you will enable entitlements based on it? Please advise, Thank you.
Hi! Is there an endpoint available that allows me to only get my active subscribers?I was only able to find this endpoint, which just returns all customers:https://api.revenuecat.com/v2/projects/{projectId}/customersI saw this old thread where this wasn't possible, but it would be great if it's been added since then.Furthermore, I looked through the docs here, but wasn’t able to find an endpoint that just returns my active subscribers / free trials.https://www.revenuecat.com/docs/api-v2#tag/Entitlement/operation/detach-products-from-entitlement
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.