Back to skills

Revenuecat

Comprehensive assistance with RevenueCat in-app subscriptions and purchases

8 stars
0 votes
0 copies
1 views
Added 12/19/2025
data-aijavascriptjavaswiftkotlinbashreacttestingdebuggingapidocumentation

Works with

api

Install via CLI

$openskills install rawveg/skillsforge-marketplace
Download Zip
Files
SKILL.md
---
name: revenuecat
description: Comprehensive assistance with RevenueCat in-app subscriptions and purchases
---

# RevenueCat Skill

Expert assistance for implementing in-app subscriptions and purchases using RevenueCat across iOS, Android, Flutter, React Native, and web platforms.

## When to Use This Skill

This skill should be triggered when:

- **SDK Setup**: Initializing RevenueCat SDK in iOS, Android, Flutter, or React Native apps
- **Subscription Implementation**: Adding subscription or in-app purchase functionality
- **Entitlement Checks**: Verifying user access to premium features or content
- **Purchase Flow**: Implementing buy buttons, handling transactions, or processing purchases
- **Restore Purchases**: Adding restore functionality for users switching devices
- **Offerings/Products**: Fetching and displaying subscription options or product catalogs
- **Paywall Design**: Building or configuring paywalls and purchase screens
- **Customer Info**: Retrieving subscription status or customer data
- **Debugging Purchases**: Troubleshooting subscription issues or transaction failures
- **REST API Integration**: Server-side subscription validation or webhook handling

## Quick Reference

### SDK Configuration

**Swift (iOS)**
```swift
import RevenueCat

Purchases.logLevel = .debug
Purchases.configure(withAPIKey: "your_public_api_key", appUserID: "user_123")
```

**Kotlin (Android)**
```kotlin
Purchases.logLevel = LogLevel.DEBUG
Purchases.configure(PurchasesConfiguration.Builder(this, "your_public_api_key").build())
```

**Flutter**
```dart
await Purchases.setLogLevel(LogLevel.debug);
PurchasesConfiguration configuration = PurchasesConfiguration("your_public_api_key");
await Purchases.configure(configuration);
```

**React Native**
```javascript
Purchases.setLogLevel(Purchases.LOG_LEVEL.DEBUG);
Purchases.configure({ apiKey: "your_public_api_key" });
```

### Checking Entitlements

**Swift**
```swift
let customerInfo = try await Purchases.shared.customerInfo()
if customerInfo.entitlements["pro"]?.isActive == true {
    // User has premium access
}
```

**Kotlin**
```kotlin
Purchases.sharedInstance.getCustomerInfoWith(
    onSuccess = { customerInfo ->
        if (customerInfo.entitlements["pro"]?.isActive == true) {
            // User has premium access
        }
    }
)
```

**React Native**
```javascript
const customerInfo = await Purchases.getCustomerInfo();
if (customerInfo.entitlements.active["pro"] !== undefined) {
    // User has premium access
}
```

### Fetching Offerings

**Swift**
```swift
Purchases.shared.getOfferings { (offerings, error) in
    if let packages = offerings?.current?.availablePackages {
        self.display(packages)
    }
}
```

**Kotlin**
```kotlin
Purchases.sharedInstance.getOfferingsWith({ error -> }) { offerings ->
    offerings.current?.availablePackages?.let { packages ->
        // Display packages
    }
}
```

### Making a Purchase

**Swift**
```swift
Purchases.shared.purchase(package: package) { (transaction, customerInfo, error, userCancelled) in
    if customerInfo.entitlements["pro"]?.isActive == true {
        // Unlock premium content
    }
}
```

**Kotlin**
```kotlin
Purchases.sharedInstance.purchase(
    packageToPurchase = aPackage,
    onError = { error, userCancelled -> },
    onSuccess = { storeTransaction, customerInfo ->
        if (customerInfo.entitlements["pro"]?.isActive == true) {
            // Unlock premium content
        }
    }
)
```

### Restoring Purchases

**Swift**
```swift
Purchases.shared.restorePurchases { customerInfo, error in
    // Check customerInfo to see if entitlement is now active
}
```

**Kotlin**
```kotlin
Purchases.sharedInstance.restorePurchases(
    onError = { error -> },
    onSuccess = { customerInfo ->
        // Check customerInfo to see if entitlement is now active
    }
)
```

### REST API - Get Customer Info

```bash
curl --request GET \
  --url https://api.revenuecat.com/v1/subscribers/app_user_id \
  --header 'Authorization: Bearer PUBLIC_API_KEY'
```

## Key Concepts

### Entitlements
A level of access, features, or content that a user is "entitled" to. Most apps use a single entitlement (e.g., "pro"). Created in the RevenueCat dashboard and linked to products. When a product is purchased, its associated entitlements become active.

### Offerings
The set of products available to a user. Configured remotely in the dashboard, allowing you to change available products without app updates. Access via `offerings.current` for the default offering.

### Packages
Containers for products within an offering. Include convenience accessors like `.monthly`, `.annual`, `.lifetime`. Each package contains a `storeProduct` with pricing details.

### CustomerInfo
The central object containing all subscription and purchase data for a user. Retrieved via `getCustomerInfo()` or returned after purchases. Contains the `entitlements` dictionary for access checks.

### App User ID
Unique identifier for each user. Can be provided during configuration or auto-generated as an anonymous ID. Used to sync purchases across devices.

## Reference Files

This skill includes comprehensive documentation in `references/`:

- **other.md** - General RevenueCat documentation and overview

For detailed implementation patterns beyond the quick reference, consult the official documentation at https://www.revenuecat.com/docs/

## Working with This Skill

### For Beginners
1. Start by configuring the SDK in your app's initialization code
2. Create entitlements and offerings in the RevenueCat dashboard
3. Implement a simple entitlement check before showing premium content
4. Add a purchase button using `purchase(package:)`
5. Include a "Restore Purchases" button for App Store compliance

### For Intermediate Users
- Implement dynamic paywalls by fetching offerings and displaying packages
- Handle multiple entitlements for tiered access levels
- Set up customer info listeners for real-time subscription updates
- Use the REST API for server-side validation

### For Advanced Users
- Configure webhooks for server-side event handling
- Implement A/B testing with different offerings
- Set up integrations with analytics and attribution platforms
- Handle edge cases like grace periods and billing retry

## Common Patterns

### Paywall Display Logic
```swift
// Show paywall only if user doesn't have active subscription
if customerInfo.entitlements["pro"]?.isActive != true {
    showPaywall()
}
```

### Conditional Offerings
```swift
if user.isPaidDownload {
    packages = offerings?.offering(identifier: "paid_download_offer")?.availablePackages
} else {
    packages = offerings?.current?.availablePackages
}
```

## Important Notes

- Always initialize the SDK early in your app's lifecycle
- Use debug logging during development (`Purchases.logLevel = .debug`)
- The SDK automatically finishes/acknowledges transactions
- Only call `restorePurchases` from user interaction (like a button tap)
- Use public API keys from Project Settings; never expose secret keys
- Test Store allows development testing without real charges

## Resources

### Official Documentation
- Getting Started: https://www.revenuecat.com/docs/getting-started/quickstart
- SDK Reference: https://www.revenuecat.com/docs/
- REST API: https://docs.revenuecat.com/reference

### references/
Organized documentation extracted from official sources with detailed explanations and code examples.

### scripts/
Add helper scripts here for common automation tasks.

### assets/
Add templates, boilerplate, or example projects here.

Comments (0)

No comments yet. Be the first to comment!