Google AdMob

    Note

    This feature is currently in beta. If you have any questions or suggestions for improvements, reach out to your Airbridge CSM. If you don't have a dedicated CSM, contact us through the Airbridge Help Center.

    Airbridge supports SDK integration with Google AdMob. With the integration, you can import the ad revenue into Airbridge.

    SDK Integration

    Click the link below and install the Google AdMob SDK.

    Send Google AdMob ad revenue data to Airbridge

    The impression-level ad revenue should be enabled in Google AdMob to send ad revenue data to Airbridge. Refer to the following article on enabling impression-level ad revenue.

    Configure data callbacks in the Google AdMob SDK to send ad revenue data to the Airbridge SDK.

    The ad revenue data passed by the Google AdMob SDK varies depending on the platform. For example, for 0.005 USD, 5000 will be returned in Unity and Android, whereas 0.005 will be returned in iOS. By using the code below, 0.005 will be sent to Airbridge SDK for all platforms. The micro dollar value, which is 5000 in this case, will be sent as semanticAttributes.adPartners.admob.value_micros.

    Android SDK (v4)

    12345678910111213141516171819202122232425262728293031323334353637383940414243444546
    fun requestRewardedAd(context: Context) {
        val adRequest = AdRequest.Builder().build()
    
        RewardedAd.load(context, "ad unit ID", adRequest, object : RewardedAdLoadCallback() {
            override fun onAdLoaded(ad: RewardedAd) {
                ad.onPaidEventListener = OnPaidEventListener { adValue ->
                    // Extract the impression-level ad revenue data.
                    val valueMicros = adValue.valueMicros
                    val currencyCode = adValue.currencyCode
                    val precision = adValue.precisionType
    
                    // Get the ad unit ID.
                    val adUnitId = ad.adUnitId
                    val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
                    val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo
    
                    // Available adFormat values:
                    // "rewarded_video" - for rewarded ads
                    // "interstitial" - for interstitial ads
                    // "banner" - for banner ads
                    // "native" - for native ads
                    val adFormat = "rewarded_video"
    
                    Airbridge.trackEvent(AirbridgeCategory.AD_IMPRESSION,
                        mapOf(
                            AirbridgeAttribute.ACTION to adUnitId,
                            AirbridgeAttribute.LABEL to adNetworkAdapter,
                            AirbridgeAttribute.VALUE to valueMicros / 1000000.0,
                            AirbridgeAttribute.AD_PARTNERS to mapOf(
                                "admob" to mapOf(
                                    "value_micros" to valueMicros,
                                    "currency_code" to currencyCode,
                                    "precision" to precision,
                                    "ad_unit_id" to adUnitId,
                                    "ad_network_adapter" to adNetworkAdapter,
                                    "ad_network" to loadedAdapterResponseInfo?.adSourceName,
                                    "ad_revenue_format" to adFormat
                                )
                            ),
                            AirbridgeAttribute.CURRENCY to currencyCode
                        )
                    )
                }
            }
        })
    }
    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
    void requestRewardedAd(Context context) {
        AdRequest adRequest = new AdRequest.Builder().build();
    
        RewardedAd.load(context, "ad unit ID", adRequest, new RewardedAdLoadCallback(){
            @Override
            public void onAdLoaded(@NonNull RewardedAd ad) {
                // Set paid event listener
                ad.setOnPaidEventListener(new OnPaidEventListener() {
                    @Override
                    public void onPaidEvent(AdValue adValue) {
                        // Extract the impression-level ad revenue data.
                        long valueMicros = adValue.getValueMicros();
                        String currencyCode = adValue.getCurrencyCode();
                        int precision = adValue.getPrecisionType();
    
                        // Get the ad unit ID.
                        String adUnitId = ad.getAdUnitId();
                        String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
                        AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
                        String adSourceName = loadedAdapterResponseInfo.getAdSourceName();
    
                        // Available adFormat values:
                        // "rewarded_video" - for rewarded ads
                        // "interstitial" - for interstitial ads
                        // "banner" - for banner ads
                        // "native" - for native ads
                        String adFormat = "rewarded_video";
    
                        Airbridge.trackEvent(AirbridgeCategory.AD_IMPRESSION,
                            new HashMap<String, Object>() {{
                                put(AirbridgeAttribute.ACTION, adUnitId);
                                put(AirbridgeAttribute.LABEL, adNetworkAdapter);
                                put(AirbridgeAttribute.VALUE, valueMicros / 1000000.0);
                                put(AirbridgeAttribute.AD_PARTNERS, new HashMap<String, Object>() {{
                                    put("admob", new HashMap<String, Object>() {{
                                        put("value_micros", valueMicros);
                                        put("currency_code", currencyCode);
                                        put("precision", precision);
                                        put("ad_unit_id", adUnitId);
                                        put("ad_network_adapter", adNetworkAdapter);
                                        put("ad_network", adSourceName);
                                        put("ad_revenue_format", adFormat);
                                    }});
                                }});
                                // ironSource has a default currency of USD
                                put(AirbridgeAttribute.CURRENCY, currencyCode);
                            }}
                        );
                    }
                });
            }
        });
    }

    Android SDK (Previous)

    12345678910111213141516171819202122232425262728293031323334353637383940414243444546
    fun requestRewardedAd(context: Context) {
        val adRequest = AdRequest.Builder().build()
    
        RewardedAd.load(context, "ad unit ID", adRequest, object : RewardedAdLoadCallback() {
            override fun onAdLoaded(ad: RewardedAd) {
                ad.onPaidEventListener = OnPaidEventListener { adValue ->
                    // Extract the impression-level ad revenue data.
                    val valueMicros = adValue.valueMicros
                    val currencyCode = adValue.currencyCode
                    val precision = adValue.precisionType
    
                    // Get the ad unit ID.
                    val adUnitId = ad.adUnitId
                    val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
                    val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo
    
                    // Available adFormat values:
                    // "rewarded_video" - for rewarded ads
                    // "interstitial" - for interstitial ads
                    // "banner" - for banner ads
                    // "native" - for native ads
                    val adFormat = "rewarded_video"
    
                    val event = Event("airbridge.adImpression")
                    val admob = mutableMapOf<String, Any?>()
                    admob["value_micros"] = valueMicros
                    admob["currency_code"] = currencyCode
                    admob["precision"] = precision
                    admob["ad_unit_id"] = adUnitId
                    admob["ad_network_adapter"] = adNetworkAdapter
                    admob["ad_network"] = loadedAdapterResponseInfo?.adSourceName
                    admob["ad_revenue_format"] = adFormat
    
                    val adPartners = mapOf("admob" to admob)
                    event.action = adUnitId
                    event.label = adNetworkAdapter
                    event.value = valueMicros / 1000000.0
                    event.semanticAttributes = mutableMapOf(
                        "adPartners" to adPartners,
                        "currency" to currencyCode
                    )
                    Airbridge.trackEvent(event)
                }
            }
        })
    }
    12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
    void requestRewardedAd(Context context) {
        AdRequest adRequest = new AdRequest.Builder().build();
    
        RewardedAd.load(context, "ad unit ID", adRequest, new RewardedAdLoadCallback(){
            @Override
            public void onAdLoaded(@NonNull RewardedAd ad) {
                // Set paid event listener
                ad.setOnPaidEventListener(new OnPaidEventListener() {
                    @Override
                    public void onPaidEvent(AdValue adValue) {
                        // Extract the impression-level ad revenue data.
                        long valueMicros = adValue.getValueMicros();
                        String currencyCode = adValue.getCurrencyCode();
                        int precision = adValue.getPrecisionType();
    
                        // Get the ad unit ID.
                        String adUnitId = ad.getAdUnitId();
                        String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
                        AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
                        String adSourceName = loadedAdapterResponseInfo.getAdSourceName();
    
                        // Available adFormat values:
                        // "rewarded_video" - for rewarded ads
                        // "interstitial" - for interstitial ads
                        // "banner" - for banner ads
                        // "native" - for native ads
                        String adFormat = "rewarded_video";
    
                        Event event = new Event("airbridge.adImpression");
                        Map<String, Object> admob = new HashMap<>();
                        admob.put("value_micros", valueMicros);
                        admob.put("currency_code", currencyCode);
                        admob.put("precision", precision);
                        admob.put("ad_unit_id", adUnitId);
                        admob.put("ad_network_adapter", adNetworkAdapter);
                        admob.put("ad_network", adSourceName);
                        admob.put("ad_revenue_format", adFormat);
    
                        Map<String, Object> adPartners = new HashMap<>();
                        adPartners.put("admob", admob);
                        Map<String, Object> semanticAttributes = new HashMap<>();
                        semanticAttributes.put("adPartners", adPartners);
                        semanticAttributes.put("currency", currencyCode);
    
                        event.setAction(adUnitId);
                        event.setLabel(adNetworkAdapter);
                        event.setValue(valueMicros / 1000000.0);
                        event.setSemanticAttributes(semanticAttributes);
    
                        Airbridge.trackEvent(event);
                    }
                });
            }
        });
    }

    iOS SDK (v4)

    12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
    import GoogleMobileAds
    import Airbridge
    import UIKit
    
    class ViewController: UIViewController {
        var rewardedAd: GADRewardedAd? = nil
        
        func requestRewardedAd() {
            let request = GADRequest()
            GADRewardedAd.load(
                withAdUnitID: "ad unit ID",
                request: request
            ) { ad, error in
                if let error {
                    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
                    return
                }
                
                self.rewardedAd = ad
                self.rewardedAd?.paidEventHandler = { value in
                    let (value, currencyCode, precision) = (
                        value.value,
                        value.currencyCode,
                        value.precision
                    )
                    
                    let adUnitID = self.rewardedAd?.adUnitID
                    let adNetworkAdapter = self.rewardedAd?.responseInfo?.adNetworkClassName
                    let adSourceName = self.rewardedAd?.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName
    
                    // Available adFormat values:
                    // "rewarded_video" - for rewarded ads
                    // "interstitial" - for interstitial ads
                    // "banner" - for banner ads
                    // "native" - for native ads
                    let adFormat = "rewarded_video"
    
                    Airbridge.trackEvent(
                        category: AirbridgeCategory.AD_IMPRESSION,
                        semanticAttributes: [
                            AirbridgeAttribute.ACTION: adUnitID,
                            AirbridgeAttribute.LABEL: adNetworkAdapter,
                            AirbridgeAttribute.VALUE: value,
                            AirbridgeAttribute.AD_PARTNERS: [
                                "admob": [
                                    "value_micros": value * 1000000.0,
                                    "currency_code": currencyCode,
                                    "precision": precision,
                                    "ad_unit_id": adUnitID,
                                    "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                                    "ad_network": adSourceName ?? NSNull(),
                                    "ad_revenue_format": adFormat
                                ]
                            ],
                            AirbridgeAttribute.CURRENCY: currencyCode
                        ]
                    )
                }
            }
        }
    }
    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
    @import GoogleMobileAds;
    @import Airbridge;
    @import UIKit;
    
    @interface ViewController ()
    @property(nonatomic, strong) GADRewardedAd *rewardedAd;
    @end
    
    @implementation ViewController
    - (void)requestRewardedAd {
        __weak ViewController* weakSelf = self;
    
        GADRequest* request = [GADRequest request];
        [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                                request:request
                      completionHandler:^(GADRewardedAd *ad, NSError *error) 
        {
            if (error) {
                NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
                return;
            }
            self.rewardedAd = ad;
            self.rewardedAd.paidEventHandler = ^void(GADAdValue *_Nonnull adValue) {
                ViewController* strongSelf = weakSelf;
    
                // Extract the impression-level ad revenue data.
                NSDecimalNumber* value; = adValue.value;
                NSString* currencyCode = adValue.currencyCode;
                GADAdValuePrecision precision = adValue.precision;
    
                // Get the ad unit ID.
                NSString* adUnitId = strongSelf.rewardedAd.adUnitID;
                
                NSString* adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
                GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                        strongSelf.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
                NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
    
                // Available adFormat values:
                // "rewarded_video" - for rewarded ads
                // "interstitial" - for interstitial ads
                // "banner" - for banner ads
                // "native" - for native ads
                NSString *adFormat = @"rewarded_video"
    
                [Airbridge trackEventWithCategory:AirbridgeCategory.AD_IMPRESSION semanticAttributes:@{
                    AirbridgeAttribute.ACTION: adUnitID,
                    AirbridgeAttribute.LABEL: adNetworkAdapter,
                    AirbridgeAttribute.VALUE: value,
                    AirbridgeAttribute.AD_PARTNERS: @{
                        @"admob": @{
                            @"value_micros": [value decimalNumberByMultiplyingByPowerOf10:6],
                            @"currency_code": currencyCode,
                            @"precision": precision,
                            @"ad_unit_id": adUnitID,
                            @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                            @"ad_network": adSourceName ?: NSNull.null,
                            @"ad_revenue_format": adFormat
                        }
                    },
                    AirbridgeAttribute.CURRENCY: currencyCode
                }];
            };
        }];
    }

    iOS SDK (Previous)

    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
    import GoogleMobileAds
    import AirBridge
    import UIKit
    
    class ViewController: UIViewController {
        var rewardedAd: GADRewardedAd? = nil
        
        func requestRewardedAd() {
            let request = GADRequest()
            GADRewardedAd.load(
                withAdUnitID: "ad unit ID",
                request: request
            ) { ad, error in
                if let error {
                    print("Rewarded ad failed to load with error: \(error.localizedDescription)")
                    return
                }
                
                self.rewardedAd = ad
                self.rewardedAd?.paidEventHandler = { value in
                    let (value, currencyCode, precision) = (
                        value.value,
                        value.currencyCode,
                        value.precision
                    )
                    
                    let adUnitID = self.rewardedAd?.adUnitID
                    let adNetworkAdapter = self.rewardedAd?.responseInfo?.adNetworkClassName
                    let adSourceName = self.rewardedAd?.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName
    
                    // Available adFormat values:
                    // "rewarded_video" - for rewarded ads
                    // "interstitial" - for interstitial ads
                    // "banner" - for banner ads
                    // "native" - for native ads
                    let adFormat = "rewarded_video"
    
                    let event = ABInAppEvent()
                    event?.setCategory("airbridge.adImpression")
                    event?.setAction(adUnitID)
                    event?.setLabel(adNetworkAdapter)
                    event?.setValue(value)
                    event?.setSemantics([
                        "adPartners": [
                            "admob": [
                                "value_micros": value * 1000000.0,
                                "currency_code": currencyCode,
                                "precision": precision,
                                "ad_unit_id": adUnitID,
                                "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                                "ad_network": adSourceName ?? NSNull(),
                                "ad_revenue_format": adFormat
                            ]
                        ],
                      	"currency": currencyCode
                    ])
    
                    event?.send()
                }
            }
        }
    }
    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
    @import GoogleMobileAds;
    @import AirBridge;
    @import UIKit;
    
    @interface ViewController ()
    @property(nonatomic, strong) GADRewardedAd *rewardedAd;
    @end
    
    @implementation ViewController
    - (void)requestRewardedAd {
        __weak ViewController* weakSelf = self;
    
        GADRequest* request = [GADRequest request];
        [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                                request:request
                      completionHandler:^(GADRewardedAd *ad, NSError *error) 
        {
            if (error) {
                NSLog(@"Rewarded ad failed to load with error: %@", [error localizedDescription]);
                return;
            }
            self.rewardedAd = ad;
            self.rewardedAd.paidEventHandler = ^void(GADAdValue *_Nonnull adValue){
                ViewController* strongSelf = weakSelf;
    
                // Extract the impression-level ad revenue data.
                NSDecimalNumber* value; = adValue.value;
                NSString* currencyCode = adValue.currencyCode;
                GADAdValuePrecision precision = adValue.precision;
    
                // Get the ad unit ID.
                NSString* adUnitId = strongSelf.rewardedAd.adUnitID;
    
                NSString *adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
                GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                        strongSelf.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
                NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
    
                // Available adFormat values:
                // "rewarded_video" - for rewarded ads
                // "interstitial" - for interstitial ads
                // "banner" - for banner ads
                // "native" - for native ads
                NSString *adFormat = @"rewarded_video";
    
                ABInAppEvent* event = [[ABInAppEvent alloc] init];
                [event setCategory:@"airbridge.adImpression"];
                [event setAction:adUnitId];
                [event setLabel:adNetworkAdapter];
                [event setValue:value];
                [event setSemantics:@{
                    @"adPartners": @{
                        @"admob": @{
                            @"value_micros": [value decimalNumberByMultiplyingByPowerOf10:6],
                            @"currency_code": currencyCode,
                            @"precision": precision,
                            @"ad_unit_id": adUnitId,
                            @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                            @"ad_network": adSourceName ?: NSNull.null,
                            @"ad_revenue_format": adFormat
                        }
                    },
                    @"currency": currencyCode
                }];
    
                [event send];
            };
        }];
    }

    Flutter SDK (v4)

    123456789101112131415161718192021222324252627282930313233343536373839404142434445
    RewardedAd.load(
      adUnitId: adUnitId,
      request: const AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
          onAdLoaded: (ad) {
            ad.onPaidEvent = (Ad ad, double valueMicros,
                PrecisionType precision, String currencyCode) {
              var adUnitID = ad.adUnitId;
              var adNetworkAdapter =
                  ad.responseInfo?.mediationAdapterClassName ?? "";
              var adSourceName =
                  ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? "";
    
              // Available adFormat values:
              // "rewarded_video" - for rewarded ads
              // "interstitial" - for interstitial ads
              // "banner" - for banner ads
              // "native" - for native ads
              var adFormat = 'rewarded_video';
    
              Map admob = {
                'value_micros': valueMicros,
                'currency_code': currencyCode,
                'precision': precision.toString(),
                'ad_unit_id': adUnitID,
                'ad_network_adapter': adNetworkAdapter,
                'ad_network': adSourceName,
                'ad_revenue_format': adFormat
              };
    
              Airbridge.trackEvent(
                  category: AirbridgeCategory.AD_IMPRESSION,
                  semanticAttributes: {
                    AirbridgeAttribute.ACTION: adUnitID,
                    AirbridgeAttribute.LABEL: adNetworkAdapter,
                    AirbridgeAttribute.VALUE: valueMicros / 1000000.0,
                    AirbridgeAttribute.AD_PARTNERS: {
                      'admob': admob
                    }
                  });
            };
          },
          onAdFailedToLoad: (error) {}
      )
    );

    Flutter SDK (Previous)

    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
    RewardedAd.load(
      adUnitId: adUnitId,
      request: const AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
          onAdLoaded: (ad) {
            ad.onPaidEvent = (Ad ad, double valueMicros,
                PrecisionType precision, String currencyCode) {
              var adUnitID = ad.adUnitId;
              var adNetworkAdapter =
                  ad.responseInfo?.mediationAdapterClassName ?? "";
              var adSourceName =
                  ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? "";
    
              // Available adFormat values:
              // "rewarded_video" - for rewarded ads
              // "interstitial" - for interstitial ads
              // "banner" - for banner ads
              // "native" - for native ads
              var adFormat = 'rewarded_video';
    
              Map admob = {
                'value_micros': valueMicros,
                'currency_code': currencyCode,
                'precision': precision.toString(),
                'ad_unit_id': adUnitID,
                'ad_network_adapter': adNetworkAdapter,
                'ad_network': adSourceName,
                'ad_revenue_format': adFormat
              };
    
              Airbridge.event.trackEvent(
                  AirbridgeCategory.AD_IMPRESSION,
                  AirbridgeEventOption(
                    action: adUnitID,
                    label: adNetworkAdapter,
                    value: valueMicros / 1000000.0,
                    semanticAttributes: {
                        'adPartners': {
                          'admob': admob
                        }
                    }
                  )
              );
            };
          },
          onAdFailedToLoad: (error) {}
      )
    );

    Unity SDK (v4)

    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
    private void RequestRewardedAd()
    {
        RewardedAd.LoadAd(adUnitId, new AdRequest.Builder().Build(), (rewardedAd, error) => {
            if (error != null) { return; }
    
            this.rewardedAd = rewardedAd;
            this.rewardedAd.OnPaidEvent += this.HandleAdPaidEvent;
        }
    }
    
    public void HandleAdPaidEvent(object sender, AdValueEventArgs args)
    {
        if (adInfo == null) {
            return;
        }
    
        AdValue adValue = args.AdValue;
        var adUnitId = this.rewardedAd.adUnitId;
        var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
        var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
        var adSourceName = loadedAdapterResponseInfo.AdSourceName;
    
        // Available adFormat values:
        // "rewarded_video" - for rewarded ads
        // "interstitial" - for interstitial ads
        // "banner" - for banner ads
        // "native" - for native ads
        val adFormat = "rewarded_video";
        
        Airbridge.TrackEvent(
            category: AirbridgeCategory.AD_IMPRESSION,
            semanticAttributes: new Dictionary<string, object>()
            {
                { AirbridgeAttribute.ACTION, adUnitId },
                { AirbridgeAttribute.LABEL, adNetworkAdapter },
                { AirbridgeAttribute.VALUE, adValue.Value / 1000000.0 },
                { AirbridgeAttribute.CURRENCY, adValue.CurrencyCode },
                {
                    AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                    {
                        {
                            "admob", new Dictionary<string, object>()
                            {
                                { "value_micros", adValue.Value },
                                { "currency_code", adValue.CurrencyCode },
                                { "precision", adValue.Precision },
                                { "ad_unit_id", adUnitId },
                                { "ad_network_adapter", adNetworkAdapter },
                                { "ad_network", adSourceName },
                                { "ad_revenue_format", adFormat }
                            }
                        }
                    }
                },
            }
        );
    }

    Unity SDK (Previous)

    123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
    private void RequestRewardedAd()
    {
        RewardedAd.LoadAd(adUnitId, new AdRequest.Builder().Build(), (rewardedAd, error) => {
            if (error != null) { return; }
    
            this.rewardedAd = rewardedAd;
            this.rewardedAd.OnPaidEvent += this.HandleAdPaidEvent;
        }
    }
    
    public void HandleAdPaidEvent(object sender, AdValueEventArgs args)
    {
        if (adInfo == null) {
            return;
        }
    
        AdValue adValue = args.AdValue;
        var adUnitId = this.rewardedAd.adUnitId;
        var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
        var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
        var adSourceName = loadedAdapterResponseInfo.AdSourceName;
    
        // Available adFormat values:
        // "rewarded_video" - for rewarded ads
        // "interstitial" - for interstitial ads
        // "banner" - for banner ads
        // "native" - for native ads
        val adFormat = "rewarded_video"
      
        AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");
    
        var admob = new Dictionary<string, object>();
        admob["value_micros"] = adValue.Value;
        admob["currency_code"] = adValue.CurrencyCode;
        admob["precision"] = adValue.Precision;
        admob["ad_unit_id"] = adUnitId;
        admob["ad_network_adapter"] = adNetworkAdapter;
        admob["ad_network"] = adSourceName;
        admob["ad_revenue_format"] = adFormat;
         
        var adPartners = new Dictionary<string, object>();
        adPartners["admob"] = admob;
      
        @event.SetAction(adUnitId);
        @event.SetLabel(adNetworkAdapter);
        @event.SetValue(adValue.Value / 1000000.0);
        @event.AddSemanticAttribute("adPartners", adPartners);
        @event.AddSemanticAttribute("currency", adValue.CurrencyCode);
      
        AirbridgeUnity.TrackEvent(@event);
    }

    Send Google AdMob ad click data to Airbridge

    The code below allows you to pass the ad click data to the Airbridge SDK when the user engages with an ad.

    Android SDK (v4)

    12345678910111213141516171819202122232425
    rewardedAd?.let { ad ->
        val adUnitId = ad.adUnitId
        val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
        val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo
    
        Airbridge.trackEvent(AirbridgeCategory.AD_CLICK,
            mapOf(
                AirbridgeAttribute.ACTION to adUnitId,
                AirbridgeAttribute.LABEL to adNetworkAdapter
                AirbridgeAttribute.AD_PARTNERS to mapOf(
                    "admob" to mapOf(
                        "ad_unit_id" to adUnitId,
                        "ad_network_adapter" to adNetworkAdapter,
                        "ad_network" to loadedAdapterResponseInfo?.adSourceName
                    )
                )
            )
        )
    
        ad.show(activityContext, OnUserEarnedRewardListener { rewardItem ->
            // Handle the reward.
        })
    } ?: run {
        // ad wasn't ready yet
    }
    1234567891011121314151617181920212223242526272829
    if (rewardedAd != null) {
        String adUnitId = ad.getAdUnitId();
        String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
        AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
        String adSourceName = loadedAdapterResponseInfo.getAdSourceName();
    
        Airbridge.trackEvent(AirbridgeCategory.AD_CLICK,
            new HashMap<String, Object>() {{
                put(AirbridgeAttribute.ACTION, adUnitId);
                put(AirbridgeAttribute.LABEL, adNetworkAdapter);
                put(AirbridgeAttribute.AD_PARTNERS, new HashMap<String, Object>() {{
                    put("admob", new HashMap<String, Object>() {{
                        put("ad_unit_id", adUnitId);
                        put("ad_network_adapter", adNetworkAdapter);
                        put("ad_network", adSourceName);
                    }});
                }});
            }}
        );
    
        rewardedAd.show(activityContext, new OnUserEarnedRewardListener() {
            @Override
            public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
                // Handle the reward.
            }
        });
    } else {
      // ad wasn't ready yet
    }

    Android SDK (Previous)

    123456789101112131415161718192021222324252627
    rewardedAd?.let { ad ->
        val adUnitId = ad.adUnitId
        val adNetworkAdapter = ad.responseInfo.mediationAdapterClassName
        val loadedAdapterResponseInfo = ad.responseInfo.loadedAdapterResponseInfo
    
        val event = Event("airbridge.adClick")
        val admob = mutableMapOf<String, Any?>()
        admob["ad_unit_id"] = adUnitId
        admob["ad_network_adapter"] = adNetworkAdapter
        admob["ad_network"] = loadedAdapterResponseInfo?.adSourceName
    
        val adPartners = mapOf("admob" to admob)
        event.action = adUnitId
        event.label = adNetworkAdapter
        event.semanticAttributes = mutableMapOf(
            "adPartners" to adPartners,
            "currency" to currencyCode
        )
    
        Airbridge.trackEvent(event)
    
        ad.show(activityContext, OnUserEarnedRewardListener { rewardItem ->
            // Handle the reward.
        })
    } ?: run {
        // ad wasn't ready yet
    }
    1234567891011121314151617181920212223242526272829303132
    if (rewardedAd != null) {
        String adUnitId = ad.getAdUnitId();
        String adNetworkAdapter = ad.getResponseInfo().getMediationAdapterClassName();
        AdapterResponseInfo loadedAdapterResponseInfo = ad.getResponseInfo().getLoadedAdapterResponseInfo();
        String adSourceName = loadedAdapterResponseInfo.getAdSourceName();
    
        Event event = new Event("airbridge.adClick")
        Map<String, Object> admob = new HashMap<>();
        admob.put("ad_unit_id", adUnitId);
        admob.put("ad_network_adapter", adNetworkAdapter);
        admob.put("ad_network", adSourceName);
    
        Map<String, Object> adPartners = new HashMap<>();
        adPartners.put("admob", admob);
        Map<String, Object> semanticAttributes = new HashMap<>();
        semanticAttributes.put("adPartners", adPartners);
    
        event.setAction(adUnitId);
        event.setLabel(adNetworkAdapter);
        event.setSemanticAttributes(semanticAttributes);
    
        Airbridge.trackEvent(event);
    
        rewardedAd.show(activityContext, new OnUserEarnedRewardListener() {
            @Override
            public void onUserEarnedReward(@NonNull RewardItem rewardItem) {
                // Handle the reward.
            }
        });
    } else {
      // ad wasn't ready yet
    }

    iOS SDK (v4)

    12345678910111213141516171819202122232425262728293031323334353637383940414243444546
    class ViewController: UIViewController {
        
        var rewardedAd: GADRewardedAd?
    
        func load() {
            let request = GADRequest()
            GADRewardedAd.load(withAdUnitID: "ad unit ID", request: request) { [weak self] ad, error in
                if let error = error {
                    print("Failed to load rewarded ad: \(error.localizedDescription)")
                    return
                }
                self?.rewardedAd = ad
            }
        }
    
        func show() {
            guard let rewardedAd = rewardedAd else {
                // Ad wasn't ready
                return
            }
    
            let adUnitID = rewardedAd?.adUnitID
            let adNetworkAdapter = rewardedAd?.responseInfo?.adNetworkClassName
            let adSourceName = rewardedAd?.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName
    
            Airbridge.trackEvent(
                category: AirbridgeCategory.AD_CLICK,
                semanticAttributes: [
                    AirbridgeAttribute.ACTION: adUnitID,
                    AirbridgeAttribute.LABEL: adNetworkAdapter,
                    AirbridgeAttribute.AD_PARTNERS: [
                        "admob": [
                            "ad_unit_id": adUnitID,
                            "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                            "ad_network": adSourceName ?? NSNull()
                        ]
                    ]
                ]
            )
            
            rewardedAd.present(fromRootViewController: self) {
                let reward = rewardedAd.adReward
                // TODO: Reward the user.
            }
        }
    }
    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
    @interface ViewController () <GADFullScreenContentDelegate>
    @property(nonatomic, strong) GADRewardedAd *rewardedAd;
    @end
    
    @implementation ViewController
    
    - (void)load {
        GADRequest* request = [GADRequest request];
        [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                                request:request
                      completionHandler:^(GADRewardedAd *ad, NSError *error) {
            self.rewardedAd = ad;
        }];
    }
    
    - (void)show {
        if (self.rewardedAd) {
            NSString* adUnitId = self.rewardedAd.adUnitID;
            NSString *adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
            GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                            self.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
            NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
            
            // Send Event
            [Airbridge trackEventWithCategory:AirbridgeCategory.AD_CLICK semanticAttributes:@{
                AirbridgeAttribute.ACTION: adUnitID,
                AirbridgeAttribute.LABEL: adNetworkAdapter,
                AirbridgeAttribute.AD_PARTNERS: @{
                    @"admob": @{
                        @"ad_unit_id": adUnitID,
                        @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                        @"ad_network": adSourceName ?: NSNull.null
                    }
                }
            }];
            
            [self.rewardedAd presentFromRootViewController:self
                userDidEarnRewardHandler:^{
                GADAdReward *reward = self.rewardedAd.adReward;
                // TODO: Reward the user!
            }];
        } else {
            // Ad wasn't ready
        }
    }
    
    @end

    iOS SDK (Previous)

    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
    class ViewController: UIViewController {
        
        var rewardedAd: GADRewardedAd?
    
        func load() {
            let request = GADRequest()
            GADRewardedAd.load(withAdUnitID: "ad unit ID", request: request) { [weak self] ad, error in
                if let error = error {
                    print("Failed to load rewarded ad: \(error.localizedDescription)")
                    return
                }
                self?.rewardedAd = ad
            }
        }
    
        func show() {
            guard let rewardedAd = rewardedAd else {
                // Ad wasn't ready
                return
            }
    
            let adUnitID = rewardedAd.adUnitID
            let adNetworkAdapter = rewardedAd.responseInfo?.adNetworkClassName
            let adSourceName = rewardedAd.responseInfo?.loadedAdNetworkResponseInfo?.adSourceName
    
            let event = ABInAppEvent()
            event?.setCategory("airbridge.adClick")
            event?.setAction(adUnitID)
            event?.setLabel(adNetworkAdapter)
            event?.setSemantics([
                "adPartners": [
                    "admob": [
                        "ad_unit_id": adUnitId,
                        "ad_network_adapter": adNetworkAdapter ?? NSNull(),
                        "ad_network": adSourceName ?? NSNull()
                    ]
                ]
            ])
            
            event?.send()
    
            rewardedAd.present(fromRootViewController: self) {
                let reward = rewardedAd.adReward
                // TODO: Reward the user.
            }
        }
    }
    1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
    @interface ViewController () <GADFullScreenContentDelegate>
    @property(nonatomic, strong) GADRewardedAd *rewardedAd;
    @end
    
    @implementation ViewController
    
    - (void)load {
        GADRequest* request = [GADRequest request];
        [GADRewardedAd loadWithAdUnitID:@"ad unit ID"
                                request:request
                      completionHandler:^(GADRewardedAd *ad, NSError *error) {
            self.rewardedAd = ad;
        }];
    }
    
    - (void)show {
        if (self.rewardedAd) {
            NSString* adUnitId = self.rewardedAd.adUnitID;
            NSString *adNetworkAdapter = strongSelf.rewardedAd.responseInfo.adNetworkClassName;
            GADAdNetworkResponseInfo *loadedAdNetworkResponseInfo =
                            self.rewardedAd.responseInfo.loadedAdNetworkResponseInfo;
            NSString *adSourceName = loadedAdNetworkResponseInfo.adSourceName;
            
            // Send Event
            ABInAppEvent* event = [[ABInAppEvent alloc] init];
            [event setAction:adUnitId];
            [event setCategory:@"airbridge.adClick"];
            [event setLabel:adNetworkAdapter];
            [event setSemantics:@{
                @"adPartners": @{
                    @"admob": @{
                        @"ad_unit_id": adUnitId,
                        @"ad_network_adapter": adNetworkAdapter ?: NSNull.null,
                        @"ad_network": adSourceName ?: NSNull.null
                    }
                },
            }];
            [event send];
            
            [self.rewardedAd presentFromRootViewController:self
                userDidEarnRewardHandler:^{
                GADAdReward *reward = self.rewardedAd.adReward;
                // TODO: Reward the user!
            }];
        } else {
            // Ad wasn't ready
        }
    }
    
    @end

    Flutter SDK (v4)

    12345678910111213141516171819202122232425262728293031323334
    RewardedAd.load(
      adUnitId: adUnitId,
      request: const AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
          onAdLoaded: (ad) {
            ad.fullScreenContentCallback = FullScreenContentCallback(
              onAdClicked: (ad) {
                var adUnitID = ad.adUnitId;
                var adNetworkAdapter = ad.responseInfo?.mediationAdapterClassName ?? "";
                var adSourceName = ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? ""; 
                Map admob = {
                  'ad_unit_id': adUnitID,
                  'ad_network_adapter': adNetworkAdapter,
                  'ad_network': adSourceName,
                };
    
                Airbridge.trackEvent(
                  category: AirbridgeCategory.AD_CLICK,
                  semanticAttributes: {
                    AirbridgeAttribute.ACTION: adUnitID,
                    AirbridgeAttribute.LABEL: adNetworkAdapter,
                    AirbridgeAttribute.AD_PARTNERS: {
                      'admob': admob
                    }
                  }
                );
              },
            );
          },
          onAdFailedToLoad: (error) {
    
          }
       )
    );

    Flutter SDK (Previous)

    123456789101112131415161718192021222324252627282930313233343536
    RewardedAd.load(
      adUnitId: adUnitId,
      request: const AdRequest(),
      rewardedAdLoadCallback: RewardedAdLoadCallback(
          onAdLoaded: (ad) {
            ad.fullScreenContentCallback = FullScreenContentCallback(
              onAdClicked: (ad) {
                var adUnitID = ad.adUnitId;
                var adNetworkAdapter = ad.responseInfo?.mediationAdapterClassName ?? "";
                var adSourceName = ad.responseInfo?.loadedAdapterResponseInfo?.adSourceName ?? ""; 
                Map admob = {
                  'ad_unit_id': adUnitID,
                  'ad_network_adapter': adNetworkAdapter,
                  'ad_network': adSourceName,
                };
    
                Airbridge.event.trackEvent(
                  AirbridgeCategory.AD_CLICK,
                  AirbridgeEventOption(
                    action: adUnitID,
                    label: adNetworkAdapter,
                    semanticAttributes: {
                        'adPartners': {
                          'admob': admob
                        }
                    }
                  )
                );
              },
            );
          },
          onAdFailedToLoad: (error) {
    
          }
       )
    );

    Unity SDK (v4)

    1234567891011121314151617181920212223242526272829303132333435363738
    public void Show()
    {   
        if (rewardedAd != null && rewardedAd.CanShowAd())
        {
            var adUnitId = this.rewardedAd.adUnitId;
            var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
            var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
            var adSourceName = loadedAdapterResponseInfo.AdSourceName;
    
            Airbridge.TrackEvent(
                category: AirbridgeCategory.AD_CLICK,
                semanticAttributes: new Dictionary<string, object>()
                {
                    { AirbridgeAttribute.ACTION, adUnitId },
                    { AirbridgeAttribute.LABEL, adNetworkAdapter },
                    { AirbridgeAttribute.CURRENCY, adValue.CurrencyCode },
                    {
                        AirbridgeAttribute.AD_PARTNERS, new Dictionary<string, object>()
                        {
                            {
                                "admob", new Dictionary<string, object>()
                                {
                                    { "ad_unit_id", adUnitId },
                                    { "ad_network_adapter", adNetworkAdapter },
                                    { "ad_network", adSourceName }
                                }
                            }
                        }
                    },
                }
            );
    
            rewardedAd.Show((Reward reward) =>
            {
                // TODO: Reward the user.
            });
        }
    }

    Unity SDK (Previous)

    12345678910111213141516171819202122232425262728293031
    public void Show()
    {   
        if (rewardedAd != null && rewardedAd.CanShowAd())
        {
            var adUnitId = this.rewardedAd.adUnitId;
            var adNetworkAdapter = this.rewardedAd.GetMediationAdapterClassName();
            var loadedAdapterResponseInfo = this.rewardedAd.GetResponseInfo().GetLoadedAdapterResponseInfo();
            var adSourceName = loadedAdapterResponseInfo.AdSourceName;
    
            AirbridgeEvent @event = new AirbridgeEvent("airbridge.adClick");
            
            var admob = new Dictionary<string, object>();
            admob["ad_unit_id"] = adUnitId;
            admob["ad_network_adapter"] = adNetworkAdapter;
            admob["ad_network"] = adSourceName;
    
            var adPartners = new Dictionary<string, object>();
            adPartners["admob"] = admob;
    
            @event.SetAction(adUnitId);
            @event.SetLabel(adNetworkAdapter);
            @event.AddSemanticAttribute("adPartners", adPartners);
        
            AirbridgeUnity.TrackEvent(@event);
    
            rewardedAd.Show((Reward reward) =>
            {
                // TODO: Reward the user.
            });
        }
    }

    Was this helpful?

    Any questions or suggestions?