Get help with your SDK implementation.
Recently active
I’ve waited for over 24 hours (36 hours now), the productIDs all match, and everything works in testflight, all the subscriptions are approved in App Store Connect. However i still can’t collect any subscriptions on the app store build.I did recently change the reference names, but can see nowhere in revenue cat where the reference names are even mentioned, so doubt that would be the issue. Is there any further advice or information anyone can spare us? Struggling to see what we could be missing as everything looks to be in good shape based on the tests, sandbox and logs.
Trying to add the RevenueCat SDK as a Swift Package on Xcode 12.3 for iOS on Catalina after specifying dependency rule as suggested the error “because purchases-ios >= 4.0.0-beta.9 contains incompatible tools version and root depends on purchases-ios 4.0.0..<5.0.0, version solving failed” appears . How can work around this?
Hello all,I’d like to check the originalApplicationVersion for my iOS app, without prompting the user to login to their AppStore account.Your “converting a paid iOS app to subscription” blogpost has the following code, which looks like it should do what I want:if let receiptURL = Bundle.main.appStoreReceiptURL, let _ = try? Data(contentsOf: receiptURL) { Purchases.shared.restoreTransactions { (info, error) in completion?(info) }} This implies that it’s safe to call restoreTransactions if we’re certain that there is a receipt on the device.However, the (recently renamed) restoreTransactions function has a refresh policy of .always, which I suspect might prompt the user to login.So my questions:will restoreTransactions ever prompt for AppStore login if there is a receipt on the device? if that function might prompt, is there a reliable way to get originalApplicationVersion from an on-device receipt without prompting?Thank-you! Matthew
I have followed instructions from the official documentation (https://docs.revenuecat.com/docs/ios-subscription-offers) but I can’t get promotional offers to appear.I’m using a sandbox user, which has an expired annual subscription. When I call any of these methods, I either get 0 offers or it says that the user is not eligible for the promo offer (pay up front, x% off first year).let d = package.storeProduct.discounts (returns 0)let e = await Purchases.shared.checkTrialOrIntroDiscountEligibility(product: package.storeProduct) (returns ineligible)let promoOffers = await package.storeProduct.getEligiblePromotionalOffers() (returns 0) Here are the entitlements for the user:identifier=pro,isActive=false,willRenew=false,periodType=Normal,latestPurchaseDate=Optional(2022-05-28 12:36:19 +0000),originalPurchaseDate=Optional(2022-05-27 16:03:13 +0000),expirationDate=Optional(2022-05-28 13:36:19 +0000),store=Store(rawValue: 0),productIdentifier=com.mycompany.myapp.pro.yearly,isSandbox=true,unsu
HI, trying to implement renewable subscription. followed the guide to the tee, I’m pretty sure. good news, android works 100%. tried on apple devices, doesnt work. using the sandbox account I set up on apple connect, it goes through, gives me the success blue checkmark, says your all set, and then a second later I get this black debug screen of death for about 3 seconds and disappears. any help woould be appreciated, thanks
I am using android kotlin sdk for fetching the offerings (google play, IAP products). But the fetching of offering is very slow (~15s). In my application users can see the list of products as soon as they open the app. So showing a loading screen for 10-15 seconds until i can show products is giving a bad user experience. I tested the public revenuecat apis separately and they are pretty fast (<0.3s).I am using `Purchases.sharedInstance.getOfferingsWith` as instructed in the docs.I am initializing the SDK at application start.From logs i can see a 10s delay “Updating pending purchase queue” and “starting http requests”Logs:21:55:08.744 D/[Purchases]: ℹ️ Debug logging enabled21:55:08.745 D/[Purchases]: ℹ️ SDK Version - 5.0.0-rc221:55:08.745 D/[Purchases]: 👤 Initial App User ID - null21:55:08.745 D/[Purchases]: 👤 Identifying App User ID: $RCAnonymousID:QQQQQQ21:55:08.745 D/[Purchases]: ℹ️ Deleting old synced subscriber attributes that don't belong to $RCAnonymousID:QQQQQQ21:55:
Have user A logged in Purchase a subscription Log out, log in as user B Purchase a consumable in-app purchaseExpected: no subscription for user B, subscription for user AActual: subscription for B, no subscription for AThis is extremely wrong, since user B is expecting to get a consumable in-app purchase effect, while they get an effect as if they bought a subscription. Subscriptions should only be transferred when explicitly asked by a user.
We’re looking to use RevenueCat across our native Swift iOS app, Electron Mac app, and React web app. Currently all of our subscriptions have been managed via Stripe.Is there a best practice around how to integrate on the Electron app? We’re assuming Electron should behave similarly to web and use the Stripe Checkout integration or the RevenueCat REST API, but just want to make sure we’re on the right track before continuing.
Good eveningWe are moving away from calling SK1 directly towards using RC in iOS. We do use SKStorefront. We see the RCStoreFront class in the xcframework but we haven’t found a way to access/init/fetch it. Dead end? Can you point us in the right direction? How to get a RCStoreFront in ObjC Thank you
Good eveningFrom our understanding, on iOS, the purchase of a non-consommable or subscription can end up in the deferred state for example: permission of parent needed to complete the purchase. We would like to know at any moment the deferred or not state of a product. This way, we can reflect accordingly within our UI. If this is not possible with RC, why? And what is your best practice recommendation? We believe that with SK1, we are able to check this anytime thanks to the payment queue? Cheers
Some of our iOS users have reported that nothing happens when when restoring purchases on iOS and I’ve been able to reproduce. From debugging my own account, I have an active subscription in App Store but when I restore purchase, I noticed my `PurchaserInfo` does not include active subscriptions when restoring. In case it’s relevant, the `appUserId` we pass in during initialization with `Purchases.setup()` can be a different id across installs (e.g., a fresh install creates a new user id).Any known issues or advice on how to debug this further? VersionsTested with the following and both had empty active subscription:Flutter v2.10.3 and purchases_flutter v3.8.0 Flutter v3.0.1 and purchases_flutter v3.10.0 Code: final PurchaserInfo restoredInfo = await Purchases.restoreTransactions(); The data in PurchaserInfo: My phone’s subscription on App Store:
Goal: I’d set up a monthly/yearly subscription plan for App Store users, and now would like to increase the price for new users. However, I’d like to grandfather the old users’ price (i.e. their subscription prices ideally wouldn’t change).Setup: I originally created 2 new products in Apple/RevenueCat, created a new RevenueCat offering pointing to those products, and then made the new offering the default. Within my app, the new price is as expected! However, if a user goes to their payment settings, they can see ALL of the pricing. I have paying users across all 4 subscription products. Question: As I understand it, if I untick “Cleared for Sale” on the old products, old users’ subscriptions will stop. Is there a way to do this without disrupting the user? Thank you!
Hiya, I’m looking to add trials to my existing in-app subscriptions, but had some questions regarding the webhook events. I noticed that when starting a trial in the sandbox, the INITIAL_PURCHASE event is triggered, which is great. I was wondering:If the user continues with the trial and the trial automatically converts to a paying subscription, is another webhook event sent? We have a trial status against users on our API, so we would be looking to update this status based on the data that comes from the webhook. Would the RENEWAL event be sent here? If the user cancels the trial, am I correct in saying the the CANCELLATION webhook event is triggered?Thanks in advance,Joe
Hi,A quick question.I’m using RevenueCat with the sandbox user. I have two same-level subscriptions, one is monthly and the other one is annual. I added them into one entitlement. When I try to purchase each of them separately, everything works as expected. But the issue is, I subscribe to the annual plan, after that I try to subscribe to the monthly plan, and its purchases monthly without any alert, like I have not subscribed to the annual plan. I’m expecting the alert which says, “Do you want to modify your subscription to monthly, and it will begin and you will be charged after x date...”. This alert pops up when I try with the StoreKit, but not popping up with the RevenueCat. Is this normal, will it work when it is in production? My app is v1.0 and has not been accepted yet.My purchase function like;Purchases.shared.purchasePackage(package) { transaction, info, error, userCancelled in …Any idea?Thank you.
When testing purchases on Sandbox with StoreKit config specifying a 30 second subscription interval I quite often get an entitlement that has equal latestPurchaseDate and expirationDate therefore rendering it invalid immediately and deadlocking my purchase flow. Logica::Store::update_state: entitlements: ["base_content_access": <EntitlementInfo: "identifier=base_content_access,isActive=false,willRenew=true,periodType=PeriodType(rawValue: 1),latestPurchaseDate=Optional(2022-05-21 13:58:39 +0000),originalPurchaseDate=Optional(2022-05-21 13:58:39 +0000),expirationDate=Optional(2022-05-21 13:58:39 +0000),store=Store(rawValue: 0),productIdentifier=fivesysdev.logica.renewable_subscription,isSandbox=true,unsubscribeDetectedAt=nil,billingIssueDetectedAt=nil,ownershipType=PurchaseOwnershipType(rawValue: 0)>]Sometimes happen for 5 minute intervals too, but significantly less often. I was fine with this but Apple rejected my app, most probably due to them testing my app on sandbox with low
I noticed that even on a device running iOS15, Purchases.showManageSubscriptions() loads the subscriptions UI via Safari rather than a native action sheet. This seems to be because we have: SystemInfo.appleSubscriptionsURL = URL(string: "https://rev.cat/manage-apple-subscription")This url never passes the isAppleSubscription() test, therefore we always fallback to the openURL() method.Is this by design?
We’ve recently started developing a React Native app and are now at the stage of looking to configure IAP and integrate RevenueCat. However we’re running into the following issue when building the app with react-native-purchases to our Google Play testing track via fastlane:Google Api Error: Invalid request - Release uses an old version of Google Play Billing.I’m aware this is likely to be a result of the recent update to version 5 which isn’t currently supported with RevenueCat, but is there a workaround for this in the meantime? Or is it only possible if the app already had subscriptions under version 4 of the billing library?
How to check the status of a subscription suspended to block access to the application content because even when a subscription is suspended the right is still active. With the free plan.
We are migrating from sdk v3.x for android (java).The isBillingSupported method is not marked as deprecated in the new sdk, it is just gone. What is the replacement for this functionality? from v3.1Purchases.isBillingSupported(this, new com.revenuecat.purchases.interfaces.Callback<Boolean>() { @Override public void onReceived(Boolean isSupported) { if (isSupported) { // Billing Services are available queryStoreInventory(); } else { openPurchasingOffDialog(); } } });
I have a question about the StoreKit 2 isEligibleForIntroOffer behavior when testing with a sandbox user. On my iPhone I’m logged in with a sandbox user (via Settings > App Store > Sandbox Account) where I’ve cleared the purchase history via App Store Connect > Users.When I run my code on the device, the “StoreKit 1” way of determining if a user is eligible for a free trial for a renewable subscription (see “Determine Eligibility” section in Implementing Introductory Offers in Your App) works as expected. However, when I use the product.subscription.isEligibleForIntroOffer or Product.SubscriptionInfo.isEligibleForIntroOffer(for:) function with StoreKit 2, they both return false, even though this should be true since the receipt has been cleared. I was wondering if anyone has come across this too when testing with a Sandbox User...where isEligibleForIntroOffer doesn’t return the correct value.Code-wise, I’m using very similar logic found in RevenueCat’s project: TrialOrIntroPr
Hello, I have a case that I can’t seem to handle. Currently, if User1 with an alias logs in to the application from a device and buys a subscription he will get it just fine. Next, User1 does a logout and User2 will login on the same device and then something strange happens. The subscription is being transfered from User1 to User2. Is there any way to avoid that and link a subscription to the User ID alias?Also, is there any way to get a purchaseinfo by alias? Thank you
Latest Purchase Date of user a/c to the purchaser info library is: 2022-05-16I purchased the product today (17th) but still the last purchase is on 16th Why does the RevenueCat not updating the value when I am fetching latest purchase in code where as on the dashboard it shows all the information ?
Google now uses the new Subscriptions API, I would like to know if this version is already supported or if it is still using the InAppProduct API
I created a subscriber using the api https://api.revenuecat.com/v1/subscribers/app_user_idI can not find this subscriber in customer list, I checked in active,sandbox, non-subscribers and expired sections. But when I search for the user app_user_id, I can find the user. Why is that?
Im wondering why is it that i retrieve data back from “getOfferings” but not "getProducts”. I’d imagine that the fact that im receiving data for “getOfferings” means my current setup is correct. Any insight on this? Is there something more needed for “getProducts” to work?InfoExpo SDK 44react-native-purchases 4.5.3 Observed on iOS// Example response: await Purchases.getOfferings().all['Default']{"availablePackages": [{"identifier": "$rc_lifetime", "offeringIdentifier": "Default", "packageType": "LIFETIME", "product": [Object]}], "identifier": "Default", "lifetime": {"identifier": "$rc_lifetime", "offeringIdentifier": "Default", "packageType": "LIFETIME", "product": {"currency_code": "USD", "description": "Anime themed game deck!", "discounts": [Array], "identifier": "AnimeYouShouldKnow", "introPrice": null, "intro_price": null, "intro_price_cycles": null, "intro_price_period": null, "intro_price_period_number_of_units": null, "intro_price_period_unit": null, "intro_price_string":
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.