Diagnose and resolve RevenueCat integration issues — inspects dashboard configuration through the RevenueCat MCP, walks the SDK debug logs, and covers code-side gotchas. Use when the user says offerings are empty, products not loading, entitlement not active after purchase, paywall won't load, transactions not appearing, customer info shows no entitlements, sandbox purchase not working, or RevenueCat is broken on iOS, Android, Kotlin Multiplatform, Flutter, or React Native.
72
88%
Does it follow best practices?
Impact
—
No eval scenarios have been run
Passed
No known issues
Use this skill when the user reports a RevenueCat behavior that does not match expectations: empty offerings, missing products, an entitlement that does not unlock after a successful purchase, a paywall that fails to render, or sandbox transactions that never reach the dashboard.
This skill combines two angles:
Work them in order. Most reports resolve before you reach the platform specifics.
Inspect the working directory and pick the first match, from top to bottom:
package.json has a react-native-purchases entry, or react-native as a dependency → read platforms/react-native.md. If expo is also a dependency, note it as an Expo project.pubspec.yaml exists at the project root → read platforms/flutter.md.build.gradle.kts contains a kotlin { … } multiplatform source sets block, or depends on com.revenuecat.purchases:purchases-kmp* → read platforms/kmp.md.build.gradle(.kts) applies com.android.application (and is not KMP) → read platforms/android.md.Package.swift, *.xcodeproj, *.xcworkspace, or Podfile at the project root → read platforms/ios.md.If several match (e.g. an ios/ folder inside a Flutter project), pick the outermost project, the one that owns the build. If still ambiguous, ask the user which platform the bug reproduces on.
Walk these nine items in order. Most reports are resolved by steps 1 through 5.
logLevel to debug.appl_… public SDK key. Android apps must use goog_… (or amzn_… for Amazon). A mismatched key produces an authentication error on the first network call. On iOS this surfaces as an INVALID_CREDENTIALS error code. On Android it surfaces as PurchasesErrorCode.InvalidCredentialsError.availablePackages list even though getOfferings succeeds.logIn(appUserID) was called with an ID that does not match what the user expects, entitlements appear missing because they are attached to a different RC user. Print Purchases.shared.appUserID (iOS) / Purchases.sharedInstance.appUserID (Android) and confirm it matches.Use this when steps 3, 4, or 5 above point at dashboard configuration, when the user has no working app yet, or when you need to confirm a fix landed.
Important: The API key may have access to multiple projects. Always call list-projects first. If multiple projects are returned, ask the user which to inspect.
Work through this checklist via MCP tools:
list-projects → ask user to select project if multiple
list-apps (with selected project_id)list-productsproduct_id:base_plan_id format.list-entitlements
get-products-from-entitlement (for each entitlement)list-offerings
list-packagesis_current: true.$rc_monthly, etc.).list-webhook-integrationsDiagnostic Report
=================
Project: {project_name}
Checks Passed: ✅
- Project exists and is accessible
- 2 apps configured (iOS, Android)
- 4 products found
Issues Found: ⚠️
1. CRITICAL: Product not attached to entitlement
Product: annual_premium (prod123)
Fix: Attach this product to an entitlement
2. WARNING: Offering has empty package
Offering: default / Package: $rc_annual has no products
Fix: Attach annual_premium to this package
3. INFO: No webhook configured
Optional but recommended for server-side access control
Recommended Actions:
1. Attach annual_premium to "premium" entitlement
2. Attach annual_premium to $rc_annual package
Would you like me to fix issues #1 and #2 now?For each fixable issue, confirm with the user, then execute via MCP:
attach-products-to-entitlementattach-products-to-packageRead the platform file that matches detection. Each one lists platform specific gotchas not covered above (StoreKit configuration files, Gradle/desugaring, Metro caching, Expo prebuild, etc.).
platforms/ios.mdplatforms/android.mdplatforms/kmp.mdplatforms/flutter.mdplatforms/react-native.mdDo not declare the issue fixed until:
appUserID.If the user cannot reproduce locally, have them send the full debug log from app launch to the moment of failure. The SDK's own output is usually enough.
| Error code | Likely cause | Solution |
|---|---|---|
INVALID_APP_USER_ID | Reserved characters or empty string | Use alphanumeric IDs, underscores, hyphens only |
INVALID_CREDENTIALS | Wrong API key or bundle ID mismatch | Verify API key matches app |
NETWORK_ERROR | No connectivity or firewall | Check network, verify RevenueCat domains allowed |
STORE_PROBLEM | Store downtime, config issue, iOS 18.x bug | Check store status, verify config, see Known iOS Issues below |
SIGNATURE_VERIFICATION_FAILED | Tampered receipt or config error | Verify In-App Purchase Key (iOS) or service credentials |
| Error code | Solution |
|---|---|
RECEIPT_ALREADY_IN_USE | Call restorePurchases() or sync customer |
PRODUCT_NOT_AVAILABLE_FOR_PURCHASE | Verify product status in App Store Connect / Play Console |
PURCHASE_NOT_ALLOWED | Check parental controls, payment method |
PRODUCT_ALREADY_PURCHASED | Call restorePurchases() to sync |
Ask the developer to enable debug logging:
Purchases.logLevel = .debugPurchases.logLevel = LogLevel.DEBUGLog emoji indicators: 🍎 Apple/StoreKit · 🤖 Google Play · 📦 Amazon · 😿 RevenueCat backend.
iOS 18.0–18.3.2: StoreKit Daemon Connection Failure
STORE_PROBLEM (NSCocoaErrorDomain Code 4097) on ~25% of purchases on physical devices.iOS 18.4–18.5 Simulator: Products Don't Load
ProxyBillingActivity NullPointerException
NoCoreLibraryDesugaringException / NoClassDefFoundError
build.gradle or raise minSdk.product_id:base_plan_id format."Issues fetching products" — Products must be submitted for review with the app on first submission. Create products in App Store Connect, then submit app and products together.
"Error during purchase" (Sandbox) — Apple sandbox downtime. Inform reviewer, provide RevenueCat sandbox dashboard screenshot showing test purchases work, ask to retry.
"Content not unlocked after purchase" — Verify product → entitlement connection in RevenueCat. Ensure app calls getCustomerInfo() after purchase.
User purchased but has no entitlement — Check product → entitlement attachment and verify store identifier matches exactly.
Offering returns empty — Verify a current offering exists, packages have products attached, and products exist in the app's store.
Webhook not receiving events — Verify URL is internet-accessible and returns 200 OK. Test with webhook.site.
Subscription status out of sync — SDK caches CustomerInfo for 5 min (foreground). Force refresh:
// iOS
Purchases.shared.getCustomerInfo(fetchPolicy: .fetchCurrent) { ... }// Android
Purchases.sharedInstance.getCustomerInfoWith(CacheFetchPolicy.FETCH_CURRENT) { ... }SDK crashes on launch (iOS / Xcode 26) — Initialize RevenueCat before other networking libraries.
SDK crashes on launch (Android) — Enable core library desugaring or raise minSdk to 24+.
407e465
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.