Pixel
Referencia del Web Pixel de Relo: API relo(), catálogo de eventos automáticos y manuales, lead API, consent bitmask y session replay.
Web Pixel — referencia técnica
Referencia del script r.js que corre en los sitios de clientes pixel. Para el alta paso a paso de un cliente nuevo (wizard, snippet, verificación, troubleshooting) usa la guía Pixel Setup.
Qué es
El Relo Pixel es un snippet de JS (~50 KB, async, todo en try/catch) que corre en cualquier sitio web. Captura page views, formularios, compras, leads, engagement, scroll, clics y ~50 señales más. Los eventos van a p.relo.mx/e (sendBeacon con fallback XHR, cola con re-queue, batch de 10), el worker de pixel los enriquece con geo/UA y los reenvía al ingest Go, que resuelve identidad (cookie + fingerprint + hashes de PII), atribuye por click_id y escribe en ClickHouse en segundos.
API relo() — comandos
El snippet crea una cola (relo.q) hasta que r.js termina de cargar; después las llamadas se procesan directo. Comandos soportados:
| Comando | Firma | Qué hace |
|---|---|---|
init | relo('init', { client_id, ... }) | Inicializa identidad (device/session cookie, fingerprint, first/last touch) y arranca todos los trackers automáticos. Gate: consent bit 0x01. |
page | relo('page') | Dispara page_view (título, path, params, first/last touch, net info). Llamar en cada cambio de ruta en SPAs. |
event | relo('event', 'nombre', {...}) | Evento custom: purchase, view_product, add_to_cart, signup, lo que sea. |
purchase | relo('purchase', {...}) | Atajo de relo('event', 'purchase', ...). |
lead | relo('lead', {...}) | API explícita de lead-gen → dispara lead_submit. Ver sección abajo. |
identify | relo('identify', { email, phone, name }) | Resuelve identidad sin disparar conversión. Gate: consent bit 0x02. |
consent | relo('consent', 0xFF) o relo('consent', { analytics: true, dsp: false }) | Actualiza el consent bitmask en runtime (ej. desde un cookie banner). |
reset | relo('reset') | Limpia identidad (cookies _relo_did/_relo_sid/_relo_fp) — usar en logout. |
Opciones de init
| Opción | Default | Descripción |
|---|---|---|
client_id | — | Requerido. El id numérico del cliente en Relo (viene embebido en el snippet del portal). |
consent | 0xFF | Consent bitmask (tabla abajo). |
domain | auto | Cookie domain para identidad cross-subdomain (.tudominio.com). Sanitizado, máx 3KB. |
auto_lead_on_submit | false | Si true, cada submit de <form> también dispara lead_submit con lead_defaults. Ver Pixel Setup § Opcional A. |
lead_defaults | {} | Defaults del puente auto-lead: product, stage, lead_value, currency, form_id, lead_source. |
replay_enabled | false | Si true (y consent bit 0x10), carga replay.js para session replay. Normalmente lo controla la config server-side, no el snippet. |
replay_sample_rate | 100 | % de sesiones elegibles que se graban (0-100). |
Consent bitmask
| Bit | Hex | Scope | Si está OFF |
|---|---|---|---|
| 0 | 0x01 | analytics | El pixel no envía ningún evento (no-op total). |
| 1 | 0x02 | personalization | No captura identidad (email/phone hash) ni guarda fingerprint. |
| 2 | 0x04 | DSP export | El server no reenvía a Meta/Google (enforcement server-side). |
| 3 | 0x08 | cross-client | No comparte identidad entre clientes Relo. |
| 4 | 0x10 | session replay | No graba rrweb aunque replay_enabled esté on. |
Señales del browser que fuerzan bits off: navigator.doNotTrack apaga DSP (0x04); navigator.globalPrivacyControl apaga analytics + DSP (0x05).
Catálogo de eventos
| Evento | Cuándo |
|---|---|
page_view | Cada carga de página (+ relo('page') en SPAs) |
fp_ready | Fingerprint de dispositivo calculado (SHA-256; fallback djb2) |
identity | Email/phone detectado en un campo (blur/submit) — siempre hasheado |
form_start / form_submit / form_abandon | Primera interacción con un form / submit / salir sin enviar |
scroll | Profundidad 25/50/75/90/100% |
click | Cada clic con coordenadas (heatmap) |
engagement | pagehide/tab hidden con segundos activo/oculto y scroll máximo |
section_view | Sección entra al viewport (IntersectionObserver, 1s dwell) |
checkout_open | Detecta Stripe, MercadoPago, Conekta, OpenPay, PayU, PayPal, Kushki, Culqi |
net_quality / net_change | Calidad/cambio de conexión (navigator.connection + ping fallback) |
web_vitals | LCP, CLS, INP, FCP, TTFB |
rage_click / dead_click / double_click | Señales de frustración/UX |
js_error / promise_rejection / resource_error | Errores de la página |
| + ~30 más | outbound_click, cta_click, download_click, video_*, cookies_inventory, bot_signals, ad_blocker_detected, keystroke_rate, permission_state, pwa_*, … |
| Evento | Cómo dispararlo |
|---|---|
purchase | relo('event', 'purchase', { order_id, revenue, currency, ... }) |
view_product / add_to_cart / begin_checkout | relo('event', 'view_product', {...}) etc. |
lead_submit | relo('lead', {...}) — ver sección siguiente |
signup / custom | relo('event', 'mi_evento', {...}) |
API de Leads — relo('lead', {...})
Para clientes lead-gen (seguros, créditos, trials SaaS), usa la API explícita relo('lead', payload) en tu handler de submit. Distinta del evento automático form_submit: relo('lead', ...) te deja decidir qué submits califican como leads y adjuntar metadata (product, form_id, stage, lead_value) que aparece en el tab de Leads del partner. Incluye dedup client-side (30 min por email+form_id en localStorage) para no duplicar al refrescar la thank-you page.
// On form submit:
relo('lead', {
email: 'user@example.com', // hashed SHA-256 client-side
phone: '+525555551234', // hashed SHA-256 client-side
name: 'Juan Perez', // identity graph only
product: 'Auto Insurance', // shown in Leads tab
form_id: 'quote-home-v2',
stage: 'raw', // raw / qualified / rejected
lead_value: 50,
currency: 'USD',
utm_source: 'facebook',
utm_campaign: 'spring-2026',
extra: { // namespaced to x_* in Relo
coverage: 'full',
vehicle_year: 2023
}
});
Campos planos permitidos: product, form_id, lead_source, stage, lead_value, currency, utm_campaign, utm_source, notes, quote_id, product_type. Lo que pase en extra: {...} se copia con prefijo x_ (strings/numbers/booleans, máx 500 chars).
Privacidad
email/teléfono se hashean SHA-256 del lado cliente. Los partners solo ven un prefijo de 12 chars del hash — suficiente para dedup, no para ataques de diccionario. El PII crudo nunca sale del browser. (El endpoint server-side de lead push sí acepta PII completa — ver Pixel Setup § Opcional B.)
Atribución: el click wrapper t.relo.mx/c/:code pone la cookie _relo_cid en .relo.mx (visible server-side por p.relo.mx) y agrega &relo_click_id=<ulid> a la URL de destino; el pixel adopta ese valor y lo fija como cookie first-party en el dominio del cliente. Cada evento lleva el click_id y el ingest lo resuelve contra Redis para atribuir al partner y campaña. TTL: 30 días.
Session Replay (rrweb)
Para clientes pixel que opten, Relo graba sesiones DOM completas con rrweb y las reproduce en admin. Útil para depurar abandono de formulario y UX confuso. Apagado por default.
Tres gates para grabar
Todas deben ser verdaderas para que inicie la grabación:
replay_enabled = trueen la config del cliente (vía API, ver Pixel Setup § Opcional C)- Consent bit 4 (
0x10) — consentimiento del usuario random() * 100 < replay_sample_rate— control de costo 0-100
Privacy defaults
- All form inputs masked (
maskAllInputs: true) password/email/phoneget extra mask- no canvas, no fonts
- mousemove disabled (clicks captured)
Almacenamiento
- Bucket R2
relo-replays - Key:
client={cid}/YYYY-MM-DD/session={sid}/chunk-NNNNN.json.gz - 90-day TTL
Playback: Pixel Analytics → tab Replays (/v2/c/:slug/pixel-analytics, solo admin). Click a session → lazy-loads rrweb-player → stitches chunks from R2.
Tracking Types: MMP vs Pixel vs Hybrid
Cada cliente tiene un tracking_type que controla qué dashboards ven los partners. Las campañas pueden sobrescribir el default.
| Tipo | Fuente | Dashboards del partner |
|---|---|---|
mmp | AppsFlyer / Branch postbacks (Samsung-style) | Dashboard / Analytics / Orders (MMP) |
pixel | Relo Web Pixel (Quote-style, lead-gen) | PixelDashboard / PixelAnalytics / Leads |
hybrid | Accept both sources | defaults to MMP views, pixel visible in admin |
Se define al crear el cliente: wizard /v2/clients/new paso 1 (Identity). Se cambia después en Edit basics (/v2/c/:slug/setup-edit). Por campaña: Campaign Detail → Settings → Tracking Type o paso 1 del Campaign Launch Wizard.