Atribuição de receita de anúncios
Conecte a receita de anúncios às campanhas de marketing específicas que trouxeram usuários para o seu app, obtendo visibilidade completa dos custos de campanha, da receita in-app e da receita de anúncios para medir o ROI com precisão.
Visão geral
O que é atribuição de receita de anúncios
A atribuição de receita de anúncios vincula a receita de anúncios do app móvel às campanhas de marketing que geraram os usuários, permitindo medir o desempenho real da campanha ao conectar os custos de aquisição de usuários com a receita de todo o ciclo de vida, incluindo a monetização por anúncios.
- ROI da campanha: Veja custo de campanha, compras in-app e receita de anúncios em relatórios unificados para calcular o retorno real sobre o investimento em anúncios
- Otimização de rede: Envie os dados de receita de anúncios de volta às redes de anúncios para melhorar os algoritmos de lance e o desempenho das campanhas
- Fontes de dados: Compatível com dados em nível de usuário e de impressão de plataformas de mediação como AdMob, AppLovin MAX, Unity LevelPlay (IronSource) e TradPlus
Para mais detalhes, consulte as Perguntas frequentes sobre atribuição de receita de anúncios.
Considerações importantes:
- Códigos de moeda: Use códigos de moeda ISO 4217 de três letras (USD, EUR, INR). A maioria das plataformas de mediação reporta em USD; verifique a moeda da sua plataforma antes da implementação
- Precisão dos dados: Valide os dados de receita e moeda antes de enviá-los ao Singular. Dados incorretos não podem ser corrigidos retroativamente
Requisitos de implementação
O rastreamento de receita de anúncios exige integração com o SDK da sua plataforma de mediação e a configuração de callbacks de receita.
- Versão do SDK: Atualize para a versão mais recente do SDK do React Native da Singular
- Plataforma de mediação: Integre o SDK do React Native da sua plataforma de mediação (AdMob, AppLovin MAX, IronSource ou TradPlus)
- Callbacks de receita: Implemente os handlers de eventos pagos específicos de cada plataforma para capturar dados de receita em nível de impressão
- Lógica de validação: Adicione validação de receita e moeda antes de enviar os dados ao Singular
Método do SDK
Singular.adRevenue
Reporta os dados de receita de anúncios ao Singular com plataforma, moeda e valor de receita para atribuição à campanha de aquisição do usuário.
Assinatura do método:
static adRevenue(adData: SingularAdData | {
ad_platform: string;
ad_currency: string;
ad_revenue: number;
[key: string]: any;
}): void
Os nomes das chaves são verificados exatamente. O SDK procura por ad_platform, ad_currency e ad_revenue. Se qualquer uma das três estiver ausente, adRevenue() retorna sem enviar nada e não gera erro algum, de modo que uma chave digitada errado produz silêncio em vez de falha. Montar o payload com SingularAdData elimina esse risco.
Parâmetros obrigatórios:
- ad_platform: Nome da plataforma de mediação (por exemplo, "AdMob", "AppLovin", "IronSource", "TradPlus")
- ad_currency: Código de moeda ISO 4217 de três letras (por exemplo, "USD", "EUR")
- ad_revenue: Valor da receita na moeda especificada (deve ser maior que 0)
Montando o payload com SingularAdData
SingularAdData recebe os três valores obrigatórios no construtor e expõe um método encadeável para cada campo opcional. Importe-o do pacote junto com Singular.
import { Singular, SingularAdData } from 'singular-react-native';
const adData = new SingularAdData('AdMob', 'USD', 0.05)
.withAdUnitId('ca-app-pub-1234567890123456/9876543210')
.withAdType('Rewarded')
.withPrecision('precise');
Singular.adRevenue(adData);
Campos opcionais de dados de anúncio
Todos os campos a seguir são opcionais. Envie tudo o que a sua plataforma de mediação reportar: quanto mais completo o payload, mais granular será o relatório de receita de anúncios no Singular. Se você montar um objeto simples em vez de usar o builder, utilize a chave do payload da segunda coluna.
| Método do builder | Chave do payload | Detalhes |
|---|---|---|
withNetworkName() |
ad_mediation_platform |
Plataforma de mediação que reporta a impressão. Por padrão, assume o valor de ad_platform passado ao construtor. |
withAdType() |
ad_type |
Formato do anúncio, por exemplo Rewarded, Interstitial ou Banner. |
withGroupType() |
ad_group_type |
Tipo de grupo de anúncios conforme reportado pela plataforma de mediação. |
withImpressionId() |
ad_impression_id |
Identificador único da impressão. Permite que o Singular remova impressões duplicadas. |
withAdPlacementName() |
ad_placement_name |
Nome legível do posicionamento. |
withPlacementId() |
ad_placement_id |
Identificador do posicionamento. |
withAdUnitId() |
ad_unit_id |
Identificador da unidade de anúncio. |
withAdUnitName() |
ad_unit_name |
Nome legível da unidade de anúncio. |
withAdGroupId() |
ad_group_id |
Identificador do grupo de anúncios. |
withAdGroupName() |
ad_group_name |
Nome legível do grupo de anúncios. |
withAdGroupPriority() |
ad_group_priority |
Prioridade do grupo de anúncios conforme reportado pela plataforma de mediação. |
withPrecision() |
ad_precision |
Precisão da receita conforme reportado pela plataforma de mediação, por exemplo precise, estimated ou publisher_defined. |
withLimitDataSharing() |
sng_attr_limit_data_sharing |
Marca apenas este evento de receita de publicidade para limitar a partilha de dados, de forma independente da configuração limitDataSharing de todo o SDK. Boolean. Requer o SDK do React Native 4.3.0 ou superior. |
Para a documentação completa do método, consulte a referência de adRevenue.
Integrações de plataformas
Integração com AdMob
Implemente o rastreamento de receita de anúncios do AdMob usando os callbacks de eventos pagos do SDK do Google Mobile Ads para reportar receita em nível de impressão.
Pré-requisitos
- Ative os relatórios de receita de anúncios na sua conta do AdMob. Consulte o Suporte do AdMob
- Integre o pacote React Native Google Mobile Ads. Consulte o Guia de introdução
Visão geral da implementação
Ao carregar formatos de anúncio (App Open, Banner, Interstitial, Native, Rewarded), configure um handler de eventos pagos acionado quando os anúncios gerarem receita. Extraia o valor da receita e a moeda dos dados do evento, valide ambos os valores e envie-os ao Singular.
Diferença entre plataformas: O AdMob reporta a receita de forma diferente por plataforma. O Android reporta em micros (por exemplo, US$ 0,005 aparece como 5000), exigindo divisão por 1.000.000. O iOS reporta a receita diretamente em dólares (0,005). Ajuste a lógica de conversão conforme a detecção de plataforma.
Exemplo de anúncio premiado do AdMob
Carregue um anúncio premiado com o AdMob e capture eventos pagos para o rastreamento de receita.
// TurboModule direct API (React Native 0.76+ New Architecture)
import React, { useEffect } from 'react';
import NativeSingular from 'singular-react-native/js/NativeSingular';
import { RewardedAd, AdEventType } from 'react-native-google-mobile-ads';
import { Platform } from 'react-native';
const AD_UNIT_ID = 'ca-app-pub-xxxxxxxxxxxxx/yyyyyyyyyy';
export default function AdMobRevenueTracker() {
useEffect(() => {
loadRewardedAd();
}, []);
const loadRewardedAd = () => {
// Create RewardedAd instance
const rewardedAd = RewardedAd.createForAdRequest(AD_UNIT_ID);
// Set up event listener for ad events
rewardedAd.addAdEventListener((type, error, data) => {
if (type === AdEventType.LOADED) {
console.log('Rewarded ad loaded');
} else if (type === AdEventType.ERROR) {
console.error('Rewarded ad failed to load:', error);
} else if (type === AdEventType.PAID_EVENT) {
// Handle paid event with revenue data
handleAdRevenue(data);
}
});
// Load the ad
rewardedAd.load();
};
const handleAdRevenue = (data) => {
const { value, currencyCode } = data;
// Validate revenue and currency
if (!value || value <= 0) {
console.error('Invalid ad revenue value:', value);
return;
}
if (!currencyCode || currencyCode.trim() === '') {
console.error('Invalid currency code:', currencyCode);
return;
}
// Convert revenue based on platform
let revenue;
if (Platform.OS === 'android') {
// Android reports in micros - convert to dollars
revenue = value / 1_000_000.0;
} else {
// iOS reports in dollars directly
revenue = value;
}
const adRevenueData = {
ad_platform: 'AdMob',
ad_currency: currencyCode,
ad_revenue: revenue
};
// Send to Singular
NativeSingular.adRevenue(adRevenueData);
console.log('Ad Revenue reported to Singular:', adRevenueData);
};
return null;
}
import React, { useEffect } from 'react';
import { Singular, SingularAdData } from 'singular-react-native';
import { RewardedAd, AdEventType } from 'react-native-google-mobile-ads';
import { Platform } from 'react-native';
const AD_UNIT_ID = 'ca-app-pub-xxxxxxxxxxxxx/yyyyyyyyyy';
export default function AdMobRevenueTracker() {
useEffect(() => {
loadRewardedAd();
}, []);
const loadRewardedAd = () => {
// Create RewardedAd instance
const rewardedAd = RewardedAd.createForAdRequest(AD_UNIT_ID);
// Set up event listener for ad events
rewardedAd.addAdEventListener((type, error, data) => {
if (type === AdEventType.LOADED) {
console.log('Rewarded ad loaded');
} else if (type === AdEventType.ERROR) {
console.error('Rewarded ad failed to load:', error);
} else if (type === AdEventType.PAID_EVENT) {
// Handle paid event with revenue data
handleAdRevenue(data);
}
});
// Load the ad
rewardedAd.load();
};
const handleAdRevenue = (data) => {
const { value, currencyCode } = data;
// Validate revenue and currency
if (!value || value <= 0) {
console.error('Invalid ad revenue value:', value);
return;
}
if (!currencyCode || currencyCode.trim() === '') {
console.error('Invalid currency code:', currencyCode);
return;
}
// Convert revenue based on platform
let revenue;
if (Platform.OS === 'android') {
// Android reports in micros - convert to dollars
revenue = value / 1_000_000.0;
} else {
// iOS reports in dollars directly
revenue = value;
}
const adRevenueData = new SingularAdData(
'AdMob',
currencyCode,
revenue
);
// Send to Singular
Singular.adRevenue(adRevenueData);
console.log('Ad Revenue reported to Singular:', adRevenueData);
};
return null;
}
Notas de implementação:
-
Detecção de plataforma: Use
Platform.OSpara determinar a lógica de conversão (Android divide por 1.000.000, iOS usa o valor diretamente) - Validação de receita: Garanta que a receita seja maior que 0 antes de enviar
- Validação de moeda: Verifique se o código de moeda não está vazio
- Log de erros: Registre dados inválidos para depuração sem enviá-los ao Singular
Integração com AppLovin MAX
Implemente o rastreamento de receita de anúncios do AppLovin MAX usando a Impression-Level User Revenue API para reportar receita em tempo real em todos os formatos de anúncio.
Pré-requisitos
- Integre o SDK do React Native do AppLovin MAX. Consulte o Guia de introdução
- Ative a Impression-Level User Revenue API no seu painel do AppLovin
Visão geral da implementação
Configure listeners de receita de anúncios para cada formato (Interstitial, Rewarded, Banner, MRec, App Open) para capturar os eventos de receita. Extraia a receita de
adInfo.revenue e envie ao Singular com a moeda específica da plataforma (normalmente USD).
Rastreamento de receita do AppLovin MAX
Configure listeners globais de receita para todos os formatos de anúncio do AppLovin MAX.
// TurboModule direct API (React Native 0.76+ New Architecture)
import NativeSingular from 'singular-react-native/js/NativeSingular';
import {
InterstitialAd,
RewardedAd,
BannerAd,
MRecAd,
AppOpenAd
} from 'react-native-applovin-max';
// Currency constant - AppLovin typically reports in USD
const CURRENCY = 'USD';
// Generic handler for ad revenue
const handleAdRevenue = (adInfo) => {
if (!adInfo) {
console.error('AdInfo is null or undefined');
return;
}
const revenue = adInfo.revenue;
// Validate revenue
if (!revenue || revenue <= 0) {
console.error('Invalid revenue value:', revenue);
return;
}
const adRevenueData = {
ad_platform: 'AppLovin',
ad_currency: CURRENCY,
ad_revenue: revenue
};
// Send to Singular
NativeSingular.adRevenue(adRevenueData);
console.log('AppLovin ad revenue reported:', adRevenueData);
};
// Set up listeners for each ad type
export const setupAppLovinRevenueTracking = () => {
InterstitialAd.addAdRevenuePaidListener(handleAdRevenue);
RewardedAd.addAdRevenuePaidListener(handleAdRevenue);
BannerAd.addAdRevenuePaidListener(handleAdRevenue);
MRecAd.addAdRevenuePaidListener(handleAdRevenue);
AppOpenAd.addAdRevenuePaidListener(handleAdRevenue);
console.log('AppLovin MAX revenue tracking initialized');
};
import { Singular, SingularAdData } from 'singular-react-native';
import {
InterstitialAd,
RewardedAd,
BannerAd,
MRecAd,
AppOpenAd
} from 'react-native-applovin-max';
// Currency constant - AppLovin typically reports in USD
const CURRENCY = 'USD';
// Generic handler for ad revenue
const handleAdRevenue = (adInfo) => {
if (!adInfo) {
console.error('AdInfo is null or undefined');
return;
}
const revenue = adInfo.revenue;
// Validate revenue
if (!revenue || revenue <= 0) {
console.error('Invalid revenue value:', revenue);
return;
}
const adRevenueData = new SingularAdData(
'AppLovin',
CURRENCY,
revenue
);
// Send to Singular
Singular.adRevenue(adRevenueData);
console.log('AppLovin ad revenue reported:', adRevenueData);
};
// Set up listeners for each ad type
export const setupAppLovinRevenueTracking = () => {
InterstitialAd.addAdRevenuePaidListener(handleAdRevenue);
RewardedAd.addAdRevenuePaidListener(handleAdRevenue);
BannerAd.addAdRevenuePaidListener(handleAdRevenue);
MRecAd.addAdRevenuePaidListener(handleAdRevenue);
AppOpenAd.addAdRevenuePaidListener(handleAdRevenue);
console.log('AppLovin MAX revenue tracking initialized');
};
Notas de implementação:
- Todos os formatos de anúncio: Registre listeners para todos os tipos de anúncio que seu app usa (Interstitial, Rewarded, Banner, MRec, App Open)
- Moeda: O AppLovin normalmente reporta a receita em USD; verifique no seu painel
- Handler compartilhado: Use uma única função handler de receita para todos os formatos de anúncio para garantir validação consistente
Integração com Unity LevelPlay (IronSource)
Implemente o rastreamento de receita de anúncios do IronSource usando a Impression Level Revenue (ILR) SDK API para obter dados em nível de impressão do IronSource Ads e das redes mediadas.
Pré-requisitos
- Integre o SDK do React Native do IronSource. Consulte o Guia de introdução
- Ative a flag ARM SDK Postbacks no seu painel do IronSource
- Consulte a documentação de Medição de receita de anúncios do IronSource .
Visão geral da implementação
Assine o emissor de eventos onImpressionDataSuccess para receber os dados de impressão. Extraia a receita de
impressionData.revenue e envie ao Singular com a moeda USD.
Rastreamento de receita do IronSource
Configure o listener de eventos para os callbacks de dados de impressão do IronSource.
// TurboModule direct API (React Native 0.76+ New Architecture)
import { NativeModules, NativeEventEmitter } from 'react-native';
import NativeSingular from 'singular-react-native/js/NativeSingular';
const { IronSourceModule } = NativeModules;
const ironSourceEventEmitter = new NativeEventEmitter(IronSourceModule);
const AD_PLATFORM = 'IronSource';
const CURRENCY = 'USD'; // IronSource typically reports in USD
export const setupIronSourceRevenueTracking = () => {
ironSourceEventEmitter.addListener('onImpressionDataSuccess', (impressionData) => {
// Validate impression data
if (!impressionData) {
console.error('No impression data available');
return;
}
const revenue = impressionData.revenue;
// Validate revenue value
if (!revenue || revenue <= 0) {
console.error('Invalid revenue value:', revenue);
return;
}
const adRevenueData = {
ad_platform: AD_PLATFORM,
ad_currency: CURRENCY,
ad_revenue: revenue
};
// Send to Singular
NativeSingular.adRevenue(adRevenueData);
console.log('IronSource ad revenue reported:', adRevenueData);
});
console.log('IronSource revenue tracking initialized');
};
import { NativeModules, NativeEventEmitter } from 'react-native';
import { Singular, SingularAdData } from 'singular-react-native';
const { IronSourceModule } = NativeModules;
const ironSourceEventEmitter = new NativeEventEmitter(IronSourceModule);
const AD_PLATFORM = 'IronSource';
const CURRENCY = 'USD'; // IronSource typically reports in USD
export const setupIronSourceRevenueTracking = () => {
ironSourceEventEmitter.addListener('onImpressionDataSuccess', (impressionData) => {
// Validate impression data
if (!impressionData) {
console.error('No impression data available');
return;
}
const revenue = impressionData.revenue;
// Validate revenue value
if (!revenue || revenue <= 0) {
console.error('Invalid revenue value:', revenue);
return;
}
const adRevenueData = new SingularAdData(
AD_PLATFORM,
CURRENCY,
revenue
);
// Send to Singular
Singular.adRevenue(adRevenueData);
console.log('IronSource ad revenue reported:', adRevenueData);
});
console.log('IronSource revenue tracking initialized');
};
Notas de implementação:
- Emissor de eventos nativo: O IronSource usa o sistema de eventos nativos do React Native para os callbacks de impressão
- Postbacks ARM: Verifique se a flag ARM SDK Postbacks está ativada no painel do IronSource
- Assinatura de eventos: Configure o listener antes de inicializar o SDK do IronSource
Integração com TradPlus
Implemente o rastreamento de receita de anúncios do TradPlus usando listeners globais de impressão para capturar dados de eCPM das impressões de anúncios.
Pré-requisitos
- Integre o SDK do React Native do TradPlus ao seu app
- Configure as unidades de anúncio do TradPlus no seu painel
Visão geral da implementação
Assine o evento onImpressionSuccess para receber os dados de impressão de anúncios. Extraia o valor de eCPM de tpAdInfo.ecpm, converta de milésimos para dólares (divida por 1000) e envie ao Singular.
Conversão de eCPM: O TradPlus reporta o eCPM em milésimos. Divida o valor do eCPM por 1000 para convertê-lo em dólares antes de enviá-lo ao Singular.
Rastreamento de receita do TradPlus
Configure o listener de eventos para os callbacks de impressão bem-sucedida do TradPlus.
// TurboModule direct API (React Native 0.76+ New Architecture)
import { NativeModules, NativeEventEmitter } from 'react-native';
import NativeSingular from 'singular-react-native/js/NativeSingular';
const { TradPlusModule } = NativeModules;
const tradPlusEventEmitter = new NativeEventEmitter(TradPlusModule);
const AD_PLATFORM = 'TradPlus';
const CURRENCY = 'USD'; // TradPlus typically reports in USD
export const setupTradPlusRevenueTracking = () => {
tradPlusEventEmitter.addListener('onImpressionSuccess', (tpAdInfo) => {
// Validate ad info
if (!tpAdInfo) {
console.error('AdInfo is null');
return;
}
// eCPM is reported in milli-units - convert to dollars
if (!tpAdInfo.ecpm || typeof tpAdInfo.ecpm !== 'number') {
console.error('Invalid eCPM value:', tpAdInfo.ecpm);
return;
}
const revenue = tpAdInfo.ecpm / 1000.0;
// Validate revenue after conversion
if (revenue <= 0) {
console.error('Revenue out of expected range:', revenue);
return;
}
const adRevenueData = {
ad_platform: AD_PLATFORM,
ad_currency: CURRENCY,
ad_revenue: revenue
};
// Send to Singular
NativeSingular.adRevenue(adRevenueData);
console.log('TradPlus ad revenue reported:', adRevenueData);
});
console.log('TradPlus revenue tracking initialized');
};
import { NativeModules, NativeEventEmitter } from 'react-native';
import { Singular, SingularAdData } from 'singular-react-native';
const { TradPlusModule } = NativeModules;
const tradPlusEventEmitter = new NativeEventEmitter(TradPlusModule);
const AD_PLATFORM = 'TradPlus';
const CURRENCY = 'USD'; // TradPlus typically reports in USD
export const setupTradPlusRevenueTracking = () => {
tradPlusEventEmitter.addListener('onImpressionSuccess', (tpAdInfo) => {
// Validate ad info
if (!tpAdInfo) {
console.error('AdInfo is null');
return;
}
// eCPM is reported in milli-units - convert to dollars
if (!tpAdInfo.ecpm || typeof tpAdInfo.ecpm !== 'number') {
console.error('Invalid eCPM value:', tpAdInfo.ecpm);
return;
}
const revenue = tpAdInfo.ecpm / 1000.0;
// Validate revenue after conversion
if (revenue <= 0) {
console.error('Revenue out of expected range:', revenue);
return;
}
const adRevenueData = new SingularAdData(
AD_PLATFORM,
CURRENCY,
revenue
);
// Send to Singular
Singular.adRevenue(adRevenueData);
console.log('TradPlus ad revenue reported:', adRevenueData);
});
console.log('TradPlus revenue tracking initialized');
};
Notas de implementação:
- Formato do eCPM: O TradPlus reporta o eCPM em milésimos; sempre divida por 1000 antes de enviar ao Singular
- Verificação de tipo: Confirme que o eCPM é um número antes da conversão
- Validação pós-conversão: Valide que a receita é maior que 0 após a divisão
Integração genérica
Implemente o rastreamento de receita de anúncios para plataformas de mediação personalizadas ou integrações diretas usando o método genérico adRevenue() .
Quando usar a integração genérica
- Plataformas de mediação personalizadas não cobertas pelas integrações padrão
- Integrações diretas com redes de anúncios sem mediação
- Cálculos de receita de anúncios do lado do servidor encaminhados ao app
- Testes de rastreamento de receita de anúncios com dados simulados
Exemplo de implementação genérica
Crie uma função reutilizável para reportar receita de anúncios de qualquer origem com validação adequada.
// TurboModule direct API (React Native 0.76+ New Architecture)
import NativeSingular from 'singular-react-native/js/NativeSingular';
/**
* Report ad revenue to Singular with validation
*
* @param {string} adPlatform - Name of the ad platform or mediation provider
* @param {string} currency - ISO 4217 three-letter currency code (e.g., 'USD', 'EUR')
* @param {number} revenue - Revenue amount in the specified currency
*/
export const reportAdRevenue = (adPlatform, currency, revenue) => {
// Validate platform
if (!adPlatform || adPlatform.trim() === '') {
console.error('Invalid ad platform:', adPlatform);
return;
}
// Validate currency code
if (!currency || currency.trim() === '' || currency.length !== 3) {
console.error('Invalid currency code:', currency);
return;
}
// Validate revenue
if (typeof revenue !== 'number' || revenue <= 0 || !isFinite(revenue)) {
console.error('Invalid revenue value:', revenue);
return;
}
const adRevenueData = {
ad_platform: adPlatform.trim(),
ad_currency: currency.toUpperCase().trim(),
ad_revenue: revenue
};
// Send to Singular
NativeSingular.adRevenue(adRevenueData);
console.log('Ad Revenue reported to Singular:', adRevenueData);
};
// Example usage
export const trackCustomAdRevenue = () => {
// Example: Custom mediation platform
reportAdRevenue('CustomPlatform', 'USD', 0.05);
// Example: Direct network integration
reportAdRevenue('FacebookAudienceNetwork', 'EUR', 0.03);
};
import { Singular, SingularAdData } from 'singular-react-native';
/**
* Report ad revenue to Singular with validation
*
* @param {string} adPlatform - Name of the ad platform or mediation provider
* @param {string} currency - ISO 4217 three-letter currency code (e.g., 'USD', 'EUR')
* @param {number} revenue - Revenue amount in the specified currency
*/
export const reportAdRevenue = (adPlatform, currency, revenue) => {
// Validate platform
if (!adPlatform || adPlatform.trim() === '') {
console.error('Invalid ad platform:', adPlatform);
return;
}
// Validate currency code
if (!currency || currency.trim() === '' || currency.length !== 3) {
console.error('Invalid currency code:', currency);
return;
}
// Validate revenue
if (typeof revenue !== 'number' || revenue <= 0 || !isFinite(revenue)) {
console.error('Invalid revenue value:', revenue);
return;
}
const adRevenueData = new SingularAdData(
adPlatform.trim(),
currency.toUpperCase().trim(),
revenue
);
// Send to Singular
Singular.adRevenue(adRevenueData);
console.log('Ad Revenue reported to Singular:', adRevenueData);
};
// Example usage
export const trackCustomAdRevenue = () => {
// Example: Custom mediation platform
reportAdRevenue('CustomPlatform', 'USD', 0.05);
// Example: Direct network integration
reportAdRevenue('FacebookAudienceNetwork', 'EUR', 0.03);
};
Recursos de validação:
- Validação de plataforma: Garante que o nome da plataforma não esteja vazio e sem espaços extras
- Validação de moeda: Verifica o formato do código ISO 4217 de três letras e converte para maiúsculas
- Validação de receita: Confere se é um número positivo e exclui NaN e Infinity
- Segurança de tipos: A interface TypeScript garante a verificação de tipos em tempo de compilação
Boas práticas
Validação de dados
Implemente validação robusta para impedir que dados incorretos cheguem à analytics do Singular.
- Receita positiva: Sempre verifique se a receita é maior que zero antes de enviar
- Moeda válida: Use códigos ISO 4217 e verifique se as strings não estão vazias
- Consistência de plataforma: Use nomes de plataforma consistentes em todo o app (por exemplo, sempre "AdMob", não "Admob" nem "ADMOB")
- Verificação de tipo: Confirme que os tipos de dados correspondem aos valores esperados (número para receita, string para moeda e plataforma)
- Verificação de nulos: Trate valores null, undefined e vazios adequadamente
Crítico: Dados incorretos de receita de anúncios não podem ser corrigidos retroativamente no Singular. Sempre valide os dados antes de chamar
Singular.adRevenue().
Tratamento de moedas
Garanta o reporte correto de moeda para apps multirregião e diversas redes de anúncios.
- Verifique a moeda da plataforma: Consulte a documentação da sua plataforma de mediação para conhecer a moeda padrão (a maioria usa USD)
- Formato consistente: Sempre use códigos ISO 4217 de três letras em maiúsculas
- Sem conversão: Reporte a receita na moeda fornecida pela rede de anúncios; não converta moedas
- Moeda por rede: Redes de anúncios diferentes podem reportar em moedas diferentes; verifique cada uma separadamente
Considerações específicas de plataforma
Trate as diferenças de plataforma nos formatos e unidades de reporte de receita.
- AdMob Android: Receita reportada em micros; divida por 1.000.000 para converter em dólares
- AdMob iOS: Receita reportada em dólares; use o valor diretamente, sem conversão
- TradPlus: eCPM reportado em milésimos; divida por 1.000 para converter em dólares
- AppLovin: Receita reportada em dólares; use o valor diretamente
- IronSource: Receita reportada em dólares; use o valor diretamente
Tratamento de erros e logs
Implemente logs abrangentes para depurar e monitorar o rastreamento de receita de anúncios.
- Falhas de validação: Registre mensagens de erro detalhadas quando a validação falhar, incluindo os valores realmente recebidos
- Log de sucesso: Registre os reportes de receita bem-sucedidos em desenvolvimento com plataforma, moeda e valor
- Monitoramento em produção: Use serviços de rastreamento de erros (Sentry, Bugsnag) para monitorar falhas de validação em produção
- Anomalias de receita: Configure alertas para valores de receita excepcionalmente altos ou baixos que possam indicar problemas de integração
- Cobertura de plataformas: Monitore quais plataformas de anúncios estão reportando receita para garantir que todas estejam integradas corretamente
Estratégia de testes
Verifique a implementação do rastreamento de receita de anúncios antes de implantar em produção.
- Anúncios de teste: Use unidades de anúncio de teste da sua plataforma de mediação durante o desenvolvimento
- Valide os eventos: Verifique no painel do Singular os eventos de receita de anúncios após as impressões de teste
- Verifique a moeda: Confirme que os códigos de moeda aparecem corretamente nos relatórios do Singular
- Precisão de plataforma: Garanta que os nomes de plataforma estejam consistentes e reconhecíveis nos relatórios
- Valores de receita: Verifique se os valores de receita correspondem às faixas esperadas para as unidades de anúncio de teste
- Multiplataforma: Teste em iOS e Android para verificar a lógica de conversão específica de cada plataforma
Otimização de desempenho
Minimize o impacto do rastreamento de receita de anúncios no desempenho do seu app.
- Processamento assíncrono: Os callbacks de receita são executados de forma assíncrona, sem bloquear a thread principal
- Validação mínima: Mantenha a lógica de validação simples e rápida (verificações de tipo e de faixa)
- Consideração sobre lotes: Para apps de alto volume, considere o processamento em lote se o seu backend de analytics oferecer suporte
- Tratamento de erros: Use blocos try-catch para evitar que erros de rastreamento de receita derrubem seu app
Verificação e solução de problemas
Verificar a implementação
Confirme que os dados de receita de anúncios estão chegando corretamente ao Singular.
- Ative os anúncios de teste: Configure o modo de teste na sua plataforma de mediação
- Gere impressões: Exiba anúncios de teste e dispare eventos pagos
- Verifique os logs: Confirme que os logs de rastreamento de receita aparecem no console com os valores corretos
- Verificação no painel: Verifique no painel do Singular os eventos de receita de anúncios (pode levar de 15 a 30 minutos)
- Detalhes do evento: Verifique moeda, plataforma e valores de receita nos detalhes do evento no Singular
Problemas comuns
- Nenhum evento de receita: Verifique se os handlers de eventos pagos estão registrados antes do carregamento dos anúncios e se o SDK de mediação foi inicializado corretamente
- Receita zerada: Verifique a lógica de conversão específica da plataforma (micros para dólares no AdMob Android, milésimos para dólares no TradPlus)
- Moeda incorreta: Verifique se o código de moeda corresponde ao que a sua plataforma de mediação reporta; consulte a documentação da plataforma
- Divergência no nome da plataforma: Use nomes de plataforma consistentes que correspondam às plataformas reconhecidas pelo Singular
- Eventos ausentes: Garanta que o SDK do Singular seja inicializado antes que os eventos de receita de anúncios ocorram
- Eventos duplicados: Verifique se os handlers de eventos pagos estão registrados apenas uma vez, e não a cada carregamento de anúncio
Recursos adicionais: Para informações detalhadas, consulte as Perguntas frequentes sobre atribuição de receita de anúncios e a Referência de métodos do SDK do React Native.