Get help with your SDK implementation.
Recently active
Hi all,I'm building a macOS app with some renewable subscriptions.Everything is working fine when testing within Xcode on my mac, but now I have uploaded my macOS app to TestFlight, I see that the offerings are not working.If I inspect my network traffic with Proxyman, I do see that the app is trying to get the data, but the response is empty (or it says "invalid json").Any idea what might causing this?Kind regards,Frederik
I understand that the CustomerInfo data is cached for 5 minutes, and is cleared when an actual In App Purchase is made, so the user gains access to any new entitlements immediately, however I’d like to know if there’s a way to explicitly clear this cache when working with Stripe checkouts. Here’s my scenario:User is makes a purchase via Stripe for a product that is registered in RevenueCat. RevenueCat is informed of that purchase from my server using your Receipts API, and the users’ Customer ID is passed in. In the app, I call `Purchases.getCustomerInfo`, however because of the cached nature of this call, the user typically gets no new results. ← This behavior is jarring to the user, and I’m hoping there’s a way I can improve it I have verified that after the cache expires (on average, 2.5 minutes), that call successfully loads the new data asynchronously, so I am confident that this is due to the caching I understand the need for the caching, and how it can impact your servers - I’m
I am struggling to find documentation regarding how to best display what the user has purchased. I was hoping that the active entitlement has all the information but it is not for user display. There is an identifier, productIdentifier, and productPlanIdentifier. How do I take these and display user friendly information regarding the purchase. My requirement is to build a simple Subscriptions screen in the app that would resemble what the native OS shows. I would like to show what product was purchased at what price back then.The main goal here is to show as of the time of purchase. Meaning I might already change my offerings in the future but this should not affect the users who made purchases from previous offerings. I would like to make sure the information still shows even if the product, offer, or entitlement is not active anymore.What is the best way to do this?
I’m upgrading an old project (Ionic with Capacitor 5) from cordova-plugin-purchases 2.3.2 to the latest 3.13.0. I’m calling configureWith using a valid API key and user id, and 10 seconds later, I call getOfferings() and get a fatal error in xcode:PurchasesHybridCommon/CommonFunctionality.swift:21: Fatal error: Purchases has not been configured. Please configure the SDK before calling this methodUPDATE: I should have read the configureWith docs more carefully - I was calling it in the same style as Purchases.configure(apiKey, appUserId). Changing it Purchases.configureWith({apiKey, appUserId}) solves the problem! Leaving this here in case anyone else makes the same mistake. 🤦🙂
WARN: 🍎‼️ Unable to load receipt, ensure you are logged in to a valid Apple account.Error: Error Domain=NSCocoaErrorDomain Code=260 "The file “sandboxReceipt” couldn’t be opened because there is no such file." UserInfo={NSFilePath=/private/var/mobile/Containers/Data/Application/F54CAA91-D67A-404A-9ED*-1D3180B2F577/StoreKit/sandboxReceipt, NSUnderlyingError=0x282eb8de0 {Error Domain=NSPOSIXErrorDomain Code=2 "No such file or directory"}} Anyone able to to help me with this error please?
Is there a simple way to mock RevenueCat to return hardcoded responses for unit testing purposes? One option is to use the StoreKit Testing framework, but then RC still makes an outbound server call for every request which goes deeper than I'd like to for unit testing purposes.
After an apple subscription has expired, the iOS user can go to subscriptions and resubscribe there in the OS without going into the application directly. This usually takes a few seconds to complete, since immediately after resubscribe when going into the application the customerInfo() still does not show any active entitlement until after about ~30s.During those 30s the application will show a subscribe screen. What happens if the user tries to make another purchase in the app during those 30s (either same product or a different one)? Will they get double charged and how would the developer know?I am not sure if this is the same situation on Android yet.
Hello, I am getting the following crash regarding purchases I have upgraded to Google BillingClient 6.0.1 and 'com.revenuecat.purchases:purchases:7.0.0' Any advice
I use expo 49.0.18 and 7.3.0 react-native-purchases.I building my project with eas.I got an error when uploading my aab to the PlayStore, about the Play Billing version 4.0.0 that is not supported anymore. I don’t really understand how can I upgrade this dependency
Should I use the main app’s bundle identifier, or should I create a new app in revenue cat in the same project with the watchkitapp identifier?
Hello,I had to update the SDK to v4.0.0 after Google Play updated their library and now I get the following error from Cordova:> Task :app:checkDebugAarMetadata FAILED Any suggestions how to solve this?
apple, I can receive notification of renewal, but there is no notification of unsubscription
Sorry if this has been answered elsewhere but we couldn’t find any information - hopefully someone can point us in the right direction.We have 2 subscriptions set up in our Google Play Console, each with their own set of offers, and different pricing. Let’s call them SubscriptionA and SubscriptionB - the latter being a “higher tier” subscription (which gives access to more app features etc...).Our users can purchase either of these subscriptions directly, however if they purchase SubscriptionA, first, we allow them to upgrade to SubscriptionB at any point. We have so far done it using the purchasePackage method, like so:Purchases.purchasePackage(package, undefined, { oldProductIdentifier, prorationMode: PRORATION_MODE.IMMEDIATE_AND_CHARGE_PRORATED_PRICE,});This would result in the user being charged the relevant pro-rated price, and the existing SubscriptionA switching to SubscriptionB. This works correctly, as expected.However we are now facing an issue as we have an upcoming promo
Hey all, We’ve got a unique use case for a subscription mobile product (Android & iOS) that is made for households. We want one member to be able to purchase a membership that is then made available to everyone in their household. We cannot fully rely on iCloud Family Sharing because it doesn’t apply to Android devices.We could keep the member’s subscription status in our database and then check if anyone in the household has an active subscription, but I wondered if RevenueCat has a feature that would work for us built in?Anyone tried to solve this before?
Hey RC folks! 👋🏻I’m trying to determine after a purchase is made whether or not the purchase was a trial or not. I’m using `try await Purchases.shared.purchase(product: storeProduct)` to make the purchase. My initial solution was to iterate through the active entitlements i.e `results.customerInfo.entitlements.active` and try to see if there was a trial, but I was wondering if there’s a more elegant way to do so?Thanks in advance!
On my app, users can log in anonymously ( a skip button) or with a full account. Some users due to perhaps not using the app for a long time, have to resign in, but have a tendancy to “skip” when they come back. This triggers a transfer of their purchase to the new anonymous account.It would be great to have a button in the revenue cat panel to undo a transfer or an endpoint I could ping to do so or a way to prevent transfers to certain users.
Hello, My Paywall created a successful subscription with Sandbox account earlier in the day, but now on “Subscribe”, I am getting prompted for AppleID and password and after successful log in and bell sound that indicates purchase was successful, I am back on the login screen, without new subscription purchase on the Sandbox dashboard.
Hello, In the latest SDK 7.1.0, how can I obtain the days of a free trial? Currently I’m hardcoding it like this to “3 Days Free Trial”: private fun fillTrialOrNormal(it: Package) { if (isAdded) { val hasFreeTrial = it.product.subscriptionOptions?.freeTrial != null Utilities().checkTrialUsedUp(it.product.id, hasFreeTrial) { trialUsedUp -> val title: String val header: String if (trialUsedUp) { title = "${it.product.price.formatted} / Year" header = getString(R.string.upgrade_to_premium) binding.premiumTextId.text = header } else { title = "Start Your 3 Days Free Trial,\nThen ${it.product.price.formatted} / Year" } binding.trialPurchaseButtonId.text = title binding.trialPurchaseButtonId.isEnabled = true } }}Many Thanks
Hello, I have a offering where I put a custom description - Annual package with 7 day free trialAnd then I added DisplayName for product as well Monthly package itemNone of these fields were reflected in my api call, here is what I got instead: { "packageType": "MONTHLY", "product": { "title": "Pro Monthly", "identifier": "pro_monthly", "currencyCode": "GBP", "discounts": [], "productType": "NON_CONSUMABLE", "description": "Monthly subscription to access pro features", "priceString": "£14.99", "subscriptionPeriod": "P1M", "productCategory": "SUBSCRIPTION", "price": 14.99, "introPrice": null }, "identifier": "$rc_monthly", "offeringIdentifier": "default" },Why is all of my custom data missing from this product?To make it more confusing this product has a description:Monthly subscription to access pro featuresYet in the dashboard description isn’t even included as a option that you
I’m writing in Swift. Revenue Cat is up to date. When I chose one of my products I get Error Code 15. ERROR: 💰 Product purchase for 'XXXX.XXXXXX.XXXXXX' failed with error: Error Domain=RevenueCat.ErrorCode Code=15 "The operation is already in progress for this product."But of course I only pressed the button once. It displays a Notification to the users showing the error code. Moments later Apple’s Purchase view slides up and it all works correctly. I am still in sandbox and I’m wondering if this is just a sandbox issue. But I don’t want to send this error to production to confuse my users OR even worse, get my update rejected by Apple.Any help would be appreciated. My other products work fine. And I have tried deleting and remaking EVERYTHING surrounding this product/subscription. The error remaines. Also when RC is initiated, in the console, I get this error: “ERROR: Unabled to parse response to create subscription request”Again, I don’t know why this is happening. Everything see
This is the error I’m getting. Is there way to fix it somehow? [Purchases] - ERROR: 💰 Product purchase for 'mw_999_1y_2w0' failed with error: Error Domain=RevenueCat.ErrorCode Code=16 "There was an unknown backend error. Error creating subscriber alias. Alias limit reached. (7255)" UserInfo={NSLocalizedDescription=There was an unknown backend error. Error creating subscriber alias. Alias limit reached. (7255), NSUnderlyingError=0x283f72e20 {Error Domain=RevenueCat.BackendErrorCode Code=-1 "Error creating subscriber alias. Alias limit reached. (7255)" UserInfo={NSLocalizedDescription=Error creating subscriber alias. Alias limit reached. (7255), rc_backend_error_code=7255}}, rc_backend_error_code=7255, readable_error_code=UNKNOWN_BACKEND_ERROR, rc_response_status_code=400, source_function=convertUnsuccessfulResponseToError(), source_file=RevenueCat/HTTPClient.swift:410} thanks
The StoreProduct class in the RevenueCat package (purchases_flutter) contains information about purchasable items, such as subscription details, pricing, and currency. For a typical paywall implementation, one needs to derive various display strings from this class, such as:Monthly price conversion Combined period and monthly price (e.g., "$69.99/yr ($5.83/mo)") Subscription period in full text ("Annual" / "Monthly") Subscription period in short form ("yr" / "mo")...among others. Considering that such functionality is universally needed, I'm pondering the best way to implement these derived calculations.Option 1: Utility FunctionsWrite individual functions within a Utils class.Pro: Centralized location for all related functions.Con: Potential clutter with a Utils class filled with numerous functions.Option 2: Class ExtensionsCreate an extension on StoreProduct to include getters for each needed calculation.Pro: Elegant and intuitive usage (e.g., myProduct.monthlyPrice).Con: Overloads t
The documentation clearly states that to use only custom App User ID, we just need to configure the SDK with a custom app user id. Never calling logout. But my question is tied to multiple users using the same application on same device: do we need to call login() to be safe or anything special when the app authenticates a different user in? This seems to talk about this but not sure when it says login just means actually login()?Also is it ok to configure the SDK much further down in a user flow where only purchases are needed? Say when they navigate to settings->purchases. This way when starting the app (even if user is logged in) we will not configure. This way it will ensure that anonymous IDs will never be created. I am just not sure if this is ok to call configure each time a screen open and if there is any performance impact..
Apologies in advance, this topic is slightly confusing to me. I’ll explain my scenario and what I would expect. This is all in the Sand Box at the moment. Not sure if that makes a difference. When a User A signs up and subscribes, they get 20 credits a month on my app (reloaded at renewal) for X dollars/mo.If a User A signs out, and then User B signs up and subscribes, I want User A to keep their subscription active on the device, and User B as well. When I try “Keep with original App User ID”, I get an error with User B subscribing. I would expect that this new userID is separate from User A’s. But I get the error: “There is already another active subscriber using the same receipt.”I don’t want to transfer the subscription because I want User A and User B to have to purchase.
Hello,In our Firebase Crashlytics reports, we have noticed a recurring exception being faced by our users related to in-app billing.This issue has 37,775 crash events affecting 1,549 usersHere are the error details:Fatal Exception: java.lang.IllegalStateException: Too many bind requests(999+) for service Intent { act=com.android.vending.billing.InAppBillingService.BIND pkg=com.android.vending cmp=com.android.vending/com.google.android.finsky.billing.iab.InAppBillingService (has extras) } at android.app.ContextImpl.bindServiceCommon(ContextImpl.java:2115) at android.app.ContextImpl.bindService(ContextImpl.java:2024) at android.content.ContextWrapper.bindService(ContextWrapper.java:870) at com.android.billingclient.api.BillingClientImpl.launchBillingFlow(com.android.billingclient:billing@@5.1.0:52) at com.revenuecat.purchases.google.BillingWrapper.startConnection(BillingWrapper.kt:122) at com.revenuecat.purchases.google.BillingWrapper.startConnectionOn
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.