Learn more about RevenueCat and talk about it with the community.
Recently active
First of all, thank you to everyone who reached out to let us know RevenueCat was added to a popular ad block list! Because of your messages, we were able to quickly make sense of some customer support questions and start taking action. So, what’s the situation?The RevenueCat domain was added to a community-shared list of domains that are imported by popular ad blocking tools like AdAway and Pi-hole. This means anyone using these tools is unable to access RevenueCat functionality. More specifically, developers and teams using RevenueCat won’t be able to access the RevenueCat dashboard. And with regards to app end users, app purchases can’t sync with RevenueCat and thus won’t allow for entitlements to unlock or for purchases to be properly reflected in dashboard metrics.In other words, RevenueCat won’t work at all for these users. Why was RevenueCat added to this list?The short answer is “we don’t know.” It seems to be a misunderstanding of what RevenueCat does, although we’ve explained
Hi! I’m Jacob, recovering iOS engineer and CEO of RevenueCat. It’s still a bit mind boggling how many folks are using our little SDK these days, and I’m excited that we have an open community to chat about it. I’d love to hear your product and company feedback. I don’t get to spend nearly enough time with developers using our product day-to-day and would love to hear what direction you think we should take the SDK, the dashboard, and ultimately the company. We are here to help you make more money with your apps, so tell us what you need! P.S. I’m thinking about making an app. Can you still make apps in Objective-C?
I'm designing a live streaming app where users can subscribe to individual creators for $9.99/month. A user should be able to subscribe to multiple creators simultaneously (similar to Twitch or YouTube Channel Memberships), and each subscription should auto-renew independently.The challenge is scalability. We may eventually have 100k+ creators, so creating a separate App Store / Google Play subscription product for every creator doesn't seem practical.I recently came across Apple's Advanced Commerce API, which appears to address this for iOS, but I couldn't find an equivalent solution for Google Play.Has anyone built or researched a system like this?Specifically, I'm curious about: How do platforms like Twitch, Patreon, X, or YouTube implement creator-specific recurring subscriptions? What's the recommended architecture for supporting a very large number of creators? Is there a scalable Google Play equivalent to Apple's Advanced Commerce API, or is there another common pattern? I'd
For people building AI apps with subscriptions: how are you handling free/pro AI limits? Are you using a backend, Firebase/Supabase counters, RevenueCat entitlements, or just trusting the client?
Does RevenueCat Support Purchases in (X) Country?RevenueCat supports subscriptions and in-app purchases for any country that is supported by the app stores (Apple, Google, Amazon) and Stripe. What if my country is only partially supported?If you want to support in-app purchases in Bermuda, for example, RevenueCat will work for all users in Bermuda, and they can make purchases in the Apple App Store and Amazon Appstore, but not in the Google Play Store.If a Bermudian user purchases a subscription on an Apple device, they can still access their subscription on an Android device if you properly support cross-platform usage of RevenueCat. Stripe purchasesStripe works differently from the app stores. If you as a developer have a bank account in a supported country, then you can collect payments globally. So, in the table below, if a country does not have a √ for Stripe, that does not mean you cannot collect Stripe payments from users in that country. It simply means your bank account/busine
I am building an iOS app using: SwiftUI Firebase backend RevenueCat Apple In-App Purchases The goal of the referral system is:“Invite a friend, they get 50% off a premium lifetime purchase, and once they successfully purchase, you also get access to the same 50% discounted purchase.”Importantly: users NEVER get premium access directly from a custom code premium access is ALWAYS granted through Apple IAP / RevenueCat entitlement the question is mainly about the referral mechanics and App Store guidelines compliance Scenario A — Apple-native offer codes Use Apple Offer Codes generated through App Store Connect API Store/generated codes are managed on my backend User A invites User B User B receives an Apple offer code for 50% off User B redeems through Apple redemption flow and purchases through normal Apple IAP RevenueCat webhook confirms purchase Backend then unlocks another Apple offer code for User A User A can then redeem their own 50% Apple offer code Scenar
I registered three subscriptions in the Google Play Console: monthly, 3-month, and yearly.However, in the app I only receive one subscription — the monthly one. What could be causing this issue?
I have an existing app called RedBird: Cycle Nutrition and need help setting up and testing RevenueCat with Apple subscriptions. The app is already built, but the paywall is not appearing correctly and RevenueCat is showing iOS Error 23 / empty offerings. I need someone experienced with: - RevenueCat- App Store Connect subscriptions- iOS in-app purchases- TestFlight / sandbox testing- React Native / Capacitor mobile apps Scope: 1. Review App Store Connect subscription setup2. Review RevenueCat products, entitlements, offerings, and API keys3. Fix the app flow so the paywall appears after onboarding4. Make sure products load correctly5. Test on iPad/TestFlight6. Confirm purchase, restore purchases, and premium entitlement unlock7. Help prepare the app for Apple review This is a small urgent launch-blocking task. Please only apply if you have successfully set up RevenueCat for iOS subscriptions before.
We REALLY need this feature.I saw someone else posting about this as well, 8 MONTHS AGO.We really need to be able to run experiements based on our own custom attributes.I mean, what kind of development time would this be? You could have that feature ready in 1 day. I’m a dev myself, like most people here, and it is just silly this would take so much time to add.In the other thread you mentioned this is a “TOP PRIORITY”. But it has gone 8 months since that post.Please, get this done! Thank you.
Hey folks,I found myself reaching for my phone multiple times a day to check on my RevenueCat metrics. That’s why I built CatBar, a little utility that sits in your menubar and shows you all your RevenueCat metrics in the blink of an eye. Feel free to try it and leave feedback: https://www.catbar.app/
Dear dev team,I noticed that when I use one paywall for both web and android, the dark mode seems have some issue with render all background. Please see below:This is how it looks like in my browser: there are 2 big white sections besides the major section this is how I set it in paywall editor, I am not sure if I missed any settings
Hi, We're stuck in an App Store review loop (Guideline 2.1 - Information Needed) and looking for advice from others who may have faced this. The situation: 1. Apple reviewer logs in with our demo user and makes a Sandbox purchase 2. We provide a new demo user so they can test the paywall 3. When the reviewer logs in with the new demo user on the same device, the existing Sandbox subscription transfers over — because the reviewer's Sandbox Apple ID hasn't changed 4. Every new demo user immediately has an active subscription 5. Apple keeps rejecting with the same "we need a user with expired subscription" template Key insight: The Sandbox subscription is tied to the reviewer's Apple ID, not to our demo user. No matter how many new demo users we provide, as long as the reviewer uses the same device and Sandbox Apple ID — they will always have an active subscription. What we've tried: - Providing multiple demo users - Exp
Hi RevenueCat team,We’re using Virtual Currencies (beta) for an AI product, and we’ve hit an important gap that I think affects many AI businesses.For most AI subscription products, usage credits are modeled as a monthly allowance, even when the customer is on an annual plan. Today, RevenueCat grants currency on purchase/renewal (billing cycle), which means annual subscribers get all credits up front.That creates two major problems:We can’t natively do a monthly drip grant for annual plans (e.g., +X credits each month). We can’t natively do monthly expiration/reset of that monthly allowance within an annual subscription.Because of this, we had to build and maintain external scripts/webhooks to:Grant monthly credits to annual subscribers Remove/expire prior month’s credits (non-rollover policy)This is fragile and defeats the purpose of centralizing entitlement + billing logic in RevenueCat.Feature requestPlease add support for sub-cycle virtual currency schedules, such as:“For annual p
Hi everyone,I’m looking for a way to update the main Call-to-Action (CTA) button text dynamically depending on which package the user selects. I don’t find how to do it… without the toggleCase: If the Weekly package is selected (which has a free trial enabled), I want the button to display: "Try for free". If the Yearly package is selected, I want the button to display: "Continue". Has anyone implemented this kind of conditional UI before? Any tips would be greatly appreciated!Thanks in advance!
I am currently finalizing a paywall design using the RevenueCat Paywall Editor (Tabs component).I have a specific design requirement where the pricing text displayed below the main card needs to change dynamically when the user toggles between the 'Annual' and 'Standard' tabs. Currently, that text remains static regardless of which tab is selected.Could you clarify the correct layer hierarchy for this? Do I need to nest the text layers inside the specific Tab Content folders to ensure the variables (like {{ product.price_per_week }}) update according to the selected package, or is there a different method to link text visibility to the active tab state?
Hello, while inspecting my RevenueCat panel, I noticed something.I offer Ad-Free usage in my application. The user first started using the app in July 2023 and has been actively using it. They made their purchase today, exactly 2.5 years later.To convert such long-term users to paying sooner, I think adding a criterion in the experiment screen, such as "Show B paywall if X time has passed since first open," would solve my problem.For example: "Hey, we've been together for over a year. blah blah"I'm presenting this idea to you. Regards.
Currently, our app uses device ID as the RevenueCat App User ID.On Android, when a user:- resets the device, or- switches to a new phoneThe device ID changes, which causes the App User ID to change as well.Recently, we’ve received many user complaints about being unable to restore their purchases.What we observed:- After device reset or device change, the user is treated as a new App User ID in RevenueCat.- The previous purchase is still visible in RevenueCat under the old App User ID.Using the order ID, we can manually locate the old App User ID and transfer entitlements manually, which works.However, automatic restore does not always transfer entitlements, even though:- The purchase was made with the same Google account- We are calling restorePurchases() correctlyExpected behavior (our understanding)From RevenueCat documentation and theory:When calling restorePurchases(), RevenueCat should automatically transfer entitlements to the current App User IDBut in practice, this does not co
Hi, Is this normal to not having data at the Customers > Sandbox page?Thanks!
Anyone knows how to change the blue color of the buttons in the image please? As in the design they are buttons that are linked to another websites.
Hello RevenueCat community 👋Kindly ask for your support or any ideas.I have a paywall with:• a toggle that switches between a yearly plan with 3-day free trial and a weekly plan without trial, and• package cards that the user can tap directly (yearly / weekly).When the user changes the toggle, the selected package and CTA text update correctly:• Yearly + trial → CTA: “Start free trial”• Weekly (no trial) → CTA: “Continue purchase”But if the user ignores the toggle and taps a package card directly, the toggle position and CTA text don’t update — they stay in the previous state, which breaks the business logic.How would you recommend structuring the logic / configuration so that the toggle and CTA always reflect the currently selected package, even when the user taps the package directly?I’m attaching screenshots of both the toggle and the direct package selection for context. Thanks in advance for any ideas and best practices!
I’m using Stripe Server-to-Server notifications with RevenueCat, and I want to confirm whether it’s possible to automatically set RevenueCat customer attributes from the Stripe metadata included in events such as checkout.session.completed, invoice.paid, or customer.subscription.updated.Is there a built-in way for RevenueCat to read Stripe metadata and store it as customer attributes (for example, email, app_user_id, or custom fields)?Or are we required to manually call the RevenueCat POST /customers/{app_user_id}/attributes API to update customer attributes after receiving Stripe webhooks?Any recommendations or best practices for keeping Stripe metadata synced with RevenueCat customer attributes?
I’m currently using Stripe Server Notifications in RevenueCat, and I’ve found that I cannot directly update customer attributes from this flow. Because of this limitation, I implemented the following approach and would like to get feedback on whether it’s safe, reliable, and recommended.The approach I’m using: I create a RevenueCat customer using the user’s sessionId as the app_user_id After creating the customer, I update their attributes—for example, adding the user’s email. In RevenueCat, I configured it so that metadata is pulled from the app_user_id assigned to the customer. During checkout, Stripe Server Notifications correctly map the transaction to the RevenueCat customer using this app_user_id. My question:Given that Stripe Server Notifications do not allow updating attributes directly, is this an appropriate and safe approach? Are there any risks, edge cases, or potential issues with this method? Would the community recommend a better alternative? I’d really appreci
Please support Harmony 😁
I’m an expo / React native dev. I’ve been stuck testing on a physical device because my simulator could never get past:Error fetching offerings. There’s a problem with your configuration. None of the products registered in the RevenueCat dashboard could be fetched from App Store Connect.On TestFlight, physical device testing, and production, everything worked smoothly. It was just the simulator. Something I wish the docs stated that ChatGPT helped with was:In your scheme, make sure your Debug scheme, under options, set the StoreKit configuration to your StoreKit config file. Even if you assume you did, make sure it’s still there since expo, when updating versions, may delete your `ios` folder. This was the thing that helped: assuming everything else worked, running `npx expo prebuild` then opening my xcworkspace file in iOS in XCode itself then running it from Xcode actually made it work. Then, you can go back to running `npm run ios` afterwards without issue.Same thing actually if you
Hi RevenueCat Team! 👋I'd love to request a highly needed feature that would significantly improve the user experience for apps with custom language selection functionality.## The ProblemCurrently, RevenueCat paywalls automatically determine their display language based on the device's system locale settings. While this works great for most cases, it creates a major UX issue for apps that allow users to change the app language independently from their device settings.*Current limitations:*- Paywalls always use device locale, ignoring in-app language preferences- No way to programmatically specify which localization to display- Users see paywalls in different languages than their chosen app language- Particularly problematic for language learning apps, international apps, and apps targeting multilingual users## Proposed SolutionAdd an optional locale or language parameter to paywall presentation methods across all platforms:*iOS (Swift):*swift.presentPaywallIfNeeded( requiredEntitlem
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.