Singular

Singular es una plataforma de Mobile Measurement Partner (MMP) que recopila y presenta datos de campañas de marketing.

Adapty envía los eventos de suscripción que selecciones a Singular. En el dashboard de Singular, podrás ver cuántos ingresos genera cada campaña y evaluar la efectividad de tu publicidad.

Configurar la integración

Conectar Adapty con Singular

Para configurar la integración con Singular, ve a Integrations > Singular en tu Adapty Dashboard, activa el toggle y rellena los campos.

singular-creds.webp

Las siguientes credenciales están disponibles:

  • Singular SDK Key: Obligatorio. La clave SDK de producción para tu app de Singular.
  • Singular SDK Key (Sandbox): Opcional. La clave SDK para tu app de Singular en sandbox. Si no se configura, los eventos de sandbox no se enviarán a Singular.

Ambas claves se encuentran en el dashboard de Singular en Developer tools -> SDK Keys -> SDK Key (no SDK Secret):

4bc50d1-singular_sdk_key.webp

Configurar eventos y etiquetas

A continuación de las credenciales, hay tres grupos de eventos que puedes enviar a Singular desde Adapty. Para ver la lista completa de eventos de Adapty, consulta Eventos.

e67de0c-singular_events.webp

Te recomendamos usar los nombres de eventos predeterminados que ofrece Adapty, aunque puedes cambiarlos según tus necesidades.

Adapty envía eventos de suscripción al servidor de Singular server-to-server, para que puedas ver todos los eventos de suscripción en tu dashboard de Singular y vincularlos a tus campañas de adquisición.

Warning

Los perfiles creados antes de configurar la integración no pueden enviar sus eventos a Singular.

Conecta tu app con Singular

Singular habilita el Singular Device ID (SDID) por defecto en las cuentas creadas a partir del 15 de julio de 2026. Estas cuentas solo aceptan eventos a través de la API de eventos v2, y Adapty envía un evento a v2 únicamente cuando el perfil del usuario tiene un SDID. Para enviar eventos a este tipo de cuenta, pasa el SDID a Adapty desde tu app.

Si tu cuenta de Singular se creó antes del 15 de julio de 2026 y el SDID no está habilitado en ella, omite este paso. Adapty envía tus eventos a la API de eventos v1 y no es necesario añadir código en la app.

  1. Activa Adapty y luego inicia el SDK de Singular con un callback de SDID: sdidReceivedHandler en iOS, SDIDAccessorHandler en Android, sdidReceivedCallback en React Native y Flutter, y SingularSdidAccessorHandler en Unity.
  2. Espera a que Singular llame al callback. El SDID llega a tu app de forma asíncrona, después de que el SDK de Singular se inicie. Singular llama al callback en cada lanzamiento, incluso cuando el SDID ya está almacenado en el dispositivo.
  3. Dentro del callback, pasa el SDID a Adapty con setIntegrationIdentifier() y la clave singular_sdid. Ningún SDK de Adapty tiene una constante predefinida para esta clave, así que escríbela como un literal de cadena.
  4. Llama a Adapty.identify() solo después de que setIntegrationIdentifier() se complete. Adapty crea un perfil anónimo al activarse y luego cambia al perfil identificado una vez que identify() se resuelve. Un SDID establecido durante ese cambio puede perderse.

Estructura del evento

Adapty selecciona la versión de la API de eventos de Singular según si el perfil del usuario tiene un SDID:

  • Con SDID: Adapty envía una solicitud POST a https://s2s.singular.net/api/v2/evt con un cuerpo codificado en form-urlencoded. El parámetro sdid reemplaza los identificadores de dispositivo idfa, idfv, aifa, andi y asid. Los booleanos se envían como true o false.
  • Sin SDID: Adapty envía una solicitud GET a https://s2s.singular.net/api/v1/evt con parámetros de consulta.

Ambas versiones comparten los mismos parámetros en todo lo demás. Un evento v1 tiene esta estructura:

{
  "n": "subscription_renewed",
  "a": "singular_sdk_key_123",
  "p": "iOS",
  "i": "com.example.app",
  "ip": "192.168.100.1",
  "idfa": "00000000-0000-0000-0000-000000000000",
  "idfv": "00000000-0000-0000-0000-000000000000",
  "ve": "17.0.1",
  "att_authorization_status": 3,
  "custom_user_id": "user_12345",
  "utime": 1709294400,
  "partner": "adapty",
  "use_ip": false,
  "is_revenue_event": true,
  "amt": 9.99,
  "cur": "USD",
  "purchase_product_id": "yearly.premium.6999",
  "purchase_transaction_id": "GPA.3383...",
  "e": "{\"is_revenue_event\":true,\"amt\":9.99,\"cur\":\"USD\",\"purchase_product_id\":\"yearly.premium.6999\",\"purchase_transaction_id\":\"GPA.3383...\"}"
}

Donde:

ParámetroTipoDescripción
nStringEl nombre del evento (mapeado desde el evento de Adapty).
aStringTu clave SDK de Singular.
pStringPlataforma (“iOS” o “Android”).
iStringID de la app en el store (Bundle ID).
ipStringDirección IP del usuario.
sdidStringSolo v2. ID de dispositivo de Singular, obtenido del identificador de integración singular_sdid.
idfaStringiOS, solo v1. ID para anunciantes (en mayúsculas).
idfvStringiOS, solo v1. ID para proveedores (en mayúsculas).
aifaStringAndroid, solo v1. Google Advertising ID (en minúsculas).
andiStringAndroid, solo v1. Android ID (en minúsculas).
asidStringAndroid, solo v1. App Set ID (en minúsculas).
veStringVersión del sistema operativo.
att_authorization_statusIntegerSolo iOS. Estado de ATT (p. ej., 3 para autorizado).
custom_user_idStringEl Customer User ID del usuario.
utimeLongMarca de tiempo UNIX del evento en segundos.
partnerStringSiempre adapty. Identifica el evento como enviado por Adapty.
use_ipBooleantrue cuando Adapty no tiene dirección IP para el usuario.
is_revenue_eventBooleantrue si el evento contiene ingresos. Se envía solo con eventos de ingresos.
amtFloatImporte de los ingresos.
curStringCódigo de moneda (p. ej., “USD”).
purchase_product_idStringEl ID del producto en el store.
purchase_transaction_idStringID de transacción original.
eStringCadena JSON con los detalles del evento (ver más abajo).

El parámetro e (datos de evento personalizados) es una cadena codificada en JSON que contiene:

ParámetroTipoDescripción
is_revenue_eventBooleantrue si el evento contiene ingresos.
amtFloatImporte de los ingresos.
curStringCódigo de moneda.
purchase_product_idStringEl ID del producto en el store.
purchase_transaction_idStringID de transacción original.

Solución de problemas

Los eventos fallan con invalid api version: v1

Tu cuenta de Singular fue creada el 15 de julio de 2026 o después, y solo acepta eventos a través de la API de eventos v2. Adapty envió el evento a v1 porque el perfil del usuario no tiene SDID. Para solucionarlo, pasa el SDID a Adapty desde tu app, tal como se describe en Conecta tu app a Singular. Los eventos de usuarios que tengan una versión de la app sin la llamada setIntegrationIdentifier() seguirán fallando hasta que actualicen la app.

access_level_updated aparece como fallido en el Event Feed

access_level_updated es un evento exclusivo de webhooks. Adapty nunca lo envía a esta integración. Sin embargo, Adapty registra un resultado para cada integración habilitada, y un evento no compatible se muestra como un error.