LionAds V2 to V3 Migration Guide

LionAds V2 to V3 Migration Guide

This guide walks you through migrating a project from LionAds V2 (CPM Floor Ads Bidding) to LionAds V3 (BidSmart). It applies to projects on LionSuite-Ads 3.13.x–3.14.x upgrading to 4.0.0 or later.

What changed in V3

From LionAds API side, calls are same that are defined here.

The main changes are,

  • Bidding model. CPM Floor (a list of high→low CPM ad units) is replaced by BidSmart (a single bid-floor ad unit whose floor is auto-tuned at runtime).

  • Remote config source. Previously V2 fetches remote configs only from Growthbook but now any backend can be used as remote configs source.

If your project never enabled CPM Floor before, then you can follow the main docs here for BidSmart.

Step 1 — Update the package

Pull the new package version through the Lion registry / Package Manager. After import, your game code should compile without changes; only direct references to the removed V2 types listed above will break.

Step 2 — Configure ad units in the Settings Manager

Open Window → Lion Studios → Settings Manager → Ads and fill in:

  1. Enable Lion Ads — ON.

  2. Standard Ad Unit IDs (Android & iOS) — interstitial, rewarded, banner. These are the IDs that serve when BidSmart is off or hasn't received its config yet.

  3. BidSmart Ad Unit IDs (Android & iOS) — interstitial and rewarded only. Use the BidSmart-specific IDs from your Studio Manager. Don't reuse your standard IDs here; BidSmart needs its own ad units to function.

  4. Enable BidSmart — leave OFF until Step 3 is done. BidSmart only activates after it receives a remote config anyway, but it's clearer to flip the toggle once everything is wired.

  5. Banner settings (Position, Color, Disable Adaptive, Disable Show Immediate) — unchanged from V2.

If Google Ads Manager is installed as a mediation adapter, its IDs still go in AppLovin → Integration Manager, exactly as in V2.

Step 3 — Wire up the BidSmart remote config

V3 expects you to deliver a LionAdsRemoteConfig payload at runtime. More info on how to setup bidsmart configs is defined here.

Step 4 — Clean up V2 leftovers

Once Step 3 is in place, remove the V2 plumbing so it can't drift back into use:

  • Delete Assets/LionStudios/Resources/LionAdsTestRCSettings.json (and its .meta). V3 doesn't read it.

  • Retire the old GrowthBook feature flag <3LC>_lion_ads_settings. V3 doesn't consult it. (If your project still uses GrowthBook for other features, leave that alone — the change here is only that ads no longer pull from it.)

  • Expect a diff in LionAdsSettings.asset because the CPM Floor arrays no longer serialise. Commit it.

Step 5 — Update any custom code

Skip this step if your project only calls the static LionAds.* methods.

If you held references to V2-only members on LionAds, they're gone:

  • LionAds.LastShownDateTime — Track it yourself in your callers if you need it for cooldowns.

  • LionAds.OnRewardedStatusChanged (static event) — poll LionAds.IsRewardedReady for UI button gating.

Step 6 — Test

Before promoting the migration to release:

  1. BidSmart disabled — set the RC payload to Enabled: false, Confirm ads load and bid_smart global property is false.

  2. First session, BidSmart enabled — clear app data so the cached config is empty. Standard ads should serve until SetRemoteConfig BidSmart is called and starts on the next ad load after that.

  3. Warm start, BidSmart enabled — restart. The cached config should apply during init so BidSmart can serve before your RC fetch completes.

  4. CanInterstitialReplaceRewarded — toggle it in the RC payload and confirm the swap behaviour.

  5. Single-platform IDs — confirm the SDK initialises cleanly when only one platform's IDs are populated (a frequent V3 follow-up fix).

  6. Manual MAX init — if you initialise MAX yourself, verify banner ads still appear; this path was tightened in 3.15.1.

  7. Manual Adjust init — if Adjust is initialised by your code, confirm LionCore.AdjustInitialized(); is still called right after Adjust.InitSdk(). Unchanged from V2 but still required for attribution and WhoAmI.

Congratulation your project is setup now according to new LionAds.

Advance

Reference info on API changes

This is the single source of truth for the field- and API-level changes. Earlier sections refer back here.

LionAdsSettings

V2 field
V3 equivalent

enableLionAds

enableLionAds (unchanged)

EnableCPMFloor

enableBidSmart

interstitialAdUnitIdAndroid/IOS

standardInterstitialAdUnitAndroid/IOS

rewardedAdUnitIdAndroid/IOS

standardRewardedAdUnitAndroid/IOS

bannerAdUnitIdAndroid/IOS

unchanged

interstitialCPMFloorAdUnitsAndroid/IOS (LionAdUnitInfo[])

bidSmartInterstitialAdUnitAndroid/IOS (string)

rewardedCPMFloorAdUnitsAndroid/IOS (LionAdUnitInfo[])

bidSmartRewardedAdUnitAndroid/IOS (string)

rewardedAdUnitIdAmazonAndroid/IOS

amazonRewardedAdUnitIdAndroid/IOS

interstitialAdUnitIdAmazonAndroid/IOS

amazonInterstitialAdUnitIdAndroid/IOS

bannerAdUnitIdAmazonAndroid/IOS

amazonBannerAdUnitIdAndroid/IOS

RewardedAdLoadCooldown / InterstitialAdLoadCooldown / BannerAdLoadCooldown

removed — handled by AdLoadTracker

adjustSafeAreaWithBannerAds

removed — replace with your own Screen.safeArea handling

interOpen* and *ControlAdUnit*

removed

CanInterstitialReplaceRewarded / CanRewardedReplaceInterstitial (settings)

removed from settings — CanInterstitialReplaceRewarded lives on LionAdsRemoteConfig instead; the reverse direction is gone

Remote config

V2
V3

GrowthBook feature flag <3LC>_lion_ads_settings

Firebase RC parameter (any name; convention lion_ads_remote_config)

LionAdsRemoteConfigSettings (with IsUseCPMFloorAdIds, CPMFloorSettings[], both replacement toggles)

LionAdsRemoteConfig (BidSmart block + CanInterstitialReplaceRewarded)

Auto-fetched inside LionAds.Initialize

Pushed in via LionAdsRemoteConfigHandler.SetRemoteConfig(...)

Editor override file LionAdsTestRCSettings.json

None — feed a LionAdsRemoteConfig instance from any source

Static LionAds API

Member
V2
V3

TryShowInterstitial, TryShowRewarded, ShowBanner, HideBanner, IsInterstitialReady, IsRewardedReady, IsBannerReady

present

unchanged

TryShowInterOpen

[Obsolete], mapped to interstitial

present, no longer obsolete, still maps to interstitial

LastShownDateTime

static getter/setter

removed

OnRewardedStatusChanged

static event Action<bool>

removed (still on the inner ILionAds)

ILionAds interface (advanced)

Removed in V3
Added in V3

LastShownDateTime

IsBannerReady

Initialize(LionAdsSettings, LionAdDisplayer)

Initialize(LionAdsSettings)

InitializeAdIDs

SelectInterstitial, SelectRewarded

GetInterstitialAdUnit, GetRewardedAdUnit

LoadStandardInterstitialAds, LoadStandardRewardedAds

LoadInterstitialAds, LoadRewardedAds

ShowBanner, HideBanner

OnRewardedStatusChanged, HandleRewardedStatusChanged

GetActiveReward(string adUnitId)

The new internal owner is AdService plus AdUnitRegistry and AdSelectionStrategy. We recommend going through the static LionAds API rather than implementing ILionAds yourself.

Last updated

Was this helpful?