Discussion and help from anything related to RevenueCat.
Recently active
Hello,I’m testing RevenueCat exit paywalls using the Expo + React Native setup and running into an issue where the exit offer paywall never appears after closing the initial paywall.Environment: react-native: 0.81.5 expo: ~54.0.30 react-native-purchases: ^9.7.5 react-native-purchases-ui: ^9.7.5 Setup details: Using the RevenueCat Paywalls UI Calling presentPaywall() from react-native-purchases-ui Testing in dev environment Using default offering Both: Default paywall Exit offer paywall are created and published Expected behavior: presentPaywall() shows the default paywall User closes it Exit offer paywall should automatically appear Actual behavior: Default paywall shows correctly User closes it Nothing happens — exit offer is never displayed No errors are logged, and the close action completes silently.How I’m presenting the paywall:import { presentPaywall } from "react-native-purchases-ui";await presentPaywall();Questions: Is there any additional confi
Hi,is it possible to defer the enrollment to an experiment to a later point of time?I’m using the React-Native SDK. We set up our first experiment a couple of days ago and had a look at the numbers so far. RC experiment stats tell us there were 860 (A: 430 / B: 430) customers so far getting enrolled to our experiment. Our analytics tool however tracks the paywall visit. There only ~300 users made it till the paywall. After a short chat with AI I found out that RC enrolls the user to an experiment variant once the `getOfferings()` has been called. We do call this function, but only in the component which displays the paywall. In RevenueCat on our customers I can see that the customers get enrolled immediately at the same point of time once they were ”first seen using the app”. We initialise the SDK with `Purchases.configure()` directly after the app starts. Between the initialisation and the `getOfferings()` call we only fetch the customer info using `Purchases.getCustomerInfo()` to che
Hi guys,I’ve integrated RevenueCat several times in Flutter applications, but this time something strange is going on whenever I try to make a purchase on an actual device using the Apple’s sandbox account.I am charged on Apple and my subscription on Apple is active, but RevenueCat returns an error. The customer on the RevenueCat dashboard doesn’t seem to have an active subscription.I also tried changing the sandbox user, deleted the customer from the RevenueCat dashboard and tried again, but the issue still persists.Debug logs for the errorRequest-ID: '5ad15917-8bbc-423e-af57-473db0f0c502'; Amzn-Trace-ID: 'Root=1-69830dfb-54296ef62baba1f255786ed5'flutter: SubscriptionService: Error purchasing package: PlatformException(8, The receipt is not valid., {readableErrorCode: INVALID_RECEIPT, message: The receipt is not valid., underlyingErrorMessage: The receipt is not valid., readable_error_code: INVALID_RECEIPT, userCancelled: false, code: 8}, null)flutter: PaywallController: Unexpected er
I’m having an issue with fetching the one-time products I created. They are already set up in Google Play and have been imported into RevenueCat. The products show a Published status, but when I try to purchase them, it doesn’t work.The app is unable to find the products or offerings for one-time purchases. However, subscriptions are working correctly and all subscription information is fetched as expected. The issue seems to be specific to one-time products.Does anyone encountered this issue? How do you solve this? My configurations are done. App Store / iOS is fine. Only the Android causing the issue.
Hello RC community,I need help understand how Apple vs Google handle signed purchase data. I ran into something that I can't figure out and may be getting wrong. The query:With Apple's StoreKit 2, when you grab `transaction.jwsRepresentation`, you get `signedDate` field that's generated fresh every time you request it(I assume). So if someone intercepts a JWS token, it goes stale in minutes. Good for security.But for Google Play Billing, the signature is created once when the purchase happens. `purchaseTime` is static, there's no equivalent to `signedDate`. The same signature comes back every single time you query it(I assume). What I'm wondering:1. Am I understanding this correctly? Google really doesn't have a freshness mechanism?2. How does RC deal with this for things like: - Detecting stolen/leaked purchase tokens - Account transfers - Replay attacks3. Is this just a known limitation everyone accepts, or is there some workaround I'm missing? Stuff I've already looked at:-
I want to backup configuration as code. With help of rest APIs, I've got JSONs for products, offerings, etc. But I failed doing so for paywalls. https://www.revenuecat.com/docs/api-v2#tag/Paywall/operation/create-paywallIt mentions the endpointPOST https://api.revenuecat.com/v2/projects/{project_id}/paywalls But I find no way to get a paywall. Am I missing something?
Hi, I just want to enable free trial for yearly package and not the other packages. Does this functionality exist right now ? have attached a relevant previous post, just wanted to know there has been any update since the attached posthttps://community.revenuecat.com/general-questions-7/how-to-implement-a-free-trial-for-monthly-only-setup-no-free-trial-for-yearly-7195
I downloaded the subscription key for an in-app purchase from Apple into a file named 'SubscriptionKey_XXXXXXXXXX.p8' However, when I try to upload this file I get this error: “Invalid file name, it should be SubscriptionKey_XXXXXXXXXX.p8. A file name with any other prefix could be a private key for a different Apple service. Please validate you are uploading a Subscription Key.“Can I get some help as to why this is not working? I tried a bunch of different names as well but i get this same message every Time
I’m building a paywall with the builder and I’m testng in on my app, in Google Play Console I’ve set a 7 days free trial for both offers (Annual and Monthly), but I don’t see the “Try for 7 days then 5€ a month” text, I see the basic one (Full access for just {{ product.price_per_period_abbreviated }}). Maybe because I’m using the same account I have already used to test subscriptions? The account is a test account for the app, shouldn’t I always get a fresh paywall lke it was the first time? Basically what I want is simple, if free trial is available show free trial text, otherwise the basic text.Can you explain to me how to setup this the right way?
I also posted this in another category. An employee deleted the project from our RevenueCat account and we think even deleted the account. It is hooked up to manage payment on a React Native app. We cannot access the dashboard to contact support in hopes of getting the account restored.
An employee deleted the project from our RevenueCat account and we think even deleted the account. It is hooked up to manage payment on a React Native app. We cannot access the dashboard to contact support in hopes of getting the account restored.
We have a free App on the stores of Apple and Google and sell via IAP subscriptions to use our service using the RevenueCat paywall. This works well for B2C customers and should remain.But B2B customers want to buy license packages of e.g. 50 licenses and assign those to users within their organization. Therefore we need the ability to sell subscription licenses in bulk.The amount of licenses must be flexible to suit customers of different size.Ideally this can be done through our existing WooCommerce shop where customers would select the license amount from a dropdown. These bundles should then also be unlocked/processed via the paywall in RevenueCat to avoid changing our App and to maintain the B2C offer. I did all the work on the WooCommerce side to sell licenses and was able to pull web orders using n8n and make.com. But I struggle to create entitlements in RC using the REST API. According to latest ruling, this process should be allowed. Can one of you confirm this is doable at al
I am considering whether a unique device ID is suitable as user ID for my use case.I came up with the following subsequent scenarios / concept, can someone confirm or correct my understanding of how RevenueCat works?----------------------------------------------------------------------------------------BaselineThe App uses Device ID as RevenueCat User ID -> identified User.The scenarios take place on iOS.----------------------------------------------------------------------------------------Scenario 1User named Timinstalls App on Device ID 1234ABC with Apple ID tim.cook@apple.com and makes a purchase in the AppResult: Receipt is stored with Apple ID, Purchase associated with Device ID is stored in RevenueCat----------------------------------------------------------------------------------------Scenario 2Then, Timinstalls App on another Device ID 5678DEF with same Apple ID tim.cook@apple.com and launches the App initiallyEffects:App initially calls syncPurchases once Receipt is foun
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
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.