広告収益の帰属
メディエーションプラットフォームからの広告収入を追跡し、ユーザーを獲得したマーケティングキャンペーンに帰属させることで、キャンペーンコスト、アプリ内課金、広告収益化を網羅した完全なROIの可視性を提供します。
概要
広告収益アトリビューションとは
広告収益アトリビューションは、モバイルアプリの広告収益をアプリのインストールを促進したユーザー獲得キャンペーンに結び付け、広告収益化を含むキャンペーンの真の収益性を測定できるようにします。
主なメリット
- 統一されたROIビュー:キャンペーンコスト、アプリ内収益、広告収益を単一のダッシュボードで確認できます。
- キャンペーンの最適化:広告収益データを広告ネットワークに送信し、入札とターゲティングを改善します。
- LTV測定:広告収益化を含む完全なユーザー生涯価値の算出
データソース:広告収益データは通常、ユーザーレベルまたはインプレッションレベルで、お客様のメディエーションプラットフォーム(AdMob、AppLovin MAX、IronSourceなど)から提供されます。Singularはこのデータを受け取るための複数の統合方法をサポートしています。
詳細はこちら:セットアップ、レポート、トラブルシューティングの包括的な詳細については、広告収入アトリビューションFAQをご覧ください。
実装要件
重要なガイドライン
データの正確性が重要です:
- 通貨コード:3文字のISO 4217通貨コード(例:USD、EUR、INR)を使用してください。多くのメディエーション・プラットフォームはUSDでレポートします。
-
送信前に検証する:
Singular.adRevenue()を呼び出す前に、必ず収益と通貨データを検証してください。 間違ったデータは、送信後に修正できません。 - プラットフォームの違い:iOSは、マイクロを使用するAndroidとは異なり、標準通貨単位(例えば、0.005ドル)で直接収益を受け取ります。正しいフォーマットについては、常にプラットフォームのドキュメントを確認してください。
設定手順
広告収益のアトリビューションを実装するには、以下の手順に従ってください:
- SDKを更新する:最新のSingular SDKバージョンを使用していることを確認してください。
- インテグレーションを選択します:セットアップに合ったメディエーションプラットフォームのインテグレーションを選択します。
- コールバックを実装します:プラットフォーム固有の有料イベントリスナーを追加し、収益データを取得します。
- データを検証します:収益レポートをテストし、データがSingularダッシュボードに表示されることを確認します。
プラットフォームインテグレーション
AdMobインテグレーション
インプレッションレベルの収益レポート用の有料イベントリスナーを使用して、Google AdMobからの広告収益をトラッキングします。
要件
- AdMobアカウントで有料イベントトラッキングを有効にする(AdMobサポートを参照
- Google Mobile Ads SDK for iOSを実装する(スタートアップガイドを参照
プラットフォームの収益レポート:iOSは標準通貨単位(例えば、$0.005 = 0.005)で収益を返します。値を変換せずに直接Singularに送信します。
実装
広告読み込み時に有料イベントハンドラを設定し、収益データを取得してSingularに送信します。
import Singular
import GoogleMobileAds
private let adUnitID = "AD_UNIT_ID"
var rewardedAd: GADRewardedAd?
func loadRewardedAd() {
let request = GADRequest()
GADRewardedAd.load(withAdUnitID: adUnitID, request: request) { [weak self] ad, error in
guard let self = self else { return }
if let error = error {
print("Rewarded ad failed to load: \(error.localizedDescription)")
return
}
self.rewardedAd = ad
// Set paid event handler for revenue tracking
self.rewardedAd?.paidEventHandler = { adValue in
// Extract revenue and currency from AdValue
let revenue = adValue.value.doubleValue
let currency = adValue.currencyCode
// Validate revenue and currency before sending
guard revenue > 0, let currency = currency, !currency.isEmpty else {
print("Invalid ad revenue data: revenue = \(revenue), currency = \(String(describing: currency))")
return
}
// Create ad revenue data object
let data = SingularAdData(
adPlatform: "AdMob",
currency: currency,
revenue: revenue
)
// Send to Singular
Singular.adRevenue(data)
print("Ad revenue sent: \(revenue) \(currency)")
}
}
}
#import <Singular/Singular.h>
#import <GoogleMobileAds/GoogleMobileAds.h>
static NSString *const adUnitID = @"AD_UNIT_ID";
@interface AdManager ()
@property(nonatomic, strong) GADRewardedAd *rewardedAd;
@end
@implementation AdManager
- (void)loadRewardedAd {
GADRequest *request = [[GADRequest alloc] init];
[GADRewardedAd loadWithAdUnitID:adUnitID
request:request
completionHandler:^(GADRewardedAd *ad, NSError *error) {
if (error) {
NSLog(@"Rewarded ad failed to load: %@", error.localizedDescription);
return;
}
self.rewardedAd = ad;
// Set paid event handler for revenue tracking
self.rewardedAd.paidEventHandler = ^(GADAdValue *adValue) {
// Extract revenue and currency from AdValue
double revenue = adValue.value.doubleValue;
NSString *currency = adValue.currencyCode;
// Validate revenue and currency before sending
if (revenue > 0 && currency.length > 0) {
// Create ad revenue data object
SingularAdData *data = [[SingularAdData alloc]
initWithAdPlatfrom:@"AdMob"
currency:currency
revenue:revenue];
// Send to Singular
[Singular adRevenue:data];
NSLog(@"Ad revenue sent: %f %@", revenue, currency);
} else {
NSLog(@"Invalid ad revenue data: revenue = %f, currency = %@",
revenue, currency);
}
};
}];
}
@end
AppLovin MAXインテグレーション
AppLovin Impression-Level User Revenue APIを使ってインプレッションレベルの広告収益を共有します。
要件
- AppLovin MAX SDKを実装する(インプレッションレベル収益APIガイドを参照
-
AppLovin Communicator経由で
max_revenue_eventsのトピックを購読する。
実装
AppLovin Communicatorコールバックを介して収益メッセージを処理する。
import Singular
import AppLovinSDK
func didReceive(_ message: ALCMessage) {
// Check for revenue events topic
if message.topic == "max_revenue_events" {
// Extract and validate revenue value
guard let revenueValue = message.data["revenue"] as? Double,
revenueValue > 0 else {
print("Failed to parse valid revenue value or revenue is not greater than 0")
return
}
// Create ad revenue data object
let data = SingularAdData(
adPlatform: "AppLovin",
currency: "USD", // AppLovin typically reports in USD
revenue: revenueValue
)
// Send to Singular
Singular.adRevenue(data)
print("Ad revenue sent: \(revenueValue) USD")
}
}
#import <Singular/Singular.h>
#import <AppLovinSDK/AppLovinSDK.h>
- (void)didReceive:(ALCMessage *)message {
// Check for revenue events topic
if ([@"max_revenue_events" isEqualToString:message.topic]) {
NSDictionary *data = message.data;
// Extract and validate revenue value
NSNumber *revenueNumber = data[@"revenue"];
double revenueValue = [revenueNumber doubleValue];
if (revenueValue > 0) {
// Create ad revenue data object
SingularAdData *adData = [[SingularAdData alloc]
initWithAdPlatfrom:@"AppLovin"
currency:@"USD"
revenue:revenueValue];
// Send to Singular
[Singular adRevenue:adData];
NSLog(@"Ad revenue sent: %f USD", revenueValue);
} else {
NSLog(@"Failed to parse valid revenue value or revenue is not greater than 0");
}
}
}
Unity LevelPlay(IronSource)との統合
IronSource SDKを使用して、ironSourceと仲介ネットワークからのインプレッションレベルの収益を追跡します。
要件
- IronSource SDKを実装する(スタートガイドを参照
- IronSourceダッシュボードでARM SDK Postbacksフラグを有効にします。
- 収益コールバックを受信するインプレッションデータリスナーを設定する
詳細セットアップの詳細については、IronSource Ad Revenue Documentationを参照してください。
実装
インプレッションデータ成功コールバックを実装し、収益をキャプチャして送信します。
import Singular
import IronSource
func impressionDataDidSucceed(_ impressionData: ISImpressionData?) {
// Validate impression data
guard let impressionData = impressionData else {
print("No impression data available")
return
}
// Extract and validate revenue
let revenue = impressionData.revenue
guard revenue > 0 else {
print("Invalid revenue value: \(revenue)")
return
}
// Create ad revenue data object
let data = SingularAdData(
adPlatform: "IronSource",
currency: "USD", // IronSource typically reports in USD
revenue: revenue
)
// Send to Singular
Singular.adRevenue(data)
print("Ad revenue sent: \(revenue) USD")
}
#import <Singular/Singular.h>
#import <IronSource/IronSource.h>
- (void)impressionDataDidSucceed:(ISImpressionData *)impressionData {
// Validate impression data
if (!impressionData) {
NSLog(@"No impression data available");
return;
}
// Extract and validate revenue
double revenue = impressionData.revenue;
if (revenue <= 0) {
NSLog(@"Invalid revenue value: %f", revenue);
return;
}
// Create ad revenue data object
SingularAdData *data = [[SingularAdData alloc]
initWithAdPlatfrom:@"IronSource"
currency:@"USD"
revenue:revenue];
// Send to Singular
[Singular adRevenue:data];
NSLog(@"Ad revenue sent: %f USD", revenue);
}
TradPlusとの統合
インプレッションデリゲートを使用してTradPlusメディエーションから広告収益をキャプチャします。
要件
-
TradPlus.sharedInstance().impressionDelegate。 -
tradPlusAdImpressionコールバックを処理して収益データを受信する。 - eCPMをミリ単位から標準通貨に変換する(1000で割る)
実装
すべての広告インプレッションと収益をトラッキングするインプレッションデリゲートを登録する。
import Singular
import TradPlusSDK
// Set up the delegate
TradPlus.sharedInstance().impressionDelegate = self
// Delegate method for handling ad impressions
func tradPlusAdImpression(_ adInfo: [String: Any]) {
let currency = "USD"
// Extract and validate eCPM value
guard let ecpmValue = adInfo["ecpm"] as? NSNumber else {
print("No eCPM data available in adInfo")
return
}
// Convert eCPM from milli-units to dollars
let revenue = ecpmValue.doubleValue / 1000.0
// Validate revenue
guard revenue > 0 else {
print("Ad Revenue value out of expected range: \(revenue)")
return
}
// Create ad revenue data object
let data = SingularAdData(
adPlatform: "TradPlus",
currency: currency,
revenue: revenue
)
// Send to Singular
Singular.adRevenue(data)
print("Ad revenue sent: \(revenue) \(currency)")
}
#import <Singular/Singular.h>
#import <TradPlusSDK/TradPlusSDK.h>
// Set up the delegate
TradPlus.sharedInstance.impressionDelegate = self;
// Delegate method for handling ad impressions
- (void)tradPlusAdImpression:(NSDictionary<NSString *, id> *)adInfo {
NSString *currency = @"USD";
// Extract and validate eCPM value
NSNumber *ecpmValue = adInfo[@"ecpm"];
if (!ecpmValue) {
NSLog(@"No eCPM data available in adInfo");
return;
}
// Convert eCPM from milli-units to dollars
double revenue = [ecpmValue doubleValue] / 1000.0;
// Validate revenue
if (revenue <= 0) {
NSLog(@"Ad Revenue value out of expected range: %f", revenue);
return;
}
// Create ad revenue data object
SingularAdData *data = [[SingularAdData alloc]
initWithAdPlatfrom:@"TradPlus"
currency:currency
revenue:revenue];
// Send to Singular
[Singular adRevenue:data];
NSLog(@"Ad revenue sent: %f %@", revenue, currency);
}
汎用統合(その他のプラットフォーム)
一般的なSingularAdData インターフェイスを使用して、任意のメディエーションプラットフォームを統合します。
要件
- 媒介プラットフォームからのインプレッションレベルの収益データへのアクセス
- 標準通貨単位での収益額
- ISO 4217通貨コード(例:USD、EUR、INR)
データの正確性:Singularに送信する前に、収益と通貨データを検証してください。送信後に誤ったデータを修正することはできません。
実装
プラットフォーム名、通貨、収益でSingularAdData オブジェクトを作成し、Singular.adRevenue() を呼び出します。
import Singular
func reportAdRevenue(adPlatform: String, currency: String, revenue: Double) {
// Validate revenue
guard revenue > 0 else {
print("Invalid revenue value: \(revenue)")
return
}
// Validate currency
guard !currency.isEmpty else {
print("Invalid currency: \(currency)")
return
}
// Create ad revenue data object
let data = SingularAdData(
adPlatform: adPlatform,
currency: currency,
revenue: revenue
)
// Send to Singular
Singular.adRevenue(data)
print("Revenue sent: \(revenue) \(currency) from \(adPlatform)")
}
// Example usage
reportAdRevenue(adPlatform: "MyMediationPlatform", currency: "USD", revenue: 0.05)
#import <Singular/Singular.h>
- (void)reportAdRevenueWithPlatform:(NSString *)adPlatform
currency:(NSString *)currency
revenue:(double)revenue {
// Validate revenue
if (revenue <= 0) {
NSLog(@"Invalid revenue value: %f", revenue);
return;
}
// Validate currency
if (!currency || currency.length == 0) {
NSLog(@"Invalid currency: %@", currency);
return;
}
// Create ad revenue data object
SingularAdData *data = [[SingularAdData alloc]
initWithAdPlatfrom:adPlatform
currency:currency
revenue:revenue];
// Send to Singular
[Singular adRevenue:data];
NSLog(@"Revenue sent: %f %@ from %@", revenue, currency, adPlatform);
}
// Example usage
[self reportAdRevenueWithPlatform:@"MyMediationPlatform"
currency:@"USD"
revenue:0.05];
テストと検証
収益レポートの検証
広告収益の実装をテストし、データが正しくSingularに流れることを確認します。
- ログを確認する:収益コールバックのログが正しい値と通貨で表示されることを確認する。
- 広告のテストテスト広告をロードして表示し、収益イベントをトリガーします。
- ダッシュボードの検証:24時間以内にSingularダッシュボードに収益が表示されることを確認
- データの正確性:収益額がメディエーションプラットフォームのレポートと一致するか確認します。
トラブルシューティング収益がSingularに表示されない場合は、以下を確認してください:
- 広告収益のアトリビューションがSingularアカウントで有効になっている。
- 収益の値が0より大きい
- 通貨コードが有効なISO 4217コードである。
- プラットフォーム名がSingularの予想フォーマットと一致している