Discussion and help from anything related to RevenueCat.
Recently active
Hello everyone,I got RevenueCat working with Expo iOS development build but when I submit to appstore or even do a local preview build, app crashes on startup.I connected my iPhone to my mac with cable and launched the console app. And when I filtered the streaming console I found this error that caused the crash RevenueCatUI/DebugErrorView.swift:68: Fatal error: Purchases has not been configured.However, I did configure the Purchases at the very root in my App.jsI tried these both… const configurePurchases = async () => { if (Platform.OS === "ios") { Purchases.configure({ apiKey: process.env.EXPO_PUBLIC_RC_IOS }); } }; configurePurchases();and… const configurePurchases = async () => { if (Platform.OS === "ios") { Purchases.configure({ apiKey: process.env.EXPO_PUBLIC_RC_IOS }); } }; useEffect(() => { async function init() { await configurePurchases(); } init(); }, []);They both work at the development build on a physical device.But t
Hi, I’m testing payments in my app. This has been working for several months as expected. Today however, when testing subscriptions in the iOS simulator I receive an error on `.purchasePackage` and `.restoreTransactions` saying this: `[Error: The receipt is missing.]` I’ve correctly included my StoreKit configuration in my build, and this was always previously working as expected. I recently upgraded to the new mac, and therefore the latest macOS. Here is what i’m passing into `.purchasePackage`:{"identifier": "$rc_monthly", "offeringIdentifier": "Full Access", "packageType": "MONTHLY", "product": {"currency_code": "USD", "description": "", "discounts": [], "identifier": "1MONTH", "introPrice": {"cycles": 1, "period": "P2W", "periodNumberOfUnits": 2, "periodUnit": "WEEK", "price": 0, "priceString": "$0.00"}, "intro_price": 0, "intro_price_cycles": 1, "intro_price_period": "P2W", "intro_price_period_number_of_units": 2, "intro_price_period_unit": "WEEK", "intro_price_string": "$0.00",
I’m trying to implement a gift card redemption flow in my ReactNative app. I’m testing in sandbox / staging right now. Currently, once the user inputs a code, it fires of a request to my backend, which does the call to the Grant Entitlements REST API. My backend then returns a success state, and then my frontend rechecks getCustomerInfo, but it’s not working as expected. TL;DR:How should I be checking for customerInfo in my ReactNative app after I grant an entitlement via the REST API? It doesn’t seem to be refreshing correctly? It seems to be the case that the user’s Promo entitlement in customerInfo can’t be updated with subsequent successful calls to grantEntitlement, which means that the same user can’t redeem multiple subsequent promotions. Is this just a sandbox / staging thing, a short duration thing (I have it set for 10 min intervals for testing), or is this a production limitation?FULL CONTEXT // NOTE: I had to string together multiple examples, so ignore the timestampsIn my
I have a question about how experiments work when targeting is configured.Suppose I have a simple app which lets you track your hikes or bike rides. And I have two offerings: OfferingBike and OfferingHike which are shown to users depending on a custom attribute called preferredActivityType. This is just to make things easier.One of these, say OfferingBike is set as default in console, although I never use this directly as I always set my custom attribute. So, in my case, the “default” offering is irrelevant.Now I want to do an experiment. I want to try a new offering for bike riders. So I create a new one called OfferingBikeTest and adjust metadata. I say I want to test it against OfferingBike, which is set as default in my console.I wonder how will the A/B test work in this case?Which users will be included? Will it be all users, or will I only get results from users who purchased a package belonging to either OfferingBike or OfferingBikeTest, ignoring those who make purchases through
Hello RevenueCat,We are currently facing two critical issues with our implementation and would greatly appreciate your assistance.1. Sandbox Testing Error - "Error 8: The Receipt is Not Valid"During our sandbox testing phase, every single purchase attempt results in the following error: Error 8: The receipt is not valid.We have tried multiple solutions to resolve this issue, but none have been successful. We are using your Paywall CMP render with React and TypeScript. Below is the relevant code snippet from our implementation:Code:return ( <RevenueCatUI.Paywall onPurchaseStarted={onPurchaseStarted} onPurchaseCompleted={onPurchaseCompleted} onPurchaseCancelled={onPurchaseCancelled} onPurchaseError={onPurchaseError} />); The error consistently occurs in the onPurchaseCompleted callback with the following message and moves to onPurchaseError:{ "error": { "code": 8, "message": "The receipt is not valid. The purchased product was missing in the receipt. This is t
Info: Whole Backend = Firebase.That includes, Auth system, DB, Functions, Extensions etc.In the app, I have let's say an account with User 'X' with userId 'xid'. X makes a purchase through the RevenueCat SDK and it sends out webhooks that writes database entries in Firebase with the necessary User details, purchases and entitlements.I read these entitlements entries in the DB and unlock features within the App. Here in lies the dilemma.Let's say User 'X' has purchased a monthly subscription. Webhooks and Firebase Integration will give me the DB entries I need to do my unlocking features.All good so far. Now user 'X' has decided to delete their account having the userId 'xid' from the App. All good so far. Bear in mind that subscription is still active in Playstore/Appstore.Now user 'X' decides to create a new account again in the App. User 'X' now ends up with a new UserId of 'yid'. User 'X' now presses the 'Restore Purchases' button which calls "Purchases.restorePurchases()" function
At the request of the user, we have refunded his payment through the payment system “Stripe”: As a result, when we try to find this user in revenuecat - there is no such user: If we try to go by direct URL to his account - an error is also displayed: What are we doing wrong? Why was the account deleted?
Hello everyone, First of all thanks for a very well thought out product, entitlement, offering setup.It is indeed well thought. I have an educational app. The app has react-native expo as front-end and Python FastAPI as backend.My app has a monthly and yearly subscription options. I am pretty sure that it will stay that way. Meaning… It is very unlikely for me to add consumable goods, one-shot purchases, extra packages etc..I am able to get subscriptions working for anonymous users. However, it is suggested that I use Purchases.login for more defined customer tracking. Fine :) I tried it but I was not really successful.Or, … it is successful but I did not get it. I have my own authentication and backend for my app.So, I wanted to base subscriptions on user login info which is email as username and a password.Once the user logs in, I would save the user email and also do Purchases.login() with email.Once I get the subscription info after Purchases.login() I would check for activeSubscri
I call Purchases. Restoring Purchases takes about 7-10 seconds on both Android and iOS. I call it on the Splash screen, but it dramatically annoys the user. Can you give me an idea of how to get rid of it?
Let’s say customers can pay for our product via the following methods:D2C Mobile apps - customer pays via Apple/Google, RC entitlement Web app - customer pays via Stripe, RC entitlement External Ecom Upsell Customer adds our product as an upsell on a different platform — customer pays via other platform, RC entitlement For the External Econ Upsell group, we would be able to see the grant of entitlement, cool, but is there a way to assign a dollar value to those customers so they can be seen in the charts?
I have an urgent production issues, where all users have access to PRO features since migrated to RevenueCat due to the following,I have an issue where customerInfo.entitlements.active.isEmpty is always returns a value when user is not subscribed. The customerInfo.activeSubscriptions always returns the product identifier for users who have subscribed but cancelled their subscription.I have added print("ENTITLEMENTS \(customerInfo.entitlements)") print("ACTIVE SUBS \(customerInfo.activeSubscriptions)")This returns ENTITLEMENTS <RCEntitlementInfos: self.all=[pro:],self.active=[:],self.verification=VerificationResult.notRequested>ACTIVE SUBS [“com.appname.com.promonthly", “com.appname.com.proyearly”]I have also tried removing cached info with Purchases.shared.invalidateCustomerInfoCache() Also when opening Debug > StoreKit, not transactions are show. func verifyIAPReceipt() { Purchases.shared.invalida
The doc says:To address this with RevenueCat Paywalls, consider using sub_offer_price and sub_offer_duration in either your package details or your CTA to ensure that the introductory offer is clearly disclosed. In the paywall editor:Variable "sub_offer_duration" is not allowed in this field.This seems an odd and unecessary restriction.So I’m not sure where to put this information. The “Call to action for an introductory offer” does not display in the preview so how are you supposed to do this generically? Where do you put the cancel anytime? Where do you inform people of the free trial?
Hey,On the RC dashboard, there is a card labeled 'New Customers' and it has a figure in it, this figure changes from day to day but I would like to see how this number changes over time on a chart. I cannot see anywhere in the charts section that will show me this?Cheers,Will
Can we set the test-subscription life cycle anywhere?Can we set it up so monthly subscription expires in a day and yearly expires in 3 days or free introductory offer lasts longer?
We are doing subscriptions by account in our Flutter app.When I log out and reconfigure from customer ID 1 to ID 2, the customer info of 1 will no longer have the purchase, and 2 gets it even though it didn't make the purchase. How can I make the purchase "stick" to ID 1? Is this possible to do without the webhook or is it needed?
Localisation is only changing the price not the text. I have configured multiple languages in the RevenueCat paywall option. I am using flutter for app development.I’m testing with simulator using storekit in Xcode.These are the localization setting I have made in Xcode.
Hi,Are we able to see when a new user is making a first purchase and their transaction gets declined due to payment issues?I am able to see the transaction id on Google Console under Order Management with a Payment declined status. But I am not sure how to trace this to a specific app_user_id (I set this on every purchase attempt). This transaction also does not come through via the webhook.Thanks
I have a discrepancy between AppsFlyer and Revenucat, and the S2S event seems to have sent correctly. On RC, a particular conversion is listed as ASA sourced, but on Appsflyer it is not.On AppsFlyer, the default look back window for attributing from ASA is 7 days - so I’m wondering if this is the cause of the discrepancy. If RC’s look back window is longer than this, that could be why.Please could you provide info on the ASA look back window?
The Firebase iOS documentation shows the following: If you're using StoreKit 2, use the following code to log IAP events.func purchaseSomeProduct(_ product: Product) { // Purchase a Product. This is mostly standard boilerplate StoreKit 2 // code, except for the Analytics.logTransaction() call. let result = try await product.purchase() switch result { case .success(let verification): let transaction = try checkVerified(verification) // Call this Firebase API to log the in-app purchase event. Analytics.logTransaction(transaction) await transaction.finish() ...}Given that RevenueCat does a fantastic job of abstracting away the complexity of StoreKit, is it still possible to call `Analytics.logTransaction(...)` after a purchase but before `transaction.finish()`?
Testing in SandboxMy config seems to be correct,I can buy the in app purchase and it goes through to revenue catThe issue is when I call const handlePurchase = async (pack) => {try {console.log("Initiating purchase for package: " + pack.product.identifier);const {customerInfo} = await Purchases.purchasePackage(pack);console.log("Purchase completed successfully");} catch (error) {if (error && error.userCancelled) {console.log("Purchase cancelled by user");} else {console.error("Error during purchase:", error.message);}}};Nothing executes after customerInfo, not even the log statement. it just hangs indefinetlyplease help as this is the blocker to my app going live. Thank you.
Hello, I've tried to transfer a subscription made through the Google Play Store, but after a few hours, the sub (for the second account) wasn't active, and the first one was still "keeping" the sub in our system, even though it was transferred on RevenueCat. What could've gone wrong? On the same (or not) subject, I was wondering if there's a way of granting subscriptions through RC if the user ID isn't displayed (it's "anonymous").
Hi I would like to have 3 different monthly package, early bird at $49, $99 and $149 how can I do that ?
If a deleted customer's subscription in RevenueCat is actually active, and the renewal occurs on the subscription renewal date, can RevenueCat detect the subscription in store?
Hello, I use revenue cat paywall package in my iOS app. Apple rejected my build with “- Your auto-renewable subscription promotes the free trial or introductory period for your subscription more clearly and conspicuously than the billed amount.”My Package details for an introductory offer:“{{ sub_offer_duration }} free trial, then **{{ price_per_period }}**”My Call to action:“Continue with free trial 🔓”My previous app got approved with texts for package details for an introductory offer and call to action. I have made my price_per_period bold to make it more clear. How should I modify my paywall content in order to get approved?Whole rejection text:Guideline 3.1.2 - Business - Payments - SubscriptionsWe noticed that one or more of your auto-renewable subscriptions is marketed in the purchase flow in a manner that may mislead or confuse users about the subscription terms or pricing. Specifically:- Your auto-renewable subscription promotes the free trial or introductory period for you
Even though my app went live today (7-8 hours ago), my products are still under review. This is likely the reason why I am unable to fetch the products on my app at the production level, and why users are unable to see the products in the live environment (it works on TestFlight). I am getting the error : 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 Could this be the reason I am getting this error?
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.