Discussion and help from anything related to RevenueCat.
Recently active
I can’t find any hints in the documentation about how to achieve a successful fullscreen paywall with the purchases-js sdk. In particular, I run into issues withfullscreen / inset issue on iOS safari keyboard avoidance issues on iOS safari height/spacing differing between paywall editor and iOS safariIs there any real world example of a website actually showing a RC paywall on web??
My App Store auto-renewable subscriptions are fully configured in App Store Connect (a monthly and a yearly), and RevenueCat *sandbox environment* clearly has them. The dashboard shows the correct products and "Billing Plan: Upfront" on the yearly. But calling GET /v2/projects/{project_id}/products returns both products with a null subscription block:"store_identifier": "com.myapp.yearly","state": "active","type": "subscription","subscription": { "duration": null, "grace_period_duration": null, "trial_duration": null }Everything else is correct, only subscription fields are null.What I've already confirmed (so this isn't a setup mistake):- App Store Connect API key and In-App Purchase key are connected and show Valid Credentials.- Both subscriptions are Ready to Submit in App Store Connect with their durations set (1 month / 1 year).- I've re-imported the products in RevenueCat.- No purchase has ever been made against these product IDs.I found an older thread suggesting duration only p
Hi RevenueCat team,We’re currently using RevenueCat Paywalls in a Kotlin Multiplatform app and noticed that automatic Exit Offer paywalls are still not supported in the KMP presentation layer.Do you have any updates on whether Exit Offer support for KMP is on the roadmap and whether there is an estimated timeline?Replacing the entire integration with separate native implementations would likely add significant complexity without necessarily solving the problem cleanly, especially on iOS. Your answer would help us evaluate which path to take.In the meantime, we’re considering two options: Implementing a custom exit-offer flow in KMP by intercepting the initial paywall dismissal and displaying a separate RevenueCat Offering. Accessing the native RevenueCat Paywall presentation APIs from the platform-specific KMP source sets while keeping the existing shared purchase configuration. Any guidance or examples would be appreciated.P.S. pls also add KMP tag 🙏
Our Paywalls V2 paywall uses three icon components (checkmark, X, and lock). On every paywall render, the SDK tries to download them and gets HTTP 403 — for essentially every user, on every app version. The paywall itself works (icons presumably fall back / don't render), but each render produces 3 failed requests, which floods our error monitoring (New Relic records them as MobileRequestError — we see ~1,150/week).Environment- react-native-purchases / react-native-purchases-ui 10.4.1 (issue was also present on older versions)- Expo SDK 56, Android (okhttp/4.12.0 does the fetch, so this is the native Android paywall engine)- Paywalls V2, icons selected in the dashboard paywall editorFailing URLshttps://icons.pawwalls.com/lock-code.webphttps://icons.pawwalls.com/x.webphttps://icons.pawwalls.com/check.webpReproduction — fails from anywhere, not just devices:curl -i 'https://icons.pawwalls.com/check.webp' -H 'user-agent: okhttp/4.12.0'Response:HTTP/2 403content-type: application/xmlserver
It’s possible to change the language of the paywall? The user can select an specific language so its strange the the entire app is one one language and the paywall in another, I saw that there’s iOS and Android implementations for this but I have not seen a implementation in Unity, have this been implemented yet? Or it’s currently not possible in Unity?
The Atom feed available from https://www.revenuecat.com/changelog has broken links. For example, the latest Changelog entry shows up in the feed like so:<entry> <title>Better lifecycle emails for web billing failures</title> <link href="https://www.revenuecat.com/changelog/better-lifecycle-emails-for-web-billing-failures-2026-07-02" /> <id>https://www.revenuecat.com/changelog/better-lifecycle-emails-for-web-billing-failures-2026-07-02</id> <updated>2026-07-02T00:00:00.000Z</updated> <published>2026-07-02T00:00:00.000Z</published> <summary type="html">RevenueCat Billing now sends three distinct lifecycle emails to handle payment failures. This replaces the single generic billing issue email that went out regardless of the subscriber's actual access...</summary> <content type="html"> <![CDATA[ RevenueCat Billing now sends three distinct lifecycle emails to handle payment failures. This replace
I use AI editor primarly for paywalls, and i already had this active paywall which contained monthly and yearly plan for individual plan type and i added new packages in the offering for family plan type which are also monthly and yearly but the AI editor can’t see them no matter i do.
Google Play recently sent an email announcing the new Review Refund API:“We are excited to share that the Review Refund API is now available to help you take an active role in managing chargebacks. This optional API enables you to share key transaction information with Play — such as item usage.”Does RevenueCat have plans to support integration with this API? If so, is there a timeline for when this functionality will be available?
This is a feature request for Rico.When a user starts a new chat, they often have to repeat the same app details, such as: What the app does Whether it is premium / subscription / freemium / hard paywall When it launched Basic business info like user acquisition cost It would be helpful to have a place to save this as a system instruction or project context for Rico.Rico could then use this saved context in every new chat for that project, so users do not need to repeat it and the answers can be more accurate.
Hi,This is with reference to a post i read: My app is not published on play store yet. I wanted to create subscription, and wanted my testflight users to be able to test them. I created 2 subscriptions under subscriptions and they are in the state “ready to submit”. Attaching image for the same below. my business profile is in all active state. I am unable to figure out why my subscription duration is not coming our currently. i am getting them as null. I have properly configured products → mostly importing from appstore, entitlements, and default offering. i have been stuck on this for 2 days. Can you please suggest what am i missing here?
I’m testing subscriptions with RevenueCat. I want to simulate a user canceling their subscription and verify that RevenueCat updates the entitlement correctly. I’m using TestFlight. I can’t find the subscription under Settings → Subscriptions or the Sandbox account settings to cancel it manually.Is there currently a supported way to cancel a sandbox subscription, or is waiting for it to expire the only option
Hello,I have a problem with the Retention Message API. The default message is not displayed to users when they try to cancel their subscription in the device's Settings app.The request to use this API was approved by Apple for our account. After configuring it for the Sandbox environment, everything worked as expected the image and text were displayed to users.Later, I applied the same configuration to the Production environment. I received the Approved status for the message, but after purchasing the subscription from the App Store, although I can see the subscription in Settings, the retention message is not displayed when I attempt to cancel it.I have tried different Apple accounts from different regions (both EU and non-EU) and tested from physical locations without using a VPN.Also, for clarification, we do not use real-time communication only the default retention message. For additional information:I also tried configuring this message from App Store Connect, as shown in WWDC 20
Hi RevenueCat team,We're using the Paywall Builder's Tabs component to present different subscription plans (e.g. PRO and PLUS), where each tab contains its own complete set of content (carousel, package stack, features, etc.).We've noticed that while Paywalls support custom variables and Rules for controlling the visibility of many individual components, there currently doesn't appear to be a way to show or hide an individual tab within the Tabs component. The only available actions are rename, duplicate, copy, and delete. We would like to show only a single tab’s content depending on mobile app’s clicked features i.e. some should show both Plus and Pro plans, others only Pro. We would like to be able to show only Plus tab or preferably hide a single tab completely.Requested featureIt would be very helpful if individual tabs supported runtime visibility, for example via:Paywall RulesCustom VariablesSDK parametersExamples:showProTab = trueshowPlusTab = falseor{ "show_pro_tab": false,
I'm calling Purchases.shared.getCustomerInfo from my intro screen / AppDelegate on a fresh install to check if the user is premium before routing them to the correct screen. On fresh install, this call takes approximately 6 seconds to return. However, if I call getCustomerInfo again a few seconds later, it returns in under 1 second.Because of this delay, I can't reliably validate whether the user is premium at the point my intro screen needs to make a routing decision.Setup:SDK version: 5.80.0 Platform: Swift, UIKit Call site: intro screen / AppDelegate, on first launch after installQuestions:Why is the first getCustomerInfo call so much slower than subsequent calls on a fresh install? Is this expected behavior (e.g. due to receipt fetch/validation on first call, with caching afterward), or could this indicate a configuration issue on my end? What's the recommended pattern for gating UI on entitlement status during this initial slow fetch — is there a way to speed up the first call, or
Hi, we’re running an experiment and later realized that we’ve set the wrong primary metric. So I tried editing it, but got his message when I clicked “Save Changes”. I didn’t change anything related to variants, but this error keeps showing up. How do I solve this problem? Thank you.
Hi, I’m getting error 23 but there is no specific reason. Already double checked the troubleshooting guide for iOS and no result. Can you please advise?
Hello,After integrating the RevenueCat library into my Android app, the application started crashing on launch.Below is the stack trace:Exception java.lang.RuntimeException: java.lang.reflect.InvocationTargetException at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:576) at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:929)Caused by java.lang.reflect.InvocationTargetException: at java.lang.reflect.Method.invoke at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:566)Caused by com.revenuecat.purchases.PurchasesException: at com.revenuecat.purchases.SimulatedStoreErrorDialogActivity.crashApp (SimulatedStoreErrorDialogActivity.kt:55) at com.revenuecat.purchases.SimulatedStoreErrorDialogActivity.onCreate$lambda$0 (SimulatedStoreErrorDialogActivity.kt) at com.android.internal.app.AlertController$ButtonHandler.handleMessage (AlertController.java:186) at android.os.Handler.dispatchMessageImpl (Hand
Hi, we’ve encountered an issue where nothing shows up in the Experiment report, as attached below, even though (1) it’s been 2 days since we started the experiment, and (2) we do see that new customers are properly assigned to each respective variants and (3) nearly 5K new customers signed up in our app in the past 2 days. So apparently the experiment is running properly and there’s enough data to display, but there’s an issue with the report? Thank you.
Hi!7 months ago you posted here that Paypal will be available as payment method in RevenueCat Web Billing. Do you have an updated timeline for this?
Hi, we both have a Live Targeting and a running Experiment at the same time. So the expected behavior would be the Experiment to override Live Targeting, since we’ve set the audience of both the Experiment and Targeting as all new users. However, we found out that the new users -- who signed up after the Experiment was set live -- are still seeing offerings assigned in Live Targeting. Their history clearly says they’ve been enrolled to the Experiment. (please see the screenshot below) Two findings in case it helps:According to the details, the ‘offering_id’ of a user enrolled in the new Experiment is “null” According to the details, the ‘experiment_id’ starts with “exp”, while all the past experiments’ started with “prexp”. <Things we can confirm>We’ve already run numerous Experiments in the past and this never happened. We just simply duplicated a past Experiment to start the new one. We’ve tried re-installing the app, restarting the Experiment, but the issue still remains. Ther
Hello,When users send me support e-mails, RCID is also included in the e-mail - so that i can check users status. Is there any way to deeplink to check users details in revenucat app? To elaborate, is it possible to use like revenuecat://projects/{id}/customer/{id}.
Inconsistencies in Webhooks documentationThere appear to be several discrepancies between the descriptions in the following two documentation pages:Webhooks > Event Types and Fields Webhooks > Sample EventsThe following JSON fields listed in the "Sample Event" example are missing from the "Event Types and Fields" documentation:Refund Reversed: `event.metadata` Not defined in Subscription Lifecycle Events Fields. Invoice Issued: `event.metadata` Not defined in Subscription Lifecycle Events Fields. Virtual Currency: `event.country_code` Not defined in Virtual Currency Transaction Fields. Experiment Enrollment: `event.experiment_enrolled_at_ms` Not defined in Experiment Enrollment Event Fields. Purchase Redeemed: `event.store`, `event.environment` Not defined in Purchase Redemption Event Fields. Could you please clarify which documentation—whether the Sample Page or the Event Types and Fields section—contains the correct information?
I'm using RevenueCatUI.presentPaywall() (Flutter, purchases_flutter 9.x) to show a hosted paywall. I want to show a "last chance" discounted offering the moment a user cancels — specifically when they open the native StoreKit purchase/confirmation sheet and then close it without buying.What I'm seeing: presentPaywall() only returns a PaywallResult (e.g. cancelled) when the entire paywall is dismissed. When the user closes just the StoreKit sheet, the SDK simply returns them to the paywall and no result/callback is surfaced, so I can't react to that specific event.Question: Currently we have the exit paywall implemented when user closes the paywall,Is there any way to detect the StoreKit sheet dismissal while using the hosted paywall UI? Screenshot attached for refernce.
Hi RevenueCat team,We are seeing what looks like the same offering_id: null experiment issue reported here, but our setup does not use live targeting rules or placements:https://community.revenuecat.com/dashboard-tools-52/why-does-my-experiment-not-override-live-targeting-7732Setup:React Native / Expo app react-native-purchases: 10.3.0 react-native-purchases-ui: 10.3.0 RevenueCat Paywalls via RevenueCatUI.Paywall App fetches Purchases.getOfferings() and renders offerings.current Design experiment Enrollment: New customers Audience: 100% Criteria: Any audience No placements in the experiment No targeting rules imported or active on the experiment Two variant offerings: - Variant A: PW Basic Weekly + Yearly 2 - Variant B: PW Basic Weekly + YearlyObserved:Customer history shows EXPERIMENT_ENROLLMENT experiment_variant is present offering_id is null The customer profile’s Current Offering still shows the default offering, not an experiment override We know from screen recordings that t
Hi team, is it possible to localize the Change Plans screen inside Customer Center on iOS?The main Customer Center screen is localized automatically, but after tapping Change Plans, all of the text and plan details on that page still appear in English. I couldn’t find anywhere to add translations for that screen.Is this currently supported?Thanks!
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.