[Beta] Integrar AppsFlyer Web SDK

Resumen: Instala AppsFlyer Web SDK (también conocido como el píxel) en tu sitio web para reportar visitas y eventos de usuarios a AppsFlyer, y configura un customer user ID (CUID) persistente para unificar viajes entre plataformas.

General

Web SDK te permite registrar cómo interactúan los visitantes con tu sitio web y envía esta información a AppsFlyer. Es un módulo complementario de 40–60 KB que reporta las visitas y acciones de los usuarios en tu sitio web a la plataforma AppsFlyer.

Sigue los pasos a continuación para completar la integración de Web SDK, desde la instalación hasta la validación y los controles de privacidad.

  1. Obtén tus claves. Obtén el Web SDK ID (también conocido como Web Dev Key).
  2. Selecciona un snippet de código. Elige el snippet que coincida con tu tipo de integración y requisitos de seguridad.
  3. Implementa Web SDK. Implementa el SDK utilizando un snippet nativo, Google Tag Manager o Adobe Launch Tag Manager.
  4. Asegúrate de que el SDK funcione correctamente. Valida que el SDK envíe solicitudes verificando las llamadas de red en las herramientas para desarrolladores del navegador.
  5. Configura y registra eventos. Define y envía eventos personalizados al cargar la página o mediante la interacción del usuario utilizando JavaScript nativo o Google Tag Manager.
  6. Configura el customer user ID. Configura un CUID persistente para unificar la actividad web con otras plataformas.
  7. Gestiona la privacidad. Controla la activación o desactivación de la medición y configura la seguridad y el filtrado de datos (Content Security Policy y descarte de parámetros de consulta).
  8. Referencia de cookies de Web SDK. Revisa las cookies que Web SDK establece o utiliza, incluyendo su propósito, duración y alcance.

1. Obtén tus claves

Obtén el Web SDK ID (también conocido como Web Dev Key):

  1. En AppsFlyer, desde el menú superior, abre Mis apps.
  2. Selecciona tu web app (el dominio de tu sitio web con el prefijo "website-").
  3. Copia el Web SDK ID requerido.

Obtén la clave de Smart Banner (si es necesario):

  1. En AppsFlyer, desde el menú lateral, abre Engage > Web to App > Smart Banners.
  2. Copia la Smart Banner Key requerida.

2. Selecciona un snippet de código

Elige el snippet que coincida con tu tipo de integración y requisitos de seguridad. Hay dos opciones disponibles:

  • Standard Web SDK: La integración estándar.
  • Advanced SDK Verification: Una integración avanzada que agrega protección de la cadena de suministro para Web SDK. Usa esto para agregar una capa adicional de seguridad contra el compromiso de CDN, el DNS hijacking y los ataques de intermediarios.

¡Importante!

Si estás haciendo la transición del Standard Web SDK al Advanced SDK Verification, reemplaza tu fragmento existente con el nuevo. No agregues el fragmento nuevo además del existente.

Standard Web SDK

Usa este fragmento para implementar la integración estándar del SDK web. Pégalo cerca de la parte superior de la etiqueta en todas las páginas donde quieras cargar el SDK.

Sin Smart Banners

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
  window.AF.plugins = {};

  // Inject SDK
  var o = document.createElement("script"),
      p = document.getElementsByTagName("script")[0];
  o.async = 1;
  o.src = "https://websdk.appsflyersdk.com?" + "st=pba&af_id=WEB_DEV_KEY";
  p.parentNode.insertBefore(o, p);
</script>

Con Smart Banners

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
  window.AF.plugins = {};

  // Inject SDK
  var o = document.createElement("script"),
      p = document.getElementsByTagName("script")[0];
  o.async = 1;
  o.src = "https://websdk.appsflyersdk.com?" + "st=pba,banners&af_id=WEB_DEV_KEY";
  p.parentNode.insertBefore(o, p);
  AF('banners', 'showBanner');
</script>

Advanced SDK Verification

Advanced SDK Verification agrega protección a la cadena de suministro para el SDK web. Garantiza que el código que se ejecuta en los navegadores de tus usuarios sea exactamente el que publicó AppsFlyer. El código fuente del SDK en sí es idéntico a la integración estándar; solo difieren los mecanismos de entrega y verificación.

