Simple integration (Unity)

We provide MAX SDK wrapper for simple integration. Or you can implement dual track ad loading from it for complete control.

If you have MAX integrated similar to AppLovin recommendation like this:

Initialization

For dynamic bid floors you have disable back to back preloading for those ad units. This should only be done for players in optimized group. So the measured uplift will compare real default behaviour to the optimized one.

// MAX default initialization
//MaxSdkCallbacks.OnSdkInitializedEvent += sdkConfiguration =>
//{
//   Debug.Log("MAX SDK Initialized");
//};
//MaxSdk.InitializeSdk();

// With Nefta: Initialize Nefta and then MAX
NeftaAdapterEvents.InitWithAppId(_neftaAppId, (InitConfiguration config) =>
{
   Debug.Log($"[NeftaPluginMAX] Nefta Initialized, nuid: {config._nuid}");
});

if (isOptimized)
{
   MaxSdk.SetExtraParameter("disable_b2b_ad_unit_ids", string.Join(",", _adUnits));   
}
MaxSdkCallbacks.OnSdkInitializedEvent += sdkConfiguration =>
{
  Debug.Log("MAX SDK Initialized");
};
MaxSdk.InitializeSdk();

Interstitials

Replace your existing Interstitial calls to MAX with calls to Nefta SDK:

// Default MAX integration:
//MaxSdkCallbacks.Interstitial.OnAdLoadedEvent += OnAdLoadedEvent;
//MaxSdkCallbacks.Interstitial.OnAdLoadFailedEvent += OnAdLoadFailedEvent;
//MaxSdkCallbacks.Interstitial.OnAdDisplayFailedEvent += OnAdDisplayFailedEvent;
//MaxSdkCallbacks.Interstitial.OnAdHiddenEvent += OnAdHiddenEvent;

NeftaSdk.Interstitial.InitializeDualTrack(AdUnitIdA, AdUnitIdB);
NeftaSdk.Interstitial.OnAdLoadedEvent += OnAdLoadedEvent;
NeftaSdk.Interstitial.OnAdLoadFailedEvent += OnAdLoadFailedEvent;
NeftaSdk.Interstitial.OnAdDisplayFailedEvent += OnAdDisplayFailedEvent;
NeftaSdk.Interstitial.OnAdHiddenEvent += OnAdHiddenEvent;

private void Load()
{
   //MaxSdk.LoadInterstitial(AdUnitIdA);
   NeftaSdk.LoadInterstitial(AdUnitIdA);
}

private void OnShowClick()
{
   _show.interactable = false;

   //if (MaxSdk.IsInterstitialReady(AdUnitIdA))
   if (NeftaSdk.IsInterstitialReady(AdUnitIdA))
   {
      //MaxSdk.ShowInterstitial(AdUnitIdA);
      NeftaSdk.ShowInterstitial(AdUnitIdA);
   }
}

Full reference implementation: https://github.com/Nefta-io/NeftaMAXAdapter-Unity/blob/main/Assets/AdDemo/InterstitialController.cs


Rewarded

Replace your existing Rewarded calls to MAX with calls to Nefta SDK:

   //MaxSdkCallbacks.Rewarded.OnAdLoadedEvent += OnAdLoadedEvent;
   //MaxSdkCallbacks.Rewarded.OnAdLoadFailedEvent += OnAdLoadFailedEvent;
   //MaxSdkCallbacks.Rewarded.OnAdDisplayFailedEvent += OnAdDisplayFailedEvent;
   //MaxSdkCallbacks.Rewarded.OnAdHiddenEvent += OnAdHiddenEvent;
   //MaxSdkCallbacks.Rewarded.OnAdReceivedRewardEvent += OnAdReceivedRewardEvent;

   NeftaSdk.Rewarded.InitializeDualTrack(AdUnitIdA, AdUnitIdB);
   NeftaSdk.Rewarded.OnAdLoadedEvent += OnAdLoadedEvent;
   NeftaSdk.Rewarded.OnAdLoadFailedEvent += OnAdLoadFailedEvent;
   NeftaSdk.Rewarded.OnAdDisplayFailedEvent += OnAdDisplayFailedEvent;
   NeftaSdk.Rewarded.OnAdReceivedRewardEvent += OnAdReceivedRewardEvent;
   NeftaSdk.Rewarded.OnAdHiddenEvent += OnAdHiddenEvent;
}

private void Load()
{
   //MaxSdk.LoadRewardedAd(AdUnitIdA);
   NeftaSdk.LoadRewardedAd(AdUnitIdA);
}
        
private void OnShowClick()
{
   _show.interactable = false;
            
   //if (MaxSdk.IsRewardedAdReady(AdUnitIdA))
   if (NeftaSdk.IsRewardedAdReady(AdUnitIdA))
   {
      //MaxSdk.ShowRewardedAd(AdUnitIdA);
      NeftaSdk.ShowRewardedAd(AdUnitIdA);
   }
}

Full reference implementation: https://github.com/Nefta-io/NeftaMAXAdapter-Unity/blob/main/Assets/AdDemo/RewardedNeftaWrapper.cs


Wrapper flow

Under the hood, the flow would look like this:




Disabled Wrapper Flow

For control group, when you initialize wrapper with isOptimized = false, all calls will be forwarded directly to MAX and it'll behave as if Nefta SDK wouldn't be there.