Plugin Details

AdBot

Unreal Engine plugin for Yandex Mobile Ads, AppMetrica analytics, optional AppMetrica Push, and Yandex Mediation on Android.

[ Plugin Banner Image ]

What is AdBot?

AdBot integrates Yandex Mobile Ads SDK 8.0, AppMetrica Analytics 8.2, and optional AppMetrica Push 4.3 (FCM and HMS) into Unreal Engine. Blueprint and C++ cover ads, statistics, and push — no hand-written Java.

Five Yandex Mediation adapters (VK, Mintegral, BIGO, Liftoff, InMobi) are toggled in Project Settings. Drop the plugin into Plugins/AdBot and configure keys and unit IDs under Edit → Project Settings → Plugins → AdBot.

🎯

4 Ad Formats

Banner, Interstitial, Rewarded Video, App Open.

🔵

Blueprint First

Every feature exposed as BlueprintCallable or async node. No C++ required.

🔒

Privacy Controls

User consent, COPPA, location tracking, GDPR-style flags.

📡

5 Mediation Networks

VK, Mintegral, BIGO, Liftoff, InMobi — enable in Project Settings and Yandex cabinet.

📊

AppMetrica 8

Events, profiles, sessions, device ID, crash reporting.

🔔

AppMetrica Push

FCM + HMS, payload delegate, notification permission (Android 13+).

🛠

Debug Panel

Yandex in-app integration checker for development builds.

Rewarded video — known issue in current build (may not display). See Known Issues.

Features

Features

Ad Formats

FormatBlueprintC++Notes
Banner8 size presets (0–7); load from Blueprint (Load Banner), short delays on BP path
InterstitialFull-screen, load → show pattern
Rewarded Video✅ Async nodes⚠️ Known issues — see Known Issues
App OpenVertical format, ideal for splash screens

Privacy & Compliance

FeatureBlueprint Node
User Consent (GDPR)Set Yandex Ads User Consent
Location TrackingSet Yandex Ads Location Tracking Enabled
Age Restricted (COPPA)Set Yandex Ads Age Restricted User
IAB TCF v2.0Via certified CMP — SDK reads SharedPreferences

Ad Targeting

Optional per-request targeting via AdTargeting: age, gender, geo-location, context query, context tags. All configured through Blueprint before loading ads.

AppMetrica Analytics (mobile)

AdBot ships AppMetrica Android SDK 8.2.x — this is the mobile analytics product paired with Yandex Ads (not the web Yandex.Metrica counter). Report custom events, user profiles, sessions, and crashes from Blueprint (AdBot|AppMetrica).

Yandex Mediation (5 networks)

Optional adapters: VK Ads (myTarget), Mintegral, BIGO Ads, Liftoff (Vungle), InMobi. Each has a toggle under Project Settings → Yandex Mediation (Android). Enable the network in the Yandex Advertising Network partner cabinet, then rebuild the APK. No extra Blueprint code.

AppMetrica Push (optional)

When Enable AppMetrica Push is on, the APK includes FCM/HMS providers. See Push: Setup.

Get Started

Get Started

Requirements

  • Unreal Engine 5.x
  • Android target platform configured in project
  • minSdkVersion 21 or higher
  • Account in Yandex Advertising Network

1. Add the Plugin

Copy the AdBot plugin folder into your project's Plugins/ directory:

YourProject/
  Plugins/
    AdBot/          ← paste here
      AdBot.uplugin
      Source/
      Platforms/

Restart the editor. In Edit → Plugins, find AdBot under the Advertising category and enable it.

2. Configure Ad Unit IDs

Open Edit → Project Settings → Plugins → AdBot and enter your Yandex Advertising Network placement IDs:

[ Project Settings screenshot ]
SettingDescription
Banner Ad Unit IDPlacement ID for banner ads
Interstitial Unit IDPlacement ID for interstitial ads
Rewarded Unit IDPlacement ID for rewarded video
App Open Ad Unit IDPlacement ID for app-open format
Default Banner Size PresetAndroid auto-banner before Blueprint Load Banner (index 7 = Inline 90 dp)
Init Yandex Ads SDK at StartupInitialize from GameActivity.onCreate
Load Ad Data When Engine StartsCall Load Ad Data after world init
AppMetrica API KeyAppMetrica cabinet key — strongly recommended for Ads 8
Init AppMetrica at StartupAppMetrica.activate from onCreate
Banner No-Fill Max RetriesAuto-retry count on empty inventory (0 = disabled)
Banner No-Fill Retry DelaySeconds between auto-retries (1–600)
Demo ad units for testing Yandex provides demo placement IDs that always return test ads:
demo-banner-yandex · demo-interstitial-yandex · demo-rewarded-yandex · demo-appopenad-yandex

3. Initialize ads and banner (Blueprint)

Init Yandex Ads SDK at Startup = ON (SDK in onCreate). Banner loads only from Blueprint — no auto-load toggles in Project Settings.

Load Ad Data (optional) → Load Banner (preset 7, bottom) → Show Banner
Privacy first If you use a consent dialog, call Set Yandex Ads User Consent and other privacy nodes before Load Ad Data / Load Banner.

4. Package for Android

