Discussion and help from anything related to RevenueCat.
Recently active
Project: c3502b62 App: PartagePourboire (Stripe Live), app03dec2277b Stripe account: acct_1UJV0pDP4Gr8JUhn (Live, card_payments active, no pending requirements) Flutter web (purchases_flutter 9.16.1) configures fine with the app's public key and the paywall shows my two Live products (monthly price_1UKe7HDP4Gr8JUhns0Ln15Hk, yearly price_1UKe7HDP4Gr8JUhnnvLDX2vY), both Published. When starting a purchase, POST https://api.revenuecat.com/rcbilling/v1/checkout/start returns 422: {"code": 8142, "message": "Stripe account setup error: Stripe rejected the checkout session configuration."} Stripe Managed Payments is not enabled. Stripe Business details, public details, Checkout settings and Tax settings show no warnings. No POST /v1/checkout/sessions appears in my Stripe logs. What does error 8142 mean here, and which Stripe setting is being rejected?
Hello, Flutter web, purchases_flutter 9.16.1, RevenueCat Billing. The browser language is French (navigator.language) and the checkout page is displayed in French, but all customer emails (subscription confirmation and the "Manage your subscription" portal email) are in English. Docs say lifecycle email bodies use the locale selected for the purchase. Is the portal email localized at all? Is there a dashboard setting for email language?
Hello. I’m really upset today because I found out that my friend received a link to get a free T-shirt. Meanwhile, I am proud and loyal to RevenueCats and I never received that T-shirt. And as you know, life is tough. And it’s true that wearing that soft cotton against my skin would do me a world of good and keep me nice and warm (and increase conv.). I hope my message in a bottle finds a kind soul and that I can finally wear the T-shirt I deserve.Have a good day
Small iOS app, live for about a month. Annual plan with a 3-day free trial. 22 of the last 29 trial charges failed and went into billing retry. I've already added a grace period, but it still feels really off and it's killing our revenue. Anyone know what actually helps?
It would be useful to expose the existing Customer Center Contact Support UI as a standalone flow, for example:RevenueCatUI.presentContactSupport()We already use the Contact Support functionality configured through Customer Center, including RevenueCat's support form and embedded metadata.However, our app has its own Support entry point, and we would like to open the RevenueCat Contact Support form directly without first presenting the entire Customer Center.Ideally, this would use the same Contact Support configuration, metadata, and ticket flow as the existing Customer Center implementation, just exposed as a standalone UI flow.Since RevenueCatUI already uses an internal support ticket flow, it seems that most of the underlying functionality is already in place. Because of that, exposing the existing Contact Support UI as a standalone entry point may be relatively small in scope, while making it much easier to integrate into custom app settings and support screens.
Hey, I have a multistep paywall it’s works fine but in moment I add “Single Choice” component button on the second step it’s just stop working- If I try to preview it in RC app then just continue button on step 1 do nothing (it worked just before I added single choice)- If I open it inside my flutter(ios) app I see the error instead of paywall (Backend Error 8) and following logs:Error: Swift.DecodingError.dataCorrupted(Swift.DecodingError.Context(codingPath: [CodingKeys(stringValue: "screens", intValue: nil), _CodingKey(stringValue: "pw41e8848e277347b6", intValue: nil), CodingKeys(stringValue: "componentsConfig", intValue: nil), CodingKeys(stringValue: "base", intValue: nil), CodingKeys(stringValue: "stack", intValue: nil), CodingKeys(stringValue: "components", intValue: nil), _CodingKey(stringValue: "Index 2", intValue: 2)], debugDescription: "Failed to decode unknown type \"input_single_choice\" without a fallback.", underlyingError: nil)) Rc app is up to date from appstore and flut
Hey I have my app in Revenant and most things are done right on my end, but I haven't gotten any email or updates on how to get access to perks like Mobbin and few other things that are gated by "need to have app added to Revenuecat", What am I doing wrong or how do I get access to the perks?
Google released new version of Next Gen AdMob SDK. Does RevenueCat support that?
My brother in christ this is a simple client side conversion. I’m fairly confident fable 5 could 1 shot this feature. Just get it done
Hi,I added a one-time lifetime purchase to my app using RevenueCat. Technically, this is a non-consumable in-app purchase. The app is not currently available on the app stores; I am testing it through internal testing (Play Store) and TestFlight (App Store), and I plan to release it once everything is complete.Users who purchase lifetime access will receive certain benefits, such as an ad-free experience.However, I am experiencing the following issue on iOS:The user installs the app. The user purchases lifetime access. The user deletes the app. The user reinstalls it through TestFlight. The user taps the Restore Purchases button on the purchase screen.After tapping the button, it enters a loading state, but nothing happens afterward. There is no response or confirmation.However, if the user taps the purchase button again, iOS displays the following message:“You’ve already purchased this. It has been restored for free.”I am not sure whether the same issue occurs on Android because the p
RevenueCat is showing wrong paywalls in my app at seemingly random. Fresh install, etc does not help. When testing with the RevenueCat app itself this happens as well.I have only 1 paywall. Only light mode. I do not have any running experiments. iOS only app.
Hi there,I am trying to consolidate all my mcps into cloudflare MCP portal however when I use the oauth flow it fails with revenue cat. The secondary method is to use an api key but for the life of me I cannot find how to get an acount level api key, i can only make project level api keys.
Hi all,I'm hoping someone, ideally from the RevenueCat team, can help me work out where this is breaking. Every paid conversion on our Android app has failed for three weeks, and Google Play support hasn't been able to explain it.SetupFlutter app, purchases_flutter 10.0.2, default configuration (RevenueCat completes and acknowledges purchases), Google Play Billing via RevenueCat Two base plans (monthly and annual), both with a 7-day free trial Grace periods and account hold enabled; base plans active in all markets with regional pricing Service account credentials valid and RTDN flowing (events arrive in RevenueCat as expected)What's happeningOnly one trial conversion has ever succeeded, on 28 August. All 13 since then have failed. Trial starts process normally at zero. Seven days later the renewal order appears in Play Console as Pending, then goes to Canceled with the total zeroed. None show as Declined.In RevenueCat, a typical chain is: trial started → subscription extended (24h pay
I’m using a custom font with 3 weights (450, 500 & 550). I’m using these in my paywalls, and they display properly in the Paywall Editor and in my iOS and Android app. On the web, (@revenuecat/purchases-js 1.39.1) it’s not as great. The 500 font doesn’t really show up different than the 450. Font-weight is good if I inspect it but visually it’s not right.Wondering if it could be related to that specific font, or it’s a web SDK issue?Thank you.
Hi RevenueCat team,I'm participating in Shipaton 2026 in the non-Next Gen category. My app (TRDS — Educational Virtual Trading Simulator) is not yet published on any app store. I noticed the Devpost submission form does not have a field for a store URL.My questions:1. Is a published app store link required for non-Next Gen submissions? 2. If required, where should I submit it since the form doesn't ask for it? 3. If the app is not yet published, will my submission be disqualified? ~Thank you.
The context:This was a question previously asked which RevCat never officially answered. I came across this problem myself and solved it, wanted to share the answer, but RevCat also prevented anyone from replying in that thread so I’m sharing it here in the hopes that it might help someone in the future.The Problem:So the problem is that Revenue Cat tells you to get Dataset ID and Conversion API Token. You go to Meta Events Manager as instructed. If you had previously set up your app with meta, you’ll see your app listed in Datasets. You click on that, yet there is no Dataset ID (just the meta app id) and no option to create a conversion API token in settings.The Solution:The instructions are missing a step.Go to the automatically created “Dataset” for your app Go to Settings Find the button that says something like “Link data”. Click it. (It might have been connect to dataset or something like that- can’t recall exactly, and can’t go back to double check) It tells you to choose betwee
Hey RC Team, I use your charts mulitple times a day to track the progress of my business.One thing that would be a massive help to me would be to have a chart that looks at auto-renew status and gives the expected churn over the coming days. I think 30 days would be fine for my use case. I have created a number of custom charts and customer segments to track this to get a decent look at it but if there was a chart it would be super easy. It could even have the New MRR forecast as well as the auto-renew status of outstanding trials if you wanted to match the MRR Movement chart design but tbh that would be less important for us as we have a relatively good handle on forecasts for the new MRR.Happy to share screenshots and snippets if you guys wanted to take the idea forward. Best,Tom
Using purchases_ui_flutter with Paywalls V2 configured with a Google Font (e.g. Newsreader). On a fresh install, the first time RevenueCatUI.presentPaywall() opens, the paywall renders using the default system fallback font. The native UI does not recompose once the font download finishes in the background. If the user closes and reopens the paywall, the correct font displays immediately because the font file is now cached locally. How can we trigger or guarantee font preloading on the first render?
Hello,We're using a commercial font called "Campton" in our RevenueCat paywall. We're occasionally seeing characters in certain languages render incorrectly (please see the attached screenshot).One thing we found odd is that if we change the device's system language to that language and reopen the paywall, the characters that were previously broken now display correctly.For example, with the device language set to Korean, some characters were broken when viewing the Vietnamese paywall. After changing the device language to Vietnamese, those same characters rendered properly.Because of this, we'd like to understand how fonts are applied to paywalls. For instance, when the configured font doesn't support certain characters, is there any fallback logic — such as falling back to the system font?Thanks in advance for your help.
Hi, just wanted to give a heads up that I’ve started to see a read-after-write gap between webhook emission and /v1/subscribers, dating to ~Sept 1 14:30 UTC. My server responds to all webhook events by requesting and updating entitlements from /v1/subscribers (as recommended), and after every INITIAL_PURCHASE event I’ve received since then (all from Google Play purchases), the response has had unexpectedly empty entitlements. No code changes on my end and I’ve not seen similar issues previously.I’ve updated my server to be resilient to this issue, and I’ve also filed a ticket through support with more detailed info on my specific case, but wanted to post this here for a higher chance of visibility as I doubt I’m the only customer seeing this.
On android, in a .aab internal testing build, sometimes the paywall will show and sometimes it won’t. When it doesn’t show, just the loading skeletons display indefinitely. At other times the paywall will show. Restarting the app doesn’t help, and reinstalling doesn’t either. Then at other times the paywall will work perfectly. Another app (installed through the Play store) on my phone that uses revenuecat seems to be out at the same times, and working at the same times.
I’m currently writing an API endpoint for use by an Android app, to interface with the “Restore a Google Play purchase by order ID” REST API endpoint. This is due to well-known “consumed purchase” misconfiguration issue. It’s hard to test it due to the nature of the issue, and therefore I have a few questions.If the restoration succeeds (i.e. the response code is 200), can I immediately query the customer info (using the app SDK) and expect the entitlement that wasn’t present before to now be immediately present, or does it take time? I will disable caching for the request. If the customer entered an invalid order_id (the GPA… value) what response code should I expect from the API? I’m seeing 404, is that correct? What safeguards are there for customers restoring to multiple devices, for example if their order_id became public? Once an order is restored can it be restored to other users? How much protection should I build into my API? Are there any other potential vectors for abuse I s
We use the RevenueCat Purchases SDK for Kotlin, version 9.28.1, on our Android app.In our use case, we want to set or update the user’s e-mail attribute on their RevenueCat profile as part of their logging in to our app. The e-mail is a piece of data that does help during customer support, so we want it to be stored reliably on RevenueCat.We are aware that user attributes are not immediately synced to the RC backend for calls like setEmail(), and that attribute syncing actually happens implicitly as part of other, more significant, events (or with an explicit syncAttributesAndOfferingsIfNeeded() call.) With this in mind, we do these two calls, one right after the other:Purchases.sharedInstance.setEmail(...)Purchases.sharedInstance.logIn(...)We have browsed the SDK source code and it does look like logIn() is one of the calls for which attribute synchronization happens under the covers on the Kotlin SDK (even though that is not mentioned in the documentation), which might mean that we d
Hi everyone,I'm running into the known Billing Library 8 limitation around consumed one-time products, and want to confirm the recommended path forward, plus flag one detail that seems inconsistent.Setup:Flutter app, no login system (anonymous app_user_ids) purchases_flutter 10.11.0 / purchases-android (via hybrid common) Product sfl_pro is a non-consumable one-time product (not a subscription), correctly configured as non-consumable in the RevenueCat dashboard Transfer Purchases setting is enabled correctly Testing via Open Testing track with a licensed tester account (sandbox/test purchases, not production charges)Issue:User purchases sfl_pro on Device A → works, entitlement active. On Device B (same Google account, same license tester, confirmed identical "preferred billing account" identifier in logcat), restorePurchases() returns successfully but with an empty result: activeEntitlements: [], nonSubscriptionTransactions: [],However, if the user tries to purchase sfl_pro again f
I'd like to request support for Airwallex as a payment gateway / billing provider for RevenueCat's Web Billing (alongside Stripe and Paddle).Why this matters:Airwallex is widely used in Vietnam and across Southeast Asia, where Stripe availability and local payment method coverage are limited. It offers strong support for local payment methods and multi-currency settlement that are important for our market. Currently, needing Stripe or Paddle is a blocker for teams like ours who already run our web payments through Airwallex.Use case:We sell web subscriptions and want to use RevenueCat's paywalls, customer portal, and cross-platform entitlements — but process payments through our existing Airwallex account.Impact:This would let developers in underserved regions adopt RevenueCat Web Billing without switching payment processors.Thanks for considering!
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.