Discussion and help from anything related to RevenueCat.
Recently active
Hello,I have an app (written in React Native) and use RevenueCatSdk to facilitate my IAP purchases. In my app I want to set an IAP price for a profile to unlock it. I can create 3 different IAPs to represent the different price tiers. When a user goes to buy the profile I will get a webhook saying the user bought lets call it “profile_access_first_tier” however, I won’t know what profile they unlocked. I will know who the purchaser is, and the product, but the actual product can apply to multiple profile unlocks. Is there a way, when the purchase is happening from the frontend to attach a custom attribute that will be sent with the “NON_RENEWING_PURCHASE” webhook? Such as attaching a custom attribute like “sellerId” would be useful so I can then give the user access to that seller’s profile? Yes I can solve this in a different way by storing something saying the profile the user is on before the purchase happens then link the two in the webhook, but I think this would be more reliable
Been using RevenueCat for many years in a mixed Objective C/Swift project and suddenly having problems: Purchases.shared.getCustomerInfo { (customerInfo, error) in DispatchQueue.main.async { if let error = error { let alert = UIAlertController(title: nil, message: error.localizedDescription, preferredStyle: UIAlertController.Style.alert) alert.addAction(UIAlertAction(title: "OK", style: .default, handler: nil)) self.present(alert, animated: true, completion: nil) } else if let customerInfo = customerInfo { myObjectiveCClass.purchaserInfo = customerInfoLast line gives the compilation error: Cannot assign value of type 'RevenueCat.CustomerInfo' to type '__ObjC.CustomerInfo'They are the same type. Here’s the declaration in myObjectiveCClass:@property (retain, nonatomic) RCCustomerInfo *purchaserInfo;and show definition on that RCCustomerInfo goes to the definition in
Error Domain=RevenueCat.ErrorCode Code=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" UserInfo={source_function=createErrorForEmptyResult(_:), source_file=RevenueCat/OfferingsManager.swift:253, readable_error_code=CONFIGURATION_ERROR, NSLocalizedDescription=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} userCancelled: False We have a production app with several thousand users per day, but
I am having an issue enabling a simple button after a user subscribes using the presentPaywallIfNeeded(requiredEntitlementIdentifier: "Premium") sheet. I disable this button until a user purchases a subscription. Now this works when i click off the current view and come back via tab bar. It's when the sheet dismisses to the current view where i am not able to enable the button. I’ve tried a number of things so far:creating a isSubscribed flag which works but not for the current view until i leave and come back to that view. adding various things to OnAppear for the current view Maybe creating a Binding? Any ideas would be appreciated. The functionality comes across as being very buggy when i can't enable UI components after a user purchases a subscription and the sheet dismisses. Swiftui Xcode 16.2
During testing, purchases are working fine. So we uploaded a version to the play store. But now our users can’t make purchases, the error that pops up is “The device or user is not allowed to make the purchase” and other times it’s “There was a problem with the play store”.This is from a Unity project
In the customer center cancellation option we offer a promotional offer as a winback after they select a feedback survey response. We have localized every string via Customer Center > Localization but can not work out how to localize the actual CTA button, it does not appear to have an option but I know it can be done as I have seen variations of it.Thanks so much :)
I added the Paywall (RevenueCatUI.presentPaywall()).I did everything from this guide:Google Play Store | In-App Subscriptions Made Easy – RevenueCatDownloaded from closed beta, add my google account to testers, but the app try to charge my card.Meanwhile in iOS everything working good and payment not charging
We're building an iOS and an Android app that uses RevenueCat to manage the subscriptions.There's a free trial period and we'd like to send users an email 2 days before their free trial period ends. It sounded like maybe one of the webhooks could do that, but we weren't sure. Is it possible with a webhook or is there another method you suggest?
I'm currently evaluating whether adding a lifetime (non-consumable) in-app purchase is as simple as adding a new non-consumable one-time purchase to my paywall, or if it's more complicated.Here is the current technical situation of the appApp already uses RevenueCat + RC paywalls. The app currently has no login functionality, so each installation is an anonymous account.My requirements for adding a lifetime optionI want users to be able to use their lifetime purchase across all of their devices. I will be adding an account system in the future and want to make sure that the in-app purchase can only be used for one account.A few years ago I implemented a one-time purchase in an iOS app (without RC though) and I remember it was quite a struggle because people couldn't restore non-consumable items across their devices.So my first question is:Is it possible for users (on both iOS and Android) to restore non-consumable purchases across devices? I couldn't find any information on this.If so,
I know (now) I can add different subscriptions to different groups. Which will restrict users into a group. However as the option of using different groups was not known my app has all subscriptions within the same group.Subscription A $15Subscription B $10In my app Subscription B is only offered if certain criteria are met and the relevant paywall is displayed. Unfortunately as both Subscriptions are in the same group users can through their Apple Account > Subscriptions. Move to Subscription B. I know now I can prevent this with different groups but I want to stop it.In AppStoreConnect I see the option to turn off “Streamlined Purchasing”. Is this enough to prevent moving between subscriptions in the device settings and will force users to need to make purchases through the app so its logic can be applied? As I can not move product ID’s between groups. I have to set up a new ID “Subscription C”. In the new group. My thinking is to remove Subscription B from sale. This will then no
We currently have partnerships with several clients, and we want to grant them premium access. This would provide 5 tokens each month for them. However, I’m unsure if granting entitlement is the right approach. If I select a one-month option, it appears it will not auto-renew. On the other hand, a lifetime option also doesn’t seem to allow for monthly auto-renewal. What is the best way to implement a monthly auto-renewable subscription for free? Thank you.
I’ve been seeing a ton of these events come through and they often lead to cancelation and lost revenue. How can I make sure this isn’t due to some misconfiguration in RC or Apple, or my code set up?
Hi,We tried to simulate a communication failure with our webhook endpoint and we noticed that failed events are no longer resent.How can we handle this case correctly? Is there a way to manually send a failed event?Also we not found in the documentation if there is an api rest that allows us to recover failed events. There isn't, is that correct? Thanks
We have been using RevenueCat for close to 5 years now, so really would love to know what LTV/paying customer is over that period but the prediction explorer currently limited to 24 months of data.
Hi, We have a subscription structure in Stripe that has one product and multiple SKUs inside that product with variations of subscription lengths/discounts/etc. Currently in the events data from RC we’re getting product id but we’re unable to attach the info about a particular SKU that was purchase at transaction level. We have decided to insert this info in the subscriber parameters but that’s not ideal for downstream analytics. Have anyone had a similar problem and found a way to pass that info with the transactional data?
As we continue to promote and market our app, we’ve been seeing an increasing number of subscribers, yet the MRR seems to be going down slightly.Our churn rate is low, we’ve had days without any churn, and increasing subscriptions, yet MRR went down We have both monthly and annual offerings Our main market is not based in USD, are exchange rates taken into consideration at any point?We want to clarify this calculation so our marketing and growth team have better tools to make decisions.
Currently, we are using pure StoreKit2 to detect user’s entitlement. var purchasedShops = Set<Shop>() //Iterate through all of the user's purchased products. for await result in Transaction.currentEntitlements { //Don't operate on this transaction if it's not verified. if case .verified(let transaction) = result { //Check the `productType` of the transaction and get the corresponding product from the store. switch transaction.productType { case .autoRenewable: fallthrough case .nonConsumable: let productID = transaction.productID guard let shop = Store.identifierToShop[productID] else { continue } // Not sure such checking is required. I guess no harm to do so. if transaction.revocationDate == nil { purchasedShops.insert(shop) } default: preconditi
Hi, I'm working on Bubble (nocode) and here's the API call setup I did following the RC doc (https://www.revenuecat.com/docs/api-v1#tag/customers/operation/subscribers) to pass the user id into my app so that it replaces the id that RC provides automatically and randomly.Is something missing because this is what I think when I initialize. I don't want that, I want the users in my app to use the unique id they get in my app, to use it in RC.
Why are some of my subscriptions canceled due to a billing error? Am I doing something wrong on my end or does that mean the user’s credit card isn’t working or something? Some of the transactions are going through and others aren’t so I’m not sure why this is happening.
In Google Play, my free trial is not showing up for my monthly subscription and I can’t figure out why. Do I need to recreate the app or somehow re-sync the settings from Play Store?
Here’s how I combined RevenueCat subscriptions with usage-based credits without overcomplicating things (perfect for AI tools, AI wrappers API calls, or limiting features): Subscriptions via RevenueCat: Users pick weekly/monthly/yearly plans. RevenueCat handles Apple/Google payments. Credit Tracking in Firestore: We store credits in Firebase. Example: "Monthly plan = 1000 credits." Auto-Sync with Webhooks: When someone subscribes/cancels, Custom Written Revenuecat Webhook Handler in nextjs deployed on vercel extension updates Firestore. Credits auto-add/reset. Deduct Credits via Backend: Every API call from ios app hits our backend → checks Firestore → subtracts credits. IOS App: Firebase Auth and Reveneucat login with firebase userID Backend 1: Communicatig with 3rd party services, spends credits from user’s firestore record. Backend 2: Webhook handler for revenuecat, add credits to user accounts on new subscriptions, resets and adds new credits on renewal etc. I wrote all handl
So, I am following the recommendation to “Don’t set emails as App User IDs” in:https://www.revenuecat.com/docs/customers/identifying-customers#tips-for-setting-custom-app-user-idsand instead am setting the App User ID to their UID. But this means in my RevenueCat dashboard, the users are identified by strings like “McXAayHL1qVtFLSm74phQAqZNGx1”.Is there a way to follow your recommendation but still display users via their email in the dashboard?
When a user first enters our app, they are setup as an anonymous user and get RevCat’s anonymous ID. This happens via using `Purchases.configure(revcat key)`. Later should they login with a named account from our system, we use `Purchases.shared.logIn(customID)` to update the RevCat user with our customer identifier. The issue is that after doing this and checking `Purchases.shared.customerInfo()` for the ID, the initial anonymous ID is returned rather than the custom ID supplied at login. Should the login method not change the user’s ID when checking their `customerInfo`?
I'm using Flutter to develop my application, but I ran into a problem when I tried to incorporate a revenue cat subscription feature into my Android app. This problem is specific to Android, not iOS, so the error message I'm seeing in the debug log is “Error loading offerings info: PlatformException(3, The device or user is not allowed to make the purchase., {code: 3, message: The device or user is not allowed to make the purchase., readableErrorCode: PurchaseNotAllowedError, readable_error_code: PurchaseNotAllowedError, underlyingErrorMessage: Error when fetching products. DebugMessage: Billing Unavailable. ErrorCode: BILLING_UNAVAILABLE.}, null)”I have followed all the instructions they have given me, and I have made sure to do so, but I'm still having trouble. If someone could assist me, I would be very grateful.
Hope someone can help.In my Android app (which I’m still developing, so in test / sandbox mode etc), RevenueCat purchases seem to work okay. However, after a purchase, in onCompleted, I’m trying to get EntitlementInfo from provided CustomerInfo, and it’s (EntitlementInfo) always null.I’ve also attempted to get EntitlementInfo from CustomerInfo using the RecieveCustomerInfoCallback, a few moments after the purchase completed (so, not immediately after), and EntitlementInfo is still null.Also, just to add, it’s a non-consumable product.Any suggestions?
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.