Discussion and help from anything related to RevenueCat.
Recently active
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
I have been planning to have my app be available as only a subscription service: monthly or annual.I was expecting to have them sign in with OAuth from Google or Apple, using Supabase Auth to handle things like sessions. Then, once signed in/registered, update my own data `user` data table to store things about the user depending on their interactions within the app.Now I am trying to add RevenueCat. I see that in the docs about Users, Purchases.configure({apiKey: <public_sdk_key>}); will generate a random ID. Unfortunately, this will not tie into my backend of known users. So the docs give an option to include appUserID in the config. My question is now about the flow.Is it reasonable to have my subscription-only app open on the login screen, then user logs in, and once logged in, trigger the configure({apiKey: ‘123abc’, appUserID: ‘known@user.com’) API with the appUserId?Or I can call the RC `logIn()` method later too... Is there a downside to waiting to configure & loa
How to detect refunds that were made through Google? I tried Purchases.getCustomerInfo but this does not get updated. I thought of using Purchases.syncPurchases but the doc says “You should not call this programmatically on every app launch for every user. This can increase latency in your app and can unintentionally alias users together.”So the solution would be to call it sometimes? Or is there a better way?
We've discovered a very strange case in our app.Here's what we do:Our mobile app makes a purchase and sends a base64-encoded receipt file to our server. We send it to the /v1/receipt endpoint. We check the entitlements that are returned in the response, and we also respond to events from RevenueCat to manage access to our service.For some users, the following has occurred (user #1, user #2):/v1/receipt returned empty entitlements. No events from RevenueCat for this user have come in. However, Apple sends the correct event SUBSCRIBED.INITIAL_BUY:{ "notificationType": "SUBSCRIBED", "subtype": "INITIAL_BUY", ..., "data": { ..., "signedTransactionInfo": { "originalTransactionId": "$txId", ... }, "signedRenewalInfo": { "originalTransactionId": "$txId", ... }, "status": 1 }, "version": "2.0", "signedDate": 1698842056024}After investigating the situation, we found that the problem was with the receipts files we got. Here are the differences we foun
I'm attempting to retrieve active trials for a specific app using the Overview Metrics V2 API. However, the API response does not include the app name. How can I extract the app name from the response, which provides data on active trials and active subscriptions for the project?
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?
When the data returns for Metrics in the v2 API, what is “Num tx last 28 days”? There is no explanation about this parameter anywhere I have searched. I am guessing number of trials?Maybe using the complete word rather than tx would be more helpful to a user.
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 everyone,I have 2 apps in the google play store and two apps in the iOS App Store. Both are subscription based. I would like to offer users a discounted rate if they subscribe to both apps (in a single store). For example, iOS app 1 charges $36.99 a week and so does app 2. If the user subscribes to both, I would like to charge them around $50 instead of making them pay for both subscriptions. Any thoughts as to how to do this?
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 looking at moving my app to RevenueCat but I’m wondering how the Pro plan pricing is calculated when it comes to VAT?(Sorry if this has already been answered somewhere, I can’t find it) Is the 1% of MTR calculated from:(Price + VAT) * 0.01 Price * 0.01 (Price + VAT)*(1-store_commission_rate) * 0.01 Something elseNumber 3 is my revenueNumber 2 is mine + Apple’s/Google’s revenueNumber 1 is mine + Apple’s/Google’s + the government’s revenue. In Europe number 3 is often 60-70% of number 1. So if RevenueCat calculates pricing based on number 1 then it is more like 1.5-1.7% of my actual revenue. Which may still be reasonable but something I would like to know when I compare alternatives.
Is there any way to get the app store country of a user (not their IP-based country) in customer lists? Even in the exported CSV would be OK! I don’t see it anywhere right now.
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
I want to have a lifetime free premium offer for me and contributors. Instead of creating my own backend for this, I want to use RevenueCat as well.In AppStoreConnect, the longest subscription I can offer for free is one year, which is not sufficient.Therefor I made a non-consumable in AppStoreConnect and connected it to RevenueCat.I will implement my own logic to manage which promoCode is valid for a free lifetime subscription.I have the following two questions: Can I reliably hide this non-consumable from those who are not meant to see it? In AppStoreConnect there is no way to add logic to who can see it, so does that mean if I simply never show it in my app, nobody can access it? Because I know that for subscriptions, when going to cancel in the apple settings, one can see multiple offers, and I don’t want this non-consumable to show up in any place unless with my dedicated UI for it. Is the following implementation something that would work for what I’m trying to do? Get promo co
On August 10th, there was a noticeable decrease in ATT reported installs attributed to Facebook, dropping from an average of 70 installs to merely 15 installs per day.By August 25th, another decline was observed in reported SKAN installs on Facebook. This was accompanied by an increase in CPIs and a rise in the ratio of non-attributed installs on AppsFlyer. Interestingly, when looking at the blended numbers, there was no significant change, and there was also no surge in organic traffic as per App Store Connect data.Fast forward to October 14th, there was a campaign relaunch with the Singular MMP. This move saw a boost in SKAN reported installs and a commendable drop in CPIs from $22 down to $11. However, these numbers still weren't at the desired benchmark of approximately $5. Despite increasing the budget, the ATT installs did not see any increase, hovering consistently between 15-20 daily installs.That is the situation overview. As far as the tech goes we have RevenueCat integration
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
I build local development builds and the Revenuecat API works fine. Even with Expo Go, Revenuecat works fine, but it does not load data from Revenuecat when submitted to Test Flight and installed on my iPhone. Basically my offers are not shown at all. Here is the data loading component: const SubscribePackages = () => { const [packages, setPackages] = useState([]); const navigation = useNavigation(); const fetch_prices = async() => { const result = await Purchases.getOfferings() setPackages(result.current.availablePackages) } const subscribe = async(item) => { try { const {purchaserInfo} = await Purchases.purchasePackage(item) const purchase = await Purchases.getCustomerInfo() console.log('purchase: ', purchase) if(typeof purchase.entitlements.active['pro'] !== 'undefined') { await navigation.navigate('Account') } } catch (error) { console.log(error) } } useEffect(() => { fetch_prices() }, []) return ( <
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..
Has anyone had this issue before? We emailed the RevenueCat team and they haven’t been able to help us. Thanks in advance!
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.
Hi there!We have one subscription subscription_id, within which there are two base plans base_plan_id_1 and base_plan_id_2.After purchasing, our application sends a fetch token to our server, which we forward to /v1/receipt/:{ "app_user_id": "$someUserId", "fetch_token": "$someValidFetchToken", "is_restore": false, "product_id": "subscription_id"} The call is executed successfully, but in RevCat and all webhook events, it always shows that the base plan base_plan_id_1 was purchased, regardless of which actual base plan was bought.Example:User buys a Monthly subscription for 0.99 - it works and is tracked correctly User buys a Yearly subscription for 9.99 - it’s tracked in RevenueCat as Monthly for the price of 9.99 After studying the SDK, we tried sending the following variants, but nothing changed.Sending platform_product_id:{ "app_user_id": "$someUserId", "fetch_token": "$someValidFetchToken", "is_restore": false, "product_ids": [ "subscription_id" ], "platform_product_
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.