Discussion and help from anything related to RevenueCat.
Recently active
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.
Hello Everyone,in my app i have 2 subscriptions plans 1 month and 3 months. i am using revenuecat paywall.for 1 month the variable is {{ product.price_per_period }} its showig correct currency € symbol after price.for 3 months when i add {{ product.price }} it shows price of total 3 months with correct position in currency symbol means after price but when i add {{ product.price_per_month }}/mo to see price per month in that case the currency symbol € is showing before price
I’m currently implementing the RevenueCat Web SDK in a React application, and I’m encountering an issue during the configuration step. When I initialize Purchases.configure(), I receive the following error:Error configuring RevenueCat: _me: Invalid API key. Use your Web Billing API key.I have confirmed that I am using what should be the correct Web Billing API Key, but the SDK continues to throw this error. I’m unable to pinpoint what might be causing it.Below is the relevant code snippet from my implementation: import { Purchases } from '@revenuecat/purchases-js'; useEffect(() => { if (hasConfiguredPurchases.current) return; if (!userInfo && !userDetails) return; try { let appUserId = userInfo?.user_uuid || userDetails?.user_id; if (!appUserId) { appUserId = typeof Purchases.generateRevenueCatAnonymousAppUserId === 'function' ? Purchases.generateRevenueCatAnonymousAppUserId() : `anon_${Date.now()}_${Math.random().toString(36).slice(2, 9)}`; } const purchases = Purchases.con
Hi RevenueCat team,I’m using the Paywalls feature to sell renewing subscriptions and everything has been working well. I recently added a new non-consumable product to both app stores, imported it into RevenueCat, and created a new offering + package + paywall for it.However, when I try to show this new paywall in my app, I get an offering_not_found error, and the paywall does not load. What I’ve checked so far The product is Approved in both App Store and Google Play. The RC product type is Non-consumable. Each store product is linked to one entitlement. The entitlement is linked to the new offering. The offering contains one package, and the paywall is set to use that exact package. When I switch the paywall to a pre-existing subscription offering, the paywall loads correctly on the frontend - so the paywall system itself works. Extra context The new offering shows correctly in the RC dashboard. I tested this both on TestFlight version and production version - got the sa
We are selling non renewable (non subscription) consumable products. All of our products are using offerings, however sometimes (rarely) a customer will purchase a product and the webhook event will have:"presented_offering_context": null,"presented_offering_id": null,This doesn’t make any sense because there is no place they can purchase a product within our app that doesn’t use an offering/paywall. Please advise
Hi,I’m using the direct integration between RC and Customerio. For the expiration_at parameter, RC sends an ISO timestamp. However! Customerio only uses Epoch (specifically in seconds–not milliseconds). Please change the integration such that the timestamp for expiration_at is an Epoch timestamp in seconds. Otherwise, this integration isn’t very useful (the most important piece of data that I need in Customerio is the user’s expiration date!).I mentioned this to @Jacob Eiting at RAGA and he was grateful for the feedback.cc @Brennan I’m #34 in the leaderboard here! Most people above me are RC staff. Thanks! Toby
I noticed that Paywall Web is now available.Is there any plan to add support for Flutter Web too?
I have a 3-day free trial configured in the App Store Connect, and the Paywall Builder automatically shows "free for 3 days" correctly when running the app. However, when I try to customize the template using variables, {{ product.price_per_period }} shows "1 week" instead of "3 days" (my trial period).The automatic "free for 3 days" text seems to override my custom template changes. Is there a way to:Disable the automatic trial text display? Use a variable that shows the trial period (3 days)? Fully customize the trial period display format and not letting RC override with the ‘free for 3 days’ text?Using iOS, React Native, and RevenueCatUI.Paywall.
https://api.revenuecat.com/v2/projects/{project_id}/customers/{customer_id}what is the id this end point is expecting ?I have a scenario , that i m passing orginalApUserId form my flutter sdk response to fetch the customer via my back end, i m passing something like $RCAnonymousID:476441ddabf3406e865d7cc14c8bduuiyas the customer. but API response give me error response saying no customer found. why?
Hi, i have deployed my app to testflight and got the error of wrong API key(Photo attached),On development build it was working fine and only got this issue when i pushed to testflightI have confirmed that i m using correct api keys not test api keys ( my api keys start with appl_)The Command i use to submit my build:eas build --profile production -p ios --auto-submit
Already have an account? Login
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.