Funcionamiento del seguimiento¶
Arquitectura de doble canal¶
Cada evento de seguimiento se dispara a través de dos canales simultáneamente:
- API de Conversiones (CA) — PHP/lado del servidor, enviado directamente a la Graph API de Facebook mediante el SDK de Facebook Business. Se dispara dentro de los hooks de PS, inmediatamente en la solicitud HTTP que lo origina.
- Facebook Pixel (JS) — llamadas
fbq()del lado del navegador, inyectadas mediante un script frontend compilado con Vite. El script sondea el servidor en busca de eventos en cola y los dispara confbq().
Ambos canales llevan el mismo event_id para que Facebook los deduplique automáticamente.
Flujo de eventos¶
1. Se dispara un hook de PS (p.ej. actionCartUpdateQuantityBefore)
└── CAEventBuilder::addToCart() construye el evento
├── Establece event_name, event_time, event_id (UUID), event_source_url, user_data, custom_data
└── CAEventBuilder::sendEvent()
├── Envía el evento a la Graph API de Facebook (canal CA)
└── Persiste la fila FbpEvent en la tabla fbp_event
├── ca_sent = 1
├── js_sent = 0
└── js_event = payload JSON para la llamada fbq() del lado del navegador
2. El navegador carga la página, el JS frontend se inicia
└── Sondea ConsumerController (?action=poll)
└── Devuelve: { pixel: { pixel_id, external_id }, events: [ { id, event_type, js_event } ] }
└── Para cada evento:
├── fbq('track', event_type, js_event_data) ← dispara el píxel
└── Llama a ConsumerController (?action=confirm&id_fbp_event=N)
└── Marca fbp_event.js_sent = 1
Contexto del invitado¶
En cada inicialización del front controller (actionFrontControllerInitAfter), el módulo captura:
- User agent —
$_SERVER['HTTP_USER_AGENT'] - IP del cliente — mediante
Tools::getRemoteAddr() - Cookie
_fbp— ID de navegador de Facebook, persistente entre sesiones - Cookie
_fbc— ID de clic de Facebook, establecido cuando un usuario llega mediante un anuncio de Facebook
Estos valores se almacenan en fbp_guest_context con la clave id_guest y se adjuntan al user_data de cada evento CA. Si el usuario está autenticado, el nombre, el correo electrónico y la fecha de nacimiento también se hashean e incluyen.
Remapeo de ID de invitado¶
PrestaShop puede renovar id_guest durante el pago (p.ej. al crear el pedido). Cuando esto ocurre, los eventos en cola bajo el ID de invitado antiguo nunca serían sondeados por el navegador (que ahora tiene el nuevo id_guest).
El módulo gestiona esto en dos lugares:
hookActionFrontControllerInitAfter— si se ve_fbpasociado con unid_guestdiferente, los eventos pendientes para el invitado obsoleto se remapean al invitado actual.ConsumerController::remapStaleGuestEvents()— una red de seguridad: ejecuta la misma lógica de remapeo antes de la consulta de sondeo, capturando los casos en que la renovación ocurrió después de que se disparara el hook.
Formato del ID de producto¶
El ID de producto usado en los eventos de seguimiento sigue los indicadores de formato de ID (cs_id_format) y usar referencia (cs_use_reference_id) de la configuración del píxel:
- Predeterminado:
{id}→"42"(ID de producto) o"42-7"(ID de producto + ID de combinación cuando se exportan combinaciones) - Plantilla personalizada: p.ej.
ps_{id}→"ps_42" - Modo de referencia:
{ref}→ valor del campo de referencia del producto
Esto debe coincidir con lo que usa la exportación del catálogo, para que los eventos de seguimiento referencien los mismos IDs que el feed.
Deduplicación¶
A cada evento se le asigna un event_id único (generado por Utilities::createEventId()). El mismo ID se usa tanto para el evento CA como para el evento JS del píxel almacenado en fbp_event.event_id. Facebook lo usa para deduplicar.
Tabla fbp_event¶
| Columna | Descripción |
|---|---|
id_fbp_event |
Clave primaria de auto-incremento |
id_guest |
ID de invitado de PS al que pertenece este evento |
event_type |
Nombre del evento de Facebook (p.ej. AddToCart) |
ca_event |
JSON del evento CA sin procesar (actualmente almacenado como {}) |
js_event |
Payload JSON para la llamada fbq() del lado del navegador |
ca_sent |
1 cuando el canal CA ha enviado este evento |
js_sent |
1 cuando el navegador ha confirmado el disparo de fbq() |
event_id |
ID de deduplicación compartido |
external_id |
ID externo del invitado hasheado |
creation_date |
Cuándo se creó el evento |
update_date |
Marca de tiempo de la última actualización |