Carga Lazy del SDK y Consent Gate
El SDK de embed de Percus se distribuye en dos bundles separados, de modo que ningún código de tracking llega a la página del viewer hasta que se otorga el consentimiento. Esta es la base de la postura de privacidad de la plataforma (GDPR, Ley 19.628, LGPD): por defecto, no se recolecta nada.
Arquitectura de dos etapas
| Bundle | Qué contiene | Cuándo carga |
|---|---|---|
percus-embed.global.js (bootstrap) | Embed del player, el consent gate, y el beacon de auditoría de consent. Ningún código de tracking. | Siempre, en cuanto la página host carga el SDK. |
percus-tracking.global.js (tracking) | Cómputo del viewer-hash, tracking de sesión/playback, y transporte de eventos. | Solo después de que ambas compuertas se abran (ver más abajo). |
El bootstrap deriva la URL del bundle de tracking a partir de su propia URL de script (intercambiando percus-embed → percus-tracking) y lo inyecta como un <script> async a lo sumo una vez.
Un flag de consent dentro de un único bundle no es suficiente: el código de tracking ya estaría descargado y parseable. Separar los bundles significa que una página sin consent nunca recibe esos bytes — verificable en la pestaña Network del navegador.
La doble compuerta
percus-tracking.global.js se inyecta solo cuando se cumplen ambas condiciones:
- Opt-in del integrador —
data-percus-enable-tracking="true"en el script del embed (el alias compatible con Individeodata-iv-enable-tracking="true"también se acepta). - Consent del viewer — o bien
data-percus-consent-accepted="true"está presente al cargar, o la página host invocaPercus.acceptConsent()en runtime.
<script
src="https://cdn.percus.cl/percus-embed-sdk/percus-embed.global.js"
data-pc-campaign-api-url="https://api.percus.cl"
data-pc-channel-handle="my-channel"
data-pc-api-key="pk_public_..."
data-percus-enable-tracking="true"
data-percus-consent-accepted="false">
</script>
Si el integrador nunca setea data-percus-enable-tracking, el bundle de tracking nunca carga, sin importar el consent.
API de consent en runtime
Una plataforma de gestión de consentimiento (CMP) puede dictar la decisión luego de la carga de página:
PercusEmbed.acceptConsent(); // abre la compuerta 2 → carga el bundle de tracking (si está habilitado)
PercusEmbed.declineConsent(); // el bundle de tracking nunca carga
PercusEmbed.getConsentState(); // "unknown" | "accepted" | "declined"
La decisión de consent se mantiene solo en memoria para la carga de página. Nunca se escribe a cookie ni a web storage, así que una sesión nueva siempre arranca en unknown y la CMP de la página host sigue siendo la única fuente de verdad.
Pista de auditoría de consent
Los eventos consent.accepted y consent.declined se emiten siempre — incluso al declinar, cuando el bundle de tracking nunca carga. Este beacon de auditoría vive en el bootstrap, no en el bundle de tracking, y se envía como un único POST fetch(..., { keepalive: true }) al endpoint de ingesta autenticado con un token de ingesta de analítica dedicado del manifest. Ese token es un token Percus.Auth v3 separado, firmado con la misma clave que el endpoint de ingesta valida pero emitido con un TTL más largo (por defecto 24 h, configurable entre 15 m y 48 h) para que sobreviva al límite de pocos minutos del token de embed-session y dure una sesión de visualización completa.
El beacon de decline no carga ningún identificador de viewer (viewer_hash es null y consent.tracking es false); existe puramente para dejar constancia de que se tomó una decisión.
Estos dos tipos de evento, junto con video.errored, son los únicos eventos que el endpoint de ingesta acepta mientras consent.tracking es false.
Resiliencia a bloqueadores de anuncios
El bootstrap está diseñado para cargar bajo uBlock Origin / Brave Shields así el player sigue rindiendo. El nombre del bundle de tracking (percus-tracking) puede ser bloqueado por algunas listas — eso es aceptable por diseño: un bundle de tracking bloqueado simplemente significa que no hay eventos, nunca un player roto.
Cómo recibe el SDK su configuración
El manifest del embed del servicio campaign lleva un bloque analytics que el SmartEmbed loader entrega a PercusEmbed.init:
{
"analytics": {
"organizationId": "…",
"orgSalt": "…",
"projectId": "…",
"templateId": "…",
"templateVersion": "…",
"ingestToken": "…",
"ingestUrl": "https://ingest.percus.cl/analytics/v1/events"
}
}
ingestUrl e ingestToken son lo que el beacon de consent (y, más adelante, el transporte completo de eventos) usan para llegar al endpoint de ingesta. Cuando ingestUrl está ausente (por ejemplo en desarrollo local), el beacon es no-op. Ver la página Modelo de Identidad para entender cómo funcionan orgSalt y viewer_hash.