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.
- Obtén tus claves. Obtén el Web SDK ID (también conocido como Web Dev Key).
- Selecciona un snippet de código. Elige el snippet que coincida con tu tipo de integración y requisitos de seguridad.
- Implementa Web SDK. Implementa el SDK utilizando un snippet nativo, Google Tag Manager o Adobe Launch Tag Manager.
- 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.
- 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.
- Configura el customer user ID. Configura un CUID persistente para unificar la actividad web con otras plataformas.
- 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).
- 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):
- En AppsFlyer, desde el menú superior, abre Mis apps.
- Selecciona tu web app (el dominio de tu sitio web con el prefijo "website-").
- Copia el Web SDK ID requerido.
Obtén la clave de Smart Banner (si es necesario):
- En AppsFlyer, desde el menú lateral, abre Engage > Web to App > Smart Banners.
- 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:
- En el snippet del Paso 2, reemplaza
WEB_DEV_KEYpor tu Web SDK ID (yYOUR_BANNER_KEYsi corresponde). - 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.
- Abre Google Tag Manager.
- Crea una nueva etiqueta para AppsFlyer Web SDK.
- Selecciona el tipo de etiqueta HTML personalizado.
- Asigna un nombre descriptivo a la etiqueta.
- Pega el snippet del Paso 2 en Configuración de la etiqueta.
- Haz clic en Guardar.
- Agrega un activador:
- Para todas las páginas:
- Haz clic en Agregar activador.
- Selecciona Todas las páginas.
- Haz clic en Guardar.
- Ingresa un nombre para la etiqueta y luego haz clic en Guardar.
- Para páginas específicas:
- Haz clic en Guardar etiqueta.
- En la ventana principal de GTM, selecciona Activadores. Haz clic en Nuevo.
- Haz clic en el ícono de lápiz.
- Selecciona el tipo de activador Vista de página.
- Selecciona Algunas vistas de página.
- Configura las condiciones de página y activación según sea necesario.
- Haz clic en Guardar.
- Asocia el activador a la etiqueta de AppsFlyer Web SDK:
- En la ventana principal de GTM, selecciona Etiquetas.
- Selecciona la etiqueta que creaste anteriormente.
- En el panel de activación, haz clic en el ícono de lápiz.
- Selecciona el activador de vista de página que creaste anteriormente.
- Haz clic en Guardar.
- Para todas las páginas:
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
- Abre Adobe Experience Cloud > Lanzar.
- En Adobe Experience Cloud Launch, haz clic en Ir al lanzamiento.
- Haz clic en Nueva propiedad.
- Asigna un nombre a la propiedad.
- En Plataforma, selecciona Web.
- Ingresa el dominio de tu sitio web.
- Haz clic en Guardar.
Agregar el snippet a la propiedad de Adobe Launch
- En la página Mi propiedad web, selecciona la pestaña Reglas.
- Asigna un nombre a la regla. Recomendación: Cargar Web SDK.
- 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.
- 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.
- Haz clic en Guardar.
Agregar la etiqueta de Adobe Launch al sitio web
- En la página Mi propiedad web, selecciona la pestaña Entornos.
- Busca la fila correspondiente al entorno que deseas publicar (desarrollo o producción).
- En la columna Instalar, haz clic en el ícono de cuadro de la fila correspondiente.
- En el cuadro de diálogo Instrucciones de instalación web, copia el snippet de código y cierra el cuadro de diálogo.
- Pega el snippet de código en la sección head del sitio web.
Publicar el entorno de Adobe Launch
- En la página Mi propiedad web, ve a la pestaña Publicación.
- 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.
- 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.
- 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.
- 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.
Para asegurarte de que el SDK funcione correctamente, sigue estos pasos:
- Abre el sitio web.
- Abre las herramientas para desarrolladores del navegador.
- Ve a la pestaña (A) Red.
- Actualiza la página.
- 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.
-
Cargador del SDK — La URL de la solicitud comienza con
- Selecciona el mensaje (C) events (la llamada
wa.appsflyer.com). - 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.
- La URL de la solicitud comienza con
- Verifica que
site_idcoincida con elWEB_SDK_KEYen AppsFlyer > menú superior > Mis aplicaciones. - 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 |
Sí | Tipo de evento. Formato: String. Completa siempre este parámetro con EVENT. Ejemplo: eventType: "EVENT"
|
eventName |
Sí | 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:
- La página carga el contenido necesario.
- Una vez que la ventana se ha cargado completamente (
window.onload), el script llama automáticamente al métodoAF(). - 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
- Crea una nueva etiqueta en GTM y selecciona el tipo de etiqueta HTML personalizado.
- Asigna un nombre distintivo (por ejemplo, "AF Subscription Event").
-
Pega el siguiente script en el área de texto HTML:
AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'subscription'}); - 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.
- 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:
- Cuando la página se carga, el script adjunta un listener de evento click al elemento con el ID
checkout. - Cuando el usuario hace clic en el botón, se ejecuta la función callback.
- La función puede obtener datos relevantes (por ejemplo, desde
localStorage) y pasarlos al métodoAF(). - 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
- En GTM, haz clic en Variables > Configurar y habilita Elemento de clic en la lista de variables integradas.
- Crea una nueva variable definida por el usuario (Tipo: Todos los elementos).
- 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
- Crea una nueva etiqueta HTML personalizado para la acción de checkout.
-
Pega el script de interacción:
<script> AF('pba', 'event', {eventType: 'EVENT', eventValue: {'category' : 'holiday_promotion'}, eventName: 'checkout'}); </script> - 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.50en lugar de$10.50). -
Límites de longitud de texto: Mantén tus cadenas
event_valueconcisas; 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
setCustomerUserIdmó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)
-
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> -
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> -
Agrega una nueva etiqueta para atribuir suscripciones después de que se cargue la página de agradecimiento.
-
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> -
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.
-
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.coma tu listascript-srcde 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 |
Sí | 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. |
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¶m2=value2¶m3=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. |