Fetching Offerings Errors
0:08:00Fetching offerings errors are among the most common issues developers face. These typically occur when RevenueCat can't retrieve product information from the app stores.
Issue 1: "None of the products could be fetched" Error
Error Message
[RevenueCat] 🍎‼️ Error fetching offerings - The operation couldn't be completed.
(RevenueCat.OfferingsManager.Error error 1.)
There's a problem with your configuration. None of the products registered in the RevenueCat dashboard
could be fetched from App Store Connect (or the StoreKit Configuration file if one is being used).
More information: https://rev.cat/why-are-offerings-emptyCommon Causes
- No Products Configured: Products not set up in RevenueCat dashboard.
- Product ID Mismatch: IDs in RevenueCat don't match store products.
- Products Not Available in Current Storefront: Testing from unsupported region.
- Bundle ID / Package Name Mismatch: App identifier doesn't match dashboard.
- Products Not Approved (iOS): Products pending review in App Store Connect.
- Service Account Issues (Android): Google Play credentials not configured.
Solution Steps
Step 1: Verify Products Exist in RevenueCat
- Go to RevenueCat dashboard.
- Navigate to Product Catalog → Products.
- Verify you have products listed.
- If empty, import products or create them manually.
Step 2: Verify Product IDs Match Store
For iOS:
- Check product IDs in App Store Connect.
- Compare with RevenueCat dashboard (Product Catalog → Products).
- Ensure exact match (case-sensitive).
For Android:
- Check product IDs in Google Play Console.
- Compare with RevenueCat dashboard.
- Ensure exact match (case-sensitive).
Step 3: Verify Products Are in an Offering
- In RevenueCat dashboard, go to Product Catalog → Offerings.
- Select your offering (usually "default").
- Check that packages exist and contain products.
- If no packages, click Edit and add packages with products.
Step 4: Check Platform-Specific Setup
For iOS:
- Verify bundle ID matches in RevenueCat (Apps & providers → App Store).
- Ensure products are approved or use StoreKit Configuration File.
- Check sandbox tester is signed in (if testing in sandbox).
For Android:
- Verify package name matches in RevenueCat (Apps & providers → Google Play).
- Ensure service account is configured and has permissions.
- Verify products are Active in Google Play Console.
- Ensure app is published to at least Internal Testing.
Issue 2: Empty Offerings
Symptoms
offerings.allis empty.offerings.currentis nil.- No error message, but offerings object has no data.
Common Causes
- No Packages in Offering: Offering exists but has no packages.
- No Default Offering Set: No offering marked as default.
- Products Not Attached to Packages: Packages exist but have no products.
- Offering Identifier Mismatch: Code requests wrong offering identifier.
Solution Steps
Step 1: Verify Offering Has Packages
- In RevenueCat dashboard, go to Product Catalog → Offerings.
- Click on your offering (e.g., "default").
- Verify the Packages section has at least one package.
- If empty, click Edit and add packages.
Step 2: Verify Packages Have Products
- For each package in your offering.
- Verify it has products attached for your platform (iOS or Android).
- At minimum, each package needs one product ID.
Step 3: Set Default Offering
- In Product Catalog → Offerings.
- Find your main offering.
- Check if "Current" badge is displayed.
- If not, click the offering → Make Current.
Step 4: Verify Code Uses Correct Identifier
iOS:
let offerings = try await Purchases.shared.offerings()
// Check if current offering exists
if let offering = offerings.current {
print("Offering: \(offering.identifier)")
print("Packages: \(offering.availablePackages.count)")
} else {
print("No current offering set")
}Android:
val offerings = Purchases.sharedInstance.awaitOfferings()
// Check if current offering exists
offerings.current?.let { offering ->
Log.d("RC", "Offering: ${offering.identifier}")
Log.d("RC", "Packages: ${offering.availablePackages.size}")
} ?: Log.d("RC", "No current offering set")Issue 3: Offering Configuration Warnings
Error Message
warning: The offerings 'default' have configuration issues that may prevent users from
seeing product options or making purchases.
Product Issues:
• Package 'monthly' references product 'premium_monthly' which is not availableCommon Causes
- Missing Product for Platform: Package has iOS product but no Android product (or vice versa).
- Incorrect Product Association: Product attached to package doesn't exist in store.
- Platform Filter Issue: Product exists but is filtered out for current platform.
Solution Steps
Step 1: Check Package Configuration
- In RevenueCat dashboard, go to your offering.
- For each package, verify it has products for both iOS and Android (if you support both platforms).
- If you only support one platform, ensure products exist for that platform.
Step 2: Verify Product Exists in Store
- Copy the problematic product ID from the warning.
- Check if it exists in App Store Connect or Google Play Console.
- If it doesn't exist, either:
- Create the product in the store, OR
- Remove/update the product reference in RevenueCat.
Issue 4: Network and API Errors
Error Message
Error: Unable to fetch offerings
NetworkError: The Internet connection appears to be offline
Error: Request timed outCommon Causes
- No Network Connection: Device has no internet access.
- Firewall/VPN Blocking: Corporate network or VPN blocks RevenueCat servers.
- Invalid API Key: Wrong API key configured.
- Server Issues: Rare RevenueCat service disruption.
Solution Steps
Step 1: Verify Network Connection
- Test internet connectivity on device/simulator.
- Try opening a website in browser.
- Check Wi-Fi/cellular data is enabled.
Step 2: Check API Key
// Verify you're using the correct API key for your platform
// iOS: Should start with "appl_"
// Android: Should start with "goog_"
Purchases.configure(withAPIKey: "appl_xxxxxxxxxxx")Step 3: Test Without VPN/Proxy
- Temporarily disable VPN or proxy.
- Test if offerings fetch successfully.
- If successful, configure VPN/firewall to allow RevenueCat domains.
Step 4: Implement Retry Logic
func fetchOfferingsWithRetry(maxRetries: Int = 3) async throws -> Offerings {
var lastError: Error?
for attempt in 1...maxRetries {
do {
return try await Purchases.shared.offerings()
} catch {
lastError = error
if attempt < maxRetries {
// Wait before retrying (exponential backoff)
try await Task.sleep(nanoseconds: UInt64(pow(2.0, Double(attempt))) * 1_000_000_000)
}
}
}
throw lastError ?? NSError(domain: "Offerings", code: -1)
}Issue 5: Offerings Work in SampleCat But Not in My App
Symptom
You can retrieve offerings and products using RevenueCat's SampleCat app (or the REST API), but your own app returns empty offerings or fails to fetch products, even though the bundle ID is the same.
Why This Happens
If SampleCat works with the same bundle ID, it proves your RevenueCat dashboard configuration and store products are correct. The issue is in how your app initializes or communicates with the SDK. The bundle ID, API key, and store must form a complete chain:
Store (App Store / Google Play)
↕ (product IDs must match)
RevenueCat Project (bundle ID configured here)
↕ (API key + bundle ID must match)
Your App (bundle ID in Xcode/Gradle + API key in code)All three layers must be aligned. If any link is broken in your app but not in SampleCat, your app will fail while SampleCat succeeds.
Solution Steps
Step 1: Verify your API key
This is the most common cause. Double-check that your Purchases.configure() call uses the exact same public API key that SampleCat uses.
// iOS: Key must start with "appl_"
Purchases.configure(withAPIKey: "appl_YOUR_PUBLIC_KEY")
// Android: Key must start with "goog_"
Purchases.configure(this, "goog_YOUR_PUBLIC_KEY")sk_) in your app. Use the public key from RevenueCat Dashboard → Project Settings → API Keys.
Step 2: Check SDK initialization timing
Purchases.configure() must be called as early as possible in your app lifecycle, before any offerings fetch. If it is called too late or conditionally, the SDK may not be ready when you request offerings.
// iOS: Configure in AppDelegate or App init
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
Purchases.logLevel = .debug
Purchases.configure(withAPIKey: "appl_YOUR_KEY")
return true
}// Android: Configure in Application.onCreate()
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
Purchases.logLevel = LogLevel.DEBUG
Purchases.configure(PurchasesConfiguration.Builder(this, "goog_YOUR_KEY").build())
}
}Step 3: Check for errors in the callback
Always inspect the error parameter when fetching offerings. A silent failure here is the most common reason for "it just doesn't work."
Purchases.shared.getOfferings { offerings, error in
if let error = error {
print("❌ Error fetching offerings: \(error.localizedDescription)")
return
}
guard let current = offerings?.current else {
print("⚠️ No current offering found")
return
}
print("✅ Current offering: \(current.identifier)")
print(" Packages: \(current.availablePackages.map { $0.identifier })")
}Step 4: Verify StoreKit Configuration (iOS Simulator only)
When running on the iOS Simulator, your Xcode project needs a StoreKit Configuration file. SampleCat includes one by default, but your project may not.
- In Xcode, go to Product → Scheme → Edit Scheme → Run → Options.
- Check the StoreKit Configuration dropdown.
- If it says "None", either create a StoreKit Configuration file with matching product IDs, or test on a physical device with a sandbox account instead.
Step 5: Enable debug logs and compare
Add Purchases.logLevel = .debug (iOS) or Purchases.logLevel = LogLevel.DEBUG (Android) before configure(). Run both SampleCat and your app, then compare the debug output. Look for differences in:
- The API key being used.
- The app user ID.
- The products returned from the store.
- Any error messages during initialization.
"Configuring Purchases with API key: appl_xxx" and the key differs from what SampleCat uses, you have found the problem.
Issue 6: Products Have "READY_TO_SUBMIT" Status
Symptoms
You see two log messages in sequence. First, a warning that the SDK is configured correctly but products have issues:
WARN: ⚠️ RevenueCat SDK is configured correctly, but contains some issues you might want to address
Warnings:
• Your products are configured in RevenueCat but aren't approved in App Store Connect yet.
This prevents users from making purchases in production.
Product Issues:
⚠️ monthly (monthly): This product's status (READY_TO_SUBMIT) requires you to take action
in App Store Connect before using it in production purchases.
⚠️ yearly (yearly): 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 (monthly): status (READY_TO_SUBMIT)
⚠️ $rc_annual (yearly): status (READY_TO_SUBMIT)Then, an error that none of the products could be fetched:
ERROR: 😿‼️ There is an issue with your configuration. Check the underlying error for more details.
More information: https://rev.cat/sdk-troubleshooting
There's a problem with your configuration. None of the products registered in the RevenueCat
dashboard could be fetched from App Store Connect (or the StoreKit Configuration file if one
is being used).
More information: https://rev.cat/why-are-offerings-emptyWhy This Happens
The READY_TO_SUBMIT status means your products exist in App Store Connect but have never been submitted for review. Apple requires in-app purchase products to be submitted alongside an app version. Until they are reviewed and approved, the App Store will not serve them to your app in production.
The key insight here is in the WARN message itself: "RevenueCat SDK is configured correctly." This confirms your RevenueCat dashboard setup, API keys, and bundle ID are all fine. The problem is purely on the App Store Connect side.
Understanding Product Statuses
| Status | Meaning | Can Fetch Products? |
|---|---|---|
| Ready to Submit | Product created but never submitted for review. | No (production). Yes (sandbox/StoreKit Config). |
| Waiting for Review | Submitted with an app version, pending Apple review. | No (production). Yes (sandbox/StoreKit Config). |
| Approved | Reviewed and approved by Apple. | Yes. |
| Developer Action Needed | Apple rejected or flagged the product. | No. |
| Missing Metadata | Product is incomplete (missing description, price, or screenshot). | No. |
Solution Steps
Step 1: Complete your product metadata in App Store Connect
For each product with READY_TO_SUBMIT status, ensure it has all required metadata:
- Go to App Store Connect → Your App → Subscriptions (or In-App Purchases).
- Click on each product and verify it has:
- A Reference Name and Product ID.
- At least one Subscription Price or price tier configured.
- A Localization with display name and description.
- A Review Screenshot (a screenshot showing the product in your app).
Step 2: Submit your products with an app version
In-app purchase products must be submitted with a new app version:
- In App Store Connect, go to your app → create a new version (or use a pending version).
- Scroll to the In-App Purchases and Subscriptions section.
- Click the + button and select your products.
- Submit the version for review.
"Do I Need to Submit for Review to Test Purchases?"
There are two completely separate things:
| Submitting for App Store Review | Testing Purchases During Development | |
|---|---|---|
| What it does | Makes products available to real users in the App Store. | Lets you verify your integration works before going live. |
| Requires | Full app version with screenshots, keywords, description, review notes. | Just a StoreKit Configuration file OR a sandbox tester account. |
| Product status needed | Products must be "Approved" after review. | "Ready to Submit" works fine. |
| Build needed | Must submit a build for review via App Store Connect. | Run from Xcode, or install via TestFlight. |
| Timeline | 24-48 hours for Apple review. | Immediate (StoreKit Config) or minutes (sandbox). |
Step 3: Test without waiting for approval
You can test purchases right now with "Ready to Submit" products. Choose one of these approaches:
Option A: StoreKit Configuration File (Recommended, fastest)
This is the fastest way to test. It works offline with no Apple dependencies:
- In Xcode, go to File → New → File → StoreKit Configuration File.
- Add each product with the exact same Product ID as in App Store Connect.
- Set the product type, price, and duration to match your App Store Connect configuration.
- Go to Product → Scheme → Edit Scheme → Run → Options.
- Under StoreKit Configuration, select your new
.storekitfile. - Build and run. Products will load instantly.
Option B: Sandbox Testing (on a physical device)
This tests against Apple's sandbox servers, which is closer to the real production environment:
- Create a sandbox tester in App Store Connect → Users and Access → Sandbox Testers.
- On your test device, go to Settings → App Store → Sandbox Account and sign in with the sandbox credentials.
- Make sure your Xcode scheme has StoreKit Configuration set to "None" (so it uses the real sandbox, not the local file).
- Run the app on the device. "Ready to Submit" products are available in the sandbox.
Option C: RevenueCat Test Store
Use RevenueCat's Test Store for fast, deterministic testing without needing Apple's infrastructure at all. No sandbox accounts, no StoreKit files needed.
Issue 7: StoreKit Can't Resolve Products Despite Correct RevenueCat Config (iOS)
Symptom
Your RevenueCat dashboard and API show offerings configured correctly with the right product identifiers. Products exist in App Store Connect. However, when the app calls Purchases.shared.offerings(), the availablePackages array comes back empty. No error is thrown, but no products are displayed.
let offerings = try await Purchases.shared.offerings()
// offerings.current exists, BUT:
print(offerings.current?.availablePackages.count) // 0The key diagnostic clue: if you query the RevenueCat REST API directly, the offerings and products are returned correctly. The gap is between "RevenueCat server knows the products" and "StoreKit can't resolve them on the device."
Why This Happens
When getOfferings() is called, the RevenueCat SDK performs two steps:
- Fetches the offering configuration from RevenueCat's servers (offering identifiers, package identifiers, product IDs). This step works because your dashboard is configured correctly.
- Resolves product identifiers with StoreKit by calling Apple's
Product.products(for:)(StoreKit 2) orSKProductsRequest(StoreKit 1). If StoreKit cannot resolve the product IDs, the packages are filtered out andavailablePackagesis empty.
Apple's StoreKit requires a binary activation step: the first time you use specific product IDs in an app, Apple needs to process at least one app binary (uploaded to App Store Connect) to link those product identifiers to your app. Until this processing is complete, StoreKit will not resolve the products, even though they exist in App Store Connect.
When This Typically Occurs
- Brand new products: You just created in-app purchase products in App Store Connect for the first time.
- First-ever app submission: The app has never had a binary uploaded to App Store Connect before.
- New product IDs added: You added new products to an existing app but haven't submitted a build since creating them.
How to Distinguish This from Other Issues
| Check | Result | Interpretation |
|---|---|---|
| RevenueCat REST API returns offerings | Yes, with products | RevenueCat config is correct. |
| Products exist in App Store Connect | Yes, visible in dashboard | Products are created. |
offerings.current exists in SDK | Yes | SDK fetched the offering config successfully. |
availablePackages count | 0 | StoreKit failed to resolve product IDs. |
| StoreKit Configuration file set in Xcode | No | App is using Apple's sandbox, not local StoreKit. |
If all rows match this pattern, the issue is StoreKit product activation.
Solution Steps
Step 1: Upload a binary to App Store Connect
Submit a build through Xcode or CI/CD that references the in-app purchase product IDs:
- Archive your app in Xcode (Product → Archive).
- Upload to App Store Connect via Distribute App → App Store Connect.
- Alternatively, use
xcodebuildor Fastlane to upload. - Wait for Apple to process the build (typically 15-30 minutes, can take longer).
You do not need to submit the build for review. Simply uploading it to App Store Connect (making it available in TestFlight) is enough to trigger the activation.
Step 2: Wait for Apple's processing
After the build is uploaded:
- Apple processes the binary and links the product identifiers to your app.
- This can take anywhere from 15 minutes to a few hours.
- You can check the build's processing status in App Store Connect under TestFlight.
- Once the build shows "Ready to Test" in TestFlight, the products should start resolving.
Step 3: Test again
After the build is processed:
- Install the build from TestFlight on your device, or run from Xcode on a device with a sandbox account.
- Call
Purchases.shared.offerings()again. availablePackagesshould now be populated.
Alternative: Use a StoreKit Configuration File for immediate testing
If you need to test right away without waiting for binary activation:
- In Xcode, create a StoreKit Configuration File (File → New → File → StoreKit Configuration File).
- Add products with the exact same product IDs as in App Store Connect.
- Go to Product → Scheme → Edit Scheme → Run → Options.
- Select your StoreKit Configuration file.
- Products will resolve immediately using the local configuration.
Issue 8: "No Subscriptions Available" on iOS (Coming from Android)
Symptom
You've completed all the RevenueCat configuration (products, offerings, packages, API key), but when testing on iOS the app shows an error like:
Error: no subscriptions available. Try again later.This is particularly common for developers who have experience with Android/Google Play and are setting up iOS for the first time. The RevenueCat side is configured correctly, but something on the Apple side is preventing products from loading.
Most Common Cause: Paid Applications Agreement
The #1 cause for first-time iOS developers is the Paid Applications Agreement not being signed or incomplete. Unlike Google Play, Apple requires you to complete business and banking information before any in-app purchase products will work, even in the sandbox.
To fix this:
- Go to App Store Connect.
- Navigate to Business (formerly "Agreements, Tax, and Banking").
- Check for any banners or warnings at the top of the page.
- Complete these sections:
- Paid Applications Agreement: Must show Active status. If it says "Pending" or "New," click to accept the terms.
- Banking Information: Add your bank account details.
- Tax Forms: Complete the required tax forms (W-9 for US, W-8BEN for non-US developers).
- Wait up to 24-48 hours for Apple to verify your information (banking verification can take time).
Other Causes (iOS-Specific Gotchas for Android Developers)
If the Paid Applications Agreement is already active, work through this checklist of iOS-specific requirements that don't have Android equivalents:
| # | iOS Requirement | Android Equivalent | How to Check |
|---|---|---|---|
| 1 | Paid Applications Agreement | No equivalent (Google just needs a merchant account). | App Store Connect → Business → must show "Active." |
| 2 | StoreKit Configuration File (for Simulator testing) | No equivalent (Google Play Billing works on emulators with Play Store). | Xcode → Product → Scheme → Edit Scheme → Run → Options → StoreKit Configuration. |
| 3 | Binary uploaded to App Store Connect (for sandbox) | Equivalent: app published to Internal Testing track. | App Store Connect → TestFlight → check for a processed build. |
| 4 | Sandbox tester account | Equivalent: License Tester in Play Console. | App Store Connect → Users and Access → Sandbox Testers. |
| 5 | In-App Purchase Key (for SDK v5+/StoreKit 2) | Equivalent: Service Account JSON key. | RevenueCat Dashboard → Apps & providers → App Store → In-App Purchase Key. |
| 6 | Bundle ID match | Equivalent: Package name match. | Xcode target → General → Bundle Identifier must match RevenueCat → Apps & providers. |
Common Issues Quick Reference
| Problem | Possible Cause | Solution |
|---|---|---|
| "No subscriptions available" (first-time iOS) | Paid Applications Agreement not signed or banking info incomplete. | Go to App Store Connect → Business. Complete the Paid Applications Agreement, banking details, and tax forms. All sections must show Active/completed status. Wait up to 48 hours for verification. See detailed guide above. |
availablePackages empty but RevenueCat API works |
StoreKit hasn't activated the product IDs (no binary uploaded yet). | Upload a build to App Store Connect (even just for TestFlight). Wait for Apple to process it (15 min to a few hours). Once the build is "Ready to Test," StoreKit will start resolving the products. See detailed guide above. |
| "None of the products could be fetched" | Product IDs in RevenueCat don't match the store. | Copy product IDs from App Store Connect or Google Play Console. In RevenueCat dashboard → Product Catalog → Products, verify each ID matches exactly (case-sensitive). Even a trailing space will cause a mismatch. |
| "None of the products could be fetched" | Products not approved or active in the store. | For iOS: products must be approved by Apple or tested with a StoreKit Configuration File. For Android: products must be Active in Google Play Console and the app published to at least Internal Testing. |
| "None of the products could be fetched" | Wrong API key for the platform. | iOS apps must use an API key starting with appl_ and Android apps must use a key starting with goog_. Check your Purchases.configure() call and verify the key in RevenueCat dashboard → API keys. |
| Offerings object is empty | No packages added to the offering. | In RevenueCat dashboard → Product Catalog → Offerings → your offering, click Edit and add packages (e.g., $rc_monthly, $rc_annual). Each package must have at least one product attached. |
| Offerings object is empty | No default offering set. | In Product Catalog → Offerings, verify your main offering shows the "Current" badge. If not, click on the offering and select Make Current. The offerings.current property returns the default offering. |
| Offerings object is empty | Products attached but missing for current platform. | Each package needs products for the platform you're testing on. If testing iOS, attach an App Store product. If testing Android, attach a Google Play product. Check each package's product list in the offering editor. |
| "offerings.current" returns nil | Using wrong offering identifier in code. | If using offerings.offering(identifier:), verify the identifier matches your RevenueCat dashboard. For the default offering, use offerings.current instead. Check for typos in the identifier string. |
| Products show $0.00 price | Store unable to fetch pricing information. | This usually means the store can't resolve the product. Verify your product exists and is active in the store. On iOS, check that the StoreKit Configuration includes proper pricing. On Android, ensure the product has a base plan with pricing. |
| Offerings fetch hangs or times out | Network connectivity issues. | Check device internet connectivity. Temporarily disable VPN or proxy. Verify api.revenuecat.com is not blocked by a firewall. Add retry logic with exponential backoff in your app for transient failures. |
| Offerings fetch hangs or times out | RevenueCat SDK not configured before fetching. | Ensure Purchases.configure() is called before any offerings fetch. On iOS, configure in AppDelegate.application(_:didFinishLaunchingWithOptions:). On Android, configure in Application.onCreate(). |
| Products missing after store update | SDK cache returning stale data. | Call Purchases.shared.invalidateCustomerInfoCache() to clear the cache. Then fetch offerings again. Force-quit and reopen the app if the issue persists. |
| "Configuration warning" in dashboard | Products in offering reference non-existent store products. | Go to RevenueCat dashboard and check for configuration warnings. Cross-reference each product ID with the store. Remove or update any products that no longer exist in App Store Connect or Google Play Console. |
| Offerings empty on Android emulator | Emulator lacks Google Play Store or billing support. | Use a physical Android device for testing, or an emulator with Google Play Store installed (not just "Google APIs"). Sign in with a licensed tester Google account. Local debug builds may also need to be uploaded to a testing track. See community discussion. |
| Products have "READY_TO_SUBMIT" status | Products created in App Store Connect but never submitted for review. | In-app purchase products must be submitted alongside an app version for Apple review. Complete all product metadata (price, localization, screenshot), then add them to a new app version and submit for review. For testing, use a StoreKit Configuration file or sandbox account. See detailed guide above. |
| Offerings work in SampleCat but not my app | Wrong API key in your app's Purchases.configure() call. |
Verify you are using the exact same public API key as SampleCat. Check RevenueCat Dashboard → Project Settings → API Keys. Ensure iOS uses appl_ prefix and Android uses goog_ prefix. See detailed guide above. |
| Offerings work in SampleCat but not my app | SDK not configured or configured too late. | Ensure Purchases.configure() is called in AppDelegate.didFinishLaunching (iOS) or Application.onCreate() (Android), before any offerings fetch. Enable debug logs to verify initialization order. |
| Offerings work in SampleCat but not my app | Missing StoreKit Configuration file on iOS Simulator. | SampleCat includes a StoreKit Configuration file. Your project may not have one. Go to Product → Scheme → Edit Scheme → Run → Options and set the StoreKit Configuration. Alternatively, test on a physical device with a sandbox account. |
| Offerings work in TestFlight but not Xcode build | StoreKit Configuration set to "None" without proper sandbox setup. | When running from Xcode with StoreKit Configuration set to "None", you're using Apple's sandbox. Ensure a sandbox tester is signed in on the device. Alternatively, attach a StoreKit Configuration file with matching product IDs for local testing. See community discussion. |
| Offerings timeout during App Store review | Apple's review environment has network restrictions. | This is a transient issue with Apple's review infrastructure. Ensure your app handles offerings loading failures gracefully (show a retry button, not a blank screen). Resubmit the app for review. See community discussion. |
Expo/React Native: getProducts() returns empty |
Using Expo Go instead of a development build. | Expo Go does not support native modules like RevenueCat. Use EAS Build to create a development build. Verify react-native-purchases is correctly linked. For Android, the app must be uploaded to a testing track. See community discussion. |
Debugging Checklist for Offerings Issues
- ☐ Products exist in RevenueCat dashboard.
- ☐ Product IDs match exactly with store (case-sensitive).
- ☐ Offering has packages with products attached.
- ☐ Default offering is set.
- ☐ Bundle ID / Package name matches.
- ☐ API key is correct for platform (appl_ or goog_).
- ☐ Network connection is available.
- ☐ Products are approved (iOS) or Active (Android), not "Ready to Submit."
- ☐ Debug logging is enabled.
- ☐ Testing with valid credentials (sandbox or Test Store).