Getting Started with RevenueCat Bridge
Documentation Unreal Engine IAP Tutorial
Install the plugin, set up RevenueCat, configure your API keys, and make your first purchase.
Prerequisites
Before you start, you need:
- A RevenueCat account - sign up free at revenuecat.com
- A Google Play Console account (for Android) and/or App Store Connect (for iOS)
- Products created in your store console (subscriptions, one-time purchases, etc.)
- Products linked in the RevenueCat dashboard with at least one Offering and one Entitlement
If you haven't done the RevenueCat dashboard setup yet, follow their Getting Started guide first. It walks you through creating a project, adding your store credentials, and linking products. Come back here once you have API keys and at least one offering configured.
Step 1: Install the Plugin
From Fab Marketplace
- Purchase RevenueCat Bridge on Fab Marketplace
- In the Epic Games Launcher or Fab, click Add to Project
- Select your Unreal Engine project
- Restart the editor if prompted
Manual Installation
- Copy the
RevenueCatBridgefolder into your project'sPlugins/directory - Your folder structure should look like:
YourProject/ Plugins/ RevenueCatBridge/ RevenueCatBridge.uplugin Source/ - Open your project in Unreal Editor
- Go to Edit > Plugins, search for "RevenueCat Bridge", and make sure it's enabled
- Restart the editor
Verify Installation
After restarting, go to Project Settings > Plugins. You should see a RevenueCat section. If it's there, the plugin is installed correctly.
Step 2: Get Your API Keys
- Log into the RevenueCat dashboard
- Select your project (or create one)
- Go to API Keys in the left sidebar
- Copy the Public API key for each platform:
- Android: the key labeled "Google Play" or "Android"
- iOS: the key labeled "App Store" or "iOS"
These are public API keys, safe to ship in your binary. RevenueCat scopes them to client operations: reading offerings and processing purchases.
Step 3: Configure the Plugin
- In Unreal Editor, go to Project Settings > Plugins > RevenueCat
- Fill in:
| Setting | What to put |
|---|---|
| Android Api Key | Your RevenueCat public API key for Android |
| iOS Api Key | Your RevenueCat public API key for iOS |
| Enable Debug Logs | Check this during development. Uncheck before shipping. |
- Save
The plugin reads these settings on startup and auto-configures the SDK. You don't need to call
ConfigureSDK manually unless you want to override the key at runtime.Step 4: Set Up Your Store (if you haven't already)
Android (Google Play)
- Create your app in Google Play Console
- Go to Monetize > Products > Subscriptions (or In-app products)
- Create your products (monthly sub, annual sub, lifetime unlock, etc.)
- Set up an Internal Testing track and add yourself as a tester
- Upload a signed build to the internal testing track (you need this even for local testing of purchases)
iOS (App Store)
- Create your app in App Store Connect
- Go to the app > In-App Purchases or Subscriptions
- Create your products
- Create a Sandbox tester in Users & Access > Sandbox
RevenueCat Dashboard
- In your RevenueCat project, go to Products
- Add your store product IDs and link them to the right store
- Go to Entitlements and create your entitlements (e.g.
"pro") - Link products to entitlements
- Go to Offerings and create an offering with packages (e.g. a Monthly package using your monthly subscription product)
- Mark one offering as Current
Step 5: Your First Purchase Flow (Blueprint)
The Blueprint steps below fetch offerings, display prices, and handle purchases.
5a: Fetch Offerings on Game Start
In your HUD or game mode Blueprint:
- Search for Fetch Offerings (Async) in the action palette
- Drag it into your Event Graph
- Connect Event BeginPlay to the node's input
- From the On Success pin, you get a
TArray<FRevenueCatOffering>- these are your products
5b: Display Products
From the offerings array:
- Use a For Each Loop to iterate through offerings
- Find the one where
bIsCurrentistrue(this is the offering you marked as Current in the dashboard) - Loop through its
Packagesarray - Each package has a
ProductwithTitle,PriceString(e.g. "$4.99"), andDescription - Display these in your UI however you want (UMG widgets, text, etc.)
5c: Purchase a Package
When the player taps "Buy":
- Search for Purchase Package (Async) in the action palette
- Pass in the
FRevenueCatPackagethe player selected - On Success - purchase went through. Check entitlements.
- On Cancelled - player dismissed the dialog. Do nothing.
- On Failure - something went wrong. Show an error message.
5d: Check Entitlements
After a purchase (or on game start to check returning subscribers):
- Get the RevenueCat Subsystem (search "Get RevenueCatSubsystem")
- Call Is Entitlement Active with your entitlement ID (e.g.
"pro") - If
true, unlock premium content. Iffalse, show the paywall.
5e: Restore Purchases
Add a "Restore Purchases" button somewhere accessible (required by both Google and Apple guidelines):
- Search for Restore Purchases (Async)
- On On Success, re-check entitlements and update your UI
Alternative: Use the Native Paywall
RevenueCat's native paywall UI handles steps 5a–5c for you. It displays a screen configured in the RevenueCat dashboard, with no custom UMG widgets needed.
- Search for Present Paywall (Async) in the action palette
- Leave OfferingID empty to show the current offering
- Connect the output pins:
- OnPurchased - purchase completed, check entitlements
- OnCancelled - player dismissed the paywall
- OnRestored - player restored purchases
- OnFailure - something went wrong
Or use Present Paywall If Needed from the subsystem. It skips the paywall if the entitlement is already active:
- Get the RevenueCat Subsystem
- Call Present Paywall If Needed with your entitlement ID (e.g.
"pro") - If the player already has the entitlement, nothing happens. Otherwise, the paywall appears.
Requirements: iOS 16+ and Android with Compose support. The paywall UI is designed and managed in the RevenueCat dashboard under Paywalls.
Step 5 (Alternative): C++ Setup
If you prefer C++, here's the equivalent:
// Get the subsystem from anywhere
URevenueCatSubsystem* RC = GetGameInstance()->GetSubsystem<URevenueCatSubsystem>();
// Bind to events
RC->OnOfferingsFetched.AddDynamic(this, &UMyClass::HandleOfferings);
RC->OnPurchaseCompleted.AddDynamic(this, &UMyClass::HandlePurchase);
RC->OnError.AddDynamic(this, &UMyClass::HandleError);
// Fetch offerings
RC->FetchOfferings();void UMyClass::HandleOfferings(const TArray<FRevenueCatOffering>& Offerings)
{
for (const FRevenueCatOffering& Offering : Offerings)
{
if (Offering.bIsCurrent)
{
for (const FRevenueCatPackage& Package : Offering.Packages)
{
UE_LOG(LogTemp, Log, TEXT("Product: %s - %s"),
*Package.Product.Title,
*Package.Product.PriceString);
}
}
}
}// When the player wants to buy something
RC->PurchasePackage(SelectedPackage);void UMyClass::HandlePurchase(ERevenueCatPurchaseResult Result,
const FRevenueCatCustomerInfo& CustomerInfo)
{
if (Result == ERevenueCatPurchaseResult::Success)
{
if (RC->IsEntitlementActive("pro"))
{
// Unlock premium content
}
}
}Alternative: Native Paywall (C++)
// Present the current offering's paywall
RC->PresentPaywall();
// Or present a specific offering
RC->PresentPaywall(TEXT("premium_offering"));
// Only show if entitlement is not active
RC->PresentPaywallIfNeeded(TEXT("pro"));
// Handle the result
RC->OnPaywallCompleted.AddDynamic(this, &UMyClass::HandlePaywall);void UMyClass::HandlePaywall(ERevenueCatPaywallResult Result,
const FRevenueCatCustomerInfo& CustomerInfo)
{
switch (Result)
{
case ERevenueCatPaywallResult::Purchased:
// Player bought something, check entitlements
break;
case ERevenueCatPaywallResult::RestoreCompleted:
// Player restored purchases
break;
case ERevenueCatPaywallResult::Cancelled:
// Player dismissed the paywall
break;
case ERevenueCatPaywallResult::Error:
// Something went wrong
break;
}
}Step 6: Test on a Real Device
Purchases require a real device. They don't work in the editor or on emulators.
Android
- Build and deploy to your device. The app must be signed with the same key as your Play Console upload.
- Your Google account must be listed as a license tester in Play Console > Settings > License testing.
- The app must be published to at least the Internal Testing track.
- On device, make sure you're signed into the Google account that's a license tester.
iOS
- Build and run on a real device via Xcode or your build pipeline.
- On device, go to Settings > App Store > Sandbox Account and sign in with your sandbox tester credentials.
- Alternatively, the sandbox login prompt will appear when you try to make a purchase.
What to look for
[RevenueCat] SDK configured successfully.in the log on startupFetchOfferingsreturns your products with correct prices- Tapping "Buy" opens the native store dialog
- After purchase,
IsEntitlementActivereturnstrue
If anything goes wrong, check the Testing & Troubleshooting page.
Common Pitfalls
"FetchOfferings returns 0 offerings"
- Products not linked to an offering in the RevenueCat dashboard
- Store products not approved / not active yet
- Wrong API key (check you're using the right platform key)
"Purchase dialog never appears"
- App not published to internal testing track (Android)
- Not signed in as a license tester (Android)
- Sandbox account not configured (iOS)
- Building a debug/development configuration that isn't signed correctly
"IsEntitlementActive always returns false after purchase"
- Entitlement not linked to the product in RevenueCat dashboard
- Typo in the entitlement ID string
- Not waiting for
OnPurchaseCompletedbefore checking (the data is async)
"Works on Android but crashes on iOS" (or vice versa)
- Check the platform-specific logs (Logcat for Android, Xcode Console for iOS)
- Make sure both API keys are set in Project Settings
Next Steps
- API Reference - every function, delegate, struct, and enum
- Testing & Troubleshooting - the full 14-phase test plan, edge cases, and logging tips