================================================================================ MONETIZEPRO PLUGIN — DOCUMENTATION Copyright 2026 Alpha XP. All Rights Reserved. Version 1.1.0 | Unreal Engine 4 | Runtime Plugin ================================================================================ CONTENTS 1. What Is MonetizePro 2. System Requirements 3. Plugin Installation 4. Source Code Structure 5. Third-Party SDK Setup 5a. AdMob Android 5b. AdMob iOS 5c. AdsJumbo Win64 6. Architecture Overview 7. Configuration Reference (Project Settings) 8. Ad Unit Registry — How the Name System Works 9. Supported Ad Formats 10. Platform Support Matrix 11. Build Configuration (Build.cs) 12. Privacy & Compliance 13. Test Mode 14. Logging & Debugging 15. Known Limitations 16. Version History ──────────────────────────────────────────────────────────────────────────────── 1. WHAT IS MONETIZEPRO ──────────────────────────────────────────────────────────────────────────────── MonetizePro is a cross-platform UE4 C++ Runtime plugin that adds ad monetization to games shipping on Windows 10/11 (desktop), Android, and iOS from a single unified Blueprint and C++ API. Key design goals: - One API surface regardless of platform or ad network. - All ad network callbacks are safely delivered on the Game Thread — no manual thread synchronisation needed in Blueprint or C++. - Ad unit IDs are managed centrally in Project Settings, not scattered through Blueprint graphs. - The plugin compiles and runs cleanly even when SDK binaries are absent (falls back to a logged NullProvider). ──────────────────────────────────────────────────────────────────────────────── 2. SYSTEM REQUIREMENTS ──────────────────────────────────────────────────────────────────────────────── Unreal Engine 4.27 or later (tested on 4.27.2) C++ Standard C++17 Platforms Win64, Android (API 21+), iOS 13.0+ Build tools per platform: Win64 Visual Studio 2019 or 2022 Android NDK r25b or later, Gradle 7+ iOS macOS 13+, Xcode 16+, Apple Silicon or Intel Mac ──────────────────────────────────────────────────────────────────────────────── 3. PLUGIN INSTALLATION ──────────────────────────────────────────────────────────────────────────────── A. Copy the MonetizePro folder into your project: /Plugins/MonetizePro/ The folder must contain MonetizePro.uplugin at its root. B. Open your project in the UE4 Editor. C. Main menu → Edit → Plugins Search "MonetizePro" → tick Enabled → click "Restart Now". D. After restart the plugin is active. Verify by opening Project Settings → Plugins → MonetizePro. E. For C++ projects, add the module to your game's Build.cs: PrivateDependencyModuleNames.Add("MonetizePro"); This is NOT required for Blueprint-only projects. ──────────────────────────────────────────────────────────────────────────────── 4. SOURCE CODE STRUCTURE ──────────────────────────────────────────────────────────────────────────────── MonetizePro/ ├── MonetizePro.uplugin Plugin descriptor ├── Documentation.txt This file ├── Blueprint_Instructions.txt Step-by-step Blueprint usage guide │ ├── Source/MonetizePro/ │ ├── MonetizePro.Build.cs Module rules & SDK detection │ │ │ ├── Public/ Headers visible to other modules │ │ ├── MonetizeProTypes.h Enums (EAdType, EBannerSize, etc.) + structs │ │ ├── IAdProvider.h Pure C++ provider interface │ │ ├── MonetizeProSettings.h UDeveloperSettings (Project Settings) │ │ ├── MonetizeProSubsystem.h UGameInstanceSubsystem (main entry point) │ │ └── MonetizeProBPLibrary.h Static Blueprint utility nodes │ │ │ └── Private/ │ ├── MonetizePro.cpp Module startup / Settings registration │ ├── MonetizeProSettings.cpp Default values │ ├── MonetizeProSubsystem.cpp Provider factory, callback routing │ ├── MonetizeProBPLibrary.cpp Utility node implementations │ │ │ ├── Providers/ │ │ ├── NullAdProvider.h/.cpp No-op fallback (all platforms) │ │ ├── Win64/ │ │ │ └── AdsJumboProvider.h/.cpp Windows provider │ │ ├── Android/ │ │ │ └── AdMobAndroidProvider.h/.cpp Android JNI provider │ │ └── IOS/ │ │ └── AdMobIOSProvider.h/.mm iOS Objective-C++ provider │ │ │ └── Platform/ │ ├── Android/ │ │ └── AdMobHelper.java Java-side AdMob bridge │ ├── UPL_Android.xml Gradle deps, manifest, proguard │ └── UPL_IOS.xml Plist entries, SKAdNetwork IDs │ └── ThirdParty/ ├── AdMob/IOS/ │ ├── GoogleMobileAds.xcframework AdMob SDK v13.1.0 (real binary) │ └── UserMessagingPlatform.xcframework GDPR consent SDK (real binary) └── AdsJumbo/Win64/ └── Include/AdsJumboSDK.h C++ interface header (stub) (Lib/AdsJumbo.lib not included — obtain from adsjumbo.com) (Bin/AdsJumbo.dll not included — obtain from adsjumbo.com) ──────────────────────────────────────────────────────────────────────────────── 5. THIRD-PARTY SDK SETUP ──────────────────────────────────────────────────────────────────────────────── 5a. ADMOB — ANDROID ──────────────────── The Android AdMob SDK (Google Play Services Ads 22.6.0) is pulled automatically by Gradle during the Android build — no manual download is needed. The UPL file (Private/Platform/UPL_Android.xml) injects: - Gradle dependency: com.google.android.gms:play-services-ads:22.6.0 - Gradle dependency: com.google.android.gms:user-messaging-platform:2.2.0 - AndroidManifest: GADApplicationIdentifier - AndroidManifest: uses-permission INTERNET, ACCESS_NETWORK_STATE - Proguard rules for AdMob classes Required action: 1. Open Project Settings → MonetizePro → App IDs. 2. Set "AdMob App ID (Android)" to your real ID from the AdMob console, e.g. ca-app-pub-XXXXXXXXXXXXXXXX~YYYYYYYYYY 3. Set Test Mode = True during development. 5b. ADMOB — iOS ───────────────── The real iOS SDK binaries are already included in this plugin: ThirdParty/AdMob/IOS/GoogleMobileAds.xcframework (v13.1.0, 13 MB) ThirdParty/AdMob/IOS/UserMessagingPlatform.xcframework (176 KB) Both xcframeworks ship with arm64 device slices and arm64+x86_64 simulator slices. They are registered in Build.cs via PublicAdditionalFrameworks and require no additional manual steps. The UPL file (Private/Platform/UPL_IOS.xml) injects into Info.plist: - NSUserTrackingUsageDescription (ATT prompt text) - GADApplicationIdentifier - SKAdNetworkIdentifier entries for AdMob mediation networks Required action: 1. Open Project Settings → MonetizePro → App IDs. 2. Set "AdMob App ID (iOS)" to your real ID. 3. Open Private/Platform/UPL_IOS.xml and update the NSUserTrackingUsageDescription string and GADApplicationIdentifier to match your app. 4. Build from a Mac with Xcode 16+. System frameworks automatically linked by Build.cs: AppTrackingTransparency, AdSupport, StoreKit, WebKit 5c. ADSJUMBO — WIN64 ────────────────────── The AdsJumbo SDK header interface is included (ThirdParty/AdsJumbo/Win64/Include/). The binary files must be obtained from https://adsjumbo.com/developers and placed here: ThirdParty/AdsJumbo/Win64/ ├── Include/ │ └── AdsJumboSDK.h (already present — interface definition) ├── Lib/ │ └── AdsJumbo.lib ← PLACE HERE (static import library) └── Bin/ └── AdsJumbo.dll ← PLACE HERE (runtime DLL) Build.cs auto-detects the SDK by checking for both files: - If Lib/AdsJumbo.lib AND Bin/AdsJumbo.dll both exist: MONETIZEPRO_ADSJUMBO_SDK = 1 (full SDK — real ads) - If only Include/ exists (current state): MONETIZEPRO_ADSJUMBO_SDK = 0 (stub mode — logged no-ops) - If nothing exists: MONETIZEPRO_ADSJUMBO_SDK = 0 (stub mode) You do NOT need to modify Build.cs — detection is fully automatic. The plugin will compile and run in stub mode until the binaries are placed. ──────────────────────────────────────────────────────────────────────────────── 6. ARCHITECTURE OVERVIEW ──────────────────────────────────────────────────────────────────────────────── ┌──────────────────────────────────────────────────────────────┐ │ Blueprint / C++ Game Code │ │ UMonetizeProSubsystem::Get(WorldContextObject) │ └────────────────────┬─────────────────────────────────────────┘ │ UGameInstanceSubsystem (auto-lifetime) ┌────────────────────▼─────────────────────────────────────────┐ │ UMonetizeProSubsystem │ │ - ResolveAdUnitId(Name, AdType) → platform Unit ID │ │ - Dispatches all callbacks to Game Thread │ │ - Exposes BlueprintAssignable delegates │ └────────────────────┬─────────────────────────────────────────┘ │ TSharedPtr ┌─────────────┼──────────────────────────────┐ │ │ │ ┌─────▼─────┐ ┌─────▼───────────────┐ ┌───────────▼──────────┐ │ NullAd │ │ FAdsJumboProvider │ │ FAdMobAndroidProvider│ │ Provider │ │ (Win64) │ │ (Android JNI) │ │ (no-op) │ │ AdsJumboSDK.dll │ │ AdMobHelper.java │ └───────────┘ └─────────────────────┘ └──────────────────────┘ ┌──────────────────────┐ │ FAdMobIOSProvider │ │ (iOS Obj-C++) │ │ GADMobileAds.h │ └──────────────────────┘ Data flow: 1. Game code calls subsystem (e.g. LoadRewarded("ExtraLife_Rewarded")) 2. Subsystem resolves the Name → Unit ID string for the current platform 3. Subsystem forwards the call to the active IAdProvider 4. The SDK fires a native callback (possibly on a background thread) 5. The provider wraps it in AsyncTask(GameThread) and fires the TFunction 6. The subsystem's TFunction binding broadcasts the DYNAMIC delegate 7. Blueprint receives the event on the Game Thread, safely ──────────────────────────────────────────────────────────────────────────────── 7. CONFIGURATION REFERENCE (PROJECT SETTINGS) ──────────────────────────────────────────────────────────────────────────────── Location: Edit → Project Settings → Plugins → MonetizePro INI file: Saved/Config//MonetizePro.ini (Config/DefaultMonetizePro.ini for source-controlled defaults) FIELD TYPE DEFAULT DESCRIPTION ─────────────────────────── ─────── ──────── ───────────────────────────── Active Ad Provider enum None Which SDK to use at runtime AdMob App ID (Android) string "" Full ca-app-pub-... ID AdMob App ID (iOS) string "" Full ca-app-pub-... ID AdsJumbo App ID (Win64) string "" From AdsJumbo dashboard Ad Units array [] Named ad unit registry Default Banner Size enum Banner 320×50 — fallback size Default Banner Position enum Bottom Screen anchor GDPR Consent Granted bool false Personalised ads consent COPPA Mode bool false Child-directed content Test Mode bool true Use test unit IDs Verbose Logging bool false Log all SDK calls ──────────────────────────────────────────────────────────────────────────────── 8. AD UNIT REGISTRY — HOW THE NAME SYSTEM WORKS ──────────────────────────────────────────────────────────────────────────────── Problem with the old approach: Hard-coding ca-app-pub-xxx/yyy strings directly in Blueprint graphs means changing a Unit ID requires finding every node across every Blueprint. MonetizePro solution: All Unit IDs live in ONE place: Project Settings → Ad Units array. Each entry has: - Name (FName) — your identifier, e.g. "ExtraLife_Rewarded" - Ad Type — the format this unit is for - Unit ID (Windows) — AdsJumbo Unit ID - Unit ID (Android) — AdMob Unit ID - Unit ID (iOS) — AdMob Unit ID In Blueprint you reference ads by Name only. The subsystem calls ResolveAdUnitId(Name, AdType) at runtime and returns the correct platform string automatically. Blueprint never sees raw IDs. To change a Unit ID (e.g. when you graduate from test to production): 1. Open Project Settings → MonetizePro → Ad Units 2. Find the row by Name 3. Update the Unit ID string 4. Done — all Blueprints automatically use the new ID on next build TitleProperty meta on the array means the Name column shows as the element header in the Project Settings UI, making long lists readable. Convention recommendations: "HomeScreen_Banner" type = Banner "GameOver_Interstitial" type = Interstitial "ExtraLife_Rewarded" type = Rewarded "DailyBonus_RewardedInter" type = Rewarded Interstitial "AppResume_AppOpen" type = App Open "NewsFeed_Native" type = Native Rules: - Names must be unique per Ad Type (same name, different type is allowed) - Spaces in names work but underscores are recommended - Platform IDs you leave blank produce an empty string → the provider will log a warning and no-op safely ──────────────────────────────────────────────────────────────────────────────── 9. SUPPORTED AD FORMATS ──────────────────────────────────────────────────────────────────────────────── FORMAT ENUM VALUE DESCRIPTION ───────────────────────────────────────────────────────────────────────────── Banner EAdType::Banner Persistent inline banner Interstitial EAdType::Interstitial Full-screen image/video (skip) Native EAdType::Native Custom-rendered ad data Rewarded EAdType::Rewarded Opt-in video → reward Rewarded Interstitial EAdType::RewardedInterstitial Auto-shown video → reward App Open EAdType::AppOpen Shown on app foreground BANNER SIZES (IAB fixed dp) ───────────────────────────────────────────────────────────────────────────── ENUM VALUE dp SIZE AVAILABILITY ADMOB CONSTANT Banner 320×50 Phones + Tablets BANNER LargeBanner 320×100 Phones + Tablets LARGE_BANNER MediumRectangle 300×250 Phones + Tablets MEDIUM_RECTANGLE FullBanner 468×60 Tablets FULL_BANNER Leaderboard 728×90 Tablets LEADERBOARD ──────────────────────────────────────────────────────────────────────────────── 10. PLATFORM SUPPORT MATRIX ──────────────────────────────────────────────────────────────────────────────── FORMAT WIN64 ANDROID IOS ────────────────────── ───────── ───────── ───────── Banner YES * YES YES Interstitial YES * YES YES Rewarded YES * YES YES Rewarded Interstitial NO YES YES App Open NO YES YES Native NO YES YES * Win64 YES requires AdsJumbo.lib + AdsJumbo.dll in ThirdParty. Without binaries the provider stubs compile and run safely (no-op + log). ──────────────────────────────────────────────────────────────────────────────── 11. BUILD CONFIGURATION (Build.cs) ──────────────────────────────────────────────────────────────────────────────── MonetizePro.Build.cs handles all platform-conditional linking. You should NOT need to modify it. This section explains what it does. PUBLIC DEPENDENCIES (all platforms): Core, DeveloperSettings PRIVATE DEPENDENCIES (all platforms): CoreUObject, Engine, Slate, SlateCore EDITOR ONLY: Settings (registers the UDeveloperSettings panel) WIN64: Checks for Lib/AdsJumbo.lib AND Bin/AdsJumbo.dll. If both exist → links the SDK, sets MONETIZEPRO_ADSJUMBO_SDK=1. If only Include/ exists → adds include path, sets MONETIZEPRO_ADSJUMBO_SDK=0. If nothing → sets MONETIZEPRO_ADSJUMBO_SDK=0. ANDROID: Adds Launch module (for AndroidJNI helpers). Registers UPL_Android.xml (injects Gradle deps, manifest, Java file). IOS: Registers system frameworks: AppTrackingTransparency, AdSupport, StoreKit, WebKit. Registers UPL_IOS.xml (injects plist entries). Links GoogleMobileAds.xcframework from ThirdParty/AdMob/IOS/. Links UserMessagingPlatform.xcframework from ThirdParty/AdMob/IOS/. PREPROCESSOR DEFINES set by Build.cs: MONETIZEPRO_ADSJUMBO_SDK 0 or 1 (Win64 only) ──────────────────────────────────────────────────────────────────────────────── 12. PRIVACY & COMPLIANCE ──────────────────────────────────────────────────────────────────────────────── GDPR (EU General Data Protection Regulation) ───────────────────────────────────────────── The UserMessagingPlatform.xcframework (iOS) and UMP SDK (Android, via Gradle) handle the IAB TCF 2.0 consent dialog flow. In Blueprint, call Set GDPR Consent (bool) BEFORE the first ad load: True = user granted consent → personalised ads False = no consent → non-personalised ads only You are responsible for showing a GDPR consent dialog to EU users and passing the result to this function. The plugin does not show a dialog automatically — it only forwards your decision to the SDK. Default value in Project Settings: false (non-personalised — safest default) COPPA (Children's Online Privacy Protection Act) ───────────────────────────────────────────────── Call Set COPPA Compliance (bool) before the first ad load: True = child-directed content → disables personalised ads and location targeting for all users of this app instance False = normal (default) ATT (App Tracking Transparency — iOS 14+) ────────────────────────────────────────── The NSUserTrackingUsageDescription string is injected into Info.plist by UPL_IOS.xml. iOS will automatically present the ATT prompt to the user before the first AdMob request that needs tracking permission. Update the description string in UPL_IOS.xml to match your app's usage. ──────────────────────────────────────────────────────────────────────────────── 13. TEST MODE ──────────────────────────────────────────────────────────────────────────────── Test Mode is controlled by the "Test Mode" bool in Project Settings → Debug. Default: TRUE (safe for development). When Test Mode = True: - Win64/AdsJumbo: passes bTestMode=true to AdsJumboSDK::SetTestMode() - Android/iOS: the per-platform Ad Unit IDs you set in Project Settings are STILL used, but the SDKs know to return test creatives. Using Google's official test unit IDs is the safest option: Google official test unit IDs (use these while in development): FORMAT ANDROID ID IOS ID Banner ca-app-pub-3940256099942544/6300978111 ca-app-pub-3940256099942544/2934735716 Interstitial ca-app-pub-3940256099942544/1033173712 ca-app-pub-3940256099942544/4411468910 Rewarded ca-app-pub-3940256099942544/5224354917 ca-app-pub-3940256099942544/1712485313 Rewarded Interstitial ca-app-pub-3940256099942544/5354046379 ca-app-pub-3940256099942544/6978759866 App Open ca-app-pub-3940256099942544/9257395921 ca-app-pub-3940256099942544/5575463023 Native ca-app-pub-3940256099942544/2247696110 ca-app-pub-3940256099942544/3986624511 BEFORE SHIPPING: 1. Replace all test IDs with your real AdMob Unit IDs. 2. Set Test Mode = False in Project Settings → Debug. 3. Set GDPR Consent and COPPA to the appropriate defaults for your market. ──────────────────────────────────────────────────────────────────────────────── 14. LOGGING & DEBUGGING ──────────────────────────────────────────────────────────────────────────────── Log categories written by this plugin: CATEGORY LEVEL SOURCE ───────────────────────── ──────── ───────────────────────────────────── LogMonetizePro Log UMonetizeProSubsystem (subsystem init, provider selection, unit ID resolution) LogAdsJumbo Log FAdsJumboProvider LogNullAdProvider Warning FNullAdProvider (fires on every call) LogAdMobAndroid Log FAdMobAndroidProvider LogAdMobIOS Log FAdMobIOSProvider To view logs in the editor: Window → Developer Tools → Output Log Filter by category: type "LogMonetizePro" in the filter box. Common log messages: "No provider matched for current platform/config. Falling back to NullProvider." → The Active Ad Provider dropdown in Project Settings is set to None, or the selected provider is not available on this platform. "Ad unit 'ExtraLife_Rewarded' (type 3) not found in Project Settings." → The Name you passed to LoadRewarded() does not match any entry in the Ad Units array, or the Ad Type mismatch (e.g. you set type=Banner but called LoadRewarded with that name). "[AdsJumboProvider] SDK binaries not found." → ThirdParty/AdsJumbo/Win64/Lib/AdsJumbo.lib or /Bin/AdsJumbo.dll is missing. Place the real SDK files or leave as-is for stub mode. "[NullAdProvider] LoadBanner called — no active provider configured." → You called LoadBanner before setting an Active Ad Provider in Settings, or you are running on an unsupported platform (e.g. Console, Editor PIE without a provider set). Enable Verbose Logging in Project Settings → Debug for additional output including every SDK callback received. ──────────────────────────────────────────────────────────────────────────────── 15. KNOWN LIMITATIONS ──────────────────────────────────────────────────────────────────────────────── 1. Win64 native/rewarded-interstitial/app-open not supported AdsJumbo does not expose these formats on desktop. LoadNative, LoadRewardedInterstitial, and LoadAppOpen log a warning and no-op on Win64. This is by design, not a bug. 2. Native ad rendering is your responsibility MonetizePro loads native ad data and fires OnAdLoaded. Displaying that data in custom UMG widgets requires additional SDK-specific work that is outside the scope of this plugin's Blueprint API. 3. iOS build requires a Mac The xcframework binaries are ARM64 Mach-O. You cannot build an iOS package from Windows even with remote build configured; the link step must run on macOS with Xcode 16+. 4. AdsJumbo SDK not bundled The AdsJumbo.lib and AdsJumbo.dll files are not included due to SDK licensing. Obtain them from https://adsjumbo.com/developers. 5. GDPR dialog not automatic The plugin does NOT show a consent dialog automatically. You must build your own consent UI and call SetGDPRConsent() with the result. 6. Single provider per session Only one ad provider is active per game session (chosen in Project Settings). Switching providers at runtime is not supported; restart the game instance. ──────────────────────────────────────────────────────────────────────────────── 16. VERSION HISTORY ──────────────────────────────────────────────────────────────────────────────── VERSION DATE CHANGES ──────── ────────── ────────────────────────────────────────────────────── 1.0.0 2026-03-01 Initial release. Provider pattern, NullProvider, AdsJumboProvider stub, AdMobAndroidProvider (JNI), AdMobIOSProvider (Obj-C++), UPL Android + iOS, real GoogleMobileAds.xcframework v13.1.0 + UserMessagingPlatform.xcframework bundled. Blueprint delegates: OnAdLoaded, OnAdFailed, OnAdShown, OnAdClosed, OnRewardGranted. 1.1.0 2026-03-02 Added: - Ad formats: Native, Rewarded Interstitial, App Open - Fixed IAB banner sizes: Banner/LargeBanner/ MediumRectangle/FullBanner/Leaderboard - Ad Unit Name registry (FAdUnitEntry array in Settings) - Named unit lookup: ResolveAdUnitId(FName, EAdType) - SetBannerPosition (live reposition without reload) - Video callbacks: OnVideoStarted, OnVideoCompleted, OnVideoMuted, OnVideoUnmuted - General callbacks: OnAdClicked, OnAdImpression - Build.cs: file-existence check for AdsJumbo binaries (fixes WARNING: lib not resolvable) - Fixed C2039: removed AddWeakLambda from dynamic delegate in MonetizeProBPLibrary - Fixed C3867/C2664: OnRewardGranted / OnVideoStarted / OnVideoCompleted name clash via IAdProvider* cast - Copyright year added to all source files - Documentation.txt + Blueprint_Instructions.txt ================================================================================ Copyright 2026 Alpha XP. All Rights Reserved. ================================================================================