알립니다
이 기능은 베타 서비스입니다. 개선 의견과 문의사항은 에어브릿지 CSM을 통해 전달해 주세요. 담당 CSM이 없는 경우 문의하기를 통해 전달해 주세요. 정식 서비스에서 발전한 기능으로 보답하겠습니다.
에어브릿지와 앱러빈(AppLovin)의 실시간 인앱 비딩 솔루션 맥스(MAX)를 연동해 광고로 발생한 수익을 에어브릿지 대시보드에서 확인할 수 있습니다. 에어브릿지는 앱러빈 맥스와의 서버 투 서버(S2S) 연동과 SDK 연동을 지원합니다.
권장하는 연동 방식
더 정확한 광고 성과 측정과 활용을 위해 서버 투 서버 연동과 SDK 연동을 모두 설정하는 것을 권장합니다.
에어브릿지는 SDK 연동으로 실시간으로 받은 데이터를 서버 투 서버 연동으로 받은 보정된 데이터로 자동 업데이트합니다. 또한 SDK 연동으로 받은 데이터는 SKAdNetwork(SKAN)에 활용할 수 있습니다.
에어브릿지 SDK가 아래 버전 이상인지 확인해 주세요. 확인 시점에 에어브릿지 SDK가 아래 버전 미만이라면 서버 투 서버 연동 또는 SDK 연동 중에 1가지만 진행하는 것을 권장합니다.
주의하세요
서버 투 서버 연동과 SDK 연동을 모두 진행한다면 에어브릿지 SDK가 아래 버전 이상인지 반드시 확인해 주세요.
충분히 많은 유저가 아래 버전 이상의 SDK가 설치된 앱으로 업데이트한 후에 모든 연동을 진행하는 것을 권장합니다. 아래 버전 미만의 에어브릿지 SDK가 설치된 앱을 사용하는 유저가 대부분일 때 서버 투 서버 연동과 SDK 연동을 모두 진행하면 유저 수가 정확히 집계되지 않습니다.
Android SDK 2.25.0
React Native SDK 2.8.6
Flutter SDK 3.5.6
Cordova SDK 2.6.6
Expo SDK 2.6.6
Unity SDK 1.14.5
Unreal SDK 1.3.5
아래 링크에 따라 앱러빈 맥스 SDK 를 설치해 주세요.
앱러빈 맥스에서 발생한 광고 수익 데이터를 에어브릿지로 전송합니다. 앱러빈 맥스 SDK에 광고 수익 데이터 콜백을 설정합니다. 해당 콜백을 활용하여 광고 수익 데이터를 에어브릿지 SDK로 전송합니다.
private void OnEnable() {
MaxSdkCallbacks.Banner.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
MaxSdkCallbacks.Interstitial.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
MaxSdkCallbacks.Rewarded.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
MaxSdkCallbacks.RewardedInterstitial.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
MaxSdkCallbacks.MRec.OnAdRevenuePaidEvent += OnAdRevenuePaidEvent;
}
private void OnAdRevenuePaidEvent(string adUnitId, MaxSdkBase.AdInfo adInfo)
{
if (adInfo != null) {
AirbridgeEvent @event = new AirbridgeEvent("airbridge.adImpression");
var appLovin = new Dictionary<string, object>();
appLovin["revenue"] = adInfo.Revenue;
appLovin["country_code"] = MaxSdk.GetSdkConfiguration().CountryCode;
appLovin["network_name"] = adInfo.NetworkName;
appLovin["network_placement"] = adInfo.NetworkPlacement;
appLovin["adunit_identifier"] = adInfo.AdUnitIdentifier;
appLovin["creative_identifier"] = adInfo.CreativeIdentifier;
appLovin["placement"] = adInfo.Placement;
var adPartners = new Dictionary<string, object>();
adPartners["appLovin"] = appLovin;
@event.SetAction(adInfo.NetworkName);
@event.SetLabel(adInfo.NetworkPlacement);
@event.SetValue(adInfo.Revenue);
@event.AddSemanticAttribute("adPartners", adPartners);
// AppLovin MAX has a default currency of USD
@event.AddSemanticAttribute("currency", "USD");
AirbridgeUnity.TrackEvent(@event);
}
}
function App(): JSX.Element {
useEffect(() => {
// Helper function to add an ad revenue paid listener
const addAdRevenuePaidListener = (AdClass) => {
AdClass.addAdRevenuePaidListener(adInfo => {
if (adInfo) {
onAdRevenuePaidEvent(adInfo);
}
});
};
// Set up event listeners
[BannerAd, InterstitialAd, RewardedAd, AppOpenAd, MRecAd].forEach(addAdRevenuePaidListener);
}, []);
const onAdRevenuePaidEvent = (adInfo: AdRevenueInfo) => {
const airbridgeSemanticAttributes = {
adPartners: {
appLovin: {
revenue: adInfo.revenue,
country_code: adInfo.countryCode,
network_name: adInfo.networkName,
network_placement: adInfo.networkPlacement,
adunit_identifier: adInfo.adUnitId,
creative_identifier: adInfo.creativeId,
placement: adInfo.placement,
},
},
currency: 'USD', // Assuming USD as default
}
Airbridge.trackEvent('airbridge.adImpression', {
action: adInfo.networkName,
label: adInfo.networkPlacement,
value: adInfo.revenue,
semanticAttributes: airbridgeSemanticAttributes
});
};
return (
/* Your JSX goes here */
);
}
public class InterstitialAdActivity
extends BaseAdActivity
implements MaxAdListener, MaxAdRevenueListener
{
@Override
protected void onCreate(Bundle savedInstanceState)
{
...
// Set up event listener
interstitialAd.setRevenueListener(this);
...
}
@Override
public void onAdRevenuePaid(final MaxAd maxAd)
{
Event event = new Event("airbridge.adImpression");
Map<String, Object> appLovin = new HashMap<>();
appLovin.put("revenue", maxAd.getRevenue());
appLovin.put("country_code", AppLovinSdk.getInstance(this).getConfiguration().getCountryCode());
appLovin.put("network_name", maxAd.getNetworkName());
appLovin.put("network_placement", maxAd.getNetworkPlacement());
appLovin.put("adunit_identifier", maxAd.getAdUnitId());
appLovin.put("creative_identifier", maxAd.getCreativeId());
appLovin.put("placement", maxAd.getPlacement());
Map<String, Object> adPartners = new HashMap<>();
adPartners.put("appLovin", appLovin);
Map<String, Object> semanticAttributes = new HashMap<>();
semanticAttributes.put("adPartners", adPartners);
// AppLovin MAX has a default currency of USD
semanticAttributes.put("currency", "USD");
event.setAction(maxAd.getNetworkName());
event.setLabel(maxAd.getNetworkPlacement());
event.setValue(maxAd.getRevenue());
event.setSemanticAttributes(semanticAttributes);
Airbridge.trackEvent(event);
}
}
class InterstitialAdActivity : BaseAdActivity(),
MaxAdListener, MaxAdRevenueListener {
override fun onCreate(savedInstanceState: Bundle?) {
...
// Set up event listener
interstitialAd.setRevenueListener(this)
...
}
override fun onAdRevenuePaid(ad: MaxAd) {
val event = Event("airbridge.adImpression")
val appLovin = mutableMapOf<String, Any?>()
appLovin["revenue"] = ad.revenue
appLovin["country_code"] = AppLovinSdk.getInstance(this).configuration.countryCode
appLovin["network_name"] = ad.networkName
appLovin["network_placement"] = ad.networkPlacement
appLovin["adunit_identifier"] = ad.adUnitId
appLovin["creative_identifier"] = ad.creativeId
appLovin["placement"] = ad.placement
val adPartners = mapOf("appLovin" to appLovin)
event.action = ad.networkName
event.label = ad.networkPlacement
event.value = ad.revenue
event.semanticAttributes = mutableMapOf(
"adPartners" to adPartners,
// AppLovin MAX has a default currency of USD
"currency" to "USD"
)
Airbridge.trackEvent(event)
}
}
앱러빈 맥스(AppLovin Max)의 서버 투 서버(S2S) 연동에 앱러빈 맥스의 Report Key가 필요합니다. 앱러빈 맥스에서 확인한 Report Key를 에어브릿지에 입력합니다.
자세한 연동 방법은 아래 가이드를 참고해 주세요.
도움이 되었나요?