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
text
[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.
Quick Fix: Enable verbose logging to see exactly which products are being fetched and why they're failing. See the SDK Debug Messages section below.
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:
swift
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:
kotlin
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
text
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
text
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
swift
// 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
swift
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)
}Common Issues Quick Reference
| Problem | Possible Cause | Solution |
|---|---|---|
| "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. |
| 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).
- ☐ Debug logging is enabled.
- ☐ Testing with valid credentials (sandbox or Test Store).