Advanced SDK Verification:

  • Agrega una capa adicional de seguridad contra compromisos de CDN, DNS hijacking y ataques de intermediarios.
  • Agrega aproximadamente 250 ms al tiempo de carga del SDK.

Advanced SDK Verification es opcional. La integración estándar sigue siendo totalmente compatible y es el estándar del mercado para los píxeles de análisis de terceros. Advanced SDK Verification proporciona una capa adicional de protección más allá de ese estándar.

Si tu sitio web aplica una Política de Seguridad de Contenido (CSP) mediante una nonce, consulta Política de Seguridad de Contenido (CSP) en la sección “Gestionar privacidad” para ver la variante extendida de este fragmento.

Sin Smart Banners

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["pba"]
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

Con Smart Banners

<script>
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["banners", "pba"]
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

3. Implementar el snippet

Implementa el snippet que seleccionaste en el Paso 2 utilizando uno de los siguientes métodos. Asegúrate de que el SDK se cargue una sola vez por carga de página.

Opción A: Agregar directamente a tu sitio web

Repite esto en todas las páginas:

  1. En el snippet del Paso 2, reemplaza WEB_DEV_KEY por tu Web SDK ID (y YOUR_BANNER_KEY si corresponde).
  2. Pega el snippet cerca de la parte superior de la etiqueta del sitio web.

Opción B: Implementar mediante Google Tag Manager (GTM)

Asegúrate de que el SDK se cargue una sola vez por carga de página y configúralo para que se cargue tan pronto como la página se cargue utilizando la priorización de GTM.

  1. Abre Google Tag Manager.
  2. Crea una nueva etiqueta para AppsFlyer Web SDK.
  3. Selecciona el tipo de etiqueta HTML personalizado.
  4. Asigna un nombre descriptivo a la etiqueta.
  5. Pega el snippet del Paso 2 en Configuración de la etiqueta.
  6. Haz clic en Guardar.
  7. Agrega un activador:
    • Para todas las páginas:
      1. Haz clic en Agregar activador.
      2. Selecciona Todas las páginas.
      3. Haz clic en Guardar.
      4. Ingresa un nombre para la etiqueta y luego haz clic en Guardar.
    • Para páginas específicas:
      1. Haz clic en Guardar etiqueta.
      2. En la ventana principal de GTM, selecciona Activadores. Haz clic en Nuevo.
      3. Haz clic en el ícono de lápiz.
      4. Selecciona el tipo de activador Vista de página.
      5. Selecciona Algunas vistas de página.
      6. Configura las condiciones de página y activación según sea necesario.
      7. Haz clic en Guardar.
      8. Asocia el activador a la etiqueta de AppsFlyer Web SDK:
        1. En la ventana principal de GTM, selecciona Etiquetas.
        2. Selecciona la etiqueta que creaste anteriormente.
        3. En el panel de activación, haz clic en el ícono de lápiz.
        4. Selecciona el activador de vista de página que creaste anteriormente.
        5. Haz clic en Guardar.

Nota

Las plantillas personalizadas de GTM no son compatibles con Advanced SDK Verification, ya que su entorno aislado no permite configurar el atributo integrity requerido para la verificación. Utiliza en su lugar el tipo de etiqueta HTML personalizado.

Opción C: Implementar mediante Adobe Launch Tag Manager

Crear una propiedad en Adobe Experience Cloud

  1. Abre Adobe Experience Cloud > Lanzar.
  2. En Adobe Experience Cloud Launch, haz clic en Ir al lanzamiento.
  3. Haz clic en Nueva propiedad.
  4. Asigna un nombre a la propiedad.
  5. En Plataforma, selecciona Web.
  6. Ingresa el dominio de tu sitio web.
  7. Haz clic en Guardar.

Agregar el snippet a la propiedad de Adobe Launch

  1. En la página Mi propiedad web, selecciona la pestaña Reglas.
  2. Asigna un nombre a la regla. Recomendación: Cargar Web SDK.
  3. En la sección SI, dentro de Eventos, haz clic en Agregar.
    • En Tipo de evento, selecciona Core – DOM Ready.
    • Haz clic en Conservar cambios.
  4. En la sección ENTONCES, dentro de Acciones, haz clic en Agregar.
    • En Tipo de acción, selecciona Código personalizado.
    • Selecciona JavaScript > Abrir editor y pega el snippet del Paso 2 (sin líneas contenedoras).
    • Haz clic en Conservar cambios para cerrar el editor de código.
  5. Haz clic en Guardar.

