広告収益アトリビューションについて
広告収益アトリビューションは、ユーザーをアプリに導いた特定のキャンペーンと広告収益を結びつけるのに役立ちます。これにより、キャンペーンコスト、アプリ内収益、広告収益のすべてを一度に表示することで、広告のパフォーマンスを明確に把握できます。また、広告収益データを広告ネットワークに送信して、広告パフォーマンスを改善することもできます。
キーポイント
- 機能:広告収益アトリビューションは、モバイルアプリの広告収益を、アプリのユーザーを生み出したマーケティングキャンペーンに結び付けます。こうすることで、各キャンペーンからどれだけの収益を得たか、そしてそれが全体的な広告ROIにどのように影響するかを確認することができます。
- データソース:このデータは通常メディエーションプラットフォームから取得し、ユーザーレベルまたはインプレッションレベルとなります。Singularはこのアトリビューションデータを取得する様々な方法をサポートしています。
- もっと読む詳細については、Singularの広告収益アトリビューションに関するFAQとトラブルシューティングをご覧ください。
重要な注意事項
- 通貨コード:3文字のISO 4217通貨コードを使用してください(例:米ドルは "USD"、ユーロは "EUR"、インドルピーは "INR")。多くのメディエーション・プラットフォームは "USD "を使用しているので、それを使用している場合は、コードがこれと一致していることを確認してください。異なる通貨を使用する場合は、バリデーションコードを適宜更新してください。
- データの正確性:Singularにデータを送信する前に、収益と通貨のデータが正しいことを必ず確認してください。不正確なデータは後で修正できないため、正確であることを確認することは非常に重要です。
広告収益アトリビューションの実装
- SDKをアップデートします:Singular SDKが最新バージョンであることを確認してください。
- コードスニペットを追加します:お使いのメディエーションプラットフォームに応じて、Singular SDKのセットアップに適切なコードスニペットを追加します。
これらのステップに従うことで、広告収益アトリビューションを正しく設定し、広告データを最大限に活用することができます。
パートナーの注意事項
- この機能はAdMobアカウントで有効にする必要があります。
AdMobサポートを参照してください。
-
広告フォーマット("App Open"、"Banner"、"Interstitial"、"Native"、"Rewarded "など)を読み込む際に、広告が収益を生成するたびにトリガーされるコールバック関数としてpaidEventHandlerを設定します。Google Mobile Ads SDKは、インプレッションイベントをトラッキングし、広告が発生した収益でこのハンドラーを呼び出します。
これを行うには、広告フォーマットの"load"関数を変更し、paidEventHandlerを含めます。このコールバック内で広告収益データを管理し、検証し、Singular.adRevenue関数を使ってSingularに送信します。
例えば、"報酬付き広告" が正常にロードされると、paidEventHandler は広告の収益情報(adValue)を受け取ります。この関数で収益データを処理し、Singularに送信します。
詳細については、AdMob のドキュメントを参照してください。
重要:AdMob SDKはプラットフォームによって異なる収益を報告します。例えば、$0.005の広告収益はUnityとAndroidプラットフォームでは5000として返されますが、iOSでは0.005として返されます。iOSの場合は、Singular SDKに直接0.005を送信します。その他のプラットフォームでは、Singularに送信する前にadValueをマイクロからドルに変換してください。
SDK実装のコードベースを選択してください:
仕組み
- Google AdMob Mobile Ads SDK(Android)を実装します: スタートガイドをご覧ください。
- AdMobとの統合:AdMobから広告を読み込み、広告収益イベントを処理するためにsetOnPaidEventListenerを設定します。
- 収益の検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。
- 通貨の検証:データをSingularに送信する前に、通貨がゼロまたは空でないことを確認する。
- 無効なデータのログ:データがバリデーションに失敗した場合、デバッグ用にログメッセージを表示し、Singularにデータを送信しません。
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
private const val AD_UNIT_ID = "AD_UNIT_ID"
class AdManager(private val context: Context) {
private var rewardedAd: RewardedAd? = null
fun loadRewardedAd() {
val adRequest = AdRequest.Builder().build()
RewardedAd.load(context, AD_UNIT_ID, adRequest, object : RewardedAdLoadCallback() {
override fun onAdLoaded(ad: RewardedAd) {
rewardedAd = ad
rewardedAd?.fullScreenContentCallback = object : FullScreenContentCallback() {
override fun onAdShowedFullScreenContent() {
Log.d("AdManager", "Rewarded ad displayed.")
}
override fun onAdFailedToShowFullScreenContent(adError: AdError) {
Log.d("AdManager", "Rewarded ad failed to show with error: ${adError.message}")
}
override fun onAdDismissedFullScreenContent() {
Log.d("AdManager", "Rewarded ad dismissed.")
}
}
rewardedAd?.setOnPaidEventListener { adValue: AdValue ->
// Ensure valid revenue data
val revenue = adValue.valueMicros / 1_000_000.0
val currency = adValue.currencyCode
if (revenue > 0 && !currency.isNullOrEmpty()) {
val data = SingularAdData(
"Admob",
currency,
revenue
)
// Send Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
Log.d("AdManager", "Ad Revenue reported to Singular: $data")
} else {
Log.d("AdManager", "Invalid ad revenue data: revenue = $revenue, currency = $currency")
}
}
}
override fun onAdFailedToLoad(loadAdError: LoadAdError) {
Log.d("AdManager", "Rewarded ad failed to load with error: ${loadAdError.message}")
}
})
}
}
どのように動作するか
- Google AdMob Mobile Ads SDK(Android)を実装します: 入門ガイドをご覧ください。
- AdMobとの統合:AdMobから広告を読み込み、広告収益イベントを処理するためにsetOnPaidEventListenerを設定します。
- 収益の検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。
- 通貨の検証:データをSingularに送信する前に、通貨がゼロまたは空でないことを確認する。
- 無効なデータのログ:データがバリデーションに失敗した場合、デバッグ用にログメッセージを表示し、データをSingularに送信しないようにする。
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
// Define constants for better maintainability
private static final String AD_UNIT_ID = "AD_UNIT_ID";
public class AdManager {
private RewardedAd rewardedAd;
private Context context;
public AdManager(Context context) {
this.context = context;
}
public void loadRewardedAd() {
AdRequest adRequest = new AdRequest.Builder().build();
RewardedAd.load(context, AD_UNIT_ID, adRequest, new RewardedAdLoadCallback() {
@Override
public void onAdLoaded(RewardedAd ad) {
rewardedAd = ad;
rewardedAd.setFullScreenContentCallback(new FullScreenContentCallback() {
@Override
public void onAdShowedFullScreenContent() {
Log.d("AdManager", "Rewarded ad displayed.");
}
@Override
public void onAdFailedToShowFullScreenContent(AdError adError) {
Log.d("AdManager", "Rewarded ad failed to show with error: " + adError.getMessage());
}
@Override
public void onAdDismissedFullScreenContent() {
Log.d("AdManager", "Rewarded ad dismissed.");
}
});
rewardedAd.setOnPaidEventListener(new OnPaidEventListener() {
@Override
public void onPaidEvent(AdValue adValue) {
double revenue = adValue.getValueMicros() / 1_000_000.0;
String currency = adValue.getCurrencyCode();
// Validate the revenue value
if (revenue <= 0 || currency == null || currency.isEmpty()) {
Log.d("AdManager", "Invalid ad revenue data: revenue = " + revenue + ", currency = " + currency);
return;
}
SingularAdData data = new SingularAdData(
"Admob",
currency,
revenue
);
// Send Ad Revenue data to Singular
Singular.adRevenue(data);
// Log the data for debugging
Log.d("AdManager", "Ad Revenue reported to Singular: " + data);
}
});
}
@Override
public void onAdFailedToLoad(LoadAdError loadAdError) {
Log.d("AdManager", "Rewarded ad failed to load with error: " + loadAdError.getMessage());
}
});
}
}
パートナーノート
- Applovin Impression-Level User Revenue APIを使ってインプレッションレベルの広告収益データを共有しましょう。
SDK実装のコードベースを選択してください:
仕組み
- AppLovin Impression-Level User Revenue API(Android)を使用します: スタートガイドをご覧ください。
- AppLovinインテグレーション:AppLovin MAXからリワード広告をロードし、広告収益イベントを処理するためにonMessageReceived関数を使用します。
- 収益検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。
- 通貨の検証:以下のサンプルでは、通貨が "USD "にハードコードされています。データをSingularに送信する前に、通貨が正確で、ゼロや空でないことを確認してください。
- 無効なデータのログ:データの検証に失敗した場合は、デバッグ用にログメッセージを表示し、Singularにデータを送信しません。
import com.singular.sdk.*
override fun onMessageReceived(message: AppLovinCommunicatorMessage) {
// In the case that you are subscribed to multiple topics, check for the desired one
if ("max_revenue_events" == message.topic) {
val adData: Bundle? = message.messageData
// Safely access and validate revenue value
val revenueValue = adData?.getDouble("revenue", 0.0) ?: 0.0
if (revenueValue > 0) {
val data = SingularAdData(
adPlatform = "AppLovin",
currency = "USD",
revenue = revenueValue
)
Singular.adRevenue(data)
} else {
Log.e("AppLovinRevenue", "Failed to parse valid revenue value from message data or revenue is not greater than 0")
}
}
}
どのように動作するか
- AppLovin Impression-Level User Revenue API(Android)を使用します: スタートガイドをご覧ください。
- AppLovinインテグレーション:AppLovin MAXからリワード広告をロードし、広告収益イベントを処理するためにonMessageReceived関数を使用します。
- 収益検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。
- 通貨の検証:以下のサンプルでは、通貨が "USD "にハードコードされています。データをSingularに送信する前に、通貨が正確で、ゼロや空でないことを確認してください。
- 無効なデータのログ:データの検証に失敗した場合は、デバッグ用にログメッセージを表示し、 Singular にデータを送信しないようにしましょう。
import com.singular.sdk.*;
@Override
public void onMessageReceived(AppLovinCommunicatorMessage message) {
// In the case that you are subscribed to multiple topics, check for the desired one
if ("max_revenue_events".equals(message.getTopic())) {
Bundle adData = message.getMessageData();
// Safely access and validate revenue value
double revenueValue = (adData != null) ? adData.getDouble("revenue", 0.0) : 0.0;
if (revenueValue > 0) {
SingularAdData data = new SingularAdData(
"AppLovin",
"USD",
revenueValue
);
Singular.adRevenue(data);
} else {
Log.e("AppLovinRevenue", "Failed to parse valid revenue value from message data or revenue is not greater than 0");
}
}
}
パートナーノート
- Impression Level Revenue (ILR) SDK APIは、ironSource SDKを使用して、ironSource Adsおよびその他の媒介ネットワークのインプレッションレベルデータを提供します。詳しくは[developers.is.com]をご覧ください。
- IronSourceのARM SDK Postbacksフラグがオンになっていることを確認してください。
SDK実装のコードベースを選択します:
仕組み
- IronSource SDKを使用してインプレッションレベルのユーザー収益を取得します(Android): 入門ガイドをご覧ください。
- Ironsourceの統合:Ironsourceからリワード広告をロードし、広告収入イベントを処理するためにonImpressionDataSuccess関数を使用します。
- 収益検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。
- 通貨の検証:以下のサンプルでは、通貨が "USD "にハードコードされています。データをSingularに送信する前に、通貨が正確で、ゼロや空でないことを確認してください。
- 無効なデータのログ:データの検証に失敗した場合は、デバッグ用にログメッセージを表示し、Singularにデータを送信しません。
import com.singular.sdk.Singular
// Method called when impression data is successfully received
fun onImpressionDataSuccess(impressionData: ISImpressionData?) {
// Ensure impressionData is not null
if (impressionData == null) {
Log.d("IronSource", "No impression data available.")
return
}
// Ensure revenue value is valid
val revenue = impressionData.revenue.toDouble()
if (revenue <= 0) {
Log.w("IronSource", "Invalid revenue value: $revenue")
return
}
// Create SingularAdData object with required fields
val data = SingularAdData(
adPlatform = "IronSource",
currency = "USD",
revenue = revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
Log.i("IronSource", "Ad Revenue reported to Singular: AdPlatform: ${data.adPlatform}, Currency: ${data.currency}, Revenue: ${data.revenue}")
}
どのように動作するか
- IronSource SDKを使用し、Impression-Level User Revenue(Android)を取得します: スタートガイドをご覧ください。
- Ironsourceインテグレーション:Ironsourceからリワード広告をロードし、広告収入イベントを処理するためにonImpressionDataSuccess関数を使用します。
- 収益検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。
- 通貨の検証:以下のサンプルでは、通貨が "USD "にハードコードされています。データをSingularに送信する前に、通貨が正確で、ゼロや空でないことを確認してください。
- 無効なデータのログ:データの検証に失敗した場合は、デバッグ用にログメッセージを表示し、 Singular にデータを送信しないようにしましょう。
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
public class IronSourceAdManager {
// Method called when impression data is successfully received
public void onImpressionDataSuccess(ISImpressionData impressionData) {
// Ensure impressionData is not null
if (impressionData == null) {
Log.d("IronSource", "No impression data available.");
return;
}
// Ensure revenue value is valid
double revenue = impressionData.getRevenue().doubleValue();
if (revenue <= 0) {
Log.w("IronSource", "Invalid revenue value: " + revenue);
return;
}
// Create SingularAdData object with required fields
SingularAdData data = new SingularAdData(
"IronSource", // adPlatform
"USD", // currency
revenue // revenue
);
// Send the Ad Revenue data to Singular
Singular.adRevenue(data);
// Log the data for debugging
Log.i("IronSource", "Ad Revenue reported to Singular: AdPlatform: " + data.getAdPlatform() +
", Currency: " + data.getCurrency() +
", Revenue: " + data.getRevenue());
}
}
パートナーの注意事項
- impressionDelegateを設定する
- TradPlusAdImpressionコールバックにSingularを追加します。
SDK実装のコードベースを選択します:
どのように動作するか
- TradPlusとの統合:TradPlusからリワード広告をロードし、広告収入イベントを処理するためにonImpressionSuccess関数を使用します。
- 収益検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値を送信することを防ぎます。adInfoディクショナリには、有効な NSNumber 値を持つ"ecpm" キーが含まれています。この値をDoubleに変換し、スケーリングする(通常、ecpmはミリ単位で指定されるため、1000.0で割るとドルに変換される)。
- 通貨の検証:以下のサンプルでは、通貨は "USD" にハードコードされています。データをSingularに送信する前に、通貨が正確で、ゼロや空でないことを確認してください。
- 無効なデータのログデータの検証に失敗した場合、デバッグ用にログメッセージを表示し、Singularにデータを送信しません。
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
// Set the global impression listener for TradPlus
TradPlusSdk.setGlobalImpressionListener(
object : GlobalImpressionManager.GlobalImpressionListener {
override fun onImpressionSuccess(tpAdInfo: TPAdInfo?) {
// Ensure tpAdInfo is not null
if (tpAdInfo == null) {
println("AdInfo is null")
return
}
// Calculate revenue (assuming ecpm is a valid field)
val revenue = tpAdInfo.ecpm.toDouble() / 1000
// Validate the revenue value
if (revenue <= 0) {
println("Ad Revenue value out of expected range: $revenue")
return
}
// Create SingularAdData object with required fields
val data = SingularAdData(
adPlatform = "TradPlus",
currency = "USD", // Assuming USD, adjust if necessary
revenue = revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log for debugging
println("Ad Revenue reported to Singular: AdPlatform: ${data.adPlatform}, Currency: ${data.currency}, Revenue: ${data.revenue}")
}
}
)
どのように機能するか
- TradPlusとの統合:TradPlusからリワード広告をロードし、onImpressionSuccess関数を使用して広告収入イベントを処理します。
- 収益の検証:収益が0より大きいことを確認するチェックを追加します。これにより、ゼロまたはマイナスの収益値が送信されるのを防ぎます。adInfoディクショナリには、有効な NSNumber 値を持つ"ecpm" キーが含まれています。この値をDoubleに変換し、スケーリングする(通常、ecpmはミリ単位で指定されるため、1000.0で割るとドルに変換される)。
- 通貨の検証:以下のサンプルでは、通貨は "USD" にハードコードされています。データをSingularに送信する前に、通貨が正確で、ゼロや空でないことを確認してください。
- 無効なデータのログデータの検証に失敗した場合は、デバッグ用にログメッセージを表示し、Singular にデータを送信しないようにします。
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
public class AdImpressionListener implements GlobalImpressionManager.GlobalImpressionListener {
private static final String TAG = "AdImpressionListener";
@Override
public void onImpressionSuccess(TPAdInfo tpAdInfo) {
// Ensure tpAdInfo is not null
if (tpAdInfo == null) {
Log.e(TAG, "AdInfo is null");
return;
}
// Ensure eCPM is valid and not null
if (tpAdInfo.getEcpm() == null) {
Log.e(TAG, "eCPM value is null");
return;
}
// Calculate revenue (assuming ecpm is in micros)
double revenue = tpAdInfo.getEcpm().doubleValue() / 1000;
// Validate the revenue value
if (revenue <= 0) {
Log.e(TAG, "Ad Revenue value out of expected range: " + revenue);
return;
}
// Create SingularAdData object with required fields
SingularAdData data = new SingularAdData(
"TradPlus",
"USD",
revenue
);
// Send the Ad Revenue data to Singular
Singular.adRevenue(data);
// Log for debugging
Log.d(TAG, "Ad Revenue reported to Singular: AdPlatform: " + data.getAdPlatform() +
", Currency: " + data.getCurrency() + ", Revenue: " + data.getRevenue());
}
}
パートナーの注意事項
- 一般的な統合:SingularAdData オブジェクトを初期化し、必要なデータを渡す。データには、adPlatform(String)、currency(String)、revenue(Double)を含める。
- 収益レポート:Singularに送信する前に、収益と通貨のデータが正しいことを確認してください。不正確なデータは後で修正できないので、正確であることを確認することが重要です。
- ヒントデバッグ用のログ情報
SDK実装のコードベースを選択してください:
import com.singular.sdk.Singular
import com.singular.sdk.SingularAdData
// Function to send Ad Revenue data to Singular
fun reportAdRevenue(adPlatform: String, currency: String, revenue: Double) {
// Validate the revenue value
if (revenue <= 0) {
println("Invalid revenue value: $revenue")
return
}
// Create a SingularAdData object with the provided fields
val data = SingularAdData(
adPlatform = adPlatform,
currency = currency,
revenue = revenue
)
// Send the Ad Revenue data to Singular
Singular.adRevenue(data)
// Log the data for debugging
println("Ad Revenue reported to Singular: AdPlatform: ${data.adPlatform}, Currency: ${data.currency}, Revenue: ${data.revenue}")
}
import com.singular.sdk.Singular;
import com.singular.sdk.SingularAdData;
// Function to send Ad Revenue data to Singular
public void reportAdRevenue(String adPlatform, String currency, double revenue) {
// Validate the revenue value
if (revenue <= 0) {
Log.w("AdRevenue", "Invalid revenue value: " + revenue);
return;
}
// Create a SingularAdData object with the provided fields
SingularAdData data = new SingularAdData(
adPlatform, // adPlatform
currency, // currency
revenue // revenue
);
// Send the Ad Revenue data to Singular
Singular.adRevenue(data);
// Log the data for debugging
Log.d("AdRevenue", "Ad Revenue reported to Singular: AdPlatform: " + data.getAdPlatform() + ", Currency: " + data.getCurrency() + ", Revenue: " + data.getRevenue());
}