Get help with your SDK implementation.
Recently active
Hello, I followed step on docs however, I can not get offering and error says: 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-emptyI saw there are many other developers have same issue but no solution. This was the my first time to use revenue cat but I think I will implement my own way because of this issue. Thanks,
Hi all, I have implemented RevenueCat with my expo / react native project however I am running into a reoccurring issue where ‘customerInfo’ is not returning from my Purchases call. I am testing in sandbox and only on IOS (using my iphone on a dev server through expo). Maybe 1 in 20 attempts ‘customerInfo’ is returned from my purchase function. Otherwise the purchase function runs, makes the purchase (I receive all of the typical IOS messages regarding the purchase being successful and can see it listed in my sandbox account on the phone) but the customerInfo object is never returned, and the rest of my code just hangs. I have tested the purchases by removing the async call - obviously not ideal allowing access to the user before the purchase is made, but for testing everything works. The purchase is made and the user is logged in.. so I am not sure why I am not receiving the customerInfo object. Hoping for some assistance or an idea if I am handling the config or purchase incorrectl
Hello, I am currently building my app using Kotlin Multiplatform, and users can select multiple themes within the app. However, the Paywall template I am using seems to default to the system theme.I was wondering if there is a way to programmatically set the theme of the Paywall template. I couldn’t find a way to pass theme information in the Paywall builder. I can create a custom Paywall, but I am not looking to implement that soon as it would be a bit more efforts.Thank you!
Hi, I’m currently integrating RevenueCat into my Android app and encountered some unexpected behavior when handling subscription cancellations. After clicking “Unsubscribe” in the Play Store and then opening my app: • The activeEntitlement.unsubscribeDetectedAt property is returning null.• The activeEntitlement.willRenew property is returning true. I was expecting unsubscribeDetectedAt to indicate when the unsubscription was detected and willRenew to be false since the user unsubscribed. Could you help me understand how these properties are expected to behave in this scenario? Specifically: 1. When should I expect unsubscribeDetectedAt to be populated?2. Why does willRenew remain true even after the user unsubscribes?3. Is there a recommended way to detect unsubscriptions promptly? Any clarification would be greatly appreciated. Thank you!
I know there was a question related to this same issue but I do no see any resolution to it:User pauses subscription - we receive SUBSCRIPTION_PAUSE (OK) End of billing cycle subscription enters paused state on Google Play - we should receive EXPIRATION with reason SUBSCRIPTION_PAUSE as per docs https://www.revenuecat.com/docs/integrations/webhooks/event-types-and-fields#cancellation-and-expiration-reasons but NO event is ever received. (NOT OK) When pause period ends we receive RENEW event (OK)This has been tested on sandbox where the subcription renewals and pause time periods are considerably smaller (for pause we’ve tried 5 minutes, 10 minutes and 15 minutes but no EXPIRATION event)
I am using RevenueCat to manage my Google Play Subscription billing on my Android app. I am NOT using Amazon to make my purchases at all. However, when I start the app, I get logs that points to Amazon purchases:Rejecting re-init on previously-failed class java.lang.Class<com.revenuecat.purchases.amazon.listener.ProductDataResponseListener>: java.lang.NoClassDefFoundError: Failed resolution of: Lcom/amazon/device/iap/PurchasingListener; Caused by: java.lang.ClassNotFoundException: Didn't find class "com.amazon.device.iap.PurchasingListener" on path My confusion here is that I am not using any Amazon-related purchases. In my gradle file, I just have the purchases library and that’s it. When I set the store on RevenueCat configure, I set it to Google Play Store. implementation("com.revenuecat.purchases:purchases:7.0.0")
HiI’m using latest Revenucat iOS SDK v5.7.1 & presenting full PaywallViewController screen using below codelet controller = PaywallViewController(displayCloseButton: true)controller.delegate = selfcontroller.modalPresentationStyle = .fullScreenself.present(controller, animated: true, completion: nil)On implementing above code, Paywall screen shows NavigationBar with white background color, also it shows close (X) button in black color on top right corner on white background navigation bar.Question is1. How can I change white navigation bar color to clearColor &2. How can I change close(x) button color to white color ?
I have one subscription group with four subscriptions Premium YearlyPremium MonthlyBasic YearlyBasic Monthly First when i buy a subscription ( For example: Basic Monthly) then i upgrade to another subscription (Premium Monthly), the webhook sends the event for the product change and renewal. In the webhook, i hit the developer api v2 to check the active entitlements for the user and i get Basic Monthly and Premium Monthly both as active subscriptions. The api only returns one correct entitlement after some delay .The way we have the webhook setup is that we fetch the active entitlements from the revenue cat itself and we sync the data with our own database according to how the docs recommended it but this two entitlements keeps causing issues when we are trying to sync the data. This issue only happens on iOS. Is this a known bug with revenue cat or how can we solve this?
So, this is the workflow for me - on app start I initialise Purchase sdk with anonymous user:Purchases.configure(configuration);Upon successful login, I login - Purchases.logIn(credentials.user.sub);The question is (and I couldn't find it in the docs) - on app restart, will subsequentPurchases.configure(configuration);overwrite legit user back to anonymous ?User session is long lived, so there will be no login flow on app restart, and I'm wondering will .configure(configuration) respect existing user id (considering logout wasn't called)?
I am a little lost here and could use some pointers/help. I have a Flutter application which has Ads in it. I have no concept of a “user” in my app. I would like to add the ability to remove Ads. I created all the required store setup for both Google and Android. I’ve added a button in my app to purchase the product I setup (I have only the one product) to remove Ads. This all works as expected on both Android and iOS. I need to implement the “restore” capability in my app per the Apple App Store requirements. I have questions as I can’t seem to figure out exactly how to do this.Since I use anonymous accounts wouldn’t the user, upon removal of the app and reinstallation get a new anonymous ID? If so, how does the system know they already purchased my product? How is this done typically, should I show both a Purchase and a Restore option in the app? Seems like there should be a way to ‘detect’ that the user already made a purchase and if so provide the ‘restore’ option...and if
I would like to set a custom attribute with a string I get from UserDefaults().This will NOT set the custom attribute:let cam = UserDefaults.standard.string(forKey: "cam")!Purchases.shared.attribution.setAttributes(["cam": cam])This will set the custom attribute:Purchases.shared.attribution.setAttributes(["cam": "abc"])let cam = "abc"Purchases.shared.attribution.setAttributes(["cam": cam])let cam = UserDefaults.standard.string(forKey: "cam")!Purchases.shared.attribution.setAttributes(["cam": "abc"])Purchases.shared.attribution.setAttributes(["cam": cam])UserDefaults combined with setting the attribute through a variable will not work, except if the attribute is previously set using a literal string (last example).What do I miss here?Is it a bug?Is it Swift or RC related?
Hello,I’m setting up a subscription with 7 days free trial & 1 year period on Android & iOS, using Flutter SDK. I want to show on the UI wether the subscription is:not subscribed in trial (& active) active cancelled (& active) expiredAll states work except cancelled (when the subscription is still active but won’t renew). Upon my app startup, I call this code: Purchases.invalidateCustomerInfoCache(); _customerInfo = await Purchases.getCustomerInfo(); Even though RC’s debug logs print “😻 CustomerInfo updated from network.”, I still get cached entitlements whose “willRenew” field is always true.I added an overflow menu action to execute this code whenever I want to see if calling it multiple times works (as I read here & there on the forum), it doesn’t.The only way to get an up to date information is to call Purchases.restorePurchases(), but this shall only be called upon user request.Is there a way to get up to date CustomerInfo upon app startup?
I downloaded the subscription key for an in-app purchase from Apple into a file named 'SubscriptionKey_5S5U32JN84.p8' However, when I try to upload this file I get this error: “Invalid file name, it should be SubscriptionKey_XXXXXXXXXX.p8. A file name with any other prefix could be a private key for a different Apple service. Please validate you are uploading a Subscription Key.“ I also tried renaming the file to ‘SubscriptionKey_XXXXXXXXXX.p8’ but got the same error. What am I missing?
Hello, my user flow is like this:- user purchases subscription (not logging in with Purchases.logIn() )→ Revenuecat generates an anonymous id → INITIAL_PURCHASE event is triggered- after purchase: the user logs in with Firebase auth (logging in with Purchases.logIn() after account creation) → No event triggerI’m grating users credits on INITIAL_PURCHASE. My issue is now that there is no event triggered when logging in with custom app user id. I don’t have any reference to between the anonymous id and custom user id. Is there any way to get aliases with the custom user id as a query from the backend, or am I missing something?
As part of this guide, when I try to upload the p8 file I see this error: "Invalid file name, it should be SubscriptionKey_XXXXXXXXXX.p8. A file name with any other prefix could be a private key for a different Apple service. Please validate you are uploading a Subscription Key." The file I downloaded from App Store Connect is called “AuthKey_XXXXXXX.p8”. Am I supposed to manually rename it or have I downloaded the wrong file?
So. My app is almost ready to be submitted. Everything is working as expected and I'm busy doing screenshots and stuff. But there is one question I can't find an answer to - how subscriptions are being tested when reviewed? From what I see testing from TestFlight is unreliable and is a weird mix of sandbox and prod - I never made it work (and documentation says it's completely fine as long as things work in sandbox, which they do perfectly).Now, I use auth0's passwordless authentication with one-time passwords, so I can't "prepare" a specifc user with valid subscriptions upfront for the reviewers, they will be using their temporary emails.Will they be able to test subscriptions? How that works? I also can just disable subscription checking via my backend, so it will work on reviewers side anyway, but wouldn't it be considered as a some sort of tampering with the reviewing process?
We have a Flutter web app (not mobile). Our payment provider is Stripe. Does the RevenueCat SDK support Flutter web?
Hi,I am developing an app for Android using Flutter and I am trying your awesome service!!All is working fine by now, but the refund operation. I explaining what I did till now:I have purchased successfully a non-cosumable (life time) with my testing account. This is working fine also when restarting the app without internet active also after hours, meaning the cache does the job.Then I refunded the account in Google Play console and waited till it was successfuly refunded.Starting the app the entitlement is still active. At start I check this using:PurchaserInfo purchaserInfo = await Purchases.getPurchaserInfo();purchaserInfo.entitlements.all['myLifeTimeEntitlement']?.isActive <== this is trueBasically I have the same issue described in this post:https://community.revenuecat.com/topic/show?tid=326&fid=7I read somewhere that the SDK cache is refreshed about every 5 minutes. Thinking about this, I found:await Purchases.invalidatePurchaserInfoCache();which is not recommended. Any
Not sure if bug or intended, but I noticed that after paywall is triggered by RevenueCatUI.presentPaywallIfNeeded() and user presses "Restore" (they have no subscription to restore) and then dismiss the paywall, RevenueCatUI.presentPaywallIfNeeded() returns PAYWALL_RESULT.RESTORED (in the jsdoc it says that this will be return if successful restore happened, but this is not the case).The problem is that I can't rely on PAYWALL_RESULT.RESTORED in my code.Any ideas?
Is there a way to generate the same Customer Portal link (the one outlined here https://www.revenuecat.com/docs/web/revenuecat-billing/customer-portal) for a user that is sent to them in their invoice?
I’m having issues with a lifetime product I’m trying to setup here. This is my configuration:However, the returned `currentPrice` shows `null`:I don’t see any other way to retrieve the prices using the API either. Am I missing something here?
I want to support multiple subscription tiers (silver, gold, ...) for my Android App. The subscriptions grant a monthly token quotum, consumed by using the apps features. Different tiers grant different quota. I use the RevenueCat Paywall.I have set up the different subscription tiers each with their own entitlement and currently have a single offering for all tiers.I want customers to have only one subscription at a time, but have the ability to upgrade/downgrade the subscription tier. How would I implement that?
Hello RevenueCat Community,I’ve been using RevenueCat SDK 7.28.1 for several months with a single "Pro" plan, and everything worked fine. Recently, I added a new "Collaborator" plan within the same offering (premium_access). However, adding this new plan has introduced numerous issues, and I’m now struggling to get everything working as intended.Offering StructureHere’s the structure of my offerings:Each plan includes three products, and they are all grouped within the same premium_access offering, as users cannot be subscribed to both plans at the same time.JSON Structure Returned by RevenueCatAfter extensive testing, I’ve identified the JSON structure RevenueCat is returning when I fetch offerings. Here’s a simplified version that includes the full detail of colab_monthly:{ "offerings": { "serverDescription": "Unlimited access to all premium features for a monthly/annual price", "metadata": {}, "monthly": { "offeringIdentifier": "premium_access", "product": { "identifier": "com.myapp
Error enumerating unfinished transactions for first transaction listener: Error Domain=ASDErrorDomain Code=500 "(null)" UserInfo={client-environment-type=Sandbox, storefront-country-code=GBR, NSUnderlyingError=0x600000c02dc0 {Error Domain=AMSErrorDomain Code=2 "Finance Authentication Error" UserInfo={NSLocalizedDescription=Finance Authentication Error, AMSURL=https://mzstorekit-sb.itunes.apple.com/inApps/v1/history?guid=7666DF87F208&reason=initial, AMSStatusCode=401, NSLocalizedFailureReason=No delegate to perform authentication: <AMSAuthenticateRequest: 0x600000c0f4b0> { account = jerichomiles6@gmail.com (78985344-F6FD-42AD-BCEB-DF36B39D9837), logKey = 1379CD2F, options = <AMSAuthenticateOptions: 0x600003b408c0> { AMSAuthenticateOptionsAllowPasswordGeneration = 0, AMSAuthenticateOptionsAllowSecondaryCredentialSource = 0, AMSAuthenticateOptionsAllowServerDialogs = 0, AMSAuthenticateOptionsAuthenticationTypeKey = 1, AMSAuthenticateOptionsCanMakeAccountActiveKey =
I am using RevenueCat in my React Native app. I have a subscription and I use getCustomerInfo to keep track of subscription status. When the subscription is purchased, getCustomerInfo’s activeSubscription property lets me know that it’s been purchased and I can let the customer know the same. But when the subscription is cancelled, activeSubscription still shows active until the subscription finally expires (in real life this would be month but in my case, it’s 5 mins). As a result, I’m not able to let the user know they’re subscription has been cancelled when they cancel (I have to wait till it expires). I have also checked out the willRenew and unsubscribeAt properties of getCustomerInfo.entitlements but they show the same behaviour. I also tried out addCustomerInfoUpdateListener instead of getCustomerInfo and it also shows the same behaviour.
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.