In-App Purchases & Subscriptions
Monetize your Flutter app with RevenueCat - the industry-standard solution for in-app purchases and subscriptions. Handles cross-platform billing, receipt validation, and subscription management.
When to Use This Skill
- Adding subscriptions or one-time purchases
- Implementing a paywall
- Managing premium features/entitlements
- Restoring purchases
- User asks "add subscription", "paywall", "in-app purchase", "monetize", or "RevenueCat"
Questions to Ask
- Purchase types: Subscriptions, one-time purchases, or both?
- Subscription tiers: Free, premium only, or multiple tiers (basic/pro/enterprise)?
- Trial period: Offer free trial? How long?
- Paywall trigger: Where should the paywall appear? (feature-gated, onboarding, settings)
- Restore flow: Where should users restore purchases? (settings, paywall)
Quick Reference
RevenueCat Concepts
| Concept |
Description |
| Offering |
Container for products shown to users (e.g., "default", "sale") |
| Package |
Specific product in an offering (e.g., "monthly", "annual") |
| Entitlement |
Access level granted by purchase (e.g., "premium", "pro") |
| CustomerInfo |
User's purchase state, active entitlements, subscriptions |
Product Types
| Type |
Use Case |
Example |
| Auto-renewable |
Recurring access |
Monthly/annual subscription |
| Non-consumable |
Permanent unlock |
Remove ads, lifetime access |
| Consumable |
One-time use |
Credits, coins |
Reference Files
reference/services/purchases_service.dart - RevenueCat wrapper
reference/repositories/ - Domain interface + implementation
reference/providers/purchases_providers.dart - Riverpod state
reference/failures/purchases_failures.dart - Sealed failures
reference/models/subscription_status.dart - Freezed models
Workflow
Phase 1: RevenueCat Setup
- Create RevenueCat account at revenuecat.com
- Create a new project in RevenueCat dashboard
- Add App Store Connect and Play Console credentials
- Create products in App Store Connect / Google Play Console
- Configure products in RevenueCat → Products
- Create Entitlements (e.g., "premium")
- Create Offerings and add Packages
See: revenuecat-setup-guide.md
Phase 2: Platform Configuration
iOS:
- Enable In-App Purchase capability in Xcode
- Add StoreKit configuration file for testing
- Configure App Store Connect shared secret in RevenueCat
Android:
- Add billing permission to AndroidManifest.xml
- Configure Play Console service account in RevenueCat
- Upload signed APK/AAB to internal testing track
See: platform-setup-guide.md
Phase 3: Implementation
- Add
purchases_flutter dependency
- Copy reference files to project
- Initialize RevenueCat in
main.dart
- Create paywall UI
- Implement entitlement checks
- Add restore purchases flow
- Handle subscription changes
See: implementation-guide.md
Phase 4: Testing
- Test with StoreKit configuration (iOS Simulator)
- Test with sandbox accounts (real devices)
- Test restore purchases
- Test subscription lifecycle (renew, cancel, expire)
- Verify webhook events in RevenueCat dashboard
Core API
await PurchasesService.instance.initialize(apiKey: key); // in main.dart
final isPremium = ref.watch(isPremiumProvider); // check entitlement
await ref.read(purchasesRepositoryProvider).purchase(pkg); // purchase
await ref.read(purchasesRepositoryProvider).restorePurchases(); // restore
See: implementation-guide.md for complete examples.
Dependencies
dependencies:
purchases_flutter: ^8.0.0
Failure Types
| Type |
When |
UI Action |
PurchaseCancelled |
User cancelled |
Dismiss silently |
PurchasePending |
Payment pending (e.g., parental approval) |
Show "pending" message |
ProductNotFound |
Invalid product ID |
Log error, hide product |
NetworkError |
No connection |
Show retry option |
StoreError |
App Store/Play Store error |
Show generic error |
NotAllowed |
Device restricted |
Show restriction message |
Guides
| File |
Content |
| revenuecat-setup-guide.md |
Dashboard configuration |
| platform-setup-guide.md |
iOS & Android platform setup |
| implementation-guide.md |
Code implementation steps |
| paywall-guide.md |
Paywall UI patterns |
| testing-guide.md |
Sandbox testing |
| checklist.md |
Verification checklist |
Checklist
Setup:
Platform:
Implementation:
See: checklist.md for complete verification list.
Common Issues
Purchases not showing in RevenueCat
Ensure products are "Ready to Submit" in App Store Connect or "Active" in Play Console. RevenueCat can only fetch approved products.
"Cannot connect to App Store" on Simulator
Use StoreKit Configuration file for Simulator testing. Real App Store requires physical device with sandbox account.
Android purchases failing silently
Ensure the app is uploaded to at least internal testing track. Google Play billing requires a signed release build.
Related Skills
/analytics - Track purchase events, revenue
/auth - User identification for RevenueCat
/design - Paywall UI design patterns
/i18n - Localized paywall text, pricing
/testing - Mock purchases for tests
/force-update - Version gating with subscriptions
Next Steps
After implementing purchases:
/analytics - Track purchase events and revenue
/i18n - Localize paywall and product descriptions
/testing - Create mock repository for tests
1---2name: in-app-purchases3description: In-app purchases and subscriptions with RevenueCat. Product configuration, entitlements, paywalls, restore purchases, subscription status. Use when implementing subscriptions, one-time purchases, paywalls, or monetization.4---56# In-App Purchases & Subscriptions78Monetize your Flutter app with RevenueCat - the industry-standard solution for in-app purchases and subscriptions. Handles cross-platform billing, receipt validation, and subscription management.910## When to Use This Skill1112- Adding subscriptions or one-time purchases13- Implementing a paywall14- Managing premium features/entitlements15- Restoring purchases16- User asks "add subscription", "paywall", "in-app purchase", "monetize", or "RevenueCat"1718## Questions to Ask19201. **Purchase types:** Subscriptions, one-time purchases, or both?212. **Subscription tiers:** Free, premium only, or multiple tiers (basic/pro/enterprise)?223. **Trial period:** Offer free trial? How long?234. **Paywall trigger:** Where should the paywall appear? (feature-gated, onboarding, settings)245. **Restore flow:** Where should users restore purchases? (settings, paywall)2526## Quick Reference2728### RevenueCat Concepts2930| Concept | Description |31|---------|-------------|32| **Offering** | Container for products shown to users (e.g., "default", "sale") |33| **Package** | Specific product in an offering (e.g., "monthly", "annual") |34| **Entitlement** | Access level granted by purchase (e.g., "premium", "pro") |35| **CustomerInfo** | User's purchase state, active entitlements, subscriptions |3637### Product Types3839| Type | Use Case | Example |40|------|----------|---------|41| **Auto-renewable** | Recurring access | Monthly/annual subscription |42| **Non-consumable** | Permanent unlock | Remove ads, lifetime access |43| **Consumable** | One-time use | Credits, coins |4445## Reference Files4647- `reference/services/purchases_service.dart` - RevenueCat wrapper48- `reference/repositories/` - Domain interface + implementation49- `reference/providers/purchases_providers.dart` - Riverpod state50- `reference/failures/purchases_failures.dart` - Sealed failures51- `reference/models/subscription_status.dart` - Freezed models5253## Workflow5455### Phase 1: RevenueCat Setup56571. Create RevenueCat account at [revenuecat.com](https://www.revenuecat.com)582. Create a new project in RevenueCat dashboard593. Add App Store Connect and Play Console credentials604. Create products in App Store Connect / Google Play Console615. Configure products in RevenueCat → Products626. Create Entitlements (e.g., "premium")637. Create Offerings and add Packages6465**See:** [revenuecat-setup-guide.md](revenuecat-setup-guide.md)6667### Phase 2: Platform Configuration6869**iOS:**70- Enable In-App Purchase capability in Xcode71- Add StoreKit configuration file for testing72- Configure App Store Connect shared secret in RevenueCat7374**Android:**75- Add billing permission to AndroidManifest.xml76- Configure Play Console service account in RevenueCat77- Upload signed APK/AAB to internal testing track7879**See:** [platform-setup-guide.md](platform-setup-guide.md)8081### Phase 3: Implementation82831. Add `purchases_flutter` dependency842. Copy reference files to project853. Initialize RevenueCat in `main.dart`864. Create paywall UI875. Implement entitlement checks886. Add restore purchases flow897. Handle subscription changes9091**See:** [implementation-guide.md](implementation-guide.md)9293### Phase 4: Testing94951. Test with StoreKit configuration (iOS Simulator)962. Test with sandbox accounts (real devices)973. Test restore purchases984. Test subscription lifecycle (renew, cancel, expire)995. Verify webhook events in RevenueCat dashboard100101## Core API102103```dart104await PurchasesService.instance.initialize(apiKey: key); // in main.dart105final isPremium = ref.watch(isPremiumProvider); // check entitlement106await ref.read(purchasesRepositoryProvider).purchase(pkg); // purchase107await ref.read(purchasesRepositoryProvider).restorePurchases(); // restore108```109110**See:** [implementation-guide.md](implementation-guide.md) for complete examples.111112## Dependencies113114```yaml115dependencies:116 purchases_flutter: ^8.0.0117```118119## Failure Types120121| Type | When | UI Action |122|------|------|-----------|123| `PurchaseCancelled` | User cancelled | Dismiss silently |124| `PurchasePending` | Payment pending (e.g., parental approval) | Show "pending" message |125| `ProductNotFound` | Invalid product ID | Log error, hide product |126| `NetworkError` | No connection | Show retry option |127| `StoreError` | App Store/Play Store error | Show generic error |128| `NotAllowed` | Device restricted | Show restriction message |129130## Guides131132| File | Content |133|------|---------|134| [revenuecat-setup-guide.md](revenuecat-setup-guide.md) | Dashboard configuration |135| [platform-setup-guide.md](platform-setup-guide.md) | iOS & Android platform setup |136| [implementation-guide.md](implementation-guide.md) | Code implementation steps |137| [paywall-guide.md](paywall-guide.md) | Paywall UI patterns |138| [testing-guide.md](testing-guide.md) | Sandbox testing |139| [checklist.md](checklist.md) | Verification checklist |140141## Checklist142143**Setup:**144- [ ] RevenueCat project created with credentials145- [ ] Products configured in App Store Connect / Play Console146- [ ] Entitlements and Offerings configured147148**Platform:**149- [ ] iOS: In-App Purchase capability, StoreKit config150- [ ] Android: BILLING permission, app uploaded to testing track151152**Implementation:**153- [ ] RevenueCat initialized, providers created154- [ ] Paywall with restore purchases button155- [ ] Entitlement checks gating premium features156157**See:** [checklist.md](checklist.md) for complete verification list.158159## Common Issues160161### Purchases not showing in RevenueCat162163Ensure products are "Ready to Submit" in App Store Connect or "Active" in Play Console. RevenueCat can only fetch approved products.164165### "Cannot connect to App Store" on Simulator166167Use StoreKit Configuration file for Simulator testing. Real App Store requires physical device with sandbox account.168169### Android purchases failing silently170171Ensure the app is uploaded to at least internal testing track. Google Play billing requires a signed release build.172173## Related Skills174175- `/analytics` - Track purchase events, revenue176- `/auth` - User identification for RevenueCat177- `/design` - Paywall UI design patterns178- `/i18n` - Localized paywall text, pricing179- `/testing` - Mock purchases for tests180- `/force-update` - Version gating with subscriptions181182## Next Steps183184After implementing purchases:1851. `/analytics` - Track purchase events and revenue1862. `/i18n` - Localize paywall and product descriptions1873. `/testing` - Create mock repository for tests