Troubleshooting
Common issues and solutions when implementing in-app purchases with flutter_inapp_purchase.
Installation & Setup Issues
Package Installation Problems
Problem: flutter pub get
fails with dependency conflicts
Solution:
# Clear pub cache
flutter pub cache repair
# Clean project
flutter clean
flutter pub get
# For dependency conflicts, try:
flutter pub deps
flutter pub upgrade
iOS Build Issues
Problem: Build fails with StoreKit related errors
Solution:
-
Ensure iOS deployment target is 11.0+:
<!-- ios/Podfile -->
platform :ios, '11.0' -
Clean and rebuild:
cd ios
rm -rf Pods Podfile.lock
pod install
cd ..
flutter clean
flutter build ios
Android Build Issues
Problem: Build fails with billing library conflicts
Solution:
-
Check
android/app/build.gradle
minSdkVersion:defaultConfig {
minSdkVersion 21 // Required minimum
} -
Add billing permission to
AndroidManifest.xml
:<uses-permission android:name="com.android.vending.BILLING" />
Connection & Initialization Issues
"Billing is unavailable" Error
Problem: IAP initialization returns "Billing is unavailable"
Possible Causes & Solutions:
-
Google Play Store not installed/updated:
- Ensure Google Play Store is installed and updated
- Test on real device, not emulator
-
App not uploaded to Play Console:
- Upload app to Internal Testing track minimum
- Wait for processing (can take several hours)
-
Package name mismatch:
// Ensure android/app/build.gradle applicationId matches Play Console
defaultConfig {
applicationId "com.yourcompany.yourapp"
} -
Developer account issues:
- Verify Google Play Developer account is active
- Complete merchant agreement
iOS Connection Issues
Problem: Connection fails on iOS
Solutions:
-
Sandbox environment:
- Test on real device with sandbox account
- Don't sign in to sandbox account in Settings
- Only sign in when prompted during purchase
-
App Store Connect setup:
- Verify products are "Ready to Submit"
- Complete agreements in ASC
- Wait up to 24 hours for product propagation
Product Loading Issues
Products Not Loading
Problem: getProducts()
returns empty list
Debugging Steps:
-
Verify product IDs:
// Enable debug logging
FlutterInappPurchase.instance.setDebugMode(true);
// Check exact product ID matching
final products = await FlutterInappPurchase.instance
.requestProducts(skus: ['exact.product.id.from.store'], type: 'inapp'); -
Check store console:
- iOS: Products "Ready to Submit" in App Store Connect
- Android: Products "Active" in Play Console
-
Wait for propagation:
- New products can take 24+ hours to be available
- Try with existing, known-working products first
iOS Products Not Loading
Specific Solutions:
-
Bundle ID verification:
# Check bundle ID in Xcode matches App Store Connect
open ios/Runner.xcworkspace -
Agreements verification:
- Check App Store Connect > Agreements, Tax, and Banking
- Ensure Paid Applications Agreement is active
-
Product status:
- Products must be "Ready to Submit" or "Approved"
- Check in App Store Connect > Features > In-App Purchases
Android Products Not Loading
Specific Solutions:
-
App upload requirement:
# Build and upload APK/AAB to Play Console
flutter build appbundle --release -
Package name verification:
- Verify
applicationId
inbuild.gradle
- Must exactly match Play Console
- Verify
-
License testing:
- Add test accounts in Play Console > Setup > License testing
- Use test accounts for testing
Purchase Issues
Purchase Flow Not Working
Problem: Purchase request doesn't trigger system dialog
Debugging:
-
Check initialization:
// Ensure IAP is initialized before purchase
bool initialized = await FlutterInappPurchase.instance.initialize() != null;
if (!initialized) {
print('IAP not initialized');
return;
} -
Verify product exists:
final products = await FlutterInappPurchase.instance.requestProducts(skus: [productId], type: 'inapp');
if (products.isEmpty) {
print('Product not found: $productId');
return;
} -
Check purchase listeners:
// Ensure listeners are set up before purchase
FlutterInappPurchase.purchaseUpdated.listen((item) {
print('Purchase updated: ${item?.productId}');
});
FlutterInappPurchase.purchaseError.listen((item) {
print('Purchase error: ${item?.productId}');
});
Transaction Not Completing
Problem: Purchase succeeds but transaction doesn't complete
Solution:
void _handlePurchaseUpdate(PurchasedItem? item) async {
if (item == null) return;
try {
// IMPORTANT: Always complete transactions
if (Platform.isIOS) {
await FlutterInappPurchase.instance.finishTransaction(item);
} else {
// Android: Choose based on product type
if (isConsumable(item.productId!)) {
await FlutterInappPurchase.instance.consumePurchase(
purchaseToken: item.purchaseTokenAndroid!,
);
} else {
await FlutterInappPurchase.instance.acknowledgePurchase(
purchaseToken: item.purchaseTokenAndroid!,
);
}
}
} catch (e) {
print('Failed to complete transaction: $e');
}
}
"Already Owned" Error
Problem: Getting "already owned" error on Android
Solutions:
-
Consume previous purchases:
// For consumable products
final purchases = await FlutterInappPurchase.instance.getAvailablePurchases();
for (final purchase in purchases ?? []) {
if (isConsumable(purchase.productId!)) {
await FlutterInappPurchase.instance.consumePurchase(
purchaseToken: purchase.purchaseTokenAndroid!,
);
}
} -
Clear test purchases:
- In Google Play Store app: Menu > Account > Purchase history
- Cancel test purchases
Testing Issues
Sandbox Testing Problems (iOS)
Problem: Sandbox purchases not working
Solutions:
-
Account management:
- Create fresh sandbox accounts in App Store Connect
- Don't sign in to sandbox account in Settings > iTunes & App Store
- Only sign in when prompted during purchase
-
Purchase history:
- Clear purchase history: Settings > iTunes & App Store > Sandbox Account
- Use different sandbox accounts for different test scenarios
-
Network issues:
- Test on real device with cellular/different WiFi
- Sandbox can be unstable, try multiple times
Test Purchases Not Working (Android)
Problem: Test purchases failing on Android
Solutions:
-
License testers:
Play Console > Setup > License testing > License Testers
Add Gmail accounts for testing -
Test tracks:
- Upload app to Internal Testing minimum
- Join testing program with test account
- Install from Play Store (not sideload)
-
Account verification:
- Use Gmail account added as license tester
- Clear Play Store cache/data if needed
Runtime Errors
Stream Subscription Errors
Problem: Multiple listeners or subscription errors
Solution:
class _MyStoreState extends State<MyStore> {
StreamSubscription? _purchaseSubscription;
StreamSubscription? _errorSubscription;
void initState() {
super.initState();
_setupListeners();
}
void _setupListeners() {
// Cancel existing subscriptions first
_purchaseSubscription?.cancel();
_errorSubscription?.cancel();
_purchaseSubscription = FlutterInappPurchase
.purchaseUpdated.listen(_handlePurchase);
_errorSubscription = FlutterInappPurchase
.purchaseError.listen(_handleError);
}
void dispose() {
_purchaseSubscription?.cancel();
_errorSubscription?.cancel();
super.dispose();
}
}
Memory Leaks
Problem: App crashes or memory issues
Solution: Always clean up resources:
void dispose() {
// Cancel all subscriptions
_purchaseUpdatedSubscription?.cancel();
_purchaseErrorSubscription?.cancel();
// End IAP connection if needed
FlutterInappPurchase.instance.endConnection();
super.dispose();
}
Receipt Validation Issues
iOS Receipt Validation
Problem: Receipt validation fails
Solutions:
-
Receipt data retrieval:
String? receiptData = await FlutterInappPurchase.instance.getReceiptData();
if (receiptData == null) {
print('No receipt data available');
return;
} -
Server validation:
- Use production URL for live app:
https://buy.itunes.apple.com/verifyReceipt
- Use sandbox URL for testing:
https://sandbox.itunes.apple.com/verifyReceipt
- Use production URL for live app:
Android Receipt Validation
Problem: Purchase token validation fails
Solution:
// Use Google Play Developer API for server-side validation
// Send purchase token to your server for verification
final purchaseToken = item.purchaseTokenAndroid;
await validatePurchaseOnServer(purchaseToken, item.productId);
Performance Issues
Slow Product Loading
Problem: Products take long time to load
Solutions:
-
Cache products:
class ProductCache {
static List<IAPItem>? _cachedProducts;
static DateTime? _cacheTime;
static Future<List<IAPItem>> getProducts(List<String> ids) async {
final now = DateTime.now();
if (_cachedProducts != null &&
_cacheTime != null &&
now.difference(_cacheTime!).inMinutes < 5) {
return _cachedProducts!;
}
_cachedProducts = await FlutterInappPurchase.instance.requestProducts(skus: ids, type: 'inapp');
_cacheTime = now;
return _cachedProducts!;
}
} -
Batch requests:
// Load all products at once instead of individual requests
final allProducts = await FlutterInappPurchase.instance
.requestProducts(skus: allProductIds, type: 'inapp');
Debug Tools
Enable Debug Logging
// Add this for debugging
FlutterInappPurchase.instance.setDebugMode(true);
Check Connection Status
Future<void> debugConnection() async {
try {
final result = await FlutterInappPurchase.instance.initialize();
print('Connection result: $result');
// Test with known product
final products = await FlutterInappPurchase.instance
.requestProducts(skus: ['android.test.purchased'], type: 'inapp'); // Android test product
print('Test products: ${products.length}');
} catch (e) {
print('Debug error: $e');
}
}
Getting Help
If you're still experiencing issues:
- Check logs: Enable debug mode and check console logs
- Minimal reproduction: Create minimal example that reproduces issue
- Platform testing: Test on both iOS and Android
- Version check: Ensure you're using latest plugin version
- GitHub Issues: Report bugs with detailed information
Issue Report Template
When reporting issues, include:
**Platform:** iOS/Android/Both
**Plugin Version:** flutter_inapp_purchase x.x.x
**Flutter Version:** flutter --version output
**Device:** Real device/Simulator/Emulator
**Issue Description:**
Clear description of the problem
**Steps to Reproduce:**
1. Step one
2. Step two
3. Step three
**Expected Behavior:**
What should happen
**Actual Behavior:**
What actually happens
**Logs:**
Relevant console output
**Sample Code:**
```dart
Minimal code that reproduces the issue
This comprehensive troubleshooting guide should help developers resolve most common issues with flutter_inapp_purchase.