● v1.1.0 — Latest

MonetizePro

MonetizePro diagram
MonetizePro — architecture & feature overview

Cross-platform ad monetization plugin for Unreal Engine 4. One Blueprint API for Windows, Android, and iOS — backed by AdsJumbo and Google AdMob.

Unreal Engine 4 C++17 AdMob SDK 13.1.0 Blueprint Ready Thread-Safe Callbacks
🪟

Windows

Win64 desktop via AdsJumbo C++ SDK. Banner, Interstitial, Rewarded.

🤖

Android

Full AdMob 22.6.0 via JNI bridge. All 6 ad formats supported.

🍎

iOS

GoogleMobileAds.xcframework v13.1.0 bundled. All 6 ad formats supported.

What Is MonetizePro?

MonetizePro is a UE4 C++ Runtime plugin that adds ad monetization to games without writing platform-specific code. Define your ad units once in Project Settings, then load and show any ad format from Blueprint in one node.

💡
Design philosophy: Ad Unit IDs never appear in Blueprint graphs. They live in Project Settings as named entries. You reference them by name — the plugin resolves the correct platform ID at runtime automatically.

Features

🎯

Named Ad Unit Registry

Define all placements in Project Settings. Reference by FName in Blueprint. Change a Unit ID in one place — every Blueprint updates automatically.

🔄

Game Thread Callbacks

All SDK callbacks — regardless of which thread the native SDK fires on — are dispatched to the Game Thread before reaching Blueprint. No manual synchronisation required.

📺

Video Event Callbacks

OnVideoStarted, OnVideoCompleted, OnVideoMuted, OnVideoUnmuted — fine-grained control to mute game audio and grant rewards at exactly the right moment.

📐

Runtime Banner Repositioning

Move a live banner without tearing it down. Call Set Banner Position at any time — no reload, no flicker, immediate repositioning.

🛡️

Null Provider Fallback

If no SDK is configured, all calls route to FNullAdProvider which logs warnings and no-ops safely. The project always compiles and runs.

⚙️

Auto SDK Detection

Build.cs checks for the AdsJumbo DLL at compile time. Headers-only mode compiles cleanly with ADSJUMBO_SDK=0 — no lib-not-found warnings.

System Requirements

TargetRequirement
Unreal Engine4.27 or later
C++ StandardC++17
Win64Visual Studio 2019 or 2022
AndroidNDK r25b+, Gradle 7+, API level 21+
iOSmacOS 13+, Xcode 16+, iOS 13.0 minimum deployment

Installation

  1. Copy the plugin folder Place the MonetizePro folder inside your project's Plugins/ directory. The MonetizePro.uplugin file must be at the root.
  2. Enable in the Editor Main menu → Edit → Plugins → search MonetizePro → tick Enabled → click Restart Now.
  3. C++ projects only Add the module to your game's Build.cs:
    PrivateDependencyModuleNames.Add("MonetizePro");
    Blueprint-only projects skip this step.
  4. Verify Main menu → Edit → Project Settings → Plugins → MonetizePro should appear. If it does, the plugin is active.

Project Settings

All runtime configuration lives here. Changes are saved to Config/DefaultMonetizePro.ini and can be source-controlled.

FieldTypeDefaultDescription
Active Ad ProviderenumNoneWhich SDK to use: None / AdMob / AdsJumbo / Unity Ads
AdMob App ID (Android)string""Full ca-app-pub-XXXX~YYYY ID from AdMob console
AdMob App ID (iOS)string""Full ca-app-pub-XXXX~YYYY ID from AdMob console
AdsJumbo App ID (Win64)string""App ID from AdsJumbo dashboard
Ad Unitsarray[]Named ad unit registry — see section below
Default Banner SizeenumBanner 320×50Fallback size when not specified per call
Default Banner PositionenumBottom CenterFallback position when not specified per call
GDPR Consent GrantedboolfalseWhether the user consented to personalised ads
COPPA ModeboolfalseDisable personalised ads for child-directed apps
Test ModebooltrueUse test creatives. Set false before shipping
Verbose LoggingboolfalseLog all SDK calls and callbacks

Ad Unit Registry

Each row in the Ad Units array represents one placement in your game. Give it a unique name, choose its format, and fill in the platform-specific IDs.

FieldDescription
NameFName you type in Blueprint to select this unit (e.g. HomeScreen_Banner)
Ad TypeThe format — Banner / Interstitial / Native / Rewarded / Rewarded Interstitial / App Open
Unit ID (Windows)AdsJumbo Unit ID for Win64 builds
Unit ID (Android)AdMob Unit ID for Android builds
Unit ID (iOS)AdMob Unit ID for iOS builds

Example entries

// Project Settings → Ad Units — example rows

Row 0:  Name = "HomeScreen_Banner"       Type = Banner
        Android = "ca-app-pub-3940256099942544/6300978111"  ← test ID
        iOS     = "ca-app-pub-3940256099942544/2934735716"

Row 1:  Name = "GameOver_Interstitial"   Type = Interstitial
        Android = "ca-app-pub-3940256099942544/1033173712"
        iOS     = "ca-app-pub-3940256099942544/4411468910"

Row 2:  Name = "ExtraLife_Rewarded"      Type = Rewarded
        Android = "ca-app-pub-3940256099942544/5224354917"
        iOS     = "ca-app-pub-3940256099942544/1712485313"
When you need to swap a test ID for a production ID, change it in one row in Project Settings. Every Blueprint that references that name updates automatically — no node editing required.

AdMob — Android

The Android SDK is injected automatically by UPL. No manual download is required.

What UPL_Android.xml injects

InjectionValue
Gradle dependencycom.google.android.gms:play-services-ads:22.6.0
Gradle dependencycom.google.android.gms:user-messaging-platform:2.2.0
Manifest meta-dataGADApplicationIdentifier
PermissionsINTERNET, ACCESS_NETWORK_STATE
Proguard rulesAdMob class preservation rules
  1. Set your App ID
    Project Settings → MonetizePro → AdMob App ID (Android)
  2. Keep Test Mode on during development. Use the official Google test unit IDs (see Test Mode section).
  3. Package for Android — Gradle will pull the SDK automatically during the build.

AdMob — iOS

The real SDK binaries are already bundled inside the plugin. No download is needed.

FileSizePurpose
ThirdParty/AdMob/IOS/GoogleMobileAds.xcframework~13 MBAdMob SDK v13.1.0 — arm64 device + simulator slices
ThirdParty/AdMob/IOS/UserMessagingPlatform.xcframework~176 KBGDPR / IAB TCF 2.0 consent SDK

System frameworks linked automatically

AppTrackingTransparency AdSupport StoreKit WebKit
  1. Set your App ID
    Project Settings → MonetizePro → AdMob App ID (iOS)
  2. Update ATT description
    Open Private/Platform/UPL_IOS.xml and edit NSUserTrackingUsageDescription to describe your app's tracking usage.
  3. Build on macOS
    Requires macOS 13+ and Xcode 16+. iOS builds cannot be packaged from Windows.
iOS 14+ shows an ATT permission prompt before the first ad request that uses tracking. The prompt uses the description you set in UPL_IOS.xml. Apple may reject your app if this string is missing or inaccurate.

AdsJumbo — Win64

The header interface is included. The binary files must be obtained from adsjumbo.com/developers and placed in the correct folders.

ThirdParty/AdsJumbo/Win64/ ├── Include/ │ └── AdsJumboSDK.h ✓ included ├── Lib/ │ └── AdsJumbo.lib ← place here (obtain from adsjumbo.com) └── Bin/ └── AdsJumbo.dll ← place here (obtain from adsjumbo.com)

Auto-detection logic in Build.cs

File.Exists(Lib/AdsJumbo.lib) && File.Exists(Bin/AdsJumbo.dll) ├─ TRUE → Link SDK + MONETIZEPRO_ADSJUMBO_SDK=1 (real ads) └─ FALSE → Directory.Exists(Include/) ├─ TRUE → MONETIZEPRO_ADSJUMBO_SDK=0 (stub, no link warning) └─ FALSE → MONETIZEPRO_ADSJUMBO_SDK=0 (pure stub)

You never need to edit Build.cs. The plugin compiles cleanly in stub mode (logged no-ops) until the real binaries are present.

Getting the Subsystem

The subsystem is your single entry point for all ad operations. It is created automatically when the game instance starts — you never construct it manually.

In any Blueprint: right-click graph → search MonetizePro → select Get MonetizePro Subsystem

Get MonetizePro Subsystem
World Context
Return Value
💡
Store the result in a local variable named AdsRef and reuse it. Avoid calling Get MonetizePro Subsystem on every tick — call it once in Begin Play and cache it.

Events

Bind these delegates in Begin Play before loading any ads. All events are delivered on the Game Thread.

OnAdLoaded
▸ Ad Type (EAdType)
Ad downloaded and ready to show. For Banner: call Show Banner here.
OnAdFailed
▸ Ad Type  ▸ Error Message (String)
Network or SDK error. Log Error Message for debugging.
OnAdShown
▸ Ad Type
Fullscreen ad became visible. Good place to pause game audio.
OnAdClosed
▸ Ad Type
User dismissed the ad. Resume game and reload the next ad here.
OnAdClicked
▸ Ad Type
User tapped the ad creative.
OnAdImpression
▸ Ad Type
Ad counted as a viewable impression. Fire analytics events here.
OnRewardGranted
▸ Reward (FAdReward struct)
Grant your reward here. Break the struct → Reward Type (String) + Reward Amount (int).
OnVideoStarted
▸ Ad Type
Video playback began. Mute game audio, hide UI overlays.
OnVideoCompleted
▸ Ad Type
Video played to the end. Restore audio. Reward fires via OnRewardGranted separately.
OnVideoMuted
▸ Ad Type
User muted the video player.
OnVideoUnmuted
▸ Ad Type
User unmuted the video player.

Interstitial Ads

Full-screen ads shown at natural transition points. Pre-load during idle time so the ad is ready instantly when needed.

[Level Begin Play] [Load Interstitial] Name="GameOver_Interstitial" [On Level End] [Is Ad Ready] Ad Type=Interstitial ├─ TRUE → [Show Interstitial] │ └─ OnAdClosed fires → [Open Level "MainMenu"] └─ FALSE → [Open Level "MainMenu"] (skip if not ready)

Rewarded Ads

Opt-in videos the user watches in exchange for in-game items. The reward is only granted after the video plays fully.

Callback order

[Show Rewarded] 1. OnAdShown ← fullscreen visible 2. OnVideoStarted ← playback confirmed 3. OnVideoCompleted ← user watched to end 4. OnRewardGrantedGRANT YOUR REWARD HERE 5. OnAdClosed ← user dismissed post-video screen
Always grant the reward in OnRewardGranted, not in OnVideoCompleted. The user must explicitly dismiss the end card before OnRewardGranted fires — this matches Google's policy requirement.

Best practice flow

[Watch Ad Button Pressed] [Is Ad Ready] Ad Type=Rewarded ├─ TRUE → [Show Rewarded] └─ FALSE → Show "Come back soon" message [Load Rewarded] Name="ExtraLife_Rewarded" ← pre-fetch for next time [OnRewardGranted] → Break FAdReward → Add coins / grant life / etc. [OnAdClosed] → [Load Rewarded] ← immediately reload for next show

Rewarded Interstitial

Like rewarded ads but shown without the user opting in. Reward is still delivered via OnRewardGranted. Requires AdMob account allowlisting.

Load Rewarded Interstitial
Ad Unit Name (FName)
Show Rewarded Interstitial
Check Is Ad Ready first
Not supported on Win64 / AdsJumbo. Calls on Win64 log a warning and no-op safely.

App Open Ads

Shown when the user brings the app to the foreground. Pre-load on startup, show on OnApplicationReactivated.

[Game Instance Begin Play] [Load App Open] Name="AppResume_AppOpen" [On Application Reactivated] ← built-in UE4 event in Game Instance [Is Ad Ready] Ad Type=App Open ├─ TRUE → [Show App Open] └─ FALSE → [Load App Open] ← re-attempt load [OnAdClosed] Ad Type=App Open [Load App Open] ← reload for next foreground event

Native Ads

Native ads load ad data; you render it using your own UMG widgets. MonetizePro fires OnAdLoaded when data is ready.

Load Native
Ad Unit Name (FName)
Native is not supported on Win64 / AdsJumbo. Populate your custom UMG panel in the OnAdLoaded callback when Ad Type = Native.

Utility Nodes

These are pure (no execution pin) Blueprint nodes callable anywhere.

NodeReturnsUse Case
Get MonetizePro VersionStringCredits screen, analytics, debug HUD
Is Monetization SupportedboolHide "Watch Ad" buttons on unsupported platforms
Get Active Provider NameStringDebug overlay, QA reporting
Get Ad Unit ID By NameStringLogging, third-party bridge, debug display
Is Ad ReadyboolGuard before every Show call
// C++ equivalent — same result as the Blueprint pure node
bool bSupported = UMonetizeProBPLibrary::IsMonetizationSupported();
FString UnitId   = Sub->GetAdUnitId(FName("ExtraLife_Rewarded"), EAdType::Rewarded);

Ad Formats

EAdType ValueDisplay NameDescription
BannerBannerPersistent inline strip ad
InterstitialInterstitialFull-screen image or video with skip button
NativeNativeCustom-rendered ad data in your own UMG
RewardedRewardedOpt-in video — user earns a reward on completion
RewardedInterstitialRewarded InterstitialAuto-shown video — reward granted on completion
AppOpenApp OpenFullscreen ad shown on app foreground

Platform Support Matrix

FormatWin64AndroidiOS
Banner✓ *
Interstitial✓ *
Rewarded✓ *
Rewarded Interstitial
App Open
Native

* Win64 requires AdsJumbo.lib + AdsJumbo.dll in ThirdParty. Without binaries, calls are safe no-ops.

Privacy & Compliance

GDPR

Call Set GDPR Consent before the first ad load. You are responsible for showing your own consent dialog and passing the result.

Default is false (non-personalised ads). This is the safe default for EU markets. Switch to true only after the user explicitly accepts.

COPPA

Call Set COPPA Compliance (true) before the first ad load for child-directed apps. This disables personalised ads and location targeting for all users of that app instance.

ATT — iOS 14+

The NSUserTrackingUsageDescription string in UPL_IOS.xml drives the iOS system ATT prompt. Update this string to accurately describe your tracking usage before submitting to App Store review.

Test Mode

Project Settings → Debug → Test Mode (default: true). Use Google's official test unit IDs while developing.

FormatAndroid Test Unit IDiOS Test Unit ID
Bannerca-app-pub-3940256099942544/6300978111ca-app-pub-3940256099942544/2934735716
Interstitialca-app-pub-3940256099942544/1033173712ca-app-pub-3940256099942544/4411468910
Rewardedca-app-pub-3940256099942544/5224354917ca-app-pub-3940256099942544/1712485313
Rewarded Interstitialca-app-pub-3940256099942544/5354046379ca-app-pub-3940256099942544/6978759866
App Openca-app-pub-3940256099942544/9257395921ca-app-pub-3940256099942544/5575463023
Nativeca-app-pub-3940256099942544/2247696110ca-app-pub-3940256099942544/3986624511
🚫
Before shipping: replace all test IDs with your real AdMob Unit IDs and set Test Mode = false. Shipping with test IDs will result in zero revenue and may violate AdMob policy.

Logging & Debugging

CategoryLevelSource
LogMonetizeProLogSubsystem — provider selection, unit ID resolution
LogAdsJumboLogFAdsJumboProvider
LogNullAdProviderWarningFNullAdProvider — fires on every call
LogAdMobAndroidLogFAdMobAndroidProvider
LogAdMobIOSLogFAdMobIOSProvider

Common messages

// Provider not configured
"No provider matched for current platform/config. Falling back to NullProvider."
→ Set Active Ad Provider in Project Settings

// Name not found in registry
"Ad unit 'ExtraLife_Rewarded' (type 3) not found in Project Settings."
→ Check spelling and Ad Type match in Project Settings → Ad Units

// AdsJumbo SDK missing
"[AdsJumboProvider] SDK binaries not found."
→ Place AdsJumbo.lib + AdsJumbo.dll in ThirdParty/AdsJumbo/Win64/Lib/ and /Bin/

// No provider set
"[NullAdProvider] LoadBanner called — no active provider configured."
→ Set Active Ad Provider in Project Settings → Provider

File Structure

MonetizePro/ ├── MonetizePro.uplugin Plugin descriptor ├── index.html ✓ this file ├── Documentation.txt Full reference (text) ├── Blueprint_Instructions.txt Step-by-step BP guide │ ├── Source/MonetizePro/ │ ├── MonetizePro.Build.cs Module rules & SDK detection │ ├── Public/ │ │ ├── MonetizeProTypes.h Enums + FAdReward + FAdUnitEntry │ │ ├── IAdProvider.h Pure C++ provider interface │ │ ├── MonetizeProSettings.h UDeveloperSettings (Project Settings) │ │ ├── MonetizeProSubsystem.h UGameInstanceSubsystem │ │ └── MonetizeProBPLibrary.h Static BP utility nodes │ └── Private/ │ ├── Providers/ │ │ ├── NullAdProvider.h/.cpp Safe no-op fallback │ │ ├── Win64/ AdsJumboProvider.h/.cpp │ │ ├── Android/ AdMobAndroidProvider.h/.cpp │ │ └── IOS/ AdMobIOSProvider.h/.mm │ └── Platform/ │ ├── Android/ AdMobHelper.java UPL_Android.xml │ └── IOS/ UPL_IOS.xml │ └── ThirdParty/ ├── AdMob/IOS/ │ ├── GoogleMobileAds.xcframework ✓ v13.1.0 bundled │ └── UserMessagingPlatform.xcframework ✓ bundled └── AdsJumbo/Win64/Include/ └── AdsJumboSDK.h ✓ interface header Lib/AdsJumbo.lib ← obtain from adsjumbo.com Bin/AdsJumbo.dll ← obtain from adsjumbo.com

Architecture

──── Blueprint / C++ Game Code ──────────────────────────────────────── UMonetizeProSubsystem::Get(WorldContextObject) ──── UGameInstanceSubsystem (auto-lifetime) ─────────────────────────── UMonetizeProSubsystem ├── ResolveAdUnitId(Name, AdType) → platform Unit ID ├── Dispatches all callbacks → Game Thread └── Broadcasts BlueprintAssignable delegates TSharedPtr<IAdProvider> ├──────────────────────────────────────┐ FNullAdProvider FAdsJumboProvider (Win64) (no-op fallback) AdsJumboSDK.dll → IAdListener callbacks ├──────────────────────────────────────┐ FAdMobAndroidProvider FAdMobIOSProvider (.mm) JNI → AdMobHelper.java GADMobileAds.h → ObjC delegate callbacks

Callback data flow

  1. Blueprint calls LoadRewarded("ExtraLife_Rewarded") on the subsystem.
  2. Subsystem resolves the name → platform Unit ID string via ResolveAdUnitId().
  3. Subsystem forwards to the active IAdProvider implementation.
  4. Native SDK fires a callback (potentially on a background thread).
  5. Provider wraps it in AsyncTask(ENamedThreads::GameThread, …) and calls the bound TFunction<>.
  6. Subsystem broadcasts the DYNAMIC_MULTICAST_DELEGATE — Blueprint receives the event safely on the Game Thread.

Changelog

v1.1.0 2026-03-02 Latest
  • Ad formats: Native, Rewarded Interstitial, App Open
  • Fixed IAB banner sizes: Banner / LargeBanner / MediumRectangle / FullBanner / Leaderboard
  • Named Ad Unit registry — TArray<FAdUnitEntry> in Project Settings
  • All Blueprint Load* functions take FName AdUnitName — no raw strings in graphs
  • SetBannerPosition — live reposition without reload
  • Video callbacks: OnVideoStarted, OnVideoCompleted, OnVideoMuted, OnVideoUnmuted
  • Lifecycle callbacks: OnAdClicked, OnAdImpression
  • Documentation.txt + Blueprint_Instructions.txt + index.html
  • Copyright year (2026) and name (Alpha XP) applied to all source files
  • Build.cs: replaced Directory.Exists with File.Exists — eliminates "lib not resolvable" warning
  • MonetizeProBPLibrary: removed AddWeakLambda from dynamic delegate (C2039)
  • AdsJumboProvider: fixed OnRewardGranted / video callback name clash via IAdProvider* cast (C3867/C2664)
v1.0.0 2026-03-01
  • Initial release — provider pattern with IAdProvider interface
  • NullAdProvider, AdsJumboProvider (Win64 stub), AdMobAndroidProvider (JNI), AdMobIOSProvider (Obj-C++)
  • UPL Android + iOS — Gradle deps, manifest entries, plist keys
  • Real GoogleMobileAds.xcframework v13.1.0 + UserMessagingPlatform.xcframework bundled
  • BlueprintAssignable delegates: OnAdLoaded, OnAdFailed, OnAdShown, OnAdClosed, OnRewardGranted
  • UDeveloperSettings Project Settings panel
  • UGameInstanceSubsystem auto-lifecycle management
  • Game Thread dispatch via AsyncTask for all SDK callbacks