Get help with your SDK implementation.
Recently active
I’m building frontend logic to either:Show eligible users an offer with a 3-day free trial (a promotional offer) Show ineligible users a paywall without the trial offer.I know that checkTrialOrIntroDiscountEligibility exists for ios. But there isn’t a similar function for android devices. So I’m trying to build a workaround with allPurchasedProductIdentifiers in the CustomerInfo object. My question: I’m wondering if free trials and introductory offers are added to the allPurchasedProductIdentifiers array when the trial starts. If so, then I can simply check to see if the length of allPurchasedProductIdentifiers to determine which offer to display. If not, are free trials and introductory offers recorded somewhere else that I can check on android?
Hi,I am working on an app that doesn’t have user account management and is already integrated with RevenueCat for some existing features. We’re introducing a new feature where users can purchase digital stickers.There are thousands of sticker packs, and new ones are added regularly. Therefore, creating individual products for each sticker pack isn’t practical. Instead, we’ve categorized the stickers into pricing tiers: for example, product_sticker_tier_1 and product_sticker_tier_2, which are set up as consumables on Google Play and the App Store. Each sticker is associated with a unique ID, such as:sticker_a: associated with sticker_tier_1 sticker_b: associated with sticker_tier_1 sticker_c: associated with sticker_tier_2When a sticker is purchased, the app must send an API request to our backend to deliver the sticker to the user. However, I need to ensure that the server can validate whether a user (identified only by an anonymous ID) has purchased the corresponding sticker before al
purchases_flutter: ^8.3.2purchases_ui_flutter: ^8.3.2 When I configure RevenueCat using PurchaseConfiguration(“key"), the application’s back button handling is overridden and stops working. When I press the device back button from navigation or even use the back gesture, I get the following log in the console. D/RevenueCatUI(21343): Paywalls: Close paywall initiated
Hi everyone,I am encountering an issue (which I should have tackled a long time ago) with a limited number of users. In my apps, I usually set the RevenueCat App User ID to the Firebase notification token that is received from Firebase. I noticed a few users having their subscription expired on a User ID, only for it to be transferred over to a different User ID, only to then be transferred back to the old User ID (so it would expire on the new user ID), and the cycle keeps on going. These are users with more than one device, who are buying on one device, and restoring on a second device.According to https://www.revenuecat.com/docs/getting-started/restoring-purchases,“For example, if UserA buys a subscription, then UserB logs into your app on the same device and restores transactions, UserB would now have access to the subscription and it would be revoked from UserA.”This explains the behaviour I am seeing, but I found it to be unexpected, since I would expect the subscription to be l
Hello everybody,After the incident of a few days ago where RevenueCat was not accessible in China, we have deployed the recommended fix as quickly as possible, however it doesn’t seem to be working.We keep receiving messages from users that they cannot access paid features nor see the paywall because of a “network error”. Our error reporting tool logs error related to the SSL verification:Error Domain=RevenueCat.ErrorCode Code=10 "A network error has occurred. 请求超时。" UserInfo={source_function=init(_:dnsChecker:), NSLocalizedDescription=A network error has occurred. 请求超时。, NSUnderlyingError=0x300e8b120 {Error Domain=NSURLErrorDomain Code=-1001 "请求超时。" UserInfo={_kCFStreamErrorCodeKey=-2103, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <8F169AC4-0EF6-4C8D-85B4-001912B77290>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=( "LocalDataTask <8F169AC4-0EF6-4C8D-85B4-001912B77290>.<1>"), NSLocalizedDescription=请求超时。, NSErrorFailingURLStringKey=https://api.re
What is the difference between using a delegate (used in the Magic Weather sample app), vs calling Purchases.shared.getCustomerInfo or Purchases.shared.customerInfo() as shown here? Should you use both at the same time, or only one per project?
Hi team,Is there a way for us to get access to the underlying `appAccountToken` of a transaction?It looks like the SDK always adds it when a StoreKit2 product is purchased, but so far it seems the id is only available in the Purchase method callback, specifically as part of the StoreKit2 transaction itself.it would save us a significant amount of work if `appAccountToken` was available in `CustomerInfo` (in our specific case, for `NonSubscriptionTransactions` if it makes any difference).Thanks in advance!
On test subscription phase, Does RevenueCat send events on first subscription expire and then for renewal? I'm worried because is there any time window between expiration and renewal when user will loose premium access temporarily?I have a subscription plan on Google Play console with auto-renewal on. However, infrequently I see the paywall is prompted on my app (which I’m triggering when isActive is false) and when I try to re-subscribe, it says subscription is already active. I'm suspecting this is due to the expiry (which starts my Paywall fragment) and later renewal event, which restores the subscription.What could be possibly done to avoid this? I also have grace period enabled, though I’m not handling it anywhere in the code to check subscription status. Is this could be a test subscription quirk?
with expo sdk52, "react-native-purchases": "^8.5.0", pod install --repo-updateI had this error message[!] CDN: trunk URL couldn't be downloaded: https://cdn.cocoapods.org/Specs/9/a/d/PurchasesHybridCommon/13.15.0/PurchasesHybridCommon.podspec.json Response: Error in the HTTP2 framing layerfixed it by updating cocoapods :CocoaPods 1.16.1 is available.`sudo gem install cocoapods`Et voilà ;)
I have a question about initializing the Purchases SDK, based on the following points from the docs:If no App User ID is provided, RevenueCat will generate a random App User ID and cache it on the device. The SDK should generally be configured early in the app lifecycle.Many apps allow users to purchase subscriptions before creating an account. This reduces friction between opening the app and making a payment.But, this means that I'll need to instantiate the Purchases SDK before receiving a User ID from my authentication system. This results in the creation of an anonymous RevenueCat ID for everyone who opens the app, even if they don’t create an account or make a purchase. Assuming a typical conversion rate (e.g., 5%), this would mean that 95% of the users in my RevenueCat dashboard are likely people who opened the app once and then deleted it, which seems highly inefficient. Is there a more efficient way to handle this situation without generating so many unused anonymous users?Than
I have a paywall with weekly/monthly/annual and lifetime. Lifetime has been translated to “Durée de vie” which is obviously Google Translate / ChatGPT at work because it means “duration of life / life expectancy”, aka “life time” in a literal way. How to change the wording to “À vie” or “Achat permanent”?
I have a question regarding a RENEWAL event. Specifically, for Android, when the webhook receives a type=RENEWAL, when should we process it and consider it a real resume of subscription to where entitlements should be granted? Currently according to the documentation this RENEWAL event should only happen after a SUBSCRIPTION_PAUSED event for Android. Is this correct or can the previous event be of another type? if so, what other types should be supported.Specific example app user ID: JNhjegTrnBTZIbsYLzZkHPmroOl1Firstly, Customer History does not even show an event that happened today for RENEWAL:But as you can see from my database of logs for each webhook event I got this: Second, is this order expected? After Expiration we would get a renewal or an initial?Should we proceed with granting entitlements?
I'm using RevenueCat's fetchOfferings to retrieve subscription details for my app. While it successfully fetches the description of the subscription products I created in the Google Play Console, it does not retrieve the benefits that I added when setting them up.Here is an example of the output returned by fetchOfferings:{ "monthly_plans": [ { "offeringIdentifier": "test", "product": { "presentedOfferingIdentifier": "test", "subscriptionOptions": [ { "presentedOfferingContext": { "placementIdentifier": null, "targetingContext": null, "offeringIdentifier": "test" }, "introPhase": null, "freePhase": null, "isPrepaid": false, "presentedOfferingIdentifier": "test", "fullPricePhase": { "offerPaymentMode": null, "billingCycleCount": 0, "price": { "currencyCode": "INR", "amountMicros": 300000000, "formatted": "₹300.00" }, "recurrenceMode": 1, "billingPeriod": {
Its Possible usage an Sandbox in Flutter? Having to send it to closed testing every time takes a long time to develop
I have set up various products on play store and am able to fetch them successful via the Purchases.sharedInstance.getOfferingsWith function. Some of my products have introductory pricing and/or free trials. I have tried testing this functionality and it seems to work. The problem I am running into now is if I have a user that has made use of the free trial or intro pricing for the subscription, cancels the subscription, and then wants to resubscribe I don’t appear to have a way to tell that the user is not longer eligible for intro pricing or free trials. The only way to tell is only after the user has started to go through the play store billing flow, but I need to display the correct information about the product in my app’s UI.
I see that RC’s StoreKit 2 beta is hopefully (!) coming soon. Will this support the appAccountToken on the StoreKit transaction?
Hey everbody i got some issue. The problem is “Purchases.configure is not a function (it is undefined)] [Component Stack]”. I am using like this but this func returned how can i fix that ? I’am using expo@52
Hi team,We would like to ask for clarification on finishing transactions for consumables on iOS.RevenueCat currently finishes transactions automatically. It is left to integrators to ensure the purchase is honoured, for example through CustomerInfo.This is in direct contradiction to Apple’s guidelines, which state that the transaction should only be finished if all content has been delivered to the user first.As of this writing, and iOS SDK 5.14.4, it is our understanding that any app using RC for non-subscriptions is likely in violation of Apple guidelines.I wonder if something like a flag passed by integrators that influences the shouldFinish logic might solve this by ensuring we have provided users with the corresponding content?As a follow-up topic, with more and more apps offering a mix of renewing subscriptions, consumables, non-consumable, and non-renewing subscriptions, I second some of RC’s staff comments on the PR thread that more granular access may be provided in the futur
This issue happens when i do the following:Create an anonymous account with firebase Login with revenuecat with the newly created firebase account id Purchase a subscription Then upgrade the account from anonymous to email & afterwards logout ( I am logging out revenue cat with Pruchaseses.logOut() as well as fibrease sign out Now when trying to purchase a new anonymous account gets created and the new id is also firstly being set with Puchases.logIn(). When trying to purchase a package google play shows me an error dialog with error “PG-GEMF-01”. From the logs I can see the following: 🤖‼️ BillingWrapper purchases failed to update: DebugMessage: Account identifiers don't match the previous subscription.. ErrorCode: DEVELOPER_ERROR.null🤖‼️ PurchasesError(code=PurchaseInvalidError, underlyingErrorMessage=Error updating purchases. DebugMessage: Account identifiers don't match the previous subscription.. ErrorCode: DEVELOPER_ERROR., message='One or more of the arguments provided are
Hi All, I’m encountering this error, while attempting to test an in-app purchase in sandbox environment: 😿‼️ The receipt is not valid.API request failed: POST /v1/receipts: The receipt is not valid.I’m aware others have encountered this issue before and that the problem was on Apple’s side. Anybody else encountering the same issue now? It seems not working since last evening. Could it be a problem from my side?I’m wondering what should I do? Should I just wait? Salvo
I can’t seem to find my flaw that just happened documented (looked here). What I think I have happened in production is this flow, but data tells a slight different story.The revenue cat dashboard for the customer has this order of events:But the events that came via the webhook are in this order:These 2 don’t seem to match exactly. How do I tell what happened and if the customer should or not have entitlements at the moment?Also this means that after an EXPIRATION event, it is possible to receive a RENEWAL event for Play Store as well? The documentation seems to say that this is only for iOS and that Google will always send INITIAL_PURCHASE after an EXPIRATION happened (documented here).Should I always grant back entitlements to a user when I received a RENEWAL regardless of anything else?
How can ı. get order id in flutter for android
Recently I uploaded a new android app under different package name, from com.name.app to com.name. I have uploaded the new bundle to Play Store and changing it on RevenueCat dashboard, however when fetching the offerings using RevenueCat SDK, the old package can still get the offerings whereas the new package doesn’t. Am I missing a step here?
Hey guys,I have only one offering and one paywall, when launching the paywall on ios, it is working well and the ui matched the paywall, but on Anroid the packages and prices are fetched well but, the paywall ui is really than on only paywall I’m using this for android:implementation 'com.revenuecat.purchases:purchases:7.1.0'implementation 'com.revenuecat.purchases:purchases-ui:7.1.0' private lateinit var paywallLauncher: PaywallActivityLauncherpaywallLauncher = PaywallActivityLauncher(this, object : PaywallResultHandler {override fun onActivityResult(result: PaywallResult) { fun showPaywall() {paywallLauncher.launch()} Any help?Thanks!
Presenting paywall manually so can hide the close button. PaywallView(displayCloseButton: false)i just can’t find any documentation regarding this in the SDK. specifically its modifiers such as .onRestoreCompletedcurrently in the code block after restore I dismiss the paywall. Unfortunately the restore is successful if user made a legacy purchase. App has moved to subscription so legacy purchases need to be ignored and prevent from dismissing paywall. Only the subscription purchases should dismiss. please help me locate the documentation for .onRestoreCompleted View modifier
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.