Agregar la etiqueta de Adobe Launch al sitio web

  1. En la página Mi propiedad web, selecciona la pestaña Entornos.
  2. Busca la fila correspondiente al entorno que deseas publicar (desarrollo o producción).
  3. En la columna Instalar, haz clic en el ícono de cuadro de la fila correspondiente.
  4. En el cuadro de diálogo Instrucciones de instalación web, copia el snippet de código y cierra el cuadro de diálogo.
  5. Pega el snippet de código en la sección head del sitio web.

Publicar el entorno de Adobe Launch

  1. En la página Mi propiedad web, ve a la pestaña Publicación.
  2. En la sección Desarrollo, haz clic en Agregar nueva biblioteca.
    • Asigna un nombre a la biblioteca y selecciona un entorno.
    • En CAMBIOS DE RECURSOS, haz clic en Agregar un recurso.
    • Haz clic en Reglas > Cargar Web SDK > Última versión > Seleccionar y crear una nueva revisión.
    • Haz clic en Guardar.
  3. En la sección Desarrollo:
    • Junto a la biblioteca recién creada, haz clic en el menú de acciones (3 puntos) > selecciona Compilar para desarrollo.
    • Haz clic nuevamente en el menú de acciones > selecciona Enviar para aprobación.
  4. En la sección Enviado:
    • Haz clic en el menú de acciones > selecciona Compilar para staging.
    • Haz clic nuevamente en el menú de acciones > selecciona Aprobar para publicación.
  5. En la sección Aprobado:
    • Haz clic en el menú de acciones > selecciona Compilar y publicar en producción.

2. Asegúrate de que el SDK funcione correctamente

Después de la instalación, verifica que el SDK envíe solicitudes revisando las solicitudes de red en las herramientas para desarrolladores de tu navegador.

Captura de pantalla de DevTools

Para asegurarte de que el SDK funcione correctamente, sigue estos pasos:

  1. Abre el sitio web.
  2. Abre las herramientas para desarrolladores del navegador.
  3. Ve a la pestaña (A) Red.
  4. Actualiza la página.
  5. Filtra por (B) appsflyer. Pueden aparecer dos solicitudes:
    • Cargador del SDK — La URL de la solicitud comienza con https://websdk.appsflyersdk.com. Esto confirma que el script del SDK se cargó correctamente.
    • Datos de eventos — La URL de la solicitud comienza con https://wa.appsflyer.com/events. Esto confirma que el SDK está enviando datos de eventos a AppsFlyer.
  6. Selecciona el mensaje (C) events (la llamada wa.appsflyer.com).
  7. En Headers, (D) asegúrate de que:
    • La URL de la solicitud comienza con https://wa.appsflyer.com/events?site-id=.
    • El parámetro de consulta site_id = WEB_SDK_KEY.
    • El código de estado es 200.
  8. Verifica que site_id coincida con el WEB_SDK_KEY en AppsFlyer > menú superior > Mis aplicaciones.
  9. Verifica que el SDK se cargue una sola vez. La carga múltiple del SDK puede provocar que deje de funcionar.

3. Configurar y registrar eventos

Después de inicializar Web SDK, puedes pasar de medir visitas básicas a capturar acciones específicas de los usuarios. Esta sección te guía para definir y registrar eventos personalizados, como compras o registros, utilizando JavaScript nativo o Google Tag Manager.

Configurar eventos

Los eventos son los componentes fundamentales de la medición web y representan acciones específicas de los usuarios que tienen valor para tu negocio. Para registrar estas interacciones, debes definir la lógica y los parámetros de cada evento, asegurándote de que los parámetros correctos, como ingresos y metadatos personalizados, se envíen a la plataforma de AppsFlyer.

Evento de ejemplo (evento de compra con ingresos asociados)

AF('pba', 'event', {eventType: 'EVENT', eventName: 'purchase', eventRevenue: 12, eventValue: {"key1": 123, "key2": "name"}});

