Discussion and help from anything related to RevenueCat.
Recently active
I am experiencing a layout discrepancy between the RevenueCat Paywall Editor preview and the actual rendering on iOS devices. (I’m using Flutter.) Image 1: Preview from the RevenueCat Paywall Edit Page.Image 2: A screenshot from the iOS Simulator (The same issue occurs on a physical iPhone 14). As shown in the second image, the height of each membership package card is significantly enlarged compared to the preview. And the badge on the last membership package is being cut off.What could be causing this issue specifically on iOS? Image 1 (RevenueCat Paywall Edit Page.)Image2 (A screenshot from the iOS Simulator)=======================================================================Giving a fixed height to the container made it look disproportionately large on iOS. I resolved this by removing the fixed height and using internal padding instead. And The badge issue has been fixed by applying a margin value to the container.
Hey everyone 👋We’ve been experimenting with exit offers and rewrote our paywall presentation flow on iOS. We moved from embedding PaywallView to using presentPaywallIfNeeded.However, we encountered a couple of questions about exit offers during testing. No client-side signal when an exit offer is shownThere’s no local callback or hook in the SwiftUI presenter API that tells us when an exit offer is displayed or which offering is shown.We can see this in RevenueCat debug logs, but we found no way of observing it. Since we track conversions and funnels via Mixpanel, this makes it hard to understand:Whether an exit offer was shown Whether a conversion came from the main paywall or the exit offer Exit offers always show on dismissExit offers appear every time the user dismisses the paywall. Many users open the paywall, quickly close it, and continue using the app.If the exit offer always shows immediately on the first close, it feels like two paywalls back-to-back, defeating the purpose o
I need to get the purchase data with RC_Transaction_ID on server, because I have to process the data and return the state to client before waiting webhook to arrive. I have searched the documentation and all the forums, and it seems like there is no easy way to do it. why? Current v2 api:I can get the purchases on customer, but it returns all purchases, and I have to match the one with transaction id, also if there is too much data, we have to paginate on server! I guess I can get it with two separate calls, but why? slow and will hit the genereous rate limit of 480 requests per minute. So please RC, can you help us?
Hi! I’m currently evaluating the Virtual Currency feature for our iOS+Backend app. At the moment, I’m intentionally not using an authentication system to reduce user friction and churn. Instead, I rely on RevenueCat’s default anonymous app user IDs and Apple’s restore mechanism. This worked well so far for entitlements: when a user deletes and reinstalls the app, RevenueCat correctly restores purchases and migrates entitlements to the new anonymous user ID after a restore. However, I’m struggling to understand how this is supposed to work with virtual currencies. From reading the docs, it seems that virtual currency balances are strictly tied to the RevenueCat app user ID and are not migrated or restored when the user reinstalls the app and a new anonymous ID is generated. My questions are:When RevenueCat checks historical App Store transactions and restores entitlements via Apple’s restore mechanism, is the virtual currency balance expected to be restored automatically as well, or do
Hi there,I am new to using RevenueCat with Capacitor and I'm encountering an issue during initialization. I attempted to configure RevenueCat using Purchases.configure within my application code, but the process returns an error code of -1. Could you please advise on what might be causing this issue and how I can resolve it?Thank you for your assistance!
I'm using custom fonts in my iOS app. They're provided via a Design System Swift Package and registered programmatically using `CTFontManagerRegisterFontsForURL`: private static func registerFonts() { guard let fontURLs = Bundle.module.urls(forResourcesWithExtension: "ttf", subdirectory: nil) else { return } for url in fontURLs { var error: Unmanaged<CFError>? let success = CTFontManagerRegisterFontsForURL( url as CFURL, .process, &error ) // ... error handling }}The fonts are registered at app launch before Revenue Cat Paywall is displayed. However, when the Paywall tries to use these fonts, the SDK appears to not detect that they're already registered and attempts to download them from the Revenue Cat CDN, resulting in this error:GSFont: "NewSpiritTRIAL-Bold" already exists.ERROR: 😿‼️ Error installing font with url: 'https://fonts.pawwalls.com/1356886_2e523ecc_084cd089f3d2e468f0b8.ttf': Font re
Currently I’m reviewing my access flow with API V2. Right now I am using list subscriptions https://www.revenuecat.com/docs/api-v2#tag/Customer/operation/list-subscriptions to capture current_period_starts_at and current_period_ends_at. I use these currently along with gives_access, and status to determine used monthly usage quotas and access. The process seems to work well and line up with what I’m seeing in the docs. However, my issue come in when status = in_grace_period. Its unclear to me how I can determine the access period range if grace period is active. I read about grace_period_expires_date being used for this in the docs and older community posts, but this field doesn’t seem to exist in API V2 (only in the docs for v1).What approach is proper using the V2 API?
Hello! Could I please get some guidance on a code change for my app to address a crash that appears to be tied to some code from a RevenueCat sample project? I have a shortcut that launches my iOS app and then navigates to a View. I realized that there is a crash scenario. If I initially run the shortcut from the Shortcuts app when the app wasn’t running it correctly launches the app and navigates to the View. However, if I then go back to the Shortcuts app and run the shortcut again the system correctly switches to the app but then the app crashes. To investigate I ran the app in debug mode and was quite surprised to see where it was crashing. It was inside of my tip jar, which I haven’t changed the core logic for since I first developed my app in 2023. I used the Magic Weather SwiftUI sample project as a basis for the consumable, in-app purchases in my tip jar. Here’s the code that was causing the issue:// from RC Magic Weather exampleextension NSError: LocalizedError { public var e
Looking into the REST API v1 and v2 and what the web sdk does, I’ve noticed that https://api.revenuecat.com/rcbilling/v1/subscribers/<user_id>/products?id=<product_id> is kind of what we need. Is it safe to use? I don’t see any documentation around.Thanks!
I’m testing our RC paywall on my phone on a test version of the app (iOS).We have an in-app purchase set up in RC and linked to the paywall (not a subscription purchase).When I tap the buy button, a page appears saying “Redeem Special Offer” with a box to enter a code. There is no special offer and I don’t want this page here. How do I edit the paywall so that it doesn’t show?
We use AppsFlyer for attribution and RevenueCat for subscriptions. I am referring to this article: We currently call Purchases.collectDeviceIdentifiers(); again after the user has given ATT consent.What is not clear to me though: Do we have to collect IDFA consent before signup and before showing the paywall / any purchase happening? Or does that not matter?Thanks
I have cross checked the bundleid and isuserId with app store connect and also re-upload multiple time but i am getting same validation issue
how can we dynamically set the value of free trial duration in our paywall , like i have a 7 day free trial introductory offer in appstore connect , and in revenuecat paywall introductory offer , i show Start your 7-day free trial , now I want to switch to 3-day free trial in appstore connect so how can I set it dynamically in revenuecat paywall so as not to misrepresentation of free trail duration and face appstore rejection
Hi can I get access to the beta for paywall analytics?
I get the error 'SubscriptionPeriod' is ambiguous for type lookup in this context. during a ReactNative iOS build in DraftBit since version 9.7 of react-native-purchases. I reverted to 9.6.15 and the error disappeared. The error appeared in this line:static func rc_normalized(subscriptionPeriod: SubscriptionPeriod) -> StringIs there something I can do to fix this?
I’ve been getting warnings about an old unused offering which does not let me delete.How can I get rid of these warnings?The sometimes hang the simulator / emulator tests ( not on real device ).I can not seem to delete this offering even though they are deleted from the app store.If I can delete it from the app store, revenuecat should let me delete it as well. Am I wrong?What am I missing?
I understand RevenueCat doesn’t support Windows and Linux for Flutter for now. I’m new to RevenueCat, so I want to know whether there are any workarounds to allow users pay when they are using Windows or Linux. For example, directing to web? If it’s possible, how?
Good Evening, I have been working with Revenue cat’s flutter SDK, this is my code: var configuration = PurchasesConfiguration('goog_**********');configuration.entitlementVerificationMode = EntitlementVerificationMode.informational;await Purchases.configure(configuration); After configuring the SDK, I think it fetches the products automatically which I don’t want. I have only one product (infinity) which is a non-consumable product. However what I see in logs:I/[Purchases] - INFO( 3470): ℹ️ Missing productDetails: UnfetchedProduct{productId='infinity', productType='subs', statusCode=3}I/[Purchases] - INFO( 3470): ℹ️ Product not found: infinity - Product Type: subs, Reason: PRODUCT_NOT_FOUND, Serialized doc ID: I dont have any subscription product, yet it fetches a subs type product and could not find it.What is the solution for this error? Or am I making some mistakes.
Hello,We’re planning to compare the transaction data from our service with RevenueCat’s transaction data in order to identify: missing orders mismatched subscription renewal status discrepancies in refund status Our plan is to run this as a batch job once a day during off-peak hours.From what I’ve seen, Scheduled Data Exports seems to be the most suitable RevenueCat feature for this purpose.Do you think this is the right choice? If there's a better alternative, I’d really appreciate your input.
Events are arriving in Meta Events Manager, but Eligibility results Subscribe and Start trial (App Promotion) as Integration = Conversions API and Ineligible (“Not enough signals from last 30 days”)If I set app-level integration to SDK, eligibility flips everything to SDK. And it WORKS. How should Subscribe/StartTrial be configured with RevenueCat so they’re eligible for App Promotion optimization (while avoiding mixed-integration issues / double counting)?ATT is enabled. The events are arriving fine and only from Conversions API. The App level for receiving events is switched to Conversions API. Almost the same issue as referenced here (around 7th minute): Same issue as discussed here: https://youtu.be/goI-oAn8KYU
What is the recommended way to set up separate Terms and Conditions links for App Store and Google Play Store? I couldn’t find a way in either the component API or the Paywall editor to make it dynamic. Should I set up separate offerings and paywalls for both platforms or is there an easier way?
Hi there ! Our app "STRAP - BJJ" (Flutter) is experiencing an issue on iOS where the list of products returned by RevenueCat is empty ! We've been using the same products for more than a year now and never experienced this outage, it appeared yesterday (Friday 23. January).People were able to successfully purchase them for more than a year until now … ! Our products seems to be well configured on RevenueCat and on the App Store Connect (status "verified") and no warning on the Apple Developer Portal ... When I try to get the list of Offerings using the Flutter SDK, I get the error: ```flutter: PlatformException(23, 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 information: https://rev.cat/why-are-offerings-empty, {code: 23, message: There is
I just got rejected because I have 2 yearly IAP where only one is shown in the paywall. The reviewer complained he cant find the second one. I kept it for AB tests later.How to deal with this? Telling this to Apple straight?
Hi RevenueCat Team,We’re looking for guidance on implementing the following offers using RevenueCat:25% discount for all new users (triggered from any event/source)Extra 3 months free on the annual plan for Dreamforce attendeesLifetime access at $149 for AppSumo customers (one-time purchase)Could you please advise:The recommended RevenueCat approach for each (intro offers, promo offers, custom entitlements, non-consumables, etc.)How to limit these offers to specific audiences/eventsAny Apple/Google constraints we should be aware of
Hello,I’m having an issue with Android purchases in my app and would appreciate guidance.Current status: Subscriptions are fully configured in RevenueCat and Google Play. Offerings are fetched successfully on both platforms. Purchases work correctly on: iOS production Test environments both on ios/android On Android production, the app successfully retrieves offerings and packages, but attempting to purchase always fails with: “subscription plan not available”What I have already confirmed: Android app is installed directly from Google Play (closed testing track). Tester Google account is properly added and opted into the test track. Correct Android public SDK key is used. Products are published in Google Play: noor_monthly_premium noor_annual_premium These products appear correctly in RevenueCat Android products and offerings. Offerings are returned correctly from Purchases.getOfferings() on Android. The same code path works on iOS without any issue
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.