Discussion and help from anything related to RevenueCat.
Recently active
I continue to get these warning along with my paywall purchase button not showing. I even have the storekit enabled in my xcode scheme with the correct subscriptions in them and I made sure everything matched along with my sandbox developer account signed in. It seems like revenue cat is still trying to use production env even though I have everything setup to use storekit file. Can someone help me?Warnings: • Your products are configured in RevenueCat but aren't approved in App Store Connect yet. This prevents users from making purchases in production. Please ensure all products are approved and available for sale in App Store Connect. • The offerings 'default' have configuration issues that may prevent users from seeing product options or making purchases.Product Issues: ⚠️ premium_sub (Premium Sub): This product's status (READY_TO_SUBMIT) requires you to take action in App Store Connect before using it in production purchases.Offering Issues: ⚠️ default ⚠️ $rc_monthly (premiu
Hi everyone,I’m trying to connect my Apple App Store Connect API key to RevenueCat , but I keep getting these errors:“The App Store Connect API credentials are not valid or do not have sufficient permissions to list apps.”“The App Store Connect API credentials are not valid or do not have sufficient permissions to collect information about your subscriptions.Any help would be greatly appreciated!Thanks.
I find https://app.revenuecat.com/activity page very helpful.Why 'activity' page is not available in dashboard menu?
‘Filter’ is available in 'Customers' page but why there’s no ‘sort by’ or add/remove column function?
Hey folks! 👋One of my macOS app customers noticed the app connecting to api-production.8-lives-cat.io and got a bit worried because a security scanner (Gridinsoft) flagged it as potentially suspicious: https://gridinsoft.com/online-virus-scanner/url/api_production-8_lives_cat-ioI traced it back to your SDK here: https://github.com/RevenueCat/purchases-ios/blob/bf85f138ab066ed20ec866a5cbedc1e25085e692/Sources/Networking/HTTPClient/HTTPRequestPath.swift#L143Could you confirm this is a legitimate RevenueCat domain? It would be great to have official confirmation so I can reassure my customer.If it is yours, it might be worth reaching out to Gridinsoft to get the false positive removed.Thanks!
I would like to issue prorated refunds on App Store and Google Play accounts. Within the RC documentation, I noticed refunds can be issued on RevenueCat via the user’s profile but I assume these would be full refunds?If that is the case, I assume I would have to make the partial refunds manually via Google Play Console as described in their docs: https://support.google.com/googleplay/android-developer/answer/2741495?hl=en#zippy=If I do this, would my user profiles be updated and synced on my RC dashboard as well?
Im using the v2 Paywall. If I offer two packages, Annual and Monthly,the Annual plan includes a 7-day free trial while the Monthly plan does not.Because of that, I want the CTA button (purchase button) to say “Start FREE week” when the user chooses the Annual plan, and simply “Continue” when they choose the Monthly plan. How is this possible?
The paywall in my Flutter app is being flagged as non-compliant by Google Play store because it does not conform to this policy:Unclear or invisible dismiss button: Ensure that the dismiss button in your app is clearly visible and the size and color of the dismiss button is easy for users to find. If users are not able to access any content of your app without paid subscriptions, make clear indication to the user that a subscription is required to use the app. Here is my paywall, which was constructed with the RevenueCat paywall editor: Here is the code I use to display it, which has “displayCloseButton” set to true: @override Widget build(BuildContext context, WidgetRef ref) { return GgcScaffold( body: PaywallView( offering: users.currentUserOffering, displayCloseButton: true, onPurchaseCompleted: (CustomerInfo customerInfo, StoreTransaction storeTransaction) { ref.invalidate(revenueCatIsEntitledProvider); }, onPurchaseE
I originally started developing my app on an iPhone 13 and the paywall showed up fine. But, when I switched to testing the paywall on smaller devices such as the iPhone 13 mini, the formatting and responsiveness were not correct. A part of the paywall was cut off horizontally.In the RevenueCat editor itself, if I switch between device sizes, it works fine, but when I test locally on real physical devices, the responsiveness does not translate.I’m not sure if this is an issue on my side (I did check all my formatting and none of the hardcoded values seem to interfere with the responsiveness) or with a RevenueCat setting?Let me know if you need more information - I can upload screenshots if needed. Thanks
I can’t seem to find any way to test the refund flow for simple one time consumable non-subscription purchases (no entitlements). This is mission critical because my backend needs to deduct tokens from a user’s account if they refund. I understand I should expect a CANCELLATION webhook event, but if I call GET /subscribers/{app_user_id} in response to the webhook, what will be the change to their user info object? Will the purchase entry be removed from their list of purchases in the non-subscriptions json node? Is there really no way to test refunds from the sandbox?
I am using RevenueCat with Stripe for web payments. I am considering migrating to Paddle, as it seems to handle tax collection in a way that is understandable (Stripe's tax system is so confusing).How should I approach such a migration? What should I do with existing subscriptions? Is it possible to "cut" Stripe and have users' ongoing subscriptions remain active until the end of their period? When the end period arrives, I would just ask users to subscribe again via Paddle ? Or is there a better way?If you are like me and want to share how your migration is going, please use this thread :-)
HelloI have linked the entitlement with the product and configured it properly. but when the user purchases the entitlement is not given in code and also not displayed in the dashboard saying “unattached products”. i am building for iOS using flutter. what should i do to fix it?
Paywall Editor on the left / iOS Simulator on the right Hi!I’m seeing a visual/state bug with the Offered Package component in the new Paywall Editor testing on iOS.What I’m doing • Using the Paywall Editor with the Offered Package component. • I configured the icon states like this: • Default: Circle, color #3D3C41, 24×24 • Selected: Filled Circle Check, color #FBEB00, 24×24 • In the editor preview everything looks fine.Issue:On the iOS simulator, when I open the paywall and tap on a different package than the one selected by default: • The newly tapped product becomes selected • But the icon on the left does not switch to the “Selected” icon for the newly chosen package. • Instead, the originally selected package keeps the “Selected” icon, and only its color changes when I tap on other products.So effectively, icon state and actual selection go out of sync: the default product keeps the filled check icon, while another product is actual
I am designing my Paywall using the new Paywall Editor.I am using a Carousel where each Page hasa Title an Image which is a screenshot of the appThis is how such a page looks in an ideal scenario: However, the problem is that on smaller screens,the Carousel height does not adjust thus, the Page height does not adjust thus, the Image is not scaled to fit into the viewport.This is how it looks on a smaller device: I would in that case like the Image to scale to be smaller, fit into the Viewport, and not make the Carousel scrollable. I think what is needed to achieve that is the option to allow the Carousel to only fill the available height like using a weight of 1 only on the Carousel.How can I achieve this?Thanks in advance for any thoughts or hints!
Is there a way to configure Revenue cat to revoke entitlements immediately when billing fails and the subscritpion enters a billing retry or grace period? I’m using stripe. I noticed that my past_due stripe account have an active entitlement that doesn’t expire until end of next billing cycle! I currently have code like this but it feels ugly and I prefer revenue cat handle it: // Check if all subscriptions are either not active or not trialing const hasActiveOrTrialingSub = subscriptionData?.some( (sub) => sub.status === 'active' || sub.status === 'trialing' ); // Check if any subscription is past_due const hasPastDueSub = subscriptionData?.some( (sub) => sub.status === 'past_due' ); // Step 3: Fetch active entitlements for the owner const activeEntitlements = await getActiveEntitlements(ownerProfileId); console.log("activeEntitlements", activeEntitlements); if (!activeEntitlements || activeEntitlements.length === 0) { return; } const fleetEntitlement = act
Hi team,I'm experiencing unexpected webhook behavior when using `DEFERRED` proration mode for Google Play subscription changes.## Expected Behavior (per documentation)According to the [Event Flows documentation](https://www.revenuecat.com/docs/integrations/webhooks/event-flows#product-change-at-period-end):> In the case of a product change at period end, a PRODUCT_CHANGE event will immediately be sent informing of the upcoming product change. [...] When the customer encounters their next renewal, a RENEWAL event will be dispatched (for App Store subscriptions) or an **INITIAL_PURCHASE event (for Google Play subscriptions)**.## Actual BehaviorWhen using `GoogleProrationMode.DEFERRED` for a product change on Google Play:1. `PRODUCT_CHANGE` event is received (as expected)2. At next renewal, **RENEWAL** event is received instead of **INITIAL_PURCHASE**This contradicts the documentation which states Google Play should trigger `INITIAL_PURCHASE`.Additionally, the `original_transaction_id`
We are on iOS and have figured out that `checkTrialOrIntroDiscountEligibility` exists for dynamically determining if a user is eligible for an introductory offer.That lets us update the UI appropriately. However, we’d like to go a step further and start the free trial without showing the native sheet that requires a credit card. Is there a way to start the trial for the user without showing the paywall? We plan to show RC’s paywall after the introductory offer.
Hello everyone,I'm facing a frustrating issue where RevenueCat fails to fetch my newly added Consumable products, giving the error Could not find products with identifiers. However, my existing auto-renewable subscriptions (Weekly, Monthly, Yearly) are fetching and working perfectly in the same app.My Environment: Device: iPhone 8 (iOS 16.7.12) - Real Device Xcode: 16.0.1 (Build 17A400) App Status: Live in App Store (Version 1.0) RevenueCat Configuration: Products created, Entitlements linked, Offerings configured. The Issue: I added 3 new Consumable products (Credits system) in App Store Connect. They match the IDs in RevenueCat. When I run the app on a real device (Sandbox), Purchases.shared.offerings() returns empty for these specific packages, and the logs show that Apple is returning an invalid product identifier error. Logs: [store_kit] DEBUG: 😻 Store products request received response[offering] WARN: 🍎‼️ Could not find products with identifiers: ["rc_purplai_30cr", "rc_p
I’ve just realised that calling the new subscription Paywall when the user is seeking account status info and maybe modify the subscription level probably isn’t wise. Is it best practice to create Paywalls specific for this subscription change task?
I am getting Package Resolution Failed on Xcode 26.6.1. with package manager. Using CocoaPods or Carthage is not option for us. Is anyone else having this issue?https://github.com/RevenueCat/purchases-ios-spm.git
Hello, I am trying to fetch the daily revenue for a project through API Call in python. I have the API key and the project ID. However, I am unable to locate the endpoint to get the daily revenue for a specified date range. All I can get is a snapshot of their dashboard (containing the last 28 day revenue) with the following code: url = f"https://api.revenuecat.com/v2/projects/{project_id}/metrics/overview"headers = { "Authorization": f"Bearer {API_KEY}", "Accept": "application/json"} response = requests.get(url, headers=headers)response.raise_for_status()metrics = response.json().get('metrics', [])df = pd.DataFrame(metrics).rename(columns={'id': 'metric', 'value': 'value'})print(df) Can someone please help me with the code, that will take date range as input in parameters and give me a breakdown of daily revenue for the date range?
Hi, I'm integrating the RevenueCat Web Paywall into my Flutter app.Everything works perfectly on iOS, but on Android the Paywall screen becomes completely black, and the app stops responding.Flutter gives me these errors:
My app has been rejected multiple times during the last few weeks because Apple reviewer is unable to complete the purchase on paywall. They gave this error message: Guideline 2.1 - Performance - App CompletenessWe were still unable to purchase the subscription successfully.Review device details:- Device type: iPad Air 11-inch (M2)- OS version: iPadOS 26.1Next StepsWhen validating receipts on your server, your server needs to be able to handle a production-signed app getting its receipts from Apple’s test environment. The recommended approach is for your production server to always validate receipts against the production App Store first. If validation fails with the error code "Sandbox receipt used in production," you should validate against the test environment instead.Resources- Note that in-app purchases do not need to have been previously approved to confirm they function correctly in review.- Note that the Account Holder must accept the Paid Apps Agreement in the Business sectio
When editing a paywall package, if I set a custom color for the package border, say #e17728, and then scroll down to the badge fill background color and also set it to #e17728, the package border color is reverted to the original value, in this case, #cccccc.Steps to reproduce:Open V2 Editor Select package Set a custom Border: Border color (i.e #cccccc → #e17728) Set a custom Badge Fill: Background color (i.e #cccccc → #e17728) (Step 3’s color is reverted to the default.)Steps 3 & 4 can be reversed with the result being the former color is always reverted to the default value.
Hello RevenueCat Support Team,We are experiencing an issue with the getOfferings() function in our expo app.Details: In our RevenueCat dashboard, we have created two packages within the same Offering: 3-month package (subscription) Lifetime package (non-consumable) Both products are properly registered and published in the App Store and Google Play, and we have confirmed their status in RevenueCat. Both packages are included in the Offering in RevenueCat. However, when we call getOfferings() in the app on both iOS and Android, only the 3-month package is returned. The Lifetime package is missing from the returned Offerings data. We have ensured that: Store product IDs match exactly with RevenueCat product IDs Entitlements are correctly linked to the products The Offering includes both packages SDK is v8.10.1 Could you please advise why the Lifetime (non-consumable) package is not appearing in getOfferings() and how we can resolve this?Thank you for your support.
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.