Tabla de parámetros de eventos de Web SDK

Nombre de parámetro Obligatorio Descripción
eventType Tipo de evento. Formato: String. Completa siempre este parámetro con EVENT. Ejemplo: eventType: "EVENT"
eventName Nombre del evento. Formato: String. Ejemplo: Compra, suscripción
eventRevenue No Ingresos asignados a un evento de conversión. Formato: Float
eventRevenueCurrency No Moneda de ingresos. Código de moneda ISO 4217 de 3 caracteres. Predeterminado: USD. Formato: String
eventValue No Mapa de parámetros del evento que describen el evento. Utiliza este parámetro para enviar eventos enriquecidos, como SKU de productos y precios de artículos. Formato: JSON. Ejemplo: Limitación de {"sku": "ABC123", "color": "blue", "unit_price": 3.99, "currency": "USD"}: 1000 caracteres. No excedas este límite; el contenido será truncado.

Registrar eventos al cargar la página

Este es el enfoque estándar para conversiones que terminan con una redirección, como una página de Gracias o de confirmación.

Puedes implementar este activador agregando un método de carga de ventana en tu JavaScript nativo o configurando un activador de vista de página dentro de Google Tag Manager.

Advertencia

Los siguientes ejemplos de código son solo para fines ilustrativos. No utilices este código tal cual; adáptalo a la estructura específica de tu sitio.

Ejemplo: Registrar evento mediante AF Web SDK

Este enfoque es ideal para registrar conversiones que ocurren mediante redirecciones, como una página de agradecimiento para una suscripción a un boletín.

Caso de uso: Un usuario completa el registro a un boletín y es redirigido a una página de confirmación. Deseas registrar el evento de suscripción tan pronto como esa página sea visible.

Ejemplo de carga de página nativa:

window.onload = function(){
  AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category': 'holiday_promotion'}, eventName: 'subscription'});
}

Cómo funciona:

  1. La página carga el contenido necesario.
  2. Una vez que la ventana se ha cargado completamente (window.onload), el script llama automáticamente al método AF().
  3. El evento subscription, junto con sus metadatos asociados (categoría y etiqueta), se envía directamente a AppsFlyer.

Ejemplo: Registrar evento mediante GTM

Este enfoque se utiliza para registrar conversiones exitosas, como una suscripción a un boletín, activando una etiqueta cuando se carga una página de "Gracias".

1. Configurar una página de Gracias

La siguiente estructura HTML carga GTM, que a su vez carga Web SDK. También muestra cómo los datos pueden ponerse a disposición de GTM mediante funciones o localStorage.

<html>
<head>
    <script>
        // Google Tag Manager loads the Web SDK
        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXX');
    </script>
    <script>
        function getResponseFromServer() {
            return JSON.stringify({ action: 'subscribe', category: 'site actions', label: userEmail })
        }
        localStorage.setItem('data', JSON.stringify({ action: 'subscribe', category: 'site actions', label: 'user@email.com' }));
    </script>
</head>
<body>
    <h1>Thank You for Subscribing to Our Newsletter</h1>
</body>
</html>

2. Configurar la etiqueta de GTM

  1. Crea una nueva etiqueta en GTM y selecciona el tipo de etiqueta HTML personalizado.
  2. Asigna un nombre distintivo (por ejemplo, "AF Subscription Event").
  3. Pega el siguiente script en el área de texto HTML:

    AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'subscription'});
  4. Expande Configuración avanzada > Secuenciación de etiquetas. Asegúrate de que esté configurada para activarse después de la etiqueta principal de inicialización de Web SDK.
  5. Configura un activador para que esta etiqueta se active en la Vista de página de tu página de "Gracias".

Registrar eventos mediante la interacción del usuario

Utiliza esto para rastrear acciones sin recargar la página (clics en botones, descargas, agregar al carrito).

Estas interacciones generalmente se gestionan vinculando un listener de clics a un elemento HTML nativo o utilizando variables de Google Tag Manager para identificar y medir IDs de elementos o selectores CSS específicos.

Advertencia

Los siguientes ejemplos de código son solo para fines ilustrativos. No utilices este código tal cual; adáptalo a la estructura específica de tu sitio.

Ejemplo: Registrar evento mediante AF Web SDK

