SDK de iOS - Tracking de ingresos por publicidad

Atribución de ingresos por publicidad

Rastrea los ingresos por publicidad de las plataformas de mediación y atribúyelos a las campañas de marketing que adquirieron a tus usuarios, ofreciendo visibilidad completa del ROI a través de los costos de campaña, las compras dentro de la app y la monetización publicitaria.

Descripción general

Qué es la atribución de ingresos por publicidad

La atribución de ingresos por publicidad conecta los ingresos por publicidad de aplicaciones móviles con las campañas de adquisición de usuarios que generaron las instalaciones, permitiéndote medir la rentabilidad real de la campaña, incluyendo la monetización publicitaria.

Beneficios clave:

  • Vista unificada del ROI: Visualiza los costos de campaña, los ingresos in-app y los ingresos por publicidad en un solo dashboard
  • Optimización de campañas: Envía los datos de ingresos por publicidad de vuelta a las redes publicitarias para mejorar la puja y el targeting
  • Medición de LTV: Calcula el valor total del ciclo de vida del usuario, incluyendo la monetización publicitaria

Fuentes de datos: Los datos de ingresos por publicidad generalmente provienen de tu plataforma de mediación (por ejemplo, AdMob, AppLovin MAX, IronSource) a nivel de usuario o a nivel de impresión. Singular admite varios métodos de integración para recibir estos datos.

Más información: Consulta las Preguntas frecuentes de atribución de ingresos por publicidad para obtener detalles completos sobre configuración, reportes y resolución de problemas.


Requisitos de implementación

Pautas críticas

Parámetros requeridos de SingularAdData: Los argumentos del constructor adPlatform, withCurrency y withRevenue son todos requeridos. Si alguno falta, está vacío o no es válido (según -hasRequiredParams), el SDK descarta silenciosamente la llamada a +adRevenue: sin lanzar una excepción. La llamada también se ignora silenciosamente cuando el SDK no se ha iniciado; confirma siempre que +start: se haya ejecutado antes de llamar.

Usa la firma del constructor correcta: -initWithAdPlatform:withCurrency:withRevenue: es el constructor soportado. El antiguo -initWithAdPlatfrom: (nota el error ortográfico) está anotado como __attribute__((deprecated)) y emitirá una advertencia del compilador. No lo uses en código nuevo.

La precisión de los datos es crítica:

  1. Códigos de moneda: Usa códigos de moneda ISO 4217 de tres letras (por ejemplo, USD, EUR, INR). Muchas plataformas de mediación reportan en USD; verifica la moneda de tu plataforma antes de implementar
  2. Validar antes de enviar: Valida siempre los datos de ingresos y moneda antes de llamar a Singular.adRevenue() . Los datos incorrectos no se pueden corregir después del envío
  3. Diferencias entre plataformas: iOS recibe los ingresos directamente en unidades de moneda estándar (por ejemplo, $0.005), a diferencia de Android que usa micros. Consulta siempre la documentación de tu plataforma para el formato correcto

Pasos de configuración

Sigue estos pasos para implementar la atribución de ingresos por publicidad:

  1. Actualizar el SDK: Asegúrate de estar usando la versión más reciente del SDK de Singular
  2. Elegir integración: Selecciona la integración de la plataforma de mediación que coincida con tu configuración
  3. Implementar callbacks: Agrega listeners de eventos paid específicos de la plataforma para capturar los datos de ingresos
  4. Validar los datos: Prueba el reporte de ingresos y verifica que los datos aparezcan en el dashboard de Singular

Integraciones de plataformas

Integración con AdMob

Rastrea los ingresos por publicidad de Google AdMob usando el listener de eventos paid para reportar ingresos a nivel de impresión.

Requisitos:

Reporte de ingresos según la plataforma: AdMob reporta los ingresos de forma distinta según la plataforma. iOS devuelve los ingresos en unidades de moneda estándar (por ejemplo, $0.005 = 0.005). Envía el valor directamente a Singular sin conversión.

Implementación

Establece un handler de eventos paid al cargar los anuncios para capturar los datos de ingresos y enviarlos a Singular.

Swift Objective-C
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)")
        }
    }
}

Integración con AppLovin MAX

Comparte los ingresos por publicidad a nivel de impresión usando la Impression-Level User Revenue API de AppLovin.

Requisitos:

Implementación

Maneja los mensajes de ingresos a través del callback de AppLovin Communicator.

Swift Objective-C
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")
    }
}

Integración con Unity LevelPlay (IronSource)

Rastrea los ingresos a nivel de impresión de ironSource y las redes mediadas usando el SDK de IronSource.

Requisitos:

  • Implementa el SDK de ironSource (consulta la Guía de inicio )
  • Habilita el flag ARM SDK Postbacks en tu dashboard de IronSource
  • Configura el impression data listener para recibir los callbacks de ingresos

Más información: Consulta la documentación de ingresos por publicidad de IronSource para obtener todos los detalles de configuración.

Implementación

Implementa el callback impression data success para capturar y enviar los ingresos.

Swift Objective-C
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")
}

Integración con TradPlus

Captura los ingresos por publicidad de la mediación de TradPlus usando el impression delegate.

Requisitos:

  • Configura el impression delegate vía TradPlus.sharedInstance().impressionDelegate
  • Maneja el callback tradPlusAdImpression para recibir los datos de ingresos
  • Convierte el eCPM de miliunidades a la moneda estándar (divide entre 1000)

Implementación

Registra un impression delegate para rastrear todas las impresiones de anuncios y los ingresos.

Swift Objective-C
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)")
}

Integración genérica (otras plataformas)

Integra cualquier plataforma de mediación usando la interfaz genérica SingularAdData .

Requisitos:

  • Acceso a los datos de ingresos a nivel de impresión de tu plataforma de mediación
  • Monto de ingresos en unidades de moneda estándar
  • Código de moneda ISO 4217 (por ejemplo, USD, EUR, INR)

Precisión de los datos: Valida los datos de ingresos y moneda antes de enviarlos a Singular. Los datos incorrectos no se pueden corregir después del envío.

Implementación

Crea un objeto SingularAdData con el nombre de la plataforma, la moneda y los ingresos, luego llama a Singular.adRevenue() .

Swift Objective-C
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)

Enriquecer los datos del anuncio con atributos adicionales

SingularAdData expone métodos setter para los metadatos a nivel de impresión. Úsalos para enriquecer el evento con detalles de placement, ad unit, agrupación de mediación y precisión cuando tu plataforma de mediación los proporcione.

A diferencia del SDK de Android, los setters de SingularAdData devuelven void y NO son encadenables. Llama a cada setter en su propia línea.

Método Descripción
setNetworkName: Sobrescribe el nombre de la red (por defecto, la plataforma publicitaria pasada al constructor). Úsalo para mediación donde la red subyacente difiere de la plataforma de mediación.
setAdType: Formato del anuncio (por ejemplo, @"Rewarded", @"Interstitial", @"Banner").
setGroupType: Categorización del grupo de anuncios definida por tu plataforma de mediación.
setImpressionId: Identificador único de la impresión, usado para deduplicación y reconciliación.
setAdPlacementName: Nombre legible del placement (por ejemplo, @"level_complete").
setAdUnitId: Identificador del ad unit específico de la plataforma (por ejemplo, @"ca-app-pub-..." para AdMob).
setAdUnitName: Nombre legible del ad unit.
setAdGroupId: Identificador del grupo de anuncios de la plataforma de mediación.
setAdGroupName: Nombre legible del grupo de anuncios.
setAdGroupPriority: Prioridad asignada al grupo de anuncios en el waterfall de mediación.
setPrecision: Indicador de precisión de los ingresos (por ejemplo, @"publisher_provided", @"estimated", @"exact") cuando la plataforma lo soporte.
setPlacementId: Identificador del placement específico de la plataforma.
setLimitDataSharing: Sobrescribe el límite global de compartición de datos para este único evento publicitario, por ejemplo, cuando un usuario ha optado por no recibir publicidad personalizada.

Ejemplo en Swift:

let data = SingularAdData(adPlatform: "AdMob",
                          withCurrency: "USD",
                          withRevenue: NSNumber(value: 0.05))
data.setAdUnitId("ca-app-pub-123456789/1234567890")
data.setAdType("Rewarded")
data.setAdPlacementName("level_complete")
data.setImpressionId("imp_abc123")
data.setPrecision("publisher_provided")

Singular.adRevenue(data)

Ejemplo en Objective-C:

SingularAdData *data = [[SingularAdData alloc]
    initWithAdPlatform:@"AdMob"
          withCurrency:@"USD"
           withRevenue:@(0.05)];
[data setAdUnitId:@"ca-app-pub-123456789/1234567890"];
[data setAdType:@"Rewarded"];
[data setAdPlacementName:@"level_complete"];
[data setImpressionId:@"imp_abc123"];
[data setPrecision:@"publisher_provided"];

[Singular adRevenue:data];

Pruebas y validación

Verificar el reporte de ingresos

Prueba tu implementación de ingresos por publicidad para asegurarte de que los datos fluyan correctamente hacia Singular.

  1. Revisar los logs: Verifica que los logs del callback de ingresos aparezcan con los valores y la moneda correctos
  2. Anuncios de prueba: Carga y muestra anuncios de prueba para disparar los eventos de ingresos
  3. Verificación en el dashboard: Confirma que los ingresos aparezcan en el dashboard de Singular dentro de 24 horas
  4. Precisión de los datos: Valida que los montos de ingresos coincidan con los reportes de tu plataforma de mediación

Resolución de problemas: Si los ingresos no aparecen en Singular, verifica que:

  • La atribución de ingresos por publicidad esté habilitada en tu cuenta de Singular
  • Los valores de ingresos sean mayores que 0
  • Los códigos de moneda sean códigos ISO 4217 válidos
  • El nombre de la plataforma coincida con el formato esperado por Singular