Learn and Share
Learn more about RevenueCat and talk about it with the community.
Hi everyone, I was wondering what the best way is to set up different pricing in different countries. Example:High Price Tier: e.g. USA: 9.99 USD per monthMedium Price Tier: e.g. Germany: 7.99 USD (converted from EUR) per monthLow Price Tier: e.g. Brazil: 3.99 USD (converted from EUR) per month What is the best way to do this? Also, it would be nice to run separate experiments for each tier.Is the best way to set up different revenuecat offerings and have the app handle the selection of which offering is chosen based on the country? How would it be possible to run revenuecat pricing experiments then?Are there any best practices? Thank you already in advance. Cheers,Ben
Hey Revenue Cat users - I’m new to RevenueCat, but I’m creating an app that is all local storage, and currently doesn’t have any authentication. I want users to be able to try the app, but then pay a one-time flat fee to keep using it.Has anyone else built apps with this kind of use case for payment? It’s a flutter app, so it should be cross-platform. I want to have as minimal as possible of work for users.Are there any great docs on the revenue cat website (or elsewhere) detailing this kind of use case?
HelloWhen I fetch products and offerings using RevenueCat react native js library, it says that price is 1.99 for in-app purchase, but when a customer makes a purchase apple shows that price is $2.49 (user’s country is Ghana). The price on app store is set to Tier 2: $2.49 (developer’s account is from Ghana too), but it looks like it depends on user’s settings on the device. Is there a way to fetch actual price based on user’s country? Or revenue cat always returns price for USA (1.99) and I have to manually detect user’s country and convert it?
As of today, if I want to run the same experiment in different countries and have separate data for each country, I have to run it as many time as there is countries. RevenueCat only allows one experiment per project at a time.So of I want to try the same 5 months experiment in 5 countries, it will take 25 months in total.Why not allow to filter a global experiment’s data by country on display?
Hi, I have a feature request which is going to help I think most of the developers who uses RC. I want to see my daily sales whenever I want like, There must be box on the main page which will show, for example: TodayTotal new subs: 122 Total renewed sub: 213 We are able to see new subs in chart of Active Subscriptions Movement, but it is not live. It doesn’t show the updated units at that moment and also it doesn’t show renewed ones. The chart also mentions the data as (incomplete). To sum up, I wonder when we can have a feature like this, or do we already have it?
I would like to test the full flow, without waiting, up to an hour?, for the sandbox purchase to be reset. Is there a way to change how quickly this works? Even manually cancelling the subscription in the App Store sandbox user settings doesn’t change the expiration date.
I’ve integrated RevenueCat (Capacitor) and enabled the Firebase extension. Test purchases are coming through and the Firebase Extension seems to be working. It saves information in two collections and events in EventArc, though I’m not so familiar with that.I understand that for consumable non-renewable products my own database (FireStore) is the single source of truth.I guess i can figure out how to read that data and do “something” with it, but i was wondering what best practices were. Surely this is a common situation, are there any available solutions / libraries that handle the standard events? In my case initially it would be
Hello everyone,I was wondering if anyone could share their methods or strategies for monitoring revenue on RevenueCat. Specifically, I'm interested in how to break down monthly earnings between new customers and existing ones.Any advice or insights would be greatly appreciated! Thank you.
Hi! We put together a walkthrough of the dashboard on the RevenueCat Youtube channel. This may be helpful if you’re already up-and-running and want to learn more about the dashboard, or if you’re evaluating RevenueCat and want to get an idea of what you can expect. Let me know if this is useful and if there’s other content you’d like to see!
RevenueCat proudly helps create an easy way to keep track of all your in-app transactions. However, although we manage your purchases, we don't process the payments for your subscriptions and non-renewing products. The differences are best explained by understanding how RevenueCat interacts during the purchasing phase of a customer buying a subscription or non-renewing product. When a user goes to your paywall, the SDK uses the product IDs from your current offering and retrieves the product information from the respective stores ( Apple/Google/Stripe). When the user selects a product to purchase, the SDK gets the product ID to send it to the store to purchase The store then processes the payment (charges the user via their payment option) and adds this product to the customer's receipt. When the customer's receipt changes, RevenueCat has listeners that update the `PurchaserInfo` object (allowing customers to get access to the product/feature they purchased) and updates our
App rejections are an unfortunate and dreaded aspect of launching a new app. It’s bound to happen at some point, and in the case of subscriptions and in-app purchases, it’s usually not something that you or RevenueCat can resolve.RevenueCat can’t contact Apple on your behalf and we can’t expedite the review process, but we can help you troubleshoot the rejection and work toward a resolution.If you’ve read through our docs on rejections and are still having issues, read on. Background / Review EnvironmentUnfortunately, Apple’s sandbox environment is notoriously flaky - there are regular outages and sometimes purchases can get hung up in their system. Most of the time this error is due to sandbox downtime, but you can read about all the causes for this error in our guide on error handling.Even worse is that Apple’s reviewers use this unstable environment for App Review, which can cause issues when the reviewer tests in-app purchases like subscriptions.The App Review team typically doesn’
When making purchases, you might run into unexpected errors. A common one we see our developers face is the `PURCHASE_NOT_ALLOWED` error. We have this error documented in our error handling docs. This error comes from Apple or Google and is not an indication that something is wrong on RevenueCat's side. This Error on Android When working with Android, your error might look similar to this:`ERROR: The device or user is not allowed to make the purchase. | Billing is not available in this device. DebugMessage: Google Play In-app Billing API version is less than 3. ErrorCode: BILLING_UNAVAILABLE` This error is generic; there could be several reasons this pops up. The most common is that your Android OS is out of date. We recommend updating through the Play Store and seeing if that helps. Other things to check when you get this error: Are you logged in to the correct Google Account on the device/emulator? Try logging out and logging back in. If you're testing on an emulator, can you
Customer Lists are a powerful way to organize and export your customers based on certain app interactions or important characteristics such as their current subscription status.When you export customers, RevenueCat creates a compressed CSV (CSV stands for comma-separated values) with the filtered customers as well as their attributes. The compressed CSV uses the gzip compression algorithm with a .gz extension. Decompressing on macOSFor most exports, using the default macOS Archive Utility will be enough to decompress the exported file. Occasionally, due to a bug in Archive Utility, the file may fail to decompress with the error message ‘Error 79 - Inappropriate file type or format’.When this happens, you have a few options:Use the built-in Terminal to decompress the file with the following command:gzip -d /path/to/file.gzUse a third party tool like Keka to decompress the file Viewing the data in a spreadsheetOnce the file is decompressed, you can import it into spreadsheet software lik
It’s a common issue that comes up on every single analytics platform - in one system you have 3105 active trials, on another, 5046. What’s the deal?These discrepancies are common, and can happen for a variety of reasons. This article covers why you can expect certain discrepancies between RevenueCat's analytics and other platforms, and what you can do if things don't seem right. Common Discrepancies Having a better understanding of how RevenueCat collects data and generates analytics can help a lot when comparing against other platforms. The following are the most common things to consider the vast majority of discrepancies can be attributed to. What is the source?The first thing to ask yourself when comparing analytics systems is to ask yourself, "What is the source of this data?". If the sources are different, then you should expect differences in the data as well. RevenueCat only collects data that is sent through our in-app SDKs or REST API - there's no connection to any other sour
App Tracking Transparency (ATT) is Apple's framework for requesting access to a user's IDFA. If you use any of our attribution integrations, this article will explain what you need to do to make your app compliant. What is App Tracking Transparency (ATT)?Starting in iOS 14.5, collecting the IDFA will require permission from the user. This is done by integrating Apple's AppTrackingTransparency framework in your app. How Does ATT Affect RevenueCat?RevenueCat will continue working as expected because RevenueCat doesn't depend on IDFA or collectDeviceIdentifiers to work. However, depending on the integrations or workflows you have, you may need to update your app to ask the user permission to collect the IDFA via collectDeviceIdentifiers. This section will help you figure out whether you need to integrate ATT.If any of the following apply to you, you don't need to integrate ATT:You only use integrations that don't require or rely on IDFA to work, such as Amplitude or Mixpanel. You don't mi
Restoring purchases is a mechanism by which your user can restore their in-app purchases, re-activating any content that had previously been purchased from the same store account (Apple’s App Store or Google Play).By not including a method to restore purchases, users could lose access to existing purchases to which they are entitled. This isn’t ideal, so it is strongly recommended that you include some way for users to trigger the restoreTransactions method, even if you require all customers to create accounts.What happens when a user restores purchases?When a user restores purchases, the Purchases SDK syncs the user’s device receipt with the RevenueCat backend. The device receipt contains unique information about the user’s transactions so that RevenueCat is able to pair the transactions to an app user ID and then subsequently unlock the appropriate entitlements.RevenueCat offers a configurable option in an app’s settings to change the restore behavior in the event that a receipt has
If your app is using the native iOS SDK with Swift, you can access the transactionIdentifier field through the transaction object when purchasing the product. You can see more details about this in our 'Making Purchases' docs and RCTransaction object in the iOS SDK. This field is not accessible through RevenueCat's other SDKs, however, can be accessed through webhooks and ETL exports. Typically the information included with PurchaserInfo and EntitlementInfo objects is enough data for most implementations of our SDK.If you're looking for the transactionIdentifier to track consumption of consumable products, consider using RevenueCat's GET /subscribers endpoint instead. You can utilize RevenueCat's unique identifier, id, in the non-subscription object to track consumption of all your consumable products.If there are any additional use cases for utilizing the transactionIdentifier, we'd be happy to share the feedback with our team and/or find another way to help you solve what you're tryi
What to do when a customer says they purchased the product but didn't gain access? If utilizing RevenueCat’s Entitlement system, you should first confirm that the product is attached to the correct Entitlement. If Entitlements are set up correctly, your end customer’s purchases may have to be re-synced with RevenueCat servers. This can be done either with a user-facing button in the app triggering the restore method or through the REST API with the `is_restore` field set to `true`. Note that restoring through the REST API requires your team to collect the customer’s fetch token at the time of purchase. For iOS, this is the base64 encoded receipt file and for Android this is the purchase token. You can read more about restoring either in RevenueCat’s documentation or in the following community post: https://community.revenuecat.com/featured-articles-55/do-i-need-a-restore-purchases-button-391 If you notice that your customer’s purchase is not populating in the RevenueCat dashboard,
When tracking webhook events and also using the API, there are data discrepancies how field values are presented or formatted. One such case is the Subscription#period_type. In a webhook event the value is uppercase but in the api it’s all lowercase. Another is the use of both millisecond timestamps and ISO 8601 datetime string. This makes for very awkward handling of RevenueCat’s data in our codebase. Granted, I realize this is not easy to reconcile in existing APIs but in the future I would hope the company can adopt standards for these fields that they stick to across their platform.
Also known in RevenueCat as the STORE_PROBLEM error, this error can occur when purchasing a product and indicates there was an issue verifying the purchase with the App Store or Google Play Store. The error can either come directly from Apple or Google’s libraries, or from RevenueCat’s backend when attempting to verify the receipt. Why does this error occur?The STORE_PROBLEM error occurs more commonly in sandbox than production, and can result from different causes depending on the store. Usually, it means there was a problem connecting to the store at the time of purchase—such as the store’s servers were down, or the user’s network connection failed, so the purchase could not be verified and completed. RevenueCat will forward the underlying error, or the exact cause for the error, along with the STORE_PROBLEM error. Here is a list of possible causes from each store:Apple SKErrorUnknown. An unknown or unexpected error occurred. A “catch-all” error that may point to a problem with the
If you don't have or don't want a full website, it can be unclear on how to proceed with integrating Stripe payments alongside your existing mobile in-app purchases. This sample project demonstrates how to use Stripe Checkout and webhooks to send purchase data to RevenueCat. Once published, you’ll be able to share individual links with users that will automatically redirect to Stripe, then send the receipt back to RevenueCat once the purchase is completed.It’s recommended that you know the basics about RevenueCat and Stripe before continuing with this project. Example Use-Cases Win-back email campaigns Send individual links to expired users to re-subscribe using Stripe checkout. In this case, you’ll need to have app user IDs and email addresses paired (typically from your own auth system). SetupThe easiest way to use this sample is by deploying to Heroku instantly with the button below.Or you can deploy by clicking this link. The following environment variables should be set bef
There are a variety of things you may want to test about your iOS products: different pricing, free trial durations, introductory offers, and more. The RevenueCat Experiments feature will automatically divide your new customers evenly into two groups, where each group will have a separate “current” Offering. For more information about this feature: https://docs.revenuecat.com/docs/experiments Bear in mind that this feature is currently in Beta and A/B testing is available on iOS only. When deciding to make an Offering current, double check that it works on all platforms supported by your app. This means while the experiment Offering will be available for customers on other platforms, the data is only calculated for iOS purchases. How often do Experiment results get computed?The LTV model is ran daily, typically every 24 hours after you first initiated the experiment. What to do when seeing the 'Data will show in 24 hours' message after 24 hours?If it has been well over 24 hours since
Log in to the Community
Authenticate with RevenueCat
Enter your username or e-mail address. We'll send you an e-mail with instructions to reset your password.