Utiliza este método para rastrear acciones específicas que los usuarios realizan en una página, como hacer clic en un botón de Checkout o Descarga.

Caso de uso: Gestionas un sitio de ecommerce y deseas capturar un evento checkout en el momento en que un usuario hace clic en el botón Checkout de su carrito de compras.

Ejemplo de interacción nativa del usuario:

<html>
<head>
    <script>
        window.onload = function () {
            document.getElementById('checkout').addEventListener('click', function () {
                AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'});
            });
        }
    </script>
</head>
<body>
    <h1>Shopping Cart</h1>
    <button id='checkout'>Checkout</button>
</body>
</html>

Cómo funciona:

  1. Cuando la página se carga, el script adjunta un listener de evento click al elemento con el ID checkout.
  2. Cuando el usuario hace clic en el botón, se ejecuta la función callback.
  3. La función puede obtener datos relevantes (por ejemplo, desde localStorage) y pasarlos al método AF().
  4. Luego, el SDK transmite el evento checkout a la plataforma AppsFlyer.

Ejemplo: Registrar evento mediante GTM

Este método captura acciones específicas, como hacer clic en un botón Checkout, utilizando variables y activadores integrados de GTM.

1. Configurar una página de checkout

<html>
<head>
    <script>
        (function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
        new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
        j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
        'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
        })(window,document,'script','dataLayer','GTM-XXXX');
    </script>
</head>
<body>
    <h1>Shopping Cart</h1>
    <button id='checkout'>Checkout</button>
</body>
</html>

2. Configurar variables y activadores de GTM

  1. En GTM, haz clic en Variables > Configurar y habilita Elemento de clic en la lista de variables integradas.
  2. Crea una nueva variable definida por el usuario (Tipo: Todos los elementos).
  3. Crea un nuevo Activador:
    • Tipo de activador: Clic - Todos los elementos.
    • Este activador se ejecuta en: Algunos clics.
    • Condición: Elemento de clic coincide con el selector CSS #checkout.

3. Crear la etiqueta de interacción

  1. Crea una nueva etiqueta HTML personalizado para la acción de checkout.
  2. Pega el script de interacción:

    <script>
      AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'});
    </script>
  3. Asigna el activador "Checkout Click" que creaste en el paso anterior.

Mejores prácticas para la implementación de eventos

Para garantizar la precisión de los datos y una transmisión exitosa, ten en cuenta los siguientes requisitos técnicos:

  • Orden de carga: Asegúrate de que la etiqueta de funciones de Web SDK esté completamente cargada en el ámbito de la página antes de realizar cualquier llamada de evento.
  • Formato de datos: No incluyas caracteres especiales en los valores de los eventos. Por ejemplo, utiliza valores numéricos para los ingresos en lugar de incluir símbolos de moneda (usa 10.50 en lugar de $10.50).
  • Límites de longitud de texto: Mantén tus cadenas event_value concisas; los valores superiores a 4000 caracteres serán truncados.

4. Configurar customer user ID

Después de implementar la medición de eventos, configura una identidad persistente para vincular la actividad web con otras plataformas (móvil, PC, CTV) utilizando setCustomerUserId, con el fin de obtener una vista unificada del viaje del usuario entre plataformas.

Reglas clave

  • Consistencia: Utiliza el mismo valor de CUID que en las implementaciones de tu app móvil (consulta el setCustomerUserId móvil para: iOS, Android, Unity).
  • Cuándo: Puedes enviar el CUID en cualquier etapa (por ejemplo, después del inicio de sesión o del registro). Configura el CUID tan pronto como sea posible, una vez que tengas acceso a él. La mayoría de las veces, esto significa que debes esperar a que el usuario se identifique mediante inicio de sesión o registro.
  • Sintaxis: Envía el valor como una cadena de texto (entre comillas). Ejemplo: AF('pba', 'setCustomerUserId', '663274')
  • Privacidad: No incluyas información de identificación personal (PII), como direcciones de correo electrónico o números de teléfono.

Ejemplo: Configuración de CUID después del registro (nativo)

El código proporcionado en estos ejemplos es solo de referencia. No utilices este código tal cual. Si no estás seguro de cómo utilizar este código, consulta con tu desarrollador web.

