Get help with your SDK implementation.
Recently active
Hello, I’m using react native (react-native-purchases and react-native-purchases-ui both at 9.7.0) for my iOS-only app. I’m displaying a paywall to my users via const result = await RevenueCatUI.presentPaywall({ offering });The paywall renders correctly. I have a restore button that restore the purchase correctly, but it does not dismiss the paywall. The user is often left confused as to whether the restore worked or not. How can I get the paywall to dismiss automatically after a restore? There’s no `dismiss()` method on `RevenueCatUI` either, and I would like to not use `<RevenueCatUI.Paywall />` component as that has several scroll issues when used in a bottom sheet to mimic similar behavior of `RevenueCatUI.presentPaywall()`
Our paywall on iOS works perfectly fine right now. It fetches the products/offerings and displays the paywall UI.However on Android we are only showing the offerings and not the paywall UI. Was curious if anyone knows the solution/problem?We are running RC:react-native-purchases - 9.7.0react-native-purchases-ui - 9.7.0expo: ^54.0.19We are displaying the paywall via: <RevenueCatUI.Paywall>
Hello,I have a working subscription system with revenuecat for a jazz education app. I wanted to be able sell individual lessons. I heard from many customer that they would want individual lesson purchases that is unlocked for life. I have 42 lessons in the app now and I plan to add more. It will be around 150-180 lessons total. So, What is the best practice here? Do I need to create 150 SKUs ?I have 6 categories and that number will be 10 categories soon.Every lesson in each category will have the same price. However, I will need to track who bought which lesson? So could I somehow have 10 categorical prices to simplify things down and still track 150 lessons with it? Thanks..
We can honour entitlements that were purchased on other platforms by calling login(appUserId).What if someone purchases a package on ios, then logs out of the app, then creates a new appUserId.Wouldn’t this create a scenario where multiple appUserId’s have an entitlement from a single purchase?
Im extremely stuck on submitting my app to the app store.I tried to submit my app to the app store - but it got rejected based on the paywall screen erroring.Im using a custom screen. I have a few questions.Do I have to submit the app and the subscriptions together?Surely this leads to a catch 22 - where the paywall screen will not ever serve the subscriptions since they are still in review…Ive been waiting for my subscriptions to get reviewed now for like 4 days - I’m wondering if i need to submit the whole APP again for review - to get them to review the whole app again and therefore review the subscriptions (?).If I use my prod revenue cat key - i get a similar error appearing…@app/mobile:dev: WARN [RevenueCat] ⚠️ RevenueCat SDK is configured correctly, but contains some issues you might want to address@app/mobile:dev: @app/mobile:dev: Warnings:@app/mobile:dev: • Your products are configured in RevenueCat but aren't approved in App Store Connect yet. This prevents users from mak
Is it possible to log in users anonymously?Currently we are facing an issue. We user Firebase in our apps and in order to send notifications we need to store push tokens in our database. So, we sign in users anonymously to Firebase, and then we can store this info under their user ID.The problem arises when we then call Revenuecat’s login function. We do this so that if a user contact’s us we can match them between Firebase ID abd Revenuecat.However, the problem arises in that now Revenuecat treats the user as signed in. So, same user trying to access the app on two devices will not be able to do so, as the purchase is constantly transferred from one user to the other.Hence a question - is there a way to provide anonymous alias? So that we can search users by their firebase id, but tell Revenuecat “this one is not signed in, so apply anonymous behavior to purchases transfers”.Alternatively, this could be sorted by allowing us to search customer by their user properties. We could set “F
I’ve seen these two threads: and And the blog post announcing the availability of paywall support for (non-flutter) web sdk here: https://www.revenuecat.com/blog/company/paywalls-on-the-web/ It would be very helpful to know if you have specific plans to add paywalls for web to the flutter SDK, and if so what the timeline might look like, so I can figure out whether I need to roll my own ahead of time or wait for a supported version.
In my flutter app on Android, paywall is not showing for one user, with endless loading. I have not received any other reports on this problem. The user is detected as from Russia, which might be an issue, but Google seems to support that for subscriptions, at least there is a price. I don’t see any exceptions (there is an analytics event supposed to be thrown if revenue cat paywall fails), so I guess it is just freezing forever SDK version 9.8.0video:https://drive.google.com/file/d/1v5rkR5kP6tsm22T4iCYIN3SbAdHzpScA/view?usp=sharing
We want to use the remote paywalls in our app and as there is no problem with iOS we encountered layout issues on bigger screens (e.g. iPad).Is there a way to define a safe area for the paywall? We’re not presenting it as a sheet since we need to embed in the parent view that swaps the views based on the state.If it’s not possible to have a safe area defined the only way of doing so is to change the sizes to fit and set paddings so that the view is hugging the actual size?What we’d like to achieve looks something like this what was mentioned in this post:
the new unity paywalls is nice, but my game is locked in landscape mode (very common in Unity games).The RevenueCat paywalls pop up in portrait mode. It’s very weird, and feels unnatural.Is there any hack to fix this? can I modify the open source code to fix this for myself somehow, if you can give me some ideas?Right now, Unity paywalls isnt usable because of this, and I think its very common problem since many games lock to landscape mode
Hi everyone,we are using RevenueCat’s new paywall UI feature in Unity on iOS. To present different paywalls under different conditions, we take use of the custom attribute system and the targeting feature. This works well except a once triggered paywall only changes after restarting the app. In other words, there is always the same paywall presented (using PaywallsPresenter.Present) even when the conditions for the targeting rules changes. A change is only applied after restarting the app. So it is impossible to show one paywall and then show a different paywall (i.e. with reduced prices) afterwards in one session. Again, this only works if we completely close and restart the app in between.Is there a way to manually refresh the paywall? Or can I somehow invalidate the cache?Thanks in advance!
Hi!I'm trying to verify if a user has subscribed in the past in order to decide which button to show for a purchase. However, after a reinstallation, it seems that RevenueCat resets the user’s status. I have also tried checking if the entitlements are empty — they always are — so I end up showing the “Start Trial” button even when I shouldn’t. Google Play does not show the trial period because, for this user, it was already used. I’m currently in the internal testing phase. I’m using the latest version of the SDK.Here is the relevant code snippet: fun getButtonText(pkg: Package?, customerInfo: CustomerInfo?): String { if (pkg == null || customerInfo == null) return "Continue" val hasIntroOffer = pkg.product.subscriptionOptions?.any { it.freePhase != null } == true val hasNeverSubscribed = customerInfo.allPurchasedProductIds.contains(pkg.product.id).not() if (hasIntroOffer && hasNeverSubscribed) { return when (pkg.packageType) { PackageType.ANNUAL -
Hello RevenueCat Support Team,We are integrating RevenueCat Web SDK (@revenuecat/purchases-js) with Stripe Checkout for our web subscription flow.We are passing customerEmail during purchase, like this: await Purchases.configure(WEB_BILLING_PUBLIC_API_KEY, appUserId); await Purchases.getSharedInstance().purchase({ rcPackage: selectedPackage, customerEmail: subscriptionData?.email, }); Expected behavior: Email field should be hidden or pre-filled for all users (since we already pass customerEmail). Current behavior: For most users, the email field is hidden / pre-filled, which is correct. For some users (e.g., kavita@flunzy.ai, kruti@flunzy.ai), the email field still appears on the subscription screen. We understand that Stripe Checkout controls whether the email field is displayed in some cases, such as existing customer state or session differences.Questions / Request: Can you confirm whether this behavior is expected and controlled by Stripe Checkout? Is there any supported way t
Hey, i wanted to implement purchases_flutter (latest version - 9.10.3) for my macos flutter (3.32.8) app. I got the following error:- PurchasesHybridCommon/PurchasesHybridCommon.framework/Headers/PurchasesHybridCommon-Swift.h:286:9: error: Module 'RevenueCat' not found (in target 'purchases_flutter' from project 'Pods')- /.pub-cache/hosted/pub.dev/purchases_flutter-9.10.3/macos/purchases_flutter/Sources/purchases_flutter/PurchasesFlutterPlugin.m:5:9: error: Could not build module 'PurchasesHybridCommon' (in target 'purchases_flutter' from project 'Pods')I was not able to solve the problem and decided to use a native implementation until it’s fixed. Is this issue known ? Cant find anything about. Best regards
Hi, We're using RevenueCat Web Billing and noticed that the managementURL from the SDK/API returns a URL like: https://api.revenuecat.com/rcbilling/v1/customerportal/{tx_id}/portal This redirects to a page that asks users to check their email for the management link. The email then contains a tokenized URL like: https://billing.revenuecat.com/{app_id}/{sub_id}?token=xxx This adds an extra step for users. Is there any way to get the tokenized URL directly via SDK or REST API (v1/v2) so users can access the customer portal immediately? Thanks!
I current offer subscriptions through the App Store, Google Play, RC Web Billing, and Stripe directly.I’m investigating implementing the Customer Center and see that it fully supports managing App Store & Play Store subscriptions and promo offers for win backs but it’s not clear to me if it supports management of subs from RC Web Billing and Stripe.My specific questions are:If a customer has a RC Web Billing sub: Can they cancel/manage it from the Customer Center? Do they still have to re-auth from the email magic link? Can I configure win back promo offers? If a customer has a subscription through Stripe directly, can they manage it from the Customer Center, ideally by linking to the Stripe Customer Portal? I’m fine without promo offers on Stripe but it is important that my existing Stripe subscribers can continue to manage their subscription directly from my app, via the RC Customer Center.Thanks!
Hi everyone,I recently changed my setup in the google play store so that both my basic and pro plan are part of the same subscription so that users can switch easy between them, before i had them as separate subscriptions. Now they are part of the same subscription as 2 different base plans.This solved the issue of being able to purchase a new plan and keep the old one, now when you upgrade/downgrade you only keep your new plan.However, im noticing that allPurchaseDates in customerInfo on react native now returns only the latest purchased product, even if i switch 3-4 times it always just keeps the last one. Is this expected? On ios seems to be fine, ie i get all made purchases. I primarily use this for my free trial eligibility, so if theres a better way to determine this that might help too.
Hello, I’m currently trying to setup a Play Store global discount on my one time purchase using the new “Offers” system.This is talked about in this thread: In your first reply you state “This is currently supported” but in the last one you state “Unfortunately I don’t have an ETA for one-time product offers yet but they are in our roadmap”, although you seem to be only talking about RevenueCat generated paywalls and not custom ones using the standard Purchases.getOfferings.My question is thus: are the new Play Store discounts supported in any way by the RevenueCat SDK? and if not does this mean there is currently no way to provide a global time-gated discount on one store products? (other than manually editing the current price at the expected discount start and putting it back later...) The only thing I found that seems somewhat related to this feature is this undocumented field but the comment clearly state it’s null on Android and I my testing shows it is indeed null... /// Coll
I am setting up two tiers of subscription “Plus” and “Pro” I have followed threads from other posts on the forums such as: iOS its 1 Subscription group, with 2 service levels Android its 2 separate subscriptions RevenueCat its 2 separate entitlementsUsers are successfully able to purchase either tier with thisI am now trying to figure out how best to handle allowing a user to upgrade their entitlement from plus to pro in react-nativeThe issue with presenting the paywall again is that the user sees the same tier they already have (plus), which seems confusing and I wouldn’t want them to re-pay for the same subscriptionIs it possible to re-use the existing paywall I use for upgrading to either plus or pro hiding the plus option conditionally? or do i need to create a second paywall with only pro features displayed?Appreciate any thoughts on how to structure this!
Hello,Currently, the Customer Center only supports plan changes on iOS and doesn't seem to offer this functionality on Android.Is this something that is planned or possible? Since we already have subscription groups configured, could we potentially implement this using pure Flutter code by leveraging the official API?The tool is great, but having to use the Customer Center for iOS while maintaining a separate custom page for Android plan changes is difficult to justify and explain to our end-users.Thank you in advance for your help!
i have integrated RevenueCat Paywall ui in expo using the `react-native-purchases-ui` package. i’m trying to show the managment screen on expo dev client on my ios device after subscribing with test packages.await Purchases.showManageSubscriptions()but getting this error `ℹ️ managementURL is nil, opening Apple's subscription management page LOG aa undefined`i have checked the full setup quite a bit of times but couldn’t find any issue and also couldn’t get the relevant information from the docs as well. may be i’m mistaken, please point me to the correct direction if i missed something on the doc.i have checked with await Purchases.getCustomerInfo()✅ customer is there but customer -> `managementURL` is null. ❌and by default it fallback to apple’s default management screen, which keep loading for few mins and later show connection error, try again.just for more context, i have done these steps correctly.Purchases.configure({ apiKey, appUserID });await Purchases.logIn(userId);
After renewal of my Apple Developer Membership my paywall stopped showing the products. There was an issue with the membership which led to my app being delisted from App Store for a couple of days. After contacting the support and fixing the issue, the paywall stopped working in production.In the logs I see:ERROR: 🍎‼️ 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). More information: https://rev.cat/why-are-offerings-emptyERROR: 😿‼️ 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 could be fetched from App Store Connect (or the StoreKit Configuration file if one is being used). More info
I am experiencing a persistent issue where Purchases.getOfferings() and sometimes getProducts() hangs indefinitely on Android. No error is thrown, and no response is returned, even after waiting for several minutes. This prevents the paywall from being presented. iOS is working as expected. Environment:Framework: React Native / Expo (SDK 54) Build Tool: EAS Build (Development Client) SDKs: react-native-purchases and react-native-purchases-ui (v8.12.0) Platform: Android (Testing on physical device)What I have verified and configured:RevenueCat Dashboard: Google Play credentials show as "Valid credentials" with green checkmarks for Subscriptions, InAppProducts, and Monetization APIs. Account-level permissions (including "View app information and download bulk reports") have been granted in the Google Play Console. The Public API Key in the app matches the one in the dashboard. App Configuration (app.json / Manifest): Declared com.android.vending.BILLING permission. Set launchMode to
I was testing plan upgrade on iOS in sandbox, and there seems to be inconsistent results from revenueCat log and delegate call.I was subscribed to plan_casual then purchasing plan_pro.After successful purchase, I can see in the console log that plan B is purchased “INFO: 😻💰 Purchased product - 'plan_pro'The delegate purchases(_ purchases: Purchases, receivedUpdated customerInfo: CustomerInfo) got called immediately after, however with product identifier plan_casual.After about 1 minute, storekit payment queue got update with the correct product id “Plan_pro”, then in about another 5 seconds, revenueCat delegate got called with product id “plan_pro”.
I’m trying to set up Meta Ads integration. Android works perfectly fine and I get 200 as a response back from Meta. IOS keeps failing and returning a error message. IOS request body is as follows (this fails):{"access_token": "[token here]","data": [{"action_source": "app","app_data": {"advertiser_tracking_enabled": true,"application_tracking_enabled": true,"extinfo": ["a2","","","1.1.5","Version 26.1 (Build 23B86)","","nl-NL,nl;q=0.9","","",0,0,"",0,0,0,""]},"custom_data": {"content_ids": ["scandoc_premium_montly"],"content_type": "product","contents": [{"id": "scandoc_premium_montly","quantity": 1}],"currency": "USD","order_id": "d389bfdf5ea1d930fa5c6ef4fcd9e3ab179a57fa","value": 4.99},"event_id": "d389bfdf5ea1d930fa5c6ef4fcd9e3ab179a57fa","event_name": "Subscribe","event_time": 1766084555,"user_data": {"anon_id": "XZ54193BB4-03AA-439C-83E6-357CD34D8D5E","em": "ccd793a81dd0c1ca94492edb501f3a7717a40a76c093dff515b2f7b36108576e","external_id": "a28b66322fd410eccb57ba8cfc5616ffde208dba32
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.