Freemium Paywalls
This guide walks through implementing and optimizing a Freemium strategy using RevenueCat, focusing on how to manage entitlements, display upgrade prompts, and convert free users into paying customers with minimal friction.
When to use
A freemium strategy provides value to users before asking them to pay. This model works well when:
- There is a clear and compelling upgrade path from free to paid (e.g., feature gating, usage limits).
- The app has low marginal costs per user (minimal server or infrastructure overhead).
- Your strategy is to leverage freemium users as growth drivers through sharing, referrals, or collaboration.
- The app faces competitive pressure where users expect to try the core experience before subscribing.
Before you start
1. Define free features
- Core functionality
- Basic features that showcase value
- Features that encourage engagement
2. Define premium features
- Advanced functionality
- Enhanced user experience
- Exclusive content or capabilities
Subscription Configuration Steps
Decide how many access tiers to offer based on your app's functionality and monetization goal.
1. Entitlements
RevenueCat Entitlements represent a level of access, features, or content that a user is "entitled" to. Entitlements are scoped to a project, and are typically unlocked after a user purchases a product. Entitlements are used to ensure a user has appropriate access to content based on their purchases, without having to manage all of the product identifiers in your app code.
For more information on how to set this up, please refer to our entitlement setup documentation.
2. Products
Products are the individual SKUs that users actually purchase from your app. The stores (Apple, Google, Stripe, etc.) process these SKUs and charge the user.
For more information on how to set this up, please refer to our product setup documentation.
3. Offering
Offerings are the selection of products that are "offered" to a user on your paywall. Using RevenueCat Offerings is optional, but enable features like Paywalls, Experiments, and Targeting.
For more information on how to set this up, please refer to our offering setup documentation.
Building your Paywall
Now that you have everything set up, it's time to build your paywall. Take advantage of RevenueCat's Paywalls and start creating your own.
Below you can find an example of a Freemium Paywall.
Presenting your Paywall
Implementation
For Freemium Paywalls, you should not block the user from accessing free content. Instead, use paywalls as contextual prompts that users can dismiss. Below you can find some code snippets on how to accomplish this. Please refer to this document to get more detailed information on how to present paywalls.
- SwiftUI
- Kotlin
- React Native
- Flutter
- Kotlin Multiplatform
import SwiftUI
import RevenueCat
import RevenueCatUI
struct App: View {
var body: some View {
ContentView()
.presentPaywallIfNeeded(
requiredEntitlementIdentifier: Constants.ENTITLEMENT_ID,
purchaseCompleted: { customerInfo in
print("Purchase completed: \(customerInfo.entitlements)")
},
restoreCompleted: { customerInfo in
// Paywall will be dismissed automatically if the entitlement is now active.
print("Purchases restored: \(customerInfo.entitlements)")
}
)
}
}
@OptIn(ExperimentalPreviewRevenueCatUIPurchasesAPI::class)
@Composable
private fun LockedScreen() {
YourContent()
PaywallDialog(
PaywallDialogOptions.Builder()
.setRequiredEntitlementIdentifier(Constants.ENTITLEMENT_ID)
.setListener(
object : PaywallListener {
override fun onPurchaseCompleted(customerInfo: CustomerInfo, storeTransaction: StoreTransaction) {}
override fun onRestoreCompleted(customerInfo: CustomerInfo) {}
}
)
.build()
)
}
import RevenueCatUI, { PAYWALL_RESULT } from "react-native-purchases-ui";
async function presentPaywall(): Promise<boolean> {
// Present paywall for current offering:
const paywallResult: PAYWALL_RESULT = await RevenueCatUI.presentPaywall();
// or if you need to present a specific offering:
const paywallResult: PAYWALL_RESULT = await RevenueCatUI.presentPaywall({
offering: offering // Optional Offering object obtained through getOfferings
});
switch (paywallResult) {
case PAYWALL_RESULT.NOT_PRESENTED:
case PAYWALL_RESULT.ERROR:
case PAYWALL_RESULT.CANCELLED:
return false;
case PAYWALL_RESULT.PURCHASED:
case PAYWALL_RESULT.RESTORED:
return true;
default:
return false;
}
}
async function presentPaywallIfNeeded() {
// Present paywall for current offering:
const paywallResult: PAYWALL_RESULT = await RevenueCatUI.presentPaywallIfNeeded({
requiredEntitlementIdentifier: "pro"
});
// If you need to present a specific offering:
const paywallResult: PAYWALL_RESULT = await RevenueCatUI.presentPaywallIfNeeded({
offering: offering, // Optional Offering object obtained through getOfferings
requiredEntitlementIdentifier: "pro"
});
}
import 'dart:async';
import 'dart:developer';
import 'package:purchases_ui_flutter/purchases_ui_flutter.dart';
void presentPaywall() async {
final paywallResult = await RevenueCatUI.presentPaywall();
log('Paywall result: $paywallResult');
}
void presentPaywallIfNeeded() async {
final paywallResult = await RevenueCatUI.presentPaywallIfNeeded("pro");
log('Paywall result: $paywallResult');
}
val options = remember {
PaywallOptions(dismissRequest = { TODO("Handle dismiss") }) {
shouldDisplayDismissButton = true
}
}
Paywall(options)
Best Practices
-
Free Tier Value
- Provide genuine value in the free tier
- Make core functionality accessible
-
Premium Feature Selection
- Choose premium features that offer clear additional value
- Consider different types of premium value:
- Enhanced functionality
- Removed limitations
- Exclusive content
- Better user experience
-
User Experience
- Clear distinction between free and premium features
- Smooth upgrade flow
- Easy access to subscription management
Test your Paywall
Ensure your implementation works smoothly by testing across different user scenarios:
- Free features remain accessible at all times
- A paywall is shown when a premium feature is selected
- Premium features unlock immediately after purchase
- Restore purchases and error flows work as expected
Review our Testing Guide to fine-tune your test cases and make sure everything is working as expected.
Next Steps
- Use Experiments to test different offerings, pricing strategies, placements, and user targeting approaches.
- Integrate our Customer Center feature to help users manage their subscriptions.
- Once you're ready to launch, review this App Subscription Launch Checklist.