Supuesto: Web SDK ya está cargado en la página antes de enviar el evento; no lo cargues nuevamente.

Escenario del usuario:

  • Un usuario se registra en tu sitio web.
  • El código del sitio web recopila los datos del usuario y los envía a tu servidor.
  • El servidor genera un CUID único para el usuario.
  • En la página de agradecimiento posterior al registro, consultas al servidor para obtener el nuevo CUID.
  • Utilizando la respuesta del servidor, configuras el CUID de AppsFlyer mediante el método setCustomerUserId() de Web SDK.

Ejemplo de formulario de registro

El siguiente código es un formulario de registro simple. Cuando se envía el formulario, la dirección de correo electrónico se almacena en localStorage. Cuando el usuario llega a la página de agradecimiento, la dirección de correo electrónico se envía al servidor para obtener el CUID único asociado a ese correo.

<html>
<head>
    <script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
    </script>
    <script>
        function storeUserEmail() {
            var userEmail = document.getElementById('email').value;
            localStorage.setItem('user_email', userEmail);
        }
    </script>
</head>
<body>
    <h1>Sign Up</h1>
    <form onsubmit="storeUserEmail()" action="/signup" method="post">
        <div><label>Name</label><input type="text" name="name" id="name"></div>
        <br/>
        <div><label>Email</label><input type="email" name="email" id="email"></div>
        <br/>
        <input type="submit" id="submit">
    </form>
</body>
</html>

Ejemplo de página de agradecimiento

El código utiliza la API Fetch. Envía al servidor la dirección de correo electrónico ingresada por el usuario. Suponiendo que el servidor crea un usuario con un CUID único al registrarse, enviar la dirección de correo electrónico al servidor devuelve un CUID único. El servidor responde con un CUID único, y este CUID es el valor que se envía mediante el método setCustomerUserId.

<html>
<head>
    <script>
!function(t,e,n,s,a,c,i,o,p){t.AppsFlyerSdkObject=a,t.AF=t.AF||function(){
(t.AF.q=t.AF.q||[]).push([Date.now()].concat(Array.prototype.slice.call(arguments)))},
t.AF.id=t.AF.id||i,t.AF.plugins={},o=e.createElement(n),p=e.getElementsByTagName(n)[0],o.async=1,
o.src="https://websdk.appsflyersdk.com?"+(c.length>0?"st="+c.split(",").sort().join(",")+"&":"")+(i.length>0?"af_id="+i:""),
p.parentNode.insertBefore(o,p)}(window,document,"script",0,"AF","pba",{pba: {webAppId: "WEB_DEV_KEY"}})
    </script>
    <script>
        window.onload = function () {
            var userEmail = localStorage.getItem('user_email');
            fetch('users/' + userEmail).then(function (res) {
                res.text().then(function (id) {
                    console.log(id);
                    AF('pba', 'setCustomerUserId', id);
                });
            });
        }
    </script>
</head>
<body>
    <h1>Thank You for Signing Up!</h1>
</body>
</html>

