Shopify compte des commandes : chaque paiement validé écrit une ligne en base de données, sans dépendre du navigateur du client. GA4 compte des événements purchase : un signal émis par le navigateur (ou un serveur), qui doit survivre au consentement, aux bloqueurs, aux redirections de paiement et à l'implémentation elle-même. Le premier chiffre est comptable, le second est probabiliste. La question n'est donc pas « pourquoi il y a un écart » mais « mon écart est-il structurel ou pathologique, et de combien ».
Un visiteur qui clique « Tout refuser » sur votre bannière ne doit pas être suivi — et s'il achète, sa commande existe dans Shopify mais pas dans GA4 (hors modélisation). Avec un taux de refus typique de 15 à 35 % en France, c'est la première source d'écart. Vérification : comparez votre taux de refus CMP avec votre écart ; s'ils sont du même ordre, une grande partie de l'écart est expliquée — et saine.
uBlock et consorts bloquent les appels vers google-analytics.com ; Safari (ITP) limite les cookies. Selon l'audience, 5 à 20 % des visiteurs sont concernés. Vérification : segmentez votre écart par navigateur dans GA4 — un déficit disproportionné sur Safari/iOS est la signature classique. C'est le problème qu'un envoi serveur dédupliqué résout le mieux.
Paiements différés (virement, Klarna), retours depuis PayPal qui ne repassent pas par la page de confirmation, checkout modifié depuis Checkout Extensibility : autant de parcours où l'événement ne part jamais. Vérification : passez une commande test avec chaque moyen de paiement et regardez, dans l'onglet réseau, si l'appel /g/collect avec en=purchase part réellement.
Le client part vers PayPal ou sa banque (3-D Secure) et revient : sans configuration adaptée, GA4 ouvre une nouvelle session attribuée en referral au PSP — et selon l'implémentation, l'achat se rattache mal ou pas du tout. Vérification : cherchez paypal.com ou votre banque dans vos sources de sessions avec achat ; leur présence signale des exclusions de référence manquantes.
Trafic interne filtré trop largement, propriété de test qui reçoit les vraies commandes, ou l'inverse — deux propriétés qui se partagent les événements. Vérification : dans le code source et le réseau, comptez les tid=G-XXXX ; il ne doit y en avoir qu'un, celui de votre propriété principale.
Shopify et GA4 ne découpent pas forcément les journées sur le même fuseau, et « ventes » n'y a pas le même sens : commandes créées vs événements reçus, remboursements inclus ou non, taxes et port comptés différemment dans le value. Vérification : alignez les fuseaux dans les deux admins et comparez sur une semaine complète plutôt qu'au jour le jour.
| Cause | Type | Signature | Correction |
|---|---|---|---|
| Consentement refusé | Structurel | Écart ≈ taux de refus CMP | Consent Mode V2 + modélisation |
| Adblockers / ITP | Structurel | Déficit concentré sur Safari/iOS | Collecte server-side first-party |
| Purchase absent sur certains parcours | Pathologique | Écart corrélé au moyen de paiement | Événement serveur basé sur la commande |
| Redirections de paiement | Pathologique | PSP dans les sources de sessions | Referral exclusions + garde de session |
| Filtres / double propriété | Pathologique | Deux tid dans le réseau | Une propriété unique, filtres audités |
| Fuseaux / définitions | Comparaison | Écart qui « bouge » selon la période | Aligner fuseaux et périmètres |
L'ordre de traitement compte : corrigez d'abord le pathologique (purchase manquant, doubles propriétés, filtres), puis réduisez le structurel avec une collecte server-side qui fait transiter les événements par votre propre domaine — l'événement purchase se déclenche alors côté serveur, sur la commande réelle, plus sur la bonne volonté du navigateur. C'est le périmètre exact du Tracking Fix, et l'effet se mesure en couverture d'événements avant/après, pas en promesses.
Un écart résiduel subsistera toujours — le consentement refusé reste refusé, et c'est normal. L'objectif n'est pas 0 % d'écart : c'est un écart connu, stable et documenté, sur lequel on peut piloter un budget sans se raconter d'histoires.
Je scanne votre stack avant le call — réseau, dataLayer, consentement — et je vous montre d'où vient chaque point d'écart.
Diagnostic gratuit — 30 minVous repartez avec le diagnostic, que l'on travaille ensemble ou non.