Discussion and help from anything related to RevenueCat.
Recently active
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.
Hello - I’ve tried to summarise our problem as concisely as possible below: Problem: How do we understand promotion code redemption & user behaviour using RevenueCat?Context: We recently ran a promotion using codes generated in App Store Connect. Users who redeemed these codes received two months free on our product. The promotion is now complete and we want to understand what behaviour was like for this cohort. e.g. How many of these users continued with us or did they churn? What’s their LTV? etc. Details: Within App Store Connect Reporting we can identify users who redeemed a code and see their ‘Subscriber ID’. Within RevenueCat we then have no method of tying users together i.e. there appears to be no common identifier across the two systems for a given user. Additionally it doesn’t appear that promotion codes sync across the two platforms i.e. when viewing an individual customer in RC, I can’t see within their history if they have utilised a promo code. Any advice appreciated
Hi there,→ I am purchase subscription with app userId 1 and using sandbox id 1→ Now I am log out from the app and login with app userId 2 and using sandbox id 2 with same deviceIn time of second user purchase I am getting [Error: There is already another active subscriber using the same receipt.]. I understood that If I try with same sandbox id then it happens but with different sandbox ids don’t why it’s happen.
Hello RevenueCat Team,I am currently utilizing RevenueCat's webhooks to synchronize purchase events with our backend system, and for the most part, this integration has been successful. However, we've encountered a specific issue with the "TRANSFER" event webhook, which does not seem to trigger as expected.Despite our efforts, the "TRANSFER" event webhook never gets called automatically in our setup. Oddly enough, when I manually initiate a transfer through the RevenueCat dashboard, the webhook does trigger and operates as intended. This discrepancy leads me to wonder if the problem might be related to our reliance on the legacy transfer behavior, specifically the "Share between App User IDs (legacy)" feature.Could this legacy approach be the reason why the "TRANSFER" event is not automatically triggering the webhook? If so, do you have any recommendations on how to resolve this issue or any alternative approaches we should consider to ensure seamless synchronization for transfer event
I have followed this guide:https://www.revenuecat.com/docs/apple-server-notificationsto try and setup the store server notifications, but whenever navigating to App Information > App Store Server Notifications, I do not see this - “App Store Server Notifications” per instruction steps 3 and 4. Am I missing something? I do not see anywhere I could enter the URL.
Hi everyone, I am trying to figure out the best solution to design for my new feature. I want to offer multiple expansion packs that pretty much share the same price, however I would really like to be able to use the entitlements feature to manage user access. My issue is that it seems like products map directly to an entitlement? is there any way for the same product to grant access to different entitlements? What alternatives would I have to avoid having to setup a new product on apple / google app stores and stripe for every single expansion pack?
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.