Fonctionnement du suivi¶
Architecture double canal¶
Chaque événement de suivi est déclenché via deux canaux simultanément :
- API Conversions (CA) — PHP/côté serveur, envoyé directement à l'API Graph de Facebook via le SDK Facebook Business. Se déclenche dans les hooks PS, immédiatement lors de la requête HTTP déclencheuse.
- Facebook Pixel (JS) — appels
fbq()côté navigateur, injectés via un script frontend compilé avec Vite. Le script sonde le serveur pour les événements en attente et les déclenche avecfbq().
Les deux canaux portent le même event_id pour que Facebook les déduplique automatiquement.
Flux d'événements¶
1. Un hook PS se déclenche (ex. actionCartUpdateQuantityBefore)
└── CAEventBuilder::addToCart() construit l'événement
├── Définit event_name, event_time, event_id (UUID), event_source_url, user_data, custom_data
└── CAEventBuilder::sendEvent()
├── Envoie l'événement à l'API Graph de Facebook (canal CA)
└── Persiste la ligne FbpEvent dans la table fbp_event
├── ca_sent = 1
├── js_sent = 0
└── js_event = payload JSON pour l'appel fbq() côté navigateur
2. Le navigateur charge la page, le JS frontend démarre
└── Sonde ConsumerController (?action=poll)
└── Retourne : { pixel: { pixel_id, external_id }, events: [ { id, event_type, js_event } ] }
└── Pour chaque événement :
├── fbq('track', event_type, js_event_data) ← déclenche le pixel
└── Appelle ConsumerController (?action=confirm&id_fbp_event=N)
└── Marque fbp_event.js_sent = 1
Contexte de l'invité¶
À chaque initialisation du front controller (actionFrontControllerInitAfter), le module capture :
- User agent —
$_SERVER['HTTP_USER_AGENT'] - IP client — via
Tools::getRemoteAddr() - Cookie
_fbp— ID navigateur Facebook, persisté entre les sessions - Cookie
_fbc— ID de clic Facebook, défini quand un utilisateur arrive via une annonce Facebook
Ces valeurs sont stockées dans fbp_guest_context indexées par id_guest et attachées au user_data de chaque événement CA. Si l'utilisateur est connecté, le nom, l'email et la date de naissance sont également hachés et inclus.
Remapping de l'ID invité¶
PrestaShop peut renouveler id_guest lors du paiement (ex. à la création de la commande). Lorsque cela se produit, les événements en attente sous l'ancien ID invité ne seraient jamais sondés par le navigateur (qui a maintenant le nouveau id_guest).
Le module gère cela à deux endroits :
hookActionFrontControllerInitAfter— si_fbpest vu associé à unid_guestdifférent, les événements en attente pour l'invité obsolète sont remappés vers l'invité actuel.ConsumerController::remapStaleGuestEvents()— un filet de sécurité : exécute la même logique de remapping avant la requête de sondage, capturant les cas où le renouvellement s'est produit après le déclenchement du hook.
Formatage de l'ID produit¶
L'ID produit utilisé dans les événements de suivi suit les indicateurs de format d'ID (cs_id_format) et utiliser la référence (cs_use_reference_id) des paramètres du pixel :
- Par défaut :
{id}→"42"(ID produit) ou"42-7"(ID produit + ID déclinaison quand les déclinaisons sont exportées) - Modèle personnalisé : ex.
ps_{id}→"ps_42" - Mode référence :
{ref}→ valeur du champ référence du produit
Cela doit correspondre à ce qu'utilise l'export du catalogue, pour que les événements de suivi référencent les mêmes IDs que le flux.
Déduplication¶
Chaque événement reçoit un event_id unique (généré par Utilities::createEventId()). Le même ID est utilisé à la fois pour l'événement CA et l'événement JS pixel stocké dans fbp_event.event_id. Facebook l'utilise pour dédupliquer.
Table fbp_event¶
| Colonne | Description |
|---|---|
id_fbp_event |
Clé primaire auto-incrémentée |
id_guest |
ID invité PS auquel appartient cet événement |
event_type |
Nom d'événement Facebook (ex. AddToCart) |
ca_event |
JSON brut de l'événement CA (actuellement stocké comme {}) |
js_event |
Payload JSON pour l'appel fbq() côté navigateur |
ca_sent |
1 quand le canal CA a envoyé cet événement |
js_sent |
1 quand le navigateur a confirmé le déclenchement de fbq() |
event_id |
ID de déduplication partagé |
external_id |
ID externe invité haché |
creation_date |
Date de création de l'événement |
update_date |
Horodatage de la dernière mise à jour |