Atribuição de receitas de anúncios
Acompanhe as receitas de anúncios das plataformas de mediação e atribua-as às campanhas de marketing que adquiriram os seus utilizadores, fornecendo uma visibilidade completa do ROI dos custos das campanhas, das compras na aplicação e da monetização da publicidade.
Visão geral
O que é a atribuição de receitas de anúncios
A atribuição de receitas de anúncios liga as receitas de publicidade de aplicações móveis às campanhas de aquisição de utilizadores que conduziram a instalações de aplicações, permitindo-lhe medir a verdadeira rentabilidade da campanha, incluindo a monetização de anúncios.
Principais benefícios:
- Visão unificada do ROI: Veja os custos da campanha, a receita in-app e a receita de anúncios em um único painel
- Otimização de campanhas: Envie os dados da receita de anúncios de volta às redes de anúncios para melhorar os lances e a segmentação
- Medição de LTV: Calcular o valor total do tempo de vida do utilizador, incluindo a monetização da publicidade
Fontes de dados: Os dados de receita de anúncios geralmente vêm da sua plataforma de mediação (por exemplo, AdMob, AppLovin MAX, IronSource) no nível do usuário ou no nível da impressão. O Singular suporta vários métodos de integração para receber esses dados.
Saiba mais: Consulte as Perguntas frequentes sobre atribuição de receita de anúnciospara obter detalhes abrangentes sobre configuração, relatórios e solução de problemas.
Requisitos de implementação
Diretrizes críticas
A precisão dos dados é fundamental:
- Códigos de moeda: Use códigos de moeda ISO 4217 de três letras (por exemplo, USD, EUR, INR). Muitas plataformas de mediação reportam em USD - verifique a moeda da sua plataforma antes da implementação
-
Validar antes de enviar: Valide sempre os dados da receita e da moeda antes de ligar para
Singular.adRevenue(). Os dados incorrectos não podem ser corrigidos após o envio - Diferenças de plataforma: o iOS recebe a receita diretamente em unidades monetárias padrão (por exemplo, $0,005), ao contrário do Android que utiliza micros. Verifique sempre a documentação da sua plataforma para obter o formato correto
Passos de configuração
Siga estas etapas para implementar a atribuição de receita de anúncios:
- Atualizar o SDK: Certifique-se de que está a utilizar a versão mais recente do Singular SDK
- Escolher integração: Selecione a integração da plataforma de mediação abaixo que corresponde à sua configuração
- Implementar retornos de chamada: Adicione ouvintes de eventos pagos específicos da plataforma para capturar dados de receita
- Validar dados: Teste os relatórios de receita e verifique se os dados aparecem no painel do Singular
Integrações de plataforma
Integração com a AdMob
Acompanhe a receita de anúncios do Google AdMob usando o ouvinte de eventos pagos para relatórios de receita no nível da impressão.
Requisitos:
- Ativar o seguimento de eventos pagos na sua conta AdMob (consulte Suporte AdMob)
- Implementar o SDK do Google Mobile Ads para iOS (consulte o Guia de introdução)
Relatório de receita da plataforma: A AdMob informa a receita de forma diferente por plataforma. O iOS retorna a receita em unidades monetárias padrão (por exemplo, US$ 0,005 = 0,005). Envie o valor diretamente para o Singular sem conversão.
Implementação
Defina um manipulador de eventos pagos ao carregar anúncios para capturar dados de receita e enviá-los para o 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
Integração AppLovin MAX
Partilhe a receita de anúncios ao nível da impressão utilizando a API AppLovin Impression-Level User Revenue.
Requisitos:
- Implementar o AppLovin MAX SDK (consulte o Guia da API de receita no nível de impressão)
-
Subscrever o tópico
max_revenue_eventsatravés do AppLovin Communicator
Implementação
Tratar mensagens de receitas através do callback do 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");
}
}
}
Integração do Unity LevelPlay (IronSource)
Acompanhe a receita em nível de impressão do ironSource e de redes mediadas usando o SDK do IronSource.
Requisitos:
- Implementar o SDK do ironSource (consulte o Guia de Introdução)
- Ativar o sinalizador ARM SDK Postbacks no painel do IronSource
- Definir o ouvinte de dados de impressão para receber callbacks de receita
Saiba mais: Consulte a documentação sobre receita de anúncios do IronSourcepara obter detalhes completos sobre a configuração.
Implementação
Implemente o callback de sucesso dos dados de impressão para capturar e enviar a receita.
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);
}
Integração com o TradPlus
Capture a receita de anúncios da mediação do TradPlus usando o delegado de impressão.
Requisitos:
-
Definir o delegado de impressões através de
TradPlus.sharedInstance().impressionDelegate -
Tratar a chamada de retorno
tradPlusAdImpressionpara receber dados de receitas - Converter eCPM de miliunidades para moeda padrão (dividir por 1000)
Implementação
Registar um delegado de impressão para controlar todas as impressões de anúncios e receitas.
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);
}
Integração genérica (outras plataformas)
Integrar qualquer plataforma de mediação utilizando a interface genérica SingularAdData.
Requisitos:
- Acesso aos dados de receita no nível de impressão da sua plataforma de mediação
- Valor da receita em unidades monetárias padrão
- Código de moeda ISO 4217 (por exemplo, USD, EUR, INR)
Exatidão dos dados: Valide os dados de receita e moeda antes de enviar para a Singular. Dados incorretos não podem ser corrigidos após o envio.
Implementação
Crie um objeto SingularAdData com o nome da plataforma, a moeda e a receita e, em seguida, chame 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];
Teste e validação
Verificar relatórios de receita
Teste a implementação da receita de anúncios para garantir que os dados fluam corretamente para a Singular.
- Verifique os logs: Verifique se os logs de retorno de chamada de receita aparecem com os valores e a moeda corretos
- Testar anúncios: Carregue e exiba anúncios de teste para acionar eventos de receita
- Verificação do painel: Confirmar se a receita aparece no painel do Singular dentro de 24 horas
- Precisão dos dados: Validar se os valores da receita correspondem aos relatórios da plataforma de mediação
Solução de problemas: Se a receita não aparecer no Singular, verifique se:
- A atribuição de receita de anúncios está activada na sua conta Singular
- Os valores de receita são maiores que 0
- Os códigos de moeda são códigos ISO 4217 válidos
- O nome da plataforma corresponde ao formato esperado pela Singular