Example optimisation code
Below is example code (not production-ready) showing the integration of dynamic floors in MAX.

It's important that you disable back to back ad loading in MAX when using multi ad unit set up before initializing MAX SDK:
private readonly string[] _adUnits = new string[] {
#if UNITY_IOS
// interstitials // Replace with your ad unit ids
"6d318f954e2630a8", "37146915dc4c7740", "e5dc3548d4a0913f",
// rewarded // Replace with your ad unit ids
"918acf84edf9c034", "37163b1a07c4aaa0", "e0b0d20088d60ec5"
#else // UNITY_ANDROID
// interstitials // Replace with your ad unit ids
"7267e7f4187b95b2", "00b665eda2658439", "87f1b4837da231e5",
// rewarded // Replace with your ad unit ids
"72458470d47ee781", "5305c7824f0b5e0a", "a4b93fe91b278c75"
#endif
};
MaxSdk.SetExtraParameter("disable_b2b_ad_unit_ids", string.Join(",", _adUnits));
MaxSdk.InitializeSdk();
let adUnits = [
// interstitials
"6d318f954e2630a8", "37146915dc4c7740", "e5dc3548d4a0913f",
// rewarded
"918acf84edf9c034", "37163b1a07c4aaa0", "e0b0d20088d60ec5"
]
let max = ALSdk.shared()
max.settings.setExtraParameterForKey("disable_b2b_ad_unit_ids", value: adUnits.joined(separator: ","))
max.settings.isVerboseLoggingEnabled = true
let initConfig = ALSdkInitializationConfiguration(sdkKey: "key") { builder in
builder.mediationProvider = ALMediationProviderMAX
}
max.initialize(with: initConfig) { sdkConfig in
}
ALSdkInitializationConfiguration *initConfig = [ALSdkInitializationConfiguration configurationWithSdkKey: @"key" builderBlock:^(ALSdkInitializationConfigurationBuilder *builder) {
builder.mediationProvider = ALMediationProviderMAX;
}];
ALSdkSettings *settings = [ALSdk shared].settings;
NSArray *adUnits = @[
// interstitials
@"6d318f954e2630a8", @"37146915dc4c7740", @"e5dc3548d4a0913f",
// rewarded
@"918acf84edf9c034", @"37163b1a07c4aaa0", @"e0b0d20088d60ec5"
];
[settings setExtraParameterForKey: @"disable_b2b_ad_unit_ids" value: [adUnits componentsJoinedByString:@","]];
[[ALSdk shared] initializeWithConfiguration: initConfig completionHandler:^(ALSdkConfiguration *sdkConfig) {
}];
String[] adUnits = new String[]{
// interstitials
"7267e7f4187b95b2", "00b665eda2658439", "87f1b4837da231e5",
// rewarded
"72458470d47ee781", "5305c7824f0b5e0a", "a4b93fe91b278c75"
};
AppLovinSdk sdk = AppLovinSdk.getInstance(this);
sdk.getSettings().setExtraParameter("disable_b2b_ad_unit_ids", String.join(",", adUnits));
AppLovinSdkInitializationConfiguration initConfig = AppLovinSdkInitializationConfiguration.builder( "key" )
.setMediationProvider( AppLovinMediationProvider.MAX )
.build();
sdk.initialize( initConfig, new AppLovinSdk.SdkInitializationListener() {
@Override
public void onSdkInitialized(final AppLovinSdkConfiguration sdkConfig) {
AppLovinSdk.getInstance(MainActivity.this).getSettings().setVerboseLogging(true);
}
});
Find the example optimisation code
private void GetInsightsAndLoad()
{
NeftaAdapterEvents.GetInsights(Insights.Rewarded, OnInsights, TimeoutInSeconds);
}
private void OnInsights(Insights insights)
{
_selectedAdUnitId = DefaultAdUnitId;
_usedInsight = insights._rewarded;
if (_usedInsight != null && _usedInsight._adUnit != null)
{
_selectedAdUnitId = _usedInsight._adUnit;
}
SetStatus($"Loading {_selectedAdUnitId} insights: {_usedInsight}");
MaxSdk.SetRewardedAdExtraParameter(_selectedAdUnitId, "disable_auto_retries", "true");
MaxSdk.LoadRewardedAd(_selectedAdUnitId);
}
private void OnAdFailedEvent(string adUnitId, MaxSdkBase.ErrorInfo errorInfo)
{
NeftaAdapterEvents.OnExternalMediationRequestFailed(NeftaAdapterEvents.AdType.Rewarded, _usedInsight, adUnitId, errorInfo);
SetStatus($"Load failed {adUnitId}: {errorInfo}");
_consecutiveAdFails++;
StartCoroutine(RetryLoadWithDelay());
}
private IEnumerator RetryLoadWithDelay()
{
// As per MAX recommendations, retry with exponentially higher delays up to 64s
// In case you would like to customize fill rate / revenue please contact our customer support
yield return new WaitForSeconds(new [] { 0, 2, 4, 8, 16, 32, 64 }[Math.Min(_consecutiveAdFails, 6)]);
GetInsightsAndLoad();
}
private void OnAdLoadedEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
NeftaAdapterEvents.OnExternalMediationRequestLoaded(NeftaAdapterEvents.AdType.Rewarded, _usedInsight, adInfo);
SetStatus($"Loaded {adUnitId} at: {adInfo.Revenue}");
_consecutiveAdFails = 0;
_show.interactable = true;
}
private func GetInsightsAndLoad() {
NeftaPlugin._instance.GetInsights(Insights.Rewarded, callback: Load, timeout: TimeoutInSeconds)
}
private func Load(insights: Insights) {
var selectedAdUnitId = DefaultAdUnitId
_usedInsight = insights._rewarded
if let usedInsight = _usedInsight, let recommendedAdUnit = usedInsight._adUnit {
selectedAdUnitId = recommendedAdUnit
}
let adUnitToLoad = selectedAdUnitId
Log("Loading \(selectedAdUnitId) insights: \(String(describing: _usedInsight))")
_rewarded = MARewardedAd.shared(withAdUnitIdentifier: adUnitToLoad)
_rewarded!.delegate = self
_rewarded!.setExtraParameterForKey("disable_auto_retries", value: "true")
_rewarded!.load()
}
func didFailToLoadAd(forAdUnitIdentifier adUnitIdentifier: String, withError error: MAError) {
ALNeftaMediationAdapter.onExternalMediationRequestFail(.rewarded, adUnitIdentifier: adUnitIdentifier, usedInsight: _usedInsight, error: error)
Log("didFailToLoadAd \(adUnitIdentifier): \(error)")
_consecutiveAdFails += 1
// As per MAX recommendations, retry with exponentially higher delays up to 64s
// In case you would like to customize fill rate / revenue please contact our customer support
let delayInSeconds = [0, 2, 4, 8, 16, 32, 64][min(_consecutiveAdFails, 6)]
DispatchQueue.main.asyncAfter(deadline: .now() + Double(delayInSeconds)) {
self.GetInsightsAndLoad()
}
}
func didLoad(_ ad: MAAd) {
ALNeftaMediationAdapter.onExternalMediationRequestLoad(.rewarded, ad: ad, usedInsight: _usedInsight)
Log("didLoad \(ad) at: \(ad.revenue)")
_consecutiveAdFails = 0
_showButton.isEnabled = true
}
- (void)GetInsightsAndLoad {
[NeftaPlugin._instance GetInsights: Insights.Interstitial callback: ^(Insights * insights) {
[self Load: insights];
} timeout: TimeoutInSeconds];
}
-(void)Load:(Insights *) insights {
NSString *selectedAdUnitId = DefaultAdUnitId;
_usedInsight = insights._interstitial;
if (_usedInsight != nil && _usedInsight._adUnit != nil) {
selectedAdUnitId = _usedInsight._adUnit;
}
NSLog(@"Loading %@ insights %@", selectedAdUnitId, _usedInsight);
_interstitial = [[MAInterstitialAd alloc] initWithAdUnitIdentifier: selectedAdUnitId];
_interstitial.delegate = self;
[_interstitial setExtraParameterForKey: @"disable_auto_retries" value: @"true"];
[_interstitial loadAd];
}
- (void)didFailToLoadAdForAdUnitIdentifier:(NSString *)adUnitIdentifier withError:(MAError *)error {
[ALNeftaMediationAdapter OnExternalMediationRequestFail: AdTypeInterstitial adUnitIdentifier: adUnitIdentifier usedInsight: _usedInsight error: error];
NSLog(@"didFailToLoadAdForAdUnitIdentifier %@: %@", adUnitIdentifier, error);
_consecutiveAdFails++;
// As per MAX recommendations, retry with exponentially higher delays up to 64s
// In case you would like to customize fill rate / revenue please contact our customer support
int delayInSeconds = (int[]){ 0, 2, 4, 8, 16, 32, 64 }[MIN(_consecutiveAdFails, 6)];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
[self GetInsightsAndLoad];
});
}
- (void)didLoadAd:(MAAd *)ad {
[ALNeftaMediationAdapter OnExternalMediationRequestLoad: AdTypeInterstitial ad: ad usedInsight: _usedInsight];
NSLog(@"didLoadAd %@: %f", ad, ad.revenue);
_consecutiveAdFails = 0;
_showButton.enabled = true;
}
private void GetInsightsAndLoad() {
NeftaPlugin._instance.GetInsights(Insights.REWARDED, this::Load, TimeoutInSeconds);
}
private void Load(Insights insights) {
String selectedAdUnitId = DefaultAdUnitId;
_usedInsight = insights._rewarded;
if (_usedInsight != null && _usedInsight._adUnit != null) {
selectedAdUnitId = _usedInsight._adUnit;
}
Log("Loading "+ selectedAdUnitId +" insights: "+ _usedInsight);
_rewardedAd = MaxRewardedAd.getInstance(selectedAdUnitId);
_rewardedAd.setListener(RewardedWrapper.this);
_rewardedAd.setRevenueListener(RewardedWrapper.this);
_rewardedAd.setExpirationListener(RewardedWrapper.this);
_rewardedAd.setExtraParameter("disable_auto_retries", "true");
_rewardedAd.loadAd();
}
@Override
public void onAdLoadFailed(@NonNull String adUnitId, @NonNull MaxError maxError) {
NeftaMediationAdapter.OnExternalMediationRequestFailed(NeftaMediationAdapter.AdType.Rewarded, adUnitId, _usedInsight, maxError);
Log("onAdLoadFailed "+ adUnitId + ": "+ maxError.getMessage());
_consecutiveAdFails++;
// As per MAX recommendations, retry with exponentially higher delays up to 64s
// In case you would like to customize fill rate / revenue please contact our customer support
int delayInSeconds = new int[] { 0, 2, 4, 8, 16, 32, 64 } [Math.min(_consecutiveAdFails, 6)];
_handler.postDelayed(this::GetInsightsAndLoad, delayInSeconds * 1000L);
}
@Override
public void onAdLoaded(@NonNull MaxAd ad) {
NeftaMediationAdapter.OnExternalMediationRequestLoaded(NeftaMediationAdapter.AdType.Rewarded, ad, _usedInsight);
Log("onAdLoaded "+ ad.getAdUnitId() +": "+ ad.getRevenue());
_consecutiveAdFails = 0;
_showButton.setEnabled(true);
}
Updated 5 days ago