Ejemplo: Configuración de CUID después del registro (Google Tag Manager)

  1. Configura una página de registro.

    El ejemplo de código a continuación es un formulario de registro simple. Cuando se envía el formulario, la dirección de correo electrónico se almacena en localStorage. Cuando el usuario llega a la página de agradecimiento, la dirección de correo electrónico se envía al servidor para obtener el CUID único asociado a ese correo.

    <html>
    <head>
        <script>
            (function (w, d, s, l, i) {
                w[l] = w[l] || []; w[l].push({ 'gtm.start': new Date().getTime(), event: 'gtm.js' });
                var f = d.getElementsByTagName(s)[0], j = d.createElement(s),
                    dl = l != 'dataLayer' ? '&l=' + l : ''; j.async = true;
                j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
                f.parentNode.insertBefore(j, f);
            })(window, document, 'script', 'dataLayer', 'GTM-5VJ6C7R');
            function storeUserEmail() {
                var userEmail = document.getElementById('email').value;
                localStorage.setItem('user_email', userEmail);
            }
        </script>
    </head>
    <body>
        <h1>Sign Up</h1>
        <form onsubmit="storeUserEmail()" action="/signup" method="post">
            <div><label>Name</label><input type="text" name="name" id="name"></div>
            <br />
            <div><label>Email</label><input type="email" name="email" id="email"></div>
            <br />
            <input type="submit" id="submit">
        </form>
    </body>
    </html>
  2. Configura una página de agradecimiento para los usuarios que se registran. El siguiente código corresponde a una página de agradecimiento con un activador de GTM que envía al servidor la dirección de correo electrónico proporcionada por el usuario en el formulario de registro. Suponiendo que el servidor crea un usuario con un CUID único al registrarse, enviar el correo electrónico al servidor devuelve un CUID único. El servidor responde con un CUID único, que se envía utilizando el método setCustomerUserId().

    <script>
        window.onload = function () {
            var userEmail = localStorage.getItem('user_email');
            fetch('users/' + userEmail).then(function (res) {
                res.text().then(function (id) {
                    console.log(id);
                    AF('pba', 'setCustomerUserId', id);
                });
            });
        }
    </script>
  3. Agrega una nueva etiqueta para atribuir suscripciones después de que se cargue la página de agradecimiento.

  4. Asigna un nombre distintivo a la etiqueta y selecciona la opción de tipo de etiqueta HTML personalizado.

    <script>
        var userEmail = localStorage.getItem('user_email');
        fetch('users/' + userEmail).then(function (res) {
            res.text().then(function (id) {
                console.log(id);
                AF('pba', 'setCustomerUserId', id);
            });
        });
    </script>
  5. Expande Configuración avanzada y luego Secuenciación de etiquetas debajo del área de texto, y asegúrate de que esté configurado para activar la conversión después de que se ejecute la etiqueta.

  6. Configura un activador para la etiqueta de conversión que indique cuándo debe ejecutarse (en el ejemplo siguiente, se ejecuta al cargar la página de "Gracias").

5. Gestionar la privacidad

Después de implementar la medición de eventos, es posible que debas aplicar restricciones específicas de seguridad y privacidad para cumplir con estándares organizacionales o regionales.

Activar o desactivar el envío de eventos

Puedes controlar la medición de dos maneras:

Configuración del estado inicial del SDK (en el snippet)

Determina si el SDK envía eventos cuando la página web se carga por primera vez o si espera hasta que le indiques explícitamente que comience a enviarlos. Esta configuración se define en el snippet web.

  • Enviar eventos: {pba: {webAppId: "...", measurementStatus:true}}
  • No enviar eventos: {pba: {webAppId: "...", measurementStatus:false}}

Nota

Si measurementStatus está vacío o es NULL, AppsFlyer lo interpreta como si fuera measurementStatus:true.

Control explícito

El control explícito tiene prioridad sobre la configuración del estado inicial y utiliza cookies persistentes de first-party:

  • Se establecen en el dominio del sitio web.
  • Expiran después de un período definido por Web SDK o por el navegador.
  • Siempre están sujetas a la configuración de cookies del navegador.

Comandos

  • Comenzar a enviar eventos (opt-in): window.AF_SDK.PLUGINS.PBA.enableMeasurement()
  • Dejar de enviar eventos (opt-out): window.AF_SDK.PLUGINS.PBA.disableMeasurement()

Proteger y filtrar datos

Si tu sitio web requiere estrictos protocolos de seguridad o privacidad de datos, utiliza los siguientes mecanismos para configurar cómo interactúa el SDK web con tu entorno y tus datos.

Política de Seguridad de Contenido (CSP)

Si tu sitio web requiere que JavaScript esté protegido mediante una CSP, Web SDK admite dos enfoques según tu configuración de CSP y el snippet que seleccionaste en el Paso 2.

  • CSP usando self: Agrega https://websdk.appsflyersdk.com a tu lista script-src de permitidos. Esto funciona tanto para Standard Web SDK como para Advanced SDK Verification.
  • CSP utilizando nonce: Si tu política utiliza script-src 'nonce-...', usa la variante de Advanced SDK Verification extendida con nonce que aparece a continuación. Esto reenvía el nonce a las tres etiquetas script que requiere el proceso de verificación. Reemplaza {{CSP_NONCE}} con tu valor nonce generado por el servidor, por solicitud.

La siguiente tabla muestra qué políticas de CSP son compatibles con la variante nonce-extended.