Build the project targeting Android. The plugin's UPL adds Yandex SDK and VK adapter Gradle dependencies automatically.

Project Settings

Project Settings

All AdBot settings live in Edit → Project Settings → Plugins → AdBot and are stored in DefaultGame.ini.

[ Project Settings AdBot panel screenshot ]

Startup

PropertyDefaultDescription
Init Yandex Ads SDK at Startup (Android)OnRuns YandexAds.initialize from GameActivity.onCreate — SDK ready before Blueprint
Use Refactored Android Bridge (Android)OnThin UPL → AdBotAndroidFacadeBannerPipeline, FullscreenAdsController, YandexAdsController, YandexPushHelper, AppMetricaHelper; rollback via AdBot_UPL.xml.backup
Init AppMetrica at Startup (Android)OffRuns AppMetrica.activate from onCreate — enable if you use analytics before Blueprint
Banner timing (removed from Project Settings) Auto Load Ad Data When Engine Starts, Auto Load Banner on SDK Init, and Defer Banner Until Main UI Ready were removed. Use Blueprint: Load Ad DataLoad BannerShow Banner.
Init AppMetrica at Startup (Android)Offplaceholder

Yandex Mobile Ads

PropertyTypeDefaultDescription
Banner Ad Unit IDStringYandex banner placement ID
Default Banner Size PresetEnum (0–7)Inline 90 dp (7)Fallback when Load Banner omits size (prefer passing preset 7 in Blueprint)
Interstitial Unit IDStringInterstitial placement ID
Rewarded Unit IDStringRewarded video placement ID
App Open Ad Unit IDStringApp-open placement ID
Banner No-Fill Max RetriesInt (0–20)3Auto-retries on empty ad inventory
Banner No-Fill Retry DelayInt (1–600 s)20Pause between auto-retries

AppMetrica

PropertyDefaultDescription
AppMetrica API KeyFrom AppMetrica cabinet (same Android app). Required for reliable Yandex Ads 8 banner/WebView path
Session Timeout (seconds)10AppMetrica session timeout
Enable SDK LogsOffAppMetrica Logcat (development)
Activity Auto TrackingOnAutomatic activity lifecycle events
Location TrackingOffOnly enable with user consent
Crash ReportingOnSend crashes to AppMetrica
Statistics EnabledOnMaster switch for sending statistics to AppMetrica servers

Yandex Mediation (Android)

Each adapter increases APK size. Disable unused networks before release.

PropertyDefaultGradle adapter (when ON)
Enable VK Ads (myTarget)Onmobileads-mytarget:5.45.3.1
Enable MintegralOnmobileads-mintegral:17.0.41.0
Enable BIGO AdsOnmobileads-bigoads:5.7.0.0
Enable Liftoff (Vungle)Onmobileads-vungle:7.7.0.0
Enable InMobiOnmobileads-inmobi:11.0.0.0

AppMetrica Push (Android)

PropertyDefaultDescription
Enable AppMetrica PushOffMaster switch — adds push SDK to Gradle; requires APK rebuild
POST_NOTIFICATIONS (manifest)Auto when push ONRuntime dialog on API 33+: Request Post Notifications Permission
Init AppMetrica Push at StartupOffAppMetricaPush.activate from onCreate
Use Firebase Transport (FCM)OnFCM + push-provider-firebase
Use HMS TransportOnHuawei Push + push-provider-hms
Prefer Google Services JsonOffUse google-services.json instead of manual Firebase fields
Firebase App ID / Sender ID / API Key / Project IDOnly if not using JSON — see Push setup
HMS App IDFrom agconnect-services.jsonapp_id
Do not mix plugins Disable the marketplace YandexAppMetrica plugin (mobmetricalib 5.x) when using AdBot — only one AppMetrica integration per app.
DefaultGame.ini Settings are saved under [/Script/AdBot.AdBotSettings]. You can also edit the .ini directly.

Privacy & Consent

Privacy & Consent

AdBot exposes all Yandex SDK privacy controls as Blueprint nodes in the AdBot | Yandex Privacy category.

Call privacy nodes before Load Ad Data Privacy flags are applied to Yandex SDK before YandexAds.initialize. Calling them after initialization is supported but preferred before.

Available Nodes

Blueprint NodeAndroid APIDescription
Set Yandex Ads User ConsentYandexAds.setUserConsentGDPR-style personalized ad consent (true/false)
Set Yandex Ads Location Tracking EnabledYandexAds.setLocationTrackingEnable after user consents to location use
Set Yandex Ads Age Restricted UserYandexAds.setAgeRestrictedCOPPA — mark user as under 13
Set Yandex Ads SDK Logging EnabledYandexAds.enableLoggingLogcat integration logs. Default: OFF
Set Yandex Ads Debug Error Indicator EnabledYandexAds.enableDebugErrorIndicatorToast indicator for debug builds
Show Yandex Ads Debug PanelYandexAds.showDebugPanelOpens Yandex in-app debug panel

IAB TCF v2.0

If you use a certified CMP (Consent Management Platform), Yandex SDK reads IABTCF_* keys from Android SharedPreferences automatically. You do not need Blueprint nodes for this — just delay ads until the CMP finishes.

COPPA / Age Restricted

