Get help with your SDK implementation.
Recently active
I want to switch to Android Billing Library 6. Currently I am using purchases_flutter: ^4.11.0. Everything is working fine as i want. But when i try to update it to purchases_flutter: ^6.0.0 then app got crashes at start. I don’t see any error or info in console. Help me
I am using purchases_flutter: ^8.1.1 and purchases_ui_flutter: ^8.1.1 with the Template 4 - Persian Content for purchases_ui_flutter.I am testing on a real device.Flutter (Channel stable, 3.24.2, on macOS 13.6.4 22G513 darwin-x64, locale en-GB)The Template 4 - Persian Content paywall used to pop up fine on my device and working well on my android device with the offers showing fine. However, for the first test purchase I clicked the restore button in the paywall to test it out (out of curiousity) without first subscribing and it showed a message in the debug console suggesting that the restore was somehow successful. After that, whenever i call: await RevenueCatUI.presentPaywall(); it shows the following error and: E/RevenueCatUI(23306): Paywall transitioned to error state: myAppPurchaseLogic is null, but is required when purchases.purchasesAreCompletedBy is .MY_APP. App purchases will not be successful.W/RevenueCatUI(23306): Could not process value for variable 'sub_offer_duration
Hello,I am not able to build with the @revenuecat/purchases-capacitor module. Without this module, the build works. If anyone has any suggestions to help me, I would be very grateful, as I have been trying to resolve this for several days now...I have tried:deleting the node_modules folder, then deleting package-lock.json, then npm install, npx cap sync ios deleting the derived-data folder in XCode and using “clean build folder” (many times) pod deintegrate, pod update, pod install from the /iOS/App folder pod repo update from the /iOS/App folder reverting to version 8.0.0 of @revenuecat/purchases-capacitor checking that there is no mention of swift_version in my podfile adding a single, empty Swift file to the project. going to Build Settings, looking for Library Search Paths, and adding $(SDKROOT)/usr/lib/swift as the first item on the list.I haven't tried deleting the entire iOS folder, and I would like to avoid going that far... Notes:Swift Language Version is set to 5 In-App Purch
I use "react-native-purchases": "^7.26.2" for appstore in-app-purchase. when notication come to banckend, I record every transation log, my all transation on my backend db are in Sandbox environment. like this: {"event":{"event_timestamp_ms":1725398372013,"product_id":"ios_scitudy_gold_annually","period_type":"NORMAL","purchased_at_ms":1725398365000,"expiration_at_ms":1725401965000,"environment":"SANDBOX","entitlement_id":null,"entitlement_ids":["paid-translation","AI-calling"],"presented_offering_id":"ios_scitudy_gold_annually","transaction_id":"2000000704057882","original_transaction_id":"2000000703575553","is_family_share":false,"country_code":"VN","app_user_id":"$RCAnonymousID:8a36f2d9967e4105866b57d7cbd38759","aliases":["$RCAnonymousID:8a36f2d9967e4105866b57d7cbd38759"],"original_app_user_id":"$RCAnonymousID:8a36f2d9967e4105866b57d7cbd38759","currency":"VND","is_trial_conversion":false,"price":32.121,"price_in_purchased_currency":799000,"subscriber_attributes":{"$attConsentStatus"
Added the revenuecat package to unity. No ‘purchases’ objects in scenes yet. Building for iOS and then building from XCode yields this error
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,I’m currently working on a Flutter app, available on Android, iOS, macOS, Windows and soon Linux.Unfortunately, RevenueCat is not yet available for Windows and Linux, which is a shame because RevenueCat is really helpful when it comes to implementing purchases in a Flutter app.Is there any ETA for the support of Windows and Linux for the RevenueCat Flutter SDK?Thanks.
Hey RC folks,I am loving the new Paywalls beta. So simple to use, and it looks good to boot!My only feedback is that I would like to see an “X” button in there somewhere so users are 100% sure to know how to exit the paywall. Right now you have to swipe down, which is not obvious to everyone.
I have an app with IAP in SwiftUI. When I showing purchase info to the user, I use ```swiftText(package.storeProduct.localizedTitle)Text(package.storeProduct.localizedDescription)Text(package.storeProduct.localizedPriceString)``` I noticed that “localizedPriceString” was changed base on the system region settings. However, “localizedTitle” and “localizedDescription” were fixed. I have localized for en-US, zh-Hans, and zh-Hant in my IAP settings. But I can only get Simplified Chinese localized strings in RevenueCat, it never showed the other two localized strings.
I’m using in-built PaywallView() to present in SwiftUI application, i just want to change the title of this view based on different clicks. Is there any way to directly just update title of the Paywall.I tried to customize same instanse with below line but title is get only property.offering.paywall?.localizedConfiguration?.titleAnd Figure out that, if we needs changes in title will have to create completely new instance, but it’s not that ideal to just change title name.is there any simple ways that i might missed looking into.
Hi team. Found one problem. When I’ve tried to relogin to the same account - always receive the problem with `getProducts` method: ```BillingWrapper is not attached to a listener```Precondition:Setup global customerListener ``` Purchases.sharedInstance.updatedCustomerInfoListener = UpdatedCustomerInfoListener { customerInfo → if(customerInfo.originalAppUserId == myCurrentUserId) { fetchProducts(customerInfo) } } ```Found stable steps to reproduce:Login to account A (`Purchases.sharedInstance.awaitLogIn(firebaseUser.uid)`) Logout from account A Login to account B Logout from account B Login to account A, await `customerInfo`, call getProducts Result: ``` PurchasesError(code=UnknownError, underlyingErrorMessage=BillingWrapper is not attached to a listener, message='Unknown error.') ```
Normally we have single android and ios app in the store with unique bundle Id or google package id. But we can create multiple flavors by suffixing desired name to the main package id. However creating apps in project in RevenueCat requires App Bundle Id or Google Play package depending upon the platform. So is there any way one can use same subscriptions defined in the store for multiple flavors ?
Hello everyone,It’s a bit unclear if it’s possible to have a single Android app with 2 package ids (development and production), with 2 configured apps in the RevenueCat backoffice, and a single app in Google Play Console.We are getting an error every time we try to get the products with our .dev suffixed app"There's a problem with your configuration. None of the products registered in the RevenueCat dashboard could be fetched from the Play Store."Is the only way around this to create a new app in Google Play Console with this .dev bundle?It baffles us, because this works perfectly well with Google Billing Client, without the need of any additional app on the Google Play Console.Thank you for your help!
I’m currently launching Paywall from inside a Fragment like this: class PaywallFragment: Fragment(), PaywallResultHandler, SlidePolicy { private lateinit var paywallActivityLauncher: PaywallActivityLauncher override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) paywallActivityLauncher = PaywallActivityLauncher(this, this) } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { launchPaywall() return super.onCreateView(inflater, container, savedInstanceState) } override fun onResume() { super.onResume() } private fun launchPaywall() { Purchases.sharedInstance.getOfferings(object : ReceiveOfferingsCallback { override fun onError(error: PurchasesError) { Timber.e(error.message) } override fun onReceived(offerings: Offerings) { val currentOffering = offerings.current currentOffering?.let { offering -> paywallActivi
I am only using RevenueCat Paywall (Android) to allow a user to subscribe. Let’s say a user subscribes to ‘Monthly’ and then two months down the line wants to shift to ‘Annual’. There’s no way the current Paywall or a version of it allows this shift. Personally, I feel it should be pretty easy for the RevenueCat team to use the current setup as you simply have to show the ‘Current’ subscription at the top, and allow to shift to Annual or whatever. No need to build a completely different paywall. The issue is, in Android there is absolutely no way to make this shift as the subscriptions management link which takes to Google Play Subscriptions also doesn’t show any option to shift the period / tenure. Please correct me if i am wrong anywhere.
When I get a test customer’s CustomerInfo while offline it looks exactly the same as if the user simply had no entitlements. How can we tell the difference - how can we know if a user has NOT made a purchase or if they are simply offline? If there anything in the CustomerInfo that can tell us? I feel like we can’t know for sure if a purchase has NOT been made.
My Flutter app’s Firebase Crashlytics keeps catching a platform exception from RevenueCat on Android. It’s being caught for the majority of my userbase.SDK versions:purchases_flutter: 8.1.0purchases_ui_flutter: 8.1.0Exception details (look for “revenuecat-events-thread”):Fatal Exception: io.flutter.plugins.firebase.crashlytics.FlutterError: WebSocketChannelException: Instance of 'WebSocketException' at FirebaseCrashlytics.recordError(firebase_crashlytics.dart:119) at main.<fn>(main.dart:101)pool-10-thread-9: at sun.misc.Unsafe.park(Unsafe.java) at java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:230) at java.util.concurrent.SynchronousQueue$TransferStack.awaitFulfill(SynchronousQueue.java:461) at java.util.concurrent.SynchronousQueue$TransferStack.transfer(SynchronousQueue.java:362) at java.util.concurrent.SynchronousQueue.poll(SynchronousQueue.java:937) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolE
Hi everyone, We have a Subscription page developed in Flutter that displays 3 Tiers of subscription - LITE, PRO (Monthly & Annual) and ULTRA (Monthly and Annual). RevenueCat’s single paywall only supports a single offering - current. And hence, the way that we’ve configured is that there are 2 offerings - PRO (with its PRO paywall) and Ultra (with its ULTRA paywall).When the page is loaded, in the initState() - we call:if (Platform.isAndroid) {await Purchases.configure(PurchasesConfiguration("xxx")..appUserID = userId);} else if (Platform.isIOS) {await Purchases.configure(PurchasesConfiguration("yyyy")..appUserID = userId);} To show 2 different Paywalls, there is a function that gets the respective offerings in initState():var _offerings = await Purchases.getOfferings();var _proOffering = await _offerings.getOffering('Pro')!;var _ultraOffering = await _offerings.getOffering('Ultra')!;setState(() {offerings = _offerings;proOffering = _proOffering;ultraOffering = _ultraOffering;}); I
sdk: 5.3.2 [RCPurchases configureWithAPIKey:]
When a user purchases a subscription we run the code that calls purchase():const getInfo = useCallback(async () => { try { const info = await Purchases.getCustomerInfo(); packageRef.current = info?.entitlements?.active?.[entitlementName]?.productIdentifier; const { isActive: isEntitled } = info?.entitlements?.active?.[entitlementName] || {}; setIsActive(!!isEntitled); if (isEntitled) { setSawPaywall(true); } return info; } catch (e) { throw new Error((e as Error).message); } }, [setIsActive]);const purchase = async (purchasePackage: PurchasesPackage) => { try { await Purchases.purchasePackage(purchasePackage); await getInfo(); } catch (e) { if ((e as Error).message !== 'Purchase was cancelled.') { throw new Error((e as Error).message); } } };After the subscription is successful, the app runs correctly, which navigates to the sign in page and after the user signs in, goes to
I’ve setup a subscription in Google Play console that includes an offering. While the RevenueCat SDK (react native) is able to access the subscription correctly, the free trial (introPrice) is missing (set to null). Offer settings in Google Play consoleNewly created offer, user as never purchased this subscription before. Offer received on the front-end{ annual: { identifier: "$rc_annual", offeringIdentifier: "ProTrial", packageType: "ANNUAL", presentedOfferingContext: { offeringIdentifier: "ProTrial", placementIdentifier: null, targetingContext: null, }, product: { currencyCode: "AUD", defaultOption: [Object], description: "", discounts: null, identifier: "yearly_pro_trial:yearly-pro-trial", introPrice: null, presentedOfferingContext: [Object], presentedOfferingIdentifier: "ProTrial", price: 124.99, pricePerMonth: 10415833, pricePerMonthString: "A$10.42", pricePerWeek: 2397068, pricePerWeekString: "A$2.40", pricePerYear: 124990000, pricePerYe
I have a valid Android subscription and offer setup in Google Play console. When I test this, the paywall shows correctly with correct values. When I proceed to buy the subscription, both subscription and offer are show in minutes. Is this because it’s a development build or is there something wrong? SubscriptionOffer
The RC Flutter SDK offers the .logIn method, which allows the current user to log in using only the appUserID.Since the appUserID is exposed on the client side, a malicious user could potentially obtain someone else's appUserID (e.g., through reverse engineering the app or intercepting network requests) and use it to impersonate that user. This could allow unauthorized access to premium content or features, etc..
Can I know if a subscription is cancelled using the Flutter sdk? I only found allExpirationDates property. Does the expiration date refer to the date when the subscription will end if not being renewed in the meantime? Does it also refer to the date when a canceled subscription ends its current active interval and becomes inactive? Thanks!
Hello!I am testing my flutter application on Sandbox environment. I useaddCustomerInfoUpdateListener in order to get customer info ( I call it on app initialization) and then I listen to any changes that may occur. However, if user is offline and subscription expires it does not trigger listener. User has still has access to app. I would expect, that user should loose access to app if subscription expiration date is before now. Should it work like that?From : Michael suggest to call getCustomerInfo. Is it necessary if I’ve just got all the customer information from listener?If it’s not a bug, but feature, what is your recommendation? Should I set timer myself in a code in order to take access away if expiration date passes?Thanks in advance for your help!
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.