Política Funciona Notas
script-src 'self' No No se permite el origen de CDN externo; el script en línea también se bloquea.
script-src 'self' https://websdk.appsflyersdk.com Parcial Permite el loader y el SDK, pero el script de configuración en línea sigue bloqueado.
script-src 'nonce-...' https://websdk.appsflyersdk.com Nonce cubre el script en línea y el loader; la etiqueta del SDK es reenviada por el loader.
script-src 'nonce-...' 'strict-dynamic' Sí (recomendado) Nonce cubre el script en línea y el loader; strict-dynamic propaga confianza a la etiqueta del SDK inyectada dinámicamente. No se necesita origen de CDN en la lista de permitidos.
Compatibilidad con políticas de CSP

Advanced SDK Verification con fragmentos de CSP nonce

Sin Smart Banners

<script nonce="{{CSP_NONCE}}">
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config — nonce forwarded to the injected SDK <script> tag
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["pba"],
    nonce: "{{CSP_NONCE}}"
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.nonce = "{{CSP_NONCE}}";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

Con Smart Banners

<script nonce="{{CSP_NONCE}}">
  // Queue — buffers AF() calls until the SDK is ready
  window.AppsFlyerSdkObject = "AF";
  window.AF = window.AF || function() {
    (window.AF.q = window.AF.q || []).push([Date.now()].concat(Array.prototype.slice.call(arguments)));
  };
  window.AF.id = window.AF.id || { pba: { webAppId: "WEB_DEV_KEY" }, banners: { key: "YOUR_BANNER_KEY" } };
  window.AF.plugins = {};

  // Manifest loader config — nonce forwarded to the injected SDK <script> tag
  window.AF_LOADER_CONFIG = {
    baseUrl: "https://websdk.appsflyersdk.com",
    plugins: ["banners", "pba"],
    nonce: "{{CSP_NONCE}}"
  };

  // Inject manifest loader
  var loaderScript = document.createElement("script");
  loaderScript.src = "https://websdk.appsflyersdk.com/manifestLoader.v1.js";
  loaderScript.integrity = "sha384-Uncl2YwvjFpFz0PwEfl3bL/0JsOQcDFEpwXHzcN0MBavn9vvFEx5pZxADTq8h+CV";
  loaderScript.crossOrigin = "anonymous";
  loaderScript.nonce = "{{CSP_NONCE}}";
  loaderScript.async = true;
  document.head.appendChild(loaderScript);
</script>

Descartar parámetros de consulta

Si los parámetros de consulta de tu URL contienen información sensible, indica a AppsFlyer que los descarte (URLs, referrers y header_referer).

  • Descartar todos los parámetros de consulta: agrega af_url=true
  • Descartar parámetros específicos: utiliza af_url_mask=param (separa varios parámetros con ;)

Ejemplo:

  • Original: param1=value1&param2=value2&param3=value3&af_url_mask=param2;param3
  • Resultado: param1=value1&af_url_mask=param2;param3

Referencia de cookies de Web SDK

Web SDK establece o utiliza las siguientes cookies:

Nombre de la cookie Dominio Vida útil Cuando se utiliza Detalles
afUserid El dominio de tu sitio web 395 días Páginas móviles no aceleradas Identifica a un usuario en el contexto de eventos de carga y navegación de páginas web.
AF_SYNC El dominio de tu sitio web 1 semana Páginas móviles no aceleradas Indica que se ha establecido un identificador de usuario final. Se utiliza para reducir los tiempos de carga del sitio.
af_id appsflyer.com 395 días Páginas móviles no aceleradas cuando se permiten cookies de terceros Identifica a un usuario en el contexto de eventos de apertura y navegación de la app.
af_id onelink.me 395 días Páginas móviles no aceleradas cuando se permiten cookies de terceros Vincula interacciones con banners, interacciones con OneLink o ambas con eventos de apertura de la app.
amp-afUserid AMP CDN o el dominio de tu sitio web 1 año Páginas móviles aceleradas
AF_DEFAULT_MEASUREMENT_STATUS El dominio de tu sitio web 395 días Páginas móviles no aceleradas Almacena el estado del consentimiento. Impide que el SDK funcione hasta que el usuario otorgue su consentimiento. No se configura de forma predeterminada. Se utiliza únicamente cuando está configurado control de consentimiento.