Get help with anything related to RevenueCat.
Recently active
Hi!We’ve recently starting using RevenueCat and everything seems to be working fine!We have a backend-focused approach, where we query the REST API to get subscription information server-side. Something we have noticed is that the API returns old data when immediately querying it after receiving a webhook event or purchase. This happens with both server webhooks or webhooks to the SDK. We have noticed that this can take longer than 2 seconds before querying the API delivers the new data.The question then is, when can we expect querying the API to return the same state of the data as in the webhook event? Kind regards,Bob
Right now I have 1 entitlement-id named powersEntitlementID, and I’m using it in iOS which works fine:Purchases.shared.getOfferings { [weak self](offerings, error) in guard let package = offerings?.all.first?.value.availablePackages.first else { return } self?.showPurchaseActionSheet(for: package)} func showPurchaseActionSheet(for package: Package) { Purchases.shared.purchase(package: package) { (transaction, customerInfo, error, userCancelled) in }} Using that in my PurchasePowersController, it shows me the correct action sheet. But I intend on adding a new productID/EntitlementID and I will use them in different ViewControllers. How can I get the EntitlementID/name from a Package object? For example if I had 2 entitlements named powersEntitlementID and energyEntitlementID. I can use the following code in PurchasePowersController and PurchaseEnergyController class PurchasePowersController: UIViewController { override func viewWDidAppear(_ animated: Bool) { super.v
Hi, We would like to send an email and push notifications to users which are on our yearly plan and have an upcoming renewal in 7 days. We would like to avoid users who have opted-out for renewal and/or are on a monthly plan. I was thinking of the approach below, but I’m wondering if it’s the best way to do it:Use webhooks from RevenueCat When we receive RENEWAL or INITIATE_PURCHASE (with period=NORMAL to avoid free trial users), we schedule the sending of email/notification based on the parameter expiration_at_ms If we receive CANCELLATION with reason = UNSUBSCRIBE, we cancel the schedule for this user => not sure if we will receive this when the user opt-out for renewal or at the end of the subscription periodWhat do you think of this? Is there a better approach? Thanks!
Even though the user purchases successfully one of the products from an Entitlement, the purchaserInfo.entitlements.all["entitlement"]?.isActive is always false.I have everything configured correctly in Xcode, AppStore Connect and in RevenueCat and I am testing on a real device. This issue is new, the version of my app which is on AppStore did not have this problem even in sandbox. What shall I do?
Is it possible to automatically grant promotional entitlements to users based on certain criteria? I see from this article that it can be done through the REST API but I’m unclear if that can be criteria based. Example use cases:We would like to automatically grant a promotional entitlement for users that:Apply a specific Apple Offer Code New subscribers within a certain timeframe Other RevenueCat customer attributes (that we could pass in)Thank you!
I have RevenueCat fully set up in my React Native application, and the purchasePackage() function seems to be fully functional when testing on an iPhone. In Sandbox, the popup that prompts the user to sign in with their Apple ID to pay works and has no issues aside from slight delay in between the prompt popup and the “success” alert. However, when I test the exact same build on my iPad, purchasePackage() doesn’t do anything. No errors are thrown, and the only indication that I see the purchasePackage() doing anything at all is the addCustomerInfoUpdateListener() being fired. Other than that, no popups show up, no errors show up, nothing. I would like to note I am testing these on real devices. Any help would be greatly appreciated!
I am thinking about configuring two separate entitlements in my app. One for “Premium” (access to GPT-3.5 among other features) users and another tier for “Plus” users who will have access to GPT-4 on top of premium features. Premium users should be the only users that can upgrade to Plus. GPT-4 API costs are expensive which is the reason to separate things out.I’m struggling a bit to implement the syntax in SwiftUI. I have two separate entitlements so naturally I would like to implement two separate paywall footers on two paywall screens, but the only way to configure them separately is to give them an “Offering”. I’m not sure how to initialize this offering without introducing an optional into the equation..paywallFooter(offering: *initializedOffering*, condensed: true)Writing things this way seems like hardcoding which would not allow me to change things remotely after each paywall has an offering fed to it. I would appreciate some insight into how I should proceed here.My code in p
Why do I need to log in/out to do a subscription? In real life you just choose a subscription, double click and pay with Apple Pay, it never asks for your email. I followed this video which requires the user to log in to make a purchase, which I tested and asks for an email & password. Am I going to be able to just double tap and pay for the subscription in production with the same code?
The functionality I am looking for is the user does not have to log in, they can just choose a subscription plan, double click and pay with Apple Pay. Why are we logging in manually with our email and password in this tutorial?Here’s how the user logs in:logIn(BuildContext context, String newAppUserID) async { try { await Purchases.logIn(newAppUserID); // user types in newAppUserId manually String appUserID = await Purchases.appUserID; // And we get an id of the user ... } on PlatformException catch (e) { ... }}
Hi. Thanks in advance.I have simple question regarding apple sandbox behavior via revenuecat.I have monthly subscription and when I makePurchase monthly subscription, I can see it will auto-renew for 11 month then opted-outs (probably cancelled from apple)then expires.After expiration, when I re-purchase monthly again, then it opted-outs by 1 month.Is this as expected? Is there any this opted-out rules? thank you
function_name: "ext-firestore-revenuecat-purchases-handler"severity: "DEBUG""Function execution took 6730 ms, finished with status code: 200" Logs are taken from Google Cloud Console, Revenue Cat extension 0.1.12.I have only 1 “Sandbox” customer, why RC function execution takes such an extremely long time?!! AppStore TestFlight / Sandbox auto-extends subscription each 5 minutes, and I have similar logs in Firestore (with RC Extension); in average, time varies from 800ms to 1200ms, and sometimes almost 7 seconds?Could you help please, is there any bugs / bottlenecks with this implementation? And how to disable “Debug”? Right now I am just testing, but I expect about 10,000 concurrent users and it can become really bad… thanks
Hello,I saw that google play requires you to have the option in the app and also through a separate webpage for users to delete their account. I was wondering what is the go to approach in terms of managing the subscription? Do we have to cancel the user subscription before deleting the account and then also delete the customer from the revenuecat side, or de we just delete the customer and that’s it? What would be the order in which we execute this operations?Thank you,Radu.
Hi, sorry if the title is confusing, hard to explain in one line. I am using the React Native SDK and testing on an iOS device in sandbox.The problem I’m having is that Purchases.getCustomerInfo() seems to be returning an expired entitlement in the active list on the first app run after it’s expired. On all subsequent runs, it disappears as expected because it’s expired. But it means the app thinks the user still has an active entitlement for that first run when they should not.To try and explain the steps to reproduce:User purchases a subscription, which activates the entitlement. User uses the app during the subscription and all works as expected. User closes the app. Subscription expires (dashboard reports it is expired and entitlement is expired). User opens the app, which fetches customerInfo. The entitlement still comes back in customerInfo.entitlements.active at this time. User reloads the app or closes and reopens, which refetches customerInfo. The entitlement is no longer in c
Hi all,I hope I am not asking a question that has already been answered, if so I couldn’t find the answer. My app has multiple one off in-app purchases. I would like to display these for purchase. If I add them all to an offering is there some way to exclude products (packages) that have already been purchased from the paywall when displaying the offering? Thanks L
How to enable double tap to pay feature for users? We have integrated RevenueCat into our flutter app and configured the products successfully. We are still pre-launch so our testing is currently in Sandbox mode. Currently when testing the pay flow the user sees the paywall successfully, but there is no option to allow the user to double tap to pay. Instead there is a password field that the user must enter to authenticate their purchase. Is the double tap feature just not visible due to the Sandbox mode or is there something we’re missing? I’d rather use RevenueCat for managing user subscriptions than have another provider in front of RevenueCat that handles taking payments for users. Thanks in advance!
I have default paywall selected but I can see wrong paywall design on ios and android app. Alot of text is missing and not according to selected paywall as default.What can be the reason? please help, thanks
I’m trying to migrate to the RevenueCat paywall.I’m having an issue where I’m only seeing the “call to action” text on the button and not the “Call to action for an introductory offer”.Here’s my pay wall settings: And here’s what I’m seeing in the app when I test:If I tap the action button, I can see that it presents me with a free trial. Am I doing something wrong?
We are selling Tour descriptions in our App, that are like ebook chapters plus files for the actual track. Currently, we include all ebooks in the app bundle. Now we want to move it to be downloadable content that is downloaded after the purchase and on a restore purchases event. Are there recommendations or best practices on how to handle the downloads? Can we place download URLs into some meta data that are only visible after the purchase?
I have a React Native application using RevenueCat, so there are two apps - 1 for Android and 1 for iOS, and therefore two public API keys. I’m wanting to use the endpoint for creating a new subscriber/customer on my backend server (https://api.revenuecat.com/v1/subscribers/{app_user_id}) rather than doing it on the front end, but the issue I’m having is I don’t know which platform the user is/will be using and so not sure which API key to use with the endpoint. Does this matter or am I able to use whichever endpoint and the subscription be acceptable on either platform? (I’m specifically granting the customer an entitlement after creating them, if that makes any difference.) Thanks so much in advance!
Let’s suppose there is a subscription group with monthly and yearly product. Now a user purchases my monthly plan then should I allow users to view the paywall? Currently my approach is to let users know they already own the “Pro” package which doesn’t let them redirect to a paywall and because of that they can’t also see restore purchases button. So should i still separately show the restore puchases button? or keep following my current approach?
Hello how to add a disclaimer message to the paywall generated remotely?
i want to replace native android apps by flutter android... but i have some confution i have some google pay subscription in my native android apps.. in flutter android apps i have integrate google pay subscription using revenueCat.. So if i replace previous android apps by flutter app, revenueCat can manage previous native subscription
Hello community, we currently have an offering for pro subscription for $9.99. Now we want to create a special offering for the easter holidays for $7.99 (lifetime), that should not effect the users that bought for the normal price.On Apple, I created a new subscription group with the new subscription for $7.99 in it, so users that bought for $9.99 can not switch to the $7.99 subscription in the icloud settings.On google I’m not sure whats the corrent way? Should I create a whole new subscription with a new base plan, or is a new base plan in the existing subscription enough? I want to prevent that users that bought for $9.99 can switch to the $7.99 offering. Kind regards,Marius
Hi everyone, I'm integrating RevenueCat into my FlutterFlow app and have enabled debug logging. I'm seeking your expertise on a few points: Accessing Logs: After enabling debug logging in FlutterFlow, where and how do you recommend accessing and interpreting these logs? Common Issues: Any common pitfalls during this integration process I should watch out for? Appreciate any insights or resources you can share. Thanks!
For our Stripe integration, we are currently sending the token over to RevenueCat (RC) when we receive the customer.subscription.created event, as instructed in the documentation here.However, as far as we can tell, when this event fires, Stripe hasn't necessarily completed processing the transaction/payment and therefore RC immediately receives a BILLING_ISSUE and CANCELLATION event from Stripe, which is what we are seeing in the "Customer History" for users. From a quick test, if we delay the POST to RC with the token by even a couple of seconds, we successfully receive the subscription and do not receive the issues mentioned above because (presumably) Stripe has finished the processing on its side by that point.Example user: My question is, should we instead be listening for the customer.subscription.updated and POSTing to RC at this time? It seems like customer.subscription.updated fires a couple of seconds after .created once Stripe has done a bit more processing, which I believe
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.