COPPA / Age Restricted User

If your app targets children under 13, you must notify the Yandex Mobile Ads SDK on every app launch.

Must call every launch Yandex documentation requires setAgeRestricted to be transmitted each time the app starts.

Blueprint

[ Set Yandex Ads Age Restricted User node ]
// Call before Load Ad Data
Set Yandex Ads Age Restricted User (Age Restricted: true)

C++

#include "AdBotBlueprintLibrary.h"

// On BeginPlay or before LoadAdData
UAdBotBlueprintLibrary::SetYandexAdsAgeRestrictedUser(true);

App Open

App Open Ads

App open ads appear when users launch or return to the app. They can be closed at any time and are served from the vertical-only format in the Yandex network.

How It Works

  1. Configure App Open Ad Unit ID in Project Settings.
  2. Call Load App Open early (e.g. on game start).
  3. On OnAppOpenLoaded delegate — call Show App Open.
  4. After dismiss, reload for next session.

Delegates (AdBotManager)

DelegateWhen it fires
OnAppOpenLoadedAd is ready to show
OnAppOpenFailedToLoadLoad failed
OnAppOpenShownAd appeared on screen
OnAppOpenFailedToShowShow call failed (message param)
OnAppOpenDismissedUser closed the ad
OnAppOpenImpressionImpression recorded
OnAppOpenClickedUser tapped the ad
[ App Open Blueprint graph ]

Interstitial

Interstitial Ads

Full-screen ads displayed during natural breaks in the app, such as between game levels. Users can close them and return to the game.

Flow

  1. Call Load Interstitial.
  2. Wait for OnInterstitialLoaded.
  3. Call Show Interstitial at a natural pause.
  4. After OnInterstitialDismissed, call Load again for next time.
One ad at a time The plugin guards against double-show. Only one interstitial can be shown at a time.

Delegates

DelegateDescription
OnInterstitialLoadedReady to show
OnInterstitialFailedLoad failed
OnInterstitialShownAppeared on screen
OnInterstitialFailedToShowShow failed (message)
OnInterstitialDismissedClosed by user
OnInterstitialImpressionImpression recorded
OnInterstitialClickedAd tapped
[ Interstitial Blueprint graph ]

Rewarded Video

Rewarded Video

Current status — not fully working In recent builds, rewarded ads often fail to display or dismiss in under ~300 ms without an impression (hadImpression=false in Logcat). Load may succeed (Rewarded ad loaded successfully) but the user sees no video. Banner, interstitial, and app open are OK. See Known Issues before shipping rewarded monetization.

Users voluntarily watch a rewarded video to earn in-game currency, extra lives, or other bonuses. AdBot uses async Blueprint nodes for a clean load → show → reward flow.

Async Node Flow

[ Load Ad Rewarded Video async node ]
  1. Add Load Ad Rewarded Video async node. Pass optional Keywords (context tags).
  2. On Ad Loaded — save the RewardedVideo object.
  3. Add Show Rewarded Video async node, pass the saved object.
  4. Handle Reward Granted (with RewardName + RewardAmount), Ad Dismissed, Failed To Show.

Outputs of Show Rewarded Video

PinDescription
Reward GrantedUser earned the reward. RewardName + RewardAmount from Yandex SDK.
Ad ShownAd appeared on screen
Ad DismissedUser closed the ad
Failed To ShowShow failed. Use Get Last Rewarded Show Error for message.
Ad ImpressionImpression recorded
Context tags & keywords Keywords passed to Load Ad Rewarded Video are merged with the global targeting snapshot (Set Yandex Ad Targeting Context Tags). Snapshot tags appear first; per-load keywords are appended without duplicates.

Ad Targeting

Ad Targeting

Optional additional data improves ad relevance and revenue. Configure a targeting snapshot once; it is applied automatically to all ad requests (banner, interstitial, rewarded, app open).

Location consent required Before passing location data, call Set Yandex Ads Location Tracking Enabled (true) — only after the user consents to location use.

Targeting Nodes (AdBot | Yandex Targeting)

Blueprint NodeParameterExample
Set Yandex Ad Targeting AgeString"25"
Set Yandex Ad Targeting GenderEAdBotYandexTargetingGenderMale / Female / Unknown
Set Yandex Ad Targeting Locationbool, Latitude, Longitude, Providertrue, 55.75, 37.62, "gps"
Set Yandex Ad Targeting Context QueryString"Buy a car in Moscow"
Set Yandex Ad Targeting Context TagsArray of String["car", "used", "Moscow"]
Clear Yandex Ad TargetingResets all targeting fields

Recommended Order

Set Yandex Ads User Consent     (AdBot|Yandex Privacy)
② Activate AppMetrica            (AdBot|AppMetrica) — or enable Init AppMetrica at Startup
③ Set Yandex Ad Targeting …      (optional, AdBot|Yandex Targeting)
④ Load Ad Data                   ← Yandex Ads initialize (if not already at startup)
⑤ Load Banner / Load Interstitial / etc.
⑥ Activate AppMetrica Push (optional, after analytics + permission)

Blueprint Examples — Privacy

Blueprint: Privacy Setup

Place this in your GameMode BeginPlay or a persistent widget — before any ad loads.

