Depuis iOS 14, la configuration recommandée par Meta est redondante : chaque événement part deux fois — une fois du navigateur (le pixel), une fois de votre serveur (la Conversions API). Le navigateur apporte les signaux de correspondance (fbp, fbc) ; le serveur assure que l'événement arrive même quand Safari, iOS ou un adblocker bloque le pixel.
Pour ne pas compter chaque vente deux fois, Meta applique une règle simple : deux événements reçus avec le même event_name et le même event_id dans une fenêtre de 48 heures sont fusionnés en un seul. C'est toute la déduplication. Et c'est précisément ce maillon qui manque — ou diverge — dans la majorité des installations que je scanne.
event_id cohérent avec le pixel.Symptôme n°1 : vous comptez trop. La CAPI envoie les achats, le pixel aussi, aucun event_id commun : votre colonne « Achats » dans le Gestionnaire de publicités gonfle de +20 à +100 % par rapport au back-office. Le smart bidding croit que tout fonctionne, votre CPA affiché est artificiellement beau, et vos décisions budgétaires reposent sur un mirage.
Symptôme n°2 : vous comptez trop peu. Pas de CAPI du tout (le cas des 8 marques scannées) : dès que le navigateur bloque le pixel — Safari et ses cookies à 7 jours, iOS, adblockers — la conversion disparaît purement. L'algorithme apprend sur un signal amputé et vos meilleures audiences semblent « ne pas convertir ».
Les deux symptômes ont la même racine : le lien entre les deux canaux d'envoi n'existe pas.
Purchase → total sur 7 jours, contre les commandes réelles de votre back-office. Écart supérieur à ±10 % = creusez.Purchase → « Afficher les détails ». Vous devez voir les deux canaux de réception — Navigateur et Serveur — avec la mention explicite d'événements dédupliqués. Un seul canal listé, ou deux canaux sans déduplication affichée : problème confirmé.event_id diverge.| Cause | Ce qui se passe | Où je le vois en scan |
|---|---|---|
| Pas de CAPI | Pixel seul → conversions perdues à chaque blocage navigateur | Aucun endpoint first-party, aucun envoi serveur |
| CAPI par plugin, pixel par thème | Deux installations qui s'ignorent → event_id absents ou différents | Doublons visibles dans le Gestionnaire d'événements |
event_name divergents | « Purchase » vs nom custom → jamais fusionnés, même avec un bon event_id | Deux événements distincts dans l'outil de test |
event_id régénéré | Chaque canal génère le sien → fusion impossible | IDs aléatoires des deux côtés |
| Purchase au rechargement | La page de confirmation renvoie l'événement à chaque visite → doublons même sans CAPI | Pas de garde sur le transaction_id |
La correction durable passe par une source unique de vérité pour la génération de l'event_id :
event_id est généré une seule fois, côté navigateur (souvent : transaction_id de la commande, ou un UUID poussé dans le dataLayer).eventID.event_id.event_name sont strictement identiques des deux côtés, et le purchase est protégé contre le rechargement de la page de confirmation (garde sur transaction_id).C'est exactement le périmètre d'un Tracking Fix server-side : conteneur serveur first-party, CAPI dédupliquée, GA4 propre et Consent Mode V2 — parce qu'une CAPI qui envoie des événements sans respecter le consentement échange un problème de mesure contre un problème juridique.
Une chose que je précise toujours : le server-side n'est pas une religion. Si votre volume est faible ou votre stack très simple, une dédup propre entre un pixel et une CAPI de plugin bien configurée peut suffire. C'est le genre d'arbitrage qui se tranche sur un scan réel, pas sur un article.
Je scanne votre stack avant le call et je vous montre, requêtes réseau à l'appui, si vos conversions comptent double — ou pas du tout.
Diagnostic gratuit — 30 minVous repartez avec le diagnostic, que l'on travaille ensemble ou non.