Discussion and help from anything related to RevenueCat.
Recently active
I’m looking at this chart, but why is there no option to forced an alias create in the Non-Anonymous App User ID. We’re migrating all our user IDs to a new system (new login, new backend), so we will have to force a restore purchase for all of them for them otherwise their subscription isn’t recognized. The problem is we have a few thousand stripe users, so a restore purchase doesn’t work for them. This will create a support nightmare for us when suddenly thousands of users can’t access their subscription. Why can’t I force create an alias for them to their new user IDs? Also - under what scenario does the user go from Non-Anonymous to Anonymous without calling logOut() ? Because in our upgrade flow: old app version passed userID to the SDK on int, in new version of app, we will still pass that old userID and then call logIn() once they have signed up with new backend. Can I still manually call the `createAlias` method even though it is deprecated?
How do I show this free trial when checking out? I have setup my App Store Connect API & In App purchase key config to RevenueCat.When checking the data shape of `Purchases.getOfferings()` using JS/ReactNative API, my annual offer seems to have it there as part of the `introPrice`: annual: { offeringIdentifier: 'default', product: { priceString: '$49.99', currencyCode: 'USD', description: 'Access all content', productType: 'NON_CONSUMABLE', discounts: [], productCategory: 'SUBSCRIPTION', subscriptionPeriod: 'P1Y', price: 49.989999999999995, identifier: 'ios_annual_4999_default', title: 'Annual Subscription', introPrice: { periodUnit: 'DAY', periodNumberOfUnits: 3, period: 'P3D', priceString: '$0.00', price: 0, cycles: 1, }, }, packageType: 'ANNUAL', identifier: '$rc_annual',
I originally started without a trial offer on my subscription. I updated my Google Play store to include an offer for 3 day free trial:3 day trial in Google PlayHowever, I do not see it in the `offering` of product or indicated anywhere in the `introPhase` or `freePhase` as they both are `null`. How long does it take for subscription offer phases to appear? I tried adding a tag too, but this also is not being found.
Hi guys,I complete setup for product and introductory offers for it on AppStore connect. Now I check eligibility for new user (by checkTrialOrIntroductoryPriceEligibility), and completion block return dictionary with eligibility statuses and associated products. My problem is that status for all products is “Not eligible for trial or introductory price.” Why SDK return wrong status?
I think I’m doing something silly, but I cannot seem to get RevenueCat to show the correct eligibility for a subscription intro offer. If I bring up the RevenueCat Debug UI’s paywall, it shows the intro text properly mentioning you get 3 days in your trial. If I check with StoreKit 2, I get “true” for isEligibleForIntroOffer, as expected In RevenueCat, I get “unknown” for eligibilityHere’s my StoreKit 2 code that works: let storeKitProducts = try! await Product.products(for: ["myproductid"])let isEligibleForIntroOfferStoreKit = await storeKitProducts.first?.subscription?.isEligibleForIntroOffer// Returns true Here’s my RevenueCat code that seemingly doesn’t: if let monthlyProduct { let eligibility = await Purchases.shared.checkTrialOrIntroDiscountEligibility(product: monthlyProduct) let isFreeTrialAvailable = eligibility == .eligible print(isFreeTrialAvailable, eligibility) Logger.log("Checked if free trial was available and determined \(isFreeTrialAvailable)") // Retur
Hi. I created a new iOS project on AppStore Connect 2-3 weeks ago.I was almost finished with my app, but I realized a bug. I’m using the Flutter platform to develop my new app.The checkTrialOrIntroductoryPriceEligibility method returns introEligibilityStatusUnknown when I added an Introductory offer to my subscription.(If I have not added an Introductory Offer to my subscription, in this case the checkTrialOrIntroductoryPriceEligibility returns introEligibilityStatusNoIntroOfferExists. So it is working correctly in this case.)The checkTrialOrIntroductoryPriceEligibility method and code has worked in my previous projects.Has anything changed on the iOS side? Or is it a bug on the Revenuecat side?Revenucat package (Flutter): purchases_flutter: ^4.11.1I tested it on Testflight version, and debug mode also. Thanks for your help.
Hey everyone, I did use PricePerMonth method but it provides just the value without the currency code and was wondering if there is any straightforward approach within the SDK that I have probably missed?
Problem: About 50% of the in-app events are missing in SKAN reports on Appsflyer We’re using the Appsflyer Integration to measure conversion events. I’ve noticed that for in-app events from Facebook Ads for iOS about half of the events are missing. The privacy thresholds from SKAN are not the issue. Installs are tracked correctly but conversion events aren’t. We are relatively sure about that a large share of events are missing because otherwise the data for organic installs is implausible.I checked a bunch of event logs on RevenueCat and they seem to be all send correctly to Appsflyer with the correct meta data attached.My hunch is that it has to do with wrongly identified re-installs. The numbers seem to match the 50% missing events. Question:I wonder if anyone else had a similar problem or if the RevenueCat team has heard about similar cases? I haven’t received a helpful answer from Appsflyer yet, so i’m trying my luck here.
In a test react native application on Android, I have made a purchase and am able to see that inside the customerInfo() response. The managementURL open the Subscription Play Store page where I can see it. Now I waited for it to expire and confirmed that it has indeed expired (got the Firebase extension to deliver the EXPIRATION and CANCELLATION same time). When calling customerInfo() a few minutes after this, it still shows active entitlements. Now the same managementURL point to an empty page in Play Store so it creates user confusion.Any idea how long or why the sync between EXPIRATION and customerInfo() exists?
Hi! We noticed a somewhat rare crash that we’ve only recently been able to reproduce. This affects all iOS SDK version up to 4.17.5 (the latest at the time of writing). Basically we get a hard crash on[[RCPurchases sharedPurchases] purchasePackage...];The call stack simply points to libobjc.A.dylib at objc_msgSend within our method that calls purchasePackage.We haven’t noticed this crash with the restorePurchasesWithCompletion call. The crash doesn’t happen with getOfferingsWithCompletion either. We were finally able to reproduce this crash in the past few days with our TestFlight builds (and ONLY with TestFlight builds). We are calling all 3 methods from a thread that is not the main thread. Since only purchasePackage crashes (and on Android there are no crashes at all on any of the methods when not called from the UI thread), we never considered this to be an issue. However, then we queued the call the the main thread in iOS like this:dispatch_async(dispatch_get_main_queue(), ^(void)
Hello!In terms of data, the US ist not considered safe in the EU (because of the patriot act). Therefore there is no easy legal basis to use RevenueCat (US based). Now there is a new “Data Privacy Framework” between US and EU, but RevenueCat has to self certify for this. AWS, Google, … all of them switch to this legal basis. Does RevenueCat consider this?Best regardsData Privacy Framework:https://www.dataprivacyframework.gov/s/participant-search
Link to original RC doc: https://www.revenuecat.com/docs/configuring-sdkFor the React Native Setup, it mentions the api keys (for Apple and Android).Code in the documentation:if (Platform.OS === 'ios') { Purchases.configure({apiKey: <public_ios_sdk_key>});} else if (Platform.OS === 'android') { Purchases.configure({apiKey: <public_google_sdk_key>});} What are these sdk keys exactly? Is it the App Connect Key or the Issuer Id? I searched the documentation and could not find more info.
Hello,This documentation page is unclear: https://www.revenuecat.com/docs/firebase-integration#2-set-firebase-user-identity-in-revenuecatIt has an example in Swift. But I am developing application in Flutter.I want to implement In-App Subscription Purchase, and after purchase made, I want to use Apple provided token, or even better Email, to authenticate to Firebase. Am I looking at correct documentation page? Any sample code for Flutter? Flow: user makes purchase without any external authentication on iOS, using system provided authentication to App Store and making purchase; I need this <user> to be able to access Firebase as an authenticated user. Thanks
Hello, On Android, using react-native, after upgrading the “react-native-purchases” lib from "5.13.1" to "6.7.0", I am having this error when a purchase action of an offering is triggered: “RNPurchases.purchaser got 7 arguments, expected 6”. I tried upgrading react native to latest version, but still got the error.Any clues on what that could be, or some steps on how to debug this error, please? Thanks a lot!
Hi Revenuecat team, I am new flutter developer and use firestore as my server, my question is for my flutter app I want to check user’s subscription status, so I can get it viaCustomerInfo customerInfo = await Purchases.getCustomerInfo();Should I then pass this valuecustomerInfo.entitlements.all[entitlementID]?.isActivedirectly to my cloud function to calculate different methods based on user’s subscription status, or I need to move revenuecat code part in cloud function, in case someone can hack my code and always pass TRUE value to my cloud function? Thanks!
Sorry for creating a duplicate of this, but it seems like the conversation stopped and maybe less details.I wanted to open back up the conversation to get an idea how to clearly show a price per month to the user in their local currency format. I know the SDK gives me the product with a formatted price, and I also see a raw value as well. Taking that value to divide by the right number based on subscription length is what I want to build. It means that we need a map of packageType vs integers. Where to get a list of all possible strings. I created one one month and six month packages and see the values (MONTHLY and SIX_MONTH), what are all the possible values?I see also a currency code like “USD” that maybe can use to derive a dollar sign. But how to do this for all possible scenarios/countries?Is there maybe a better way to implement this inside the SDK?thanks
hello. I have a question about the payment amount for the Pro plan.It's my understanding that 1% is paid monthly if you make more than $2500 in revenue.Does the 1% payment include the $2500? Or would it be 1% on the amount over 2500?Ex) 1. if I make $3000 in revenue in a month I pay 1% on the amount over $2500, which is $500. => 5$2. if I earn $3000 in a month, I pay 1% on $3000. => 30$
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?
Can anyone explain if I am doing this correctly? It seems to work fine on Android, but on IOS it takes at least 10 seconds for the Apple confirm dialogue to appear, and then after confirming purchase (in sandbox) it then pops up again and never gets to the alert and redirection? ```useEffect(() => { (async function () { await Purchases.setLogLevel({ level: LOG_LEVEL.INFO }); // Enable to get debug logs await Purchases.configure({ apiKey: "XXX" }); })(); }, []); const purchaseStoreProductA = async () => {const offerings = await Purchases.getOfferings();const productToBuy = offerings.current&& offerings.current.availablePackages&& offerings.current.availablePackages[0].product;if (productToBuy == null) {alert('No product');return};const purchaseResult = await Purchases.purchaseStoreProduct({product: productToBuy}); purchaseResult ? alert('Thank you for subscribing.') + history.push("/ios-signup/") : null;}```I call purchaseStoreProductA(
Hey guys, I can’t see to retrieve subscription-based products, however consumables work. Here is my code:import 'cordova-plugin-purchase';const { store, LogLevel, Platform, ProductType } = CdvPurchase;await store.register([ { id: 'monthly', platform: Platform.GOOGLE_PLAY, type: ProductType.PAID_SUBSCRIPTION }, { id: 'trimonthly', platform: Platform.GOOGLE_PLAY, type: ProductType.PAID_SUBSCRIPTION }, { id: 'semiannually', platform: Platform.GOOGLE_PLAY, type: ProductType.PAID_SUBSCRIPTION }]);console.log(store.products); // [] Screenshot: Help is much appreciated 🙏
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.
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.