[ Blueprint graph: privacy nodes before Load Ad Data ]

Minimal Consent Setup

// If user accepted your consent dialog:
Set Yandex Ads User Consent (Consent: true)
Load Ad Data

With Logging (Development)

Set Yandex Ads SDK Logging Enabled (Enabled: true)
Set Yandex Ads Debug Error Indicator Enabled (Enabled: true)
Set Yandex Ads User Consent (Consent: true)
Load Ad Data
Shipping builds Keep SDK Logging and Debug Error Indicator disabled (default) for release. Only enable for debug/development builds.

Blueprint Examples — App Open

Blueprint: App Open

[ Blueprint graph: Load App Open → OnAppOpenLoaded → Show App Open ]

Step-by-Step

// BeginPlay:
Load Ad Data
  ↓ OnAdDataLoaded
Load App Open
  ↓ OnAppOpenLoaded
Show App Open
  ↓ OnAppOpenDismissed
Load App Open   // reload for next session

Blueprint Examples — Banner

Blueprint: Banner

[ Blueprint graph: Load Banner → OnBannerLoaded → Show Banner ]

Basic Example

Load Ad Data
  ↓ OnAdDataLoaded
Load Banner (Banner Size: Sticky Full Width)
  ↓ OnBannerLoaded
Show Banner

Hide on Pause / Show on Resume

// On pause:
Hide Banner

// On resume:
Show Banner
Is Banner Loaded? Use the Is Banner Loaded pure node to gate Show Banner if needed.

Blueprint Examples — Interstitial

Blueprint: Interstitial

[ Blueprint graph: Load Interstitial → OnInterstitialLoaded → Show Interstitial ]

Between-Level Flow

// Pre-load before level ends:
Load Interstitial

// On level end:
Is Interstitial LoadedShow Interstitial
  ↓ OnInterstitialDismissed
Load Interstitial   // pre-load for next

Blueprint Examples — Rewarded Video

Blueprint: Rewarded Video

[ Blueprint graph: Load Ad Rewarded Video async → Show Rewarded Video async ]

Full Async Flow

// Player taps "Watch ad" button:

Load Ad Rewarded Video (Keywords: ["bonus", "coins"])
  ↓ Ad Loaded (RewardedVideo object)
Show Rewarded Video (Rewarded Video: <from Ad Loaded>)
  ↓ Reward Granted (RewardName, RewardAmount)
      → Grant coins to player
  ↓ Ad Dismissed
      → Resume game
  ↓ Failed To Show
      → Read Get Last Rewarded Show Error
RewardedVideo object Do not cache the RewardedVideo output across frames. It is consumed by Show Rewarded Video. Always use the freshest object from Ad Loaded.

C++ Setup

C++ Setup

You can call all AdBot functions directly from C++ using UAdBotBlueprintLibrary and UAdBotManager.

Add Module Dependency

In your project's Build.cs:

PublicDependencyModuleNames.AddRange(new string[] { "AdBot" });

Include Headers

#include "AdBotBlueprintLibrary.h"
#include "AdBotManager.h"
#include "AdBotBannerTypes.h"
#include "AdBotYandexTypes.h"

Initialize

// Before init — privacy flags:
UAdBotBlueprintLibrary::SetYandexAdsUserConsent(true);

// Initialize SDK + ads:
UAdBotBlueprintLibrary::LoadAdData();

C++ — Banner

C++: Banner

#include "AdBotBlueprintLibrary.h"
#include "AdBotManager.h"
#include "AdBotBannerTypes.h"

// Load banner with sticky full-width preset:
UAdBotBlueprintLibrary::LoadBanner(nullptr, EAdBotBannerSizePreset::StickyFullWidth);

// Listen for events via AdBotManager:
UAdBotManager* Manager = UAdBotBlueprintLibrary::GetAdBotManager(this);
Manager->OnBannerLoaded.AddDynamic(this, &AMyActor::OnBannerReady);

// Show / Hide:
UAdBotBlueprintLibrary::ShowBanner();
UAdBotBlueprintLibrary::HideBanner();

C++ — Interstitial

C++: Interstitial

#include "AdBotBlueprintLibrary.h"
#include "AdBotManager.h"

UAdBotManager* Manager = UAdBotBlueprintLibrary::GetAdBotManager(this);
Manager->OnInterstitialLoaded.AddDynamic(this, &AMyActor::OnInterstitialReady);
Manager->OnInterstitialDismissed.AddDynamic(this, &AMyActor::OnInterstitialDone);

// Pre-load:
UAdBotBlueprintLibrary::LoadInterstitial();

// Show when ready:
void AMyActor::OnInterstitialReady() {
    UAdBotBlueprintLibrary::ShowInterstitial();
}

// After dismiss — reload for next time:
void AMyActor::OnInterstitialDone() {
    UAdBotBlueprintLibrary::LoadInterstitial();
}

C++ — Rewarded Video

C++: Rewarded Video

#include "AdBotManager.h"
#include "AdBotBlueprintLibrary.h"

UAdBotManager* Manager = UAdBotBlueprintLibrary::GetAdBotManager(this);

Manager->OnRewardGranted.AddDynamic(this, &AMyActor::HandleReward);
Manager->OnRewardedDismissed.AddDynamic(this, &AMyActor::HandleDismissed);

// Load with optional keywords:
TArray<FString> Keywords = { "bonus", "coins" };
Manager->LoadRewarded(Keywords);

// Show:
Manager->ShowRewarded();

// Reward callback:
void AMyActor::HandleReward(FString RewardName, int64 RewardAmount) {
    // Grant RewardAmount of RewardName to player
}

AppMetrica Analytics

AppMetrica 8 (mobile analytics)

AppMetrica is Yandex's analytics SDK for Android/iOS. It is not the same as web Yandex.Metrica (site counter). AdBot bundles io.appmetrica.analytics:analytics:8.2.0 and exposes Blueprint nodes under AdBot|AppMetrica.

Why it matters for ads Yandex Mobile Ads SDK 8 expects AppMetrica to be present. Activating AppMetrica before YandexAds.initialize reduces banner Invalid SDK state and improves fill on production R-M-… placements.
One AppMetrica per app Do not enable the old marketplace YandexAppMetrica plugin (mobmetricalib 5.x) together with AdBot.

Blueprint nodes

NodeDescription
Activate AppMetricaUses Project Settings (API key, session timeout, logs, tracking flags). Idempotent.
Is AppMetrica ActivatedReturns true after successful activate on Android
Report AppMetrica EventCustom event name + optional JSON parameters (valid JSON or empty)
Send AppMetrica Events BufferFlush queued events (e.g. before exit)
Set AppMetrica User Profile IDProfile ID for subsequent reports
Report AppMetrica User ProfileName, gender, age, notifications flag
Pause / Resume AppMetrica SessionSession lifecycle (bound to GameActivity)
Set AppMetrica Statistics EnabledRuntime toggle for sending statistics
Get AppMetrica Device IDDevice ID after activation (SDK 8.1+)

Startup vs Blueprint activate

  • Init AppMetrica at StartupAppMetrica.activate from GameActivity.onCreate (Project Settings).
  • Activate AppMetrica node — call from Blueprint before Load Ad Data if startup init is off.

Viewing data

Events and profiles appear in the AppMetrica web cabinet (reports, funnels, retention). Allow a few minutes delay for first events on a new install.

Step-by-step statistics guide →

Blueprint — AppMetrica

Blueprint: AppMetrica examples

Minimal (with ads)

// GameMode BeginPlay — before Load Ad Data:
Set Yandex Ads User Consent (Consent: true)
Activate AppMetrica
Load Ad Data

Level completed event

Report AppMetrica Event
  Event Name: "level_complete"
  Json Parameters: "{\"level\":3,\"score\":1200}"
JSON parameters Must be valid JSON (e.g. {"key":"value"}) or an empty string. Invalid JSON is ignored or logged on Android.

User profile after login

Set AppMetrica User Profile ID (User Profile ID: PlayerIdString)

Report AppMetrica User Profile
  User Profile ID: PlayerIdString
  Profile: Name = "Player", Age = 25, Gender = Male

Pause statistics (GDPR opt-out)

Set AppMetrica Statistics Enabled (Enabled: false)
// Re-enable after consent:
Set AppMetrica Statistics Enabled (Enabled: true)

Flush before Android back button / quit

Send AppMetrica Events Buffer

Statistics: Getting Started

Getting started with AppMetrica statistics

See sidebar sections Analytics and Blueprint: AppMetrica for node reference. This page is the setup checklist.

  1. Create Android app in AppMetrica → copy API key.
  2. Paste into Project Settings → AdBot → AppMetrica API Key.
  3. Init AppMetrica at Startup or Activate AppMetrica before Load Ad Data.
  4. Send events with Report AppMetrica Event; view reports in the cabinet.

Push: Setup (FCM & HMS)

AppMetrica Push configuration

Based on Yandex: App configuration (EN: link).

Firebase (Google)

  1. Firebase Console → project → Android app (same package as UE build).
  2. Service accounts → Generate new private key (JSON).
  3. Enable FCM API in Google Cloud.
  4. AppMetrica → Settings → Push notifications → upload JSON under FCM service account key.
  5. AdBot: Enable AppMetrica Push, Use Firebase Transport; use google-services.json or manual Firebase fields — see Project Settings table on Project Settings page.

Huawei HMS

  1. Huawei AppGallery Connect + SHA-256 for all signatures.
  2. AppMetrica → Push → Huawei → App ID + App secret.
  3. AdBot: HMS App ID from agconnect-services.json.

Android notification permission (POST_NOTIFICATIONS)

Starting with Android 13 (API level 33), apps must explicitly request a runtime permission to post notifications. The manifest permission is:

android.permission.POST_NOTIFICATIONS

For devices running Android 12L (API 32) or lower, this permission is granted by default at install time. Users can still turn off notifications manually in system settings (Settings → Apps → [your app] → Notifications).

What AdBot does automatically When Enable AppMetrica Push is ON, AdBot_UPL.xml adds POST_NOTIFICATIONS to the packaged manifest. That only declares the permission — on Android 13+ you must still ask the user at runtime.
Android versionManifestRuntime dialog
API 33+ (Android 13+)Added by AdBot when push is enabledYesRequest Post Notifications Permission
API 32 and belowNot required for postingNo — node is a no-op unless user disabled notifications in settings

Reference: Android — Notification runtime permission.

When the game is not running

Yes — notifications can appear in the Android tray while Unreal is closed. FCM/HMS and AppMetrica Push deliver them natively; Blueprint is not involved in showing the icon.

Blueprint is required to register the device on first launch, request permission on Android 13+, and handle payload inside the game. See Blueprint: Push for three ready-made graphs (startup, cold start, foreground).

Runtime (Blueprint order)

  1. Rebuild APK with Enable AppMetrica Push = ON.
  2. Activate AppMetrica.
  3. Request Post Notifications Permission (Android 13+; show after consent UI if needed).
  4. Activate AppMetrica Push.
  5. Bind Push Payload Received on Game Instance.

Logcat: AdBotPush. If the user denies permission, notifications will not show until enabled in system settings.

Blueprint - Push Graphs

Blueprint: AppMetrica Push

Category AdBot|AppMetrica Push. Below: permission, three basic graphs (startup, cold start, foreground), node reference, and test checklist.

Request Post Notifications Permission (Android 13+)

Callable node Request Post Notifications Permission shows the system dialog for android.permission.POST_NOTIFICATIONS on API 33+. On Android 12L (API 32) and below it does nothing (notifications are allowed by default unless the user disabled them in settings).

Ask before the first push Call after Activate AppMetrica and before Activate AppMetrica Push, ideally after your consent UI.
// Game Instance - Event Init:
Activate AppMetrica
Request Post Notifications Permission
Activate AppMetrica Push (Async)
  Push Activated -> Bind Push Payload Received (Async)

Details: Push setup - POST_NOTIFICATIONS.

Notifications when the app is not loaded

Yes — users can receive notifications in the Android shade while Unreal is not running (app killed or only in the OS background). FCM/HMS and AppMetrica Push handle delivery in native Android; Blueprint is not required for the tray icon itself.

Blueprint is needed to register the device (first launch), request POST_NOTIFICATIONS on Android 13+, and to read the payload inside the game (while UE runs or after the user taps a notification).

SituationWho shows the notificationBlueprint
App killed or in backgroundAndroid + AppMetrica PushNot required for showing in the tray
UE is runningSame; payload to game codeBind Push Payload Received
User tapped notification (cold start)Launches game; intent carries payloadWas App Launched From Push, Get Last Push Payload

Blueprint does not run custom game logic if the app stays killed and the user never opens the notification. For background work without opening the game you need native Android services (not included in AdBot).

Blueprint nodes (category AdBot|AppMetrica Push)

NodeTypeWhen to use
Is AppMetrica Push EnabledPureBranch if push was compiled into the APK (Project Settings)
Activate AppMetrica PushCallable / AsyncRegister FCM/HMS token (once per install/session)
Is AppMetrica Push ActivatedPureCheck after async activation
Request Post Notifications PermissionCallableAndroid 13+ system dialog
Bind Push Payload ReceivedAsyncWhile UE runs; fires on each push with payload
Was App Launched From PushPureCold start after user tapped notification
Get Last Push PayloadPureRead payload from last intent (AppMetricaPush.EXTRA_PAYLOAD)
Get Push Launch ActionPureIntent action (deeplink)
Clear Last Push PayloadCallableAfter handling cold-start payload
Configure Push Notification ChannelCallableOptional; before first notification is shown

Also use AdBot|AppMetricaActivate AppMetrica before push (or enable Init AppMetrica at Startup).

Graph 1 — Game Instance startup (required minimum)

Place on your Game Instance blueprint: Event Init. Order matters on Android 13+.

// Game Instance - Event Init
Event Init
  |
  +-- Activate AppMetrica                    // skip if Init AppMetrica at Startup = ON
  |
  +-- Request Post Notifications Permission  // Android 13+; after GDPR if needed
  |
  +-- Activate AppMetrica Push (Async)
        |-- Then --------------> (optional log)
        |-- Push Activated ----> Bind Push Payload Received (Async)
        |                         Push Payload Received (String) --> Handle Push In Game
        +-- Failed --------------> Print String / Log (check AdBotPush in logcat)
  |
  +-- Handle Cold Start From Push              // Graph 2 - same Init
Startup without Blueprint Enable Init AppMetrica Push at Startup in Project Settings to call AppMetricaPush.activate from GameActivity.onCreate. You still should call Request Post Notifications Permission and Bind Push Payload Received from Blueprint after the engine starts.

Graph 2 — Cold start (app was killed, user tapped notification)

On cold start the plugin reads the launch Intent in Java and stores the payload before Blueprint runs. Use this in the same Event Init (custom function recommended).

// Function: Handle Cold Start From Push (call from Event Init)
Was App Launched From Push?
  |-- False --> (done)
  +-- True --> Payload = Get Last Push Payload
                Action = Get Push Launch Action   // optional deeplink
                --> Open level / parse JSON / show UI
                --> Clear Last Push Payload

Bind Push Payload Received may also fire on cold start (JNI from onCreate), but always handle cold start with Was App Launched From Push + Get Last Push Payload so you do not miss the payload if binding runs late.

Graph 3 — While the game is already running

After Graph 1, every new push while UE is active arrives on the async node:

Bind Push Payload Received (Async)
  Push Payload Received (Payload: String)
    --> Branch / Parse JSON / Custom Event
    --> e.g. show in-game mail, apply bonus, open shop tab

If the activity was already open, Android may deliver a new intent via onNewIntent; the plugin forwards it the same way.

Recommended Project Settings

  • Enable AppMetrica Push = ON → rebuild APK
  • AppMetrica API Key filled
  • FCM: google-services.json in Build/Android/ or manual Firebase fields + JSON in AppMetrica cabinet
  • Optional: Init AppMetrica at Startup + Init AppMetrica Push at Startup to reduce Blueprint calls

Test checklist

  1. Package APK with push enabled; install on device.
  2. Launch game once; wait for AdBotPush: AppMetrica Push activated in logcat.
  3. Grant notification permission on Android 13+.
  4. Force-stop the app; send a test push from AppMetrica → notification should appear in the tray.
  5. Tap the notification → game opens; Graph 2 should read the payload.
  6. With game in foreground, send another push → Graph 3 Push Payload Received should fire.

SDK & Android Build

SDK versions & packaging

AdBot injects Gradle dependencies via AdBot_UPL.xml at Android package time. You do not add these lines manually unless you fork the plugin.

Bundled versions (current)

ComponentCoordinate / versionNotes
Yandex Mobile Adscom.yandex.mobile:mobileads:8.0.0Local AAR in Plugins/AdBot/Platforms/Android/localrepo/
AppMetricaio.appmetrica.analytics:analytics:8.2.0Required peer for Ads 8 ([8.0.0, 9.0.0))
Kotlin Serializationkotlinx-serialization-json:1.6.0Required by Ads 8 (local POM has no transitives)
VK Ads mediationmobileads-mytarget:5.45.3.1Toggle in Project Settings
Mintegralmobileads-mintegral:17.0.41.0Extra Maven repo auto-added
BIGO Adsmobileads-bigoads:5.7.0.0
Liftoff (Vungle)mobileads-vungle:7.7.0.0
InMobimobileads-inmobi:11.0.0.0
AppMetrica Pushpush:4.3.0 + FCM/HMS providersOnly if Enable AppMetrica Push is ON

Manifest & init

  • com.yandex.mobile.ads.AUTOMATIC_SDK_INITIALIZATION=false — plugin calls AppMetrica.activate then YandexAds.initialize in the correct order.
  • android.useAndroidX=true and Jetifier enabled in Gradle properties.
  • When push is enabled: android.permission.POST_NOTIFICATIONS in manifest (Android 13+ target); request at runtime via Blueprint.
  • ProGuard/R8 rules for Yandex Ads, AppMetrica, Kotlin Serialization, and VK/myTarget are included in the UPL.

After changing AdBot_UPL.xml

  1. Save the plugin file.
  2. Run a full Android package (Development or Shipping) — hot-reload in editor does not update Java in the APK.
  3. Install the new APK on device; verify Logcat tag YaAdsBridge shows your changes (e.g. defaultBannerPreset=7).

UE & Android requirements

  • Unreal Engine 5.x (tested with 5.7.x)
  • Android minSdk 21+
  • Do not enable HTTPS MITM (Charles) networkSecurityConfig with user certs in shipping — breaks WebView ads/VAST

Logcat filters (development)

adb logcat -s YaAdsBridge:D YandexAds:I AdBotMetrica:I AdBotPush:D

Known Issues

Known issues (current build)

Status as of plugin integration with Yandex Mobile Ads 8.0.0 on Unreal GameActivity + Android.

Rewarded video — not reliable

Do not rely on rewarded for production yet API and Blueprint nodes exist, but display is unstable in the current build.

Symptoms

  • Rewarded ad loaded successfully then Rewarded ad dismissed (durationMs=100–300, hadImpression=false) — user sees no video.
  • Failed to load rewarded ad: Ad request completed successfully, but there are no ads available. on production R-M-… blocks (inventory / moderation).
  • Demo unit demo-rewarded-yandex may work once or twice; not stable with HTTPS proxy or heavy fullscreen sequencing.

Likely causes

  • UE SurfaceView — fullscreen game surface stacking over the ad layer (plugin lowers z-order on show; still fragile on some devices/MIUI).
  • Parallel loaders — loading rewarded while banner/interstitial/app-open pipelines run (plugin defers loads; avoid manual spam).
  • HTTPS MITM — Charles/Fiddler without proper networkSecurityConfig breaks VAST/video.
  • Empty inventory — real rewarded block not approved or no fill in your region.

What works instead

Banner (with Default Banner Size Preset 90 dp), interstitial, and app open are verified in testing. Use those formats until rewarded is fixed in a future AdBot release.

Banner — Invalid SDK state (mitigated)

On cold start with demo-banner-yandex, BannerAdView.loadAd could return Invalid SDK state. Mitigations in plugin: WebView warmup, deferred first load, AppMetrica activate, preset 90 dp (index 7), retries. Prefer production R-M-… banner ID for release.

Interstitial — slow first show

First interstitial may appear ~20–35 s after launch while the banner priming pipeline runs (by design to avoid parallel WebView loaders). Subsequent interstitials load faster.

Yandex Mediation

Yandex Mediation — 5 demand sources

Toggle adapters in Project Settings → Yandex Mediation (Android), enable matching networks in the Yandex Advertising Network cabinet, then rebuild the APK. No Blueprint code required.

No AdMob adapter AdBot does not bundle Google AdMob. Monetization is Yandex plus the networks below.

Networks

NetworkSettings toggleGradle (when ON)
VK Ads (myTarget)Enable VK Ads (myTarget)mobileads-mytarget:5.45.3.1
MintegralEnable Mintegralmobileads-mintegral:17.0.41.0
BIGO AdsEnable BIGO Adsmobileads-bigoads:5.7.0.0
Liftoff (Vungle)Enable Liftoff (Vungle)mobileads-vungle:7.7.0.0
InMobiEnable InMobimobileads-inmobi:11.0.0.0

Checklist

  1. Link each network in the Yandex partner cabinet.
  2. Add networks to the mediation waterfall per ad block.
  3. Enable only needed toggles in UE (smaller APK).
  4. Verify in Show Yandex Ads Debug Panel after install.

FAQ

Frequently Asked Questions

Ads don't show on device — "Invalid SDK state" in Logcat

Enable SDK logging (Set Yandex Ads SDK Logging Enabled before Load Ad Data), open Logcat and search for YandexAds. Common causes: AppMetrica key not set, BannerAdView not yet in the view hierarchy, or calling load before initialization completes.

Can I use this plugin without the AppMetrica key?

Yes. Ads may work without a key, but Yandex Mobile Ads SDK 8 requires AppMetrica SDK to be present. Leave the key empty and monitor Logcat for any warnings. For production, provide a real AppMetrica API key.

Does this plugin support iOS?

No. The plugin targets Android only via the Yandex Mobile Ads Android SDK. All JNI/UPL code is Android-specific. Blueprint nodes are safe to call on non-Android platforms (they do nothing).

Which Yandex SDK version is included?

The plugin bundles mobileads 8.0.0 (local Maven AAR) and the VK adapter mobileads-mytarget 5.45.3.1.

How do I test ads without a real Yandex account?

Use the demo placement IDs:
demo-banner-yandex, demo-interstitial-yandex, demo-rewarded-yandex, demo-appopenad-yandex

Bottom banner loads slowly or never appears

Turn OFF Auto Load Banner on SDK Init and Defer Banner Until Main UI Ready; call Load Banner from Blueprint after the main screen is visible. In Logcat (YaAdsBridge): avoid sdk_init_auto and totalDelay=8000 — use bpExplicit=true and totalDelay=500 (or 1500 with demo ID). Do not load App Open / interstitial in parallel with the first banner. Use production R-M-… banner ID instead of demo-banner-yandex for faster tests.

Rewarded video does not work / closes instantly

See the dedicated Known Issues page. Typical Logcat: hadImpression=false, duration under 300 ms, or no ads available on production units.

AppMetrica vs Yandex.Metrica (web)

AdBot uses AppMetrica (mobile SDK). Web site counters (Yandex.Metrica) are a different product — use AppMetrica cabinet for game events.

Wrong banner height (50 dp instead of 90 dp)

Use enum index 7 = Inline max height 90 dp (8th item in the list). Index 6 is 50 dp. Set Default Banner Size Preset in Project Settings or pass the correct enum to Load Banner.

Push notifications do not arrive

Check: (1) Enable AppMetrica Push ON and APK rebuilt; (2) FCM service account JSON uploaded in AppMetrica → Settings → Push notifications; (3) Firebase/HMS IDs in plugin settings or google-services.json; (4) Android 13+ notification permission granted; (5) Logcat AdBotPush. Full checklist: Push setup.; (6) on Android 13+, call Request Post Notifications Permission and tap Allow. See POST_NOTIFICATIONS.

Debug Panel

Yandex Ads Debug Panel

The Yandex Debug Panel is a built-in tool that displays SDK integration status, mediation adapter info, and privacy settings directly on the device.

How to Open

Call the Blueprint node Show Yandex Ads Debug Panel (category: AdBot | Yandex Privacy). It wraps YandexAds.showDebugPanel(context).

[ Show Yandex Ads Debug Panel node ]
Development only Do not show the Debug Panel in shipping builds. Gate it behind a debug flag or developer menu.

What the Panel Shows

  • App info (version, API level)
  • SDK integration status
  • Mediation adapter versions and status (VK Ads)
  • Privacy settings (User Consent, Location Consent, TCF, Age Restricted)
  • Integration error report

Contact

Contact & Support

If you have questions or found a bug, open an issue on GitHub or reach out directly.

GitHub Repository

github.com/xaser3d/AdBot

Before Contacting Support

  1. Enable SDK Logging and capture a Logcat output filtered by YandexAds and AdBot.
  2. Open the Debug Panel and take a screenshot of the integration status.
  3. Include your Unreal Engine version, plugin version, and Android device model.
Demo ad units Always test with demo placement IDs first to confirm the plugin is wired correctly before filing a bug.