Discussion and help from anything related to RevenueCat.
Recently active
I've activated an experiment that compares two different offers with different prices.On the experiment dashboard, I see allocation numbers and % difference, suggesting everything is running well.However, on the main RC dashboard ("Overview"), I don't see any customers with the new offer that I'm trying to test. Is this normal? I was expecting the new offer to show up there, but maybe it shouldn't?
I’m trying to integrate the paywall into my VisionOS app, which creates a volumetric WindowGroup. When the paywall attempts to present itself, I get the error “Presentations are not currently supported in Volumetric contexts.” Using Xcode 15.3 Beta 3 with Apple Vision Pro (1.1) simulator. import SwiftUIimport RevenueCatimport RevenueCatUI@mainstruct Sheila_VisionOSApp: App { init() { Purchases.logLevel = .debug Purchases.configure(withAPIKey: "XXXXXXXX", appUserID: nil) } var body: some Scene { WindowGroup { SheilaAppView() .presentPaywallIfNeeded( requiredEntitlementIdentifier: "access", purchaseCompleted: { customerInfo in print("Purchase completed: \(customerInfo.entitlements)") }, restoreCompleted: { customerInfo in // Paywall will be dismissed automatically if "pro" is now active. pr
Hello, I am receiving this RC error into my error monitoring service : “There is an issue with your configuration. Check the underlying error for more details.” However, I cannot reproduce this problem, my app is live on both iOS and Android and everything seems to work fine, I have active subscriptions. Still a little number of my users (<1%) are receiving this error. I’ve read all posts about it and all of them are about configuration issues, however in my case, RC works fine for 99% of my users. I use “react-native-purchases”: “5.13.1”. This error only happens on Android. Should I be worried about this error ? Or is it harmless ? Thank you
I’m new to React Native, Expo, and RevenueCat so this is likely very basic but can’t find an answer to this anywhere. I’m following this guide.I’m not familiar with the lingo yet but I’m pretty sure I’m using the “managed workflow” version of Expo. In terms of development and testing, the only setup I’m currently familiar with is Expo Go -- in other words, running “npm start” on my dev machine, opening Expo Go on my device and connecting, then updating/editing code. This is the only way I know how to write code for my app. Then when I’m ready for full testing on a device, I run an EAS build and download it to my device, but at this point I have absolutely no more visibility into the code, it’s a complete black box -- it’s just a standalone running app on my phone.My understanding is that the RevenueCat modules do not work with Expo Go. If I try to include them I get a “Invariant Violation: Your JavaScript code tried to access a native module that doesn't exist” error. First question is
Hello,So I have my app set up and working very nicely using revenueCat, however there is one tiny issue that I hope someone here can help with.I have a subscription management page where I am displaying some details, where ‘next billed amount’ is one of them, that is displaying the amount billed string that I can only find in the offerings object.So far I have been fine with just comparing the productId found in the offering object with the id in the active subscriptions from the customer info object. The thing is, if the user purchases that product on an android device but then switches to iPhone, then I can’t currently get the billed amount, because the offering is now returning the product Id of the iPhone product which is different to the android one. So comparing the two returns falsy and therefor an undefined amount. So I am wondering how others may have gone around this. One solution I do have in mind is naming the identifiers for android and iOS products exactly the same, but w
Hello, I don’t understand how could I organize offerings with multiple subscription groups. I want my user to be able to subscribe to different subscription plans and it’s possible that he could have two subscriptions at the same time. For example: Plan 1 (subscription group):monthly subscriptionyearly subscription Plan 2 (subscription group):monthly subscriptionyearly subscription It’s possible for user to be subscribed to 2 plans at the same time.Now when I get offerings I do like this:const offerings = await Purchases.getOfferings();offerings.current.monthly.product.priceStringHere I get current offering with the monthly price. But how could I modify this code and revenuecat configuration to be able to get current offering for another plan as well? Is this possible?I tried to add another monthly product to the offering, but it allows only one per offering. I think it needs subgroups under offering, one per each subscription group so that it would be easier to experiment and change
Title should have been: Close Button Not Visible on AndroidIn my code, I have explicitly set displayCloseButton: true when calling the presentPaywallIfNeeded function. The close button is shown successfully on iOS with the teal color. However, on Android, it is not visible at all. I am using: “expo”: “49.0.17”,"react-native": "0.72.6","react-native-purchases": "7.21.0","react-native-purchases-ui": "7.21.0", See example:
We’ve been storing raw webhooks in our db for quite some time but then have also had the GCS cloud storage export going for a while. What would you recommend when it comes to analyzing raw data? is there a difference in the data structures? We want to create some of our own LTV charts, etc with our user context. CC @Jens 🙏
I have a paywall for monthly & annual subscription. I want to give some partners a code to get the full annual subscription for free. They said that when redeeming the code, with the full URL `https://apps.apple.com/redeem?ctx=offercodes&id=${apple_app_id}&code=${codeInput}` that they still see the paywall after loading the app for the first time. I believe they have not downloaded the app even in this case, as they are new users.I had them click Restore Purchase, but they claim that too does not work.Is there a preferred method to get Promo Codes to work, on the first load of the application? I tried reading the docs...i think i am all set, perhaps I need to have the listener? But that doesn’t make sense if it’s a brand new user.
I need help, I cannot delete this product, there is no warning explaining why it is meaningless, can you help me?
Hello,I have followed official revenue cat react native facebook ads tracking integration tutorial.It seems like I am setting the facebook anonymous ID to the customer:But when I actually make a purchase from my sandbox account, I see no events being triggered. Here is how I am implementing my code: useEffect(() => { const configurePurchases = async () => { Purchases.setLogLevel(Purchases.LOG_LEVEL.VERBOSE); if (Platform.OS === "ios") { await Purchases.configure({ apiKey: APIKeys.apple, }); // Automatically collect the $idfa, $idfv, and $ip values Purchases.collectDeviceIdentifiers(); const anonymousId = await AppEventsLogger.getAnonymousID(); Purchases.setFBAnonymousID(anonymousId); } if (Platform.OS === "android") { await Purchases.configure({ apiKey: APIKeys.google, }); } }; configurePurchases().catch((error) => { console.error({ configurePurchasesError:
When I open the app everything works fine but when i close it and reopen it from the home screen it crashes on TestFlight.Here's the crash log of the thread its crashing on:Thread 0 name:Thread 0 Crashed:0 libswiftCore.dylib 0x00000001847363fc _assertionFailure(_:_:file:line:flags:) + 264 (AssertCommon.swift:144)1 PurchasesHybridCommon 0x00000001019af1a4 closure #1 in variable initialization expression of static FatalErrorUtil.defaultFatalErrorClosure + 64 (FatalErrorUtil.swift:15)2 PurchasesHybridCommon 0x00000001019a73a0 fatalError(_:file:line:) + 60 (FatalErrorUtil.swift:27)3 PurchasesHybridCommon 0x00000001019a73a0 static CommonFunctionality.sharedInstance.getter + 84 (CommonFunctionality.swift:21)4 PurchasesHybridCommon 0x00000001019a73a0 static CommonFunctionality.customerInfo(fetchPolicy:completion:) + 84 (<compiler-generated>:405)5 PurchasesHybridCommon 0x00000001019a73a0 specialized static CommonFunctio
Hello,I’m building an Ionic mobile app with the Capacitor plugin and testing payments for IOS and Android in sandbox mode. I have the Google Play store payment working properly in sandbox mode but with IOS I am having an issue with the purchasePackage method.I am receiving offerings and packages properly, using the IOS key, but when I pass in a package into the purchasePackage method, a TCP timeout occurs. I assume this is because it is reaching out to an API and waiting for a response that it isn’t getting. How can we get past this or is this a known issue with developing with Ionic Capacitor and IOS payment subscriptions? I want to test this in a production environment but that would need Apple’s approval with broken authentication. Any guidance or input would be greatly appreciated Steps taken to debug: Make sure IOS and Android keys are working properly Purposely passing broken data into purchasePackage to see what it returns Console logging and follow the trail of data until it re
Running into another unexpected set of events for a customer (app user id: ob5Wpc3mWKUoYCtijpDVtXy2XnP2).It seems that the EXPIRATION event came just a few minutes after the billing issue (when the grace period started). EXPIRATION event is expected to come at the end of the grace period if the billing issue is still persistent (current grace period is set for 3 days).Currently this causes a contradiction, since the EXPIRATION is meant to remove entitlements, but the Customer Profile page in the RC Dashboard has Entitlements listed still..
Hi there,over the last days I have gone through the steps of setting up the credentials very carefully multiple times.I have an app com.aaa.bbb where I initially set up the subscriptions for. It worked in RevenueCat and on the Google Play Store.Then I decided to leave that app accessible without subscription and offer a new app with identifier com.aaa.bbb.cccPainfully, I had to go through the whole process again, but it can never validate the sub API.The app is separate from the old app in Google Play (it is a new app) It has the correct identifier It is even approved and its subscriptions too I waited >36h I've set the correct google api key from RevenueCat in my app The permissions for the Google Cloud account are set to account wide, not restricted to single appNote that I'm using the same RevenueCat project as before but I also updated the identifier to be com.aaa.bbb.cccNow what is very bizarre is when I change the identifier to com.aaa.bbb in RevenueCat, all the sudden the per
Hi, I’m working on creating a native paywall with SwiftUI because we have a paywall design that deviates from the templates. (it’s mainly sizes and margin - footer paywalls are too tall for our use. Hope this is configurable in the future) While creating a custom paywall, I wish we could still use some of the variables and localization RC offers with paywall templates. e.g., I tried to access periodName (e.g. “Annual”) via package.periodNameOrIdentifier(.current)This gives “'periodNameOrIdentifier' is inaccessible due to 'internal' protection level" It seems that making ‘extension Package: VariableDataProvider’ public might allow this. Can RC support this? At a high level, the pain here is that as soon as we try to do anything custom that deviates from the template, we face reimplementing many of the conveniences RC provides. Wish there was a middle ground somehow.
My request to `https://api.revenuecat.com/v2/projects/:projectId/customers` is returning a 404 error which doesn’t really make sense. Full error object below: ```{ "doc_url": "https://errors.rev.cat/resource-missing", "message": "Resource not found", "object": "error", "retryable": false, "type": "resource_missing"}```I am using the projectId returned from calling GET Projects in the v2 API.I am using a V2 API key. The permissions look like: One thing I noticed is that the API key permissions has a “Customer information permissions” section, but there’s nothing there.I know the v2 API is in Beta… is something not finished here?
Hello, my client would like to slightly customize a template, beyond what's possible with the no-code editor, but not enough to warrant creating a new one from scratch. The modifications desired are as follows:Adding a 'chip overlay' around a price card labeled 'Recommended.' Adding a strikethrough text displaying a higher price tag near the effective price.Do you provide such customization services? We would be willing to pay for this. Thank you.
For customer P7JhJ9xGhJeZq1zhrxRptq52Kmb2, I am trying to determine when to remove extra entitlements.The EXPIRATION event seems to have triggered exactly 3 days after when renewal would have happened. Which is what I expect since grace period i set at 3 days.But the RC dashboard seems to show that there is still time until expiration. Maybe this matches the “Grace period ends” timestamp 1707470032885 on the BILLING_ISSUE event.So should entitlement be removed now when I’ve received the EXPIRATION event, or later when grace period ends?
Hello,I'm working on a Flutter app with an in-app purchases. I'm looking for a solution to automatically close the purchase sheet after a specified amount of time. I’ve dug around and there doesn’t appear to be any obvious way of closing the sheet?Just in general it doesn’t seem there is any way of closing the app, causing the sheet to stay open indefinitely even if the user signs out or background the app, until they click the “x” or just outside the sheet. Thank you!
when user buy first time one plan using buyConsumable method everything's works prefect, but when buy same plan second time play console showing me "already own this item". help me if anyone know.I want to need multiple time buy same product.
Sorry for the title (posted a bit too fast) but doesn’t seem to be editable. Hi guys! First time using RevenueCat, I’m having trouble to understand the Offering / Packages / Paywall concept. My use case is simple. I have two subscription level: pro and pro+ and each one can be subscribed to monthly or annually (pro is included into pro+). Pro+ allows a bit more features than pro.So, I have two entitlements, pro and pro+ and 4 products (pro_monthly, pro_yearly, pro_plus_monthly and pro_plus_yearly). Now, I’d like to display this products in my application, so I’m configuring my default “Offering”. In this offering, I’m supposed to attach “Packages” composed of my “Products” but it seems I can only attach one product per package (the product is replaced as soon as I try to add another).I’d like to display my products grouped by entitlement type (pro and pro+) but don’t understand how to do that. Am I supposed to group them myself in my application? Should I have one package = one produc
I’m using StoreKit 2 with an automatically synced StoreKit Configuration file in Xcode which is an amazing tool to use in development. Unfortunately, even though I uploaded the public certificate for StoreKit testing, I always get the “ERROR: 😿‼️ The receipt is not valid.” message during development.I’ve read in other threads that this is a common issue. Also, I’ve read somewhere to use StoreKit 1 or to not provide a StoreKit configuration file. But I’m not willing to use older APIs and features when there are shiny new tools that make development much more fun. Please don’t try to convince me that StoreKit 1 is more stable. I’ve used StoreKit 2 directly, and it was an awesome development experience. I’m just using RevenueCat for the Live Data, Experiments, and for the Paywall UI. But my development experience has degraded since I made the switch.To improve this, I would like to simply turn off receipt validation when I run my app in DEBUG mode. In other words, I’m looking for somethi
I am testing purchasing my subscriptions in sandbox. My device has purchased a subscription before, and it has expired.When I go in to purchase again, `Purchases.shared.purchasePackage` returns immediately with the `purchaserInfo` and the default entitlement shows my previous purchase, with an isActive status of false. I was never presented with the purchase modal. When I `restoreTransactions`, the `purcahserInfo` shows the same, an expired entitlement. Why can’t I re-purchase an expired subscription?
Is there any reason _not_ to call `syncPurchases` on every fresh install? That way if a user has a pre-existing subscription, we’ll know right away.The RevenueCat documentation lists these considerations:https://www.revenuecat.com/docs/restoring-purchases#considerationsBut if the user has an anonymous ID, calling syncSubscriptions will just discard that anonymous ID the user does in fact have a subscription (I believe).I don’t see any downsides to it, but I could be missing something.
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.