Suivi Matomo avec Google Tag Manager (Client-Side)
Mettre en place le tracking Matomo côté client avec GTM : la balise HTML personnalisée pour le self-hosted, le consentement natif Matomo, l'e-commerce et les dimensions personnalisées.
Dans ce guide
Il existe bien un tag officiel Matomo dans la Community Template Gallery de GTM, mais avec une restriction qui n'est pas toujours vue avant de perdre du temps à l'installer : il ne fonctionne que sur Matomo Cloud.
Le tag officiel Matomo, réservé au Cloud
Le template "Matomo Tracking Tag", maintenu par l'organisation matomo-org, est bien présent dans la Community Template Gallery de GTM. Sa documentation officielle est explicite : "This tag is only compatible with Matomo cloud instances, as URL(s) or URL patterns need to be specified in advance." Si votre instance Matomo est self-hosted (sur votre propre serveur), ce template ne convient pas, quelle que soit la configuration que vous essayez.
Pour du Matomo self-hosted : la balise HTML personnalisée
La méthode documentée par Matomo elle-même pour une instance self-hosted reste la balise HTML personnalisée avec le tracker JS classique, le même que celui utilisé hors GTM :
var _paq = window._paq = window._paq || [];
_paq.push(['setCustomUrl', '{{Page URL}}']);
_paq.push(['setDocumentTitle', '{{Page Title}}']);
_paq.push(['trackPageView']);
_paq.push(['enableLinkTracking']);
(function() {
var u = "https://votre-instance-matomo.exemple.com/";
_paq.push(['setTrackerUrl', u + 'matomo.php']);
_paq.push(['setSiteId', '1']);
var d = document, g = d.createElement('script'), s = d.getElementsByTagName('script')[0];
g.async = true;
g.src = u + 'matomo.js';
s.parentNode.insertBefore(g, s);
})();
Les variables GTM ({{Page URL}}, {{Page Title}}...) s'injectent directement dans les appels _paq.push, exactement comme pour n'importe quelle balise personnalisée. Il existe aussi des templates communautaires non officiels pour le self-hosted (par exemple sur GitHub), mais ce ne sont pas des templates maintenus par Matomo, à évaluer au cas par cas avant de les déployer en production.
Le consentement natif de Matomo, et son absence de pont avec Google Consent Mode
Le tracker JS Matomo expose sa propre API de consentement, documentée avec des fonctions précises :
_paq.push(['requireConsent']);bloque tout tracking (requêtes et cookies) tant qu'aucun consentement n'est donné._paq.push(['requireCookieConsent']);autorise les requêtes mais bloque uniquement la pose de cookies tant que le consentement cookie n'est pas donné, une nuance utile si vous voulez mesurer sans cookie plutôt que ne rien mesurer du tout._paq.push(['setConsentGiven']);et_paq.push(['setCookieConsentGiven']);signalent un consentement ponctuel, à rappeler sur chaque page si géré par une CMP externe._paq.push(['rememberConsentGiven']);(avec une durée optionnelle en heures) et_paq.push(['rememberCookieConsentGiven']);mémorisent le consentement via un cookie dédié (mtm_consentoumtm_cookie_consent), pour ne pas le redemander à chaque page._paq.push(['forgetConsentGiven']);et_paq.push(['forgetCookieConsentGiven']);retirent un consentement précédemment mémorisé.
Point à ne pas survoler si votre GTM fait cohabiter des tags Google et Matomo dans le même conteneur : la documentation officielle du tracker Matomo ne mentionne aucune intégration native avec le Google Consent Mode, seulement des intégrations documentées avec des CMP tierces (Cookiebot, CookieYes, Osano, Tarte au Citron, Klaro, Complianz). Il n'existe pas de passerelle officielle Matomo qui route automatiquement l'état de consentement vers les deux systèmes. En pratique, il faut le faire soi-même : un déclencheur GTM sur le changement de consentement qui appelle à la fois gtag('consent', 'update', ...) pour les tags Google et _paq.push(['setConsentGiven']) (ou rememberConsentGiven) pour Matomo, plutôt que de supposer une synchronisation automatique qui n'existe pas.
Suivre l'e-commerce via _paq
La syntaxe officielle pour tracker manuellement l'e-commerce, à placer dans les balises appropriées selon l'événement :
// Vue produit
_paq.push(['setEcommerceView',
"0123456789", // SKU (obligatoire)
"Ecommerce Analytics Book", // nom produit (optionnel)
"Books", // categorie (optionnel)
9.99 // prix (optionnel)
]);
// Ajout panier
_paq.push(['addEcommerceItem',
"0123456789",
"Ecommerce Analytics Book",
["Books", "Best sellers"],
9.99,
1
]);
// Commande finalisee
_paq.push(['trackEcommerceOrder',
"000123", // ID commande (obligatoire)
10.99, // total (obligatoire)
9.99, // sous-total (optionnel)
1.5, // taxe (optionnel)
1, // frais de port (optionnel)
false // remise (optionnel)
]);
Point souvent raté : les montants doivent être transmis en tant que nombres (int ou float), jamais en chaîne formatée comme "9,99€", au risque que Matomo n'enregistre pas la valeur correctement.
Définir une dimension personnalisée
_paq.push(['setCustomDimension', 1, valeur]); doit impérativement être placé avant l'appel trackPageView ou trackEvent correspondant, dans la même balise HTML personnalisée GTM. Si l'ordre est inversé, la dimension n'est tout simplement pas rattachée au hit envoyé, une erreur d'ordre silencieuse qui ne remonte aucune erreur visible dans GTM.
Suivre une SPA avec ce montage
Pour un site en single-page application, la documentation Matomo recommande de déclencher trackPageView sur un déclencheur "History Change" plutôt que sur "Toutes les pages", pour capturer les changements de vue qui ne rechargent pas la page côté navigateur. Sans ça, seule la première vue de la session serait comptabilisée, toute la navigation suivante dans l'application passerait inaperçue.
Une implémentation plus complexe à discuter ?
Discuter de votre trackingCet enjeu mérite un accompagnement dédié.
Freelance web analyticsArticles liés
Pour aller plus loin sur votre projet
Analytics (GA4, Matomo, Piano)
Analytics (GA4, Matomo, Piano)
Une configuration analytics avancée adaptée à votre e-commerce ou votre produit, pas juste l'installation par défaut.
Voir l'expertiseQuestions fréquemment posées
Le template Matomo officiel de GTM fonctionne-t-il avec une instance self-hosted ?
Non. Le template 'Matomo Tracking Tag' de la Community Template Gallery est explicitement réservé aux instances Matomo Cloud. Pour du self-hosted, il faut passer par une balise HTML personnalisée avec le tracker JS classique.
Matomo s'intègre-t-il nativement avec le Google Consent Mode ?
Non, aucune intégration native n'est documentée par Matomo. Sa documentation officielle ne couvre que des CMP tierces (Cookiebot, CookieYes, Osano...). Faire cohabiter Matomo et des tags Google avec Consent Mode demande de router soi-même le signal de consentement vers les deux systèmes.
Comment tracker une commande e-commerce avec Matomo dans GTM ?
Via trackEcommerceOrder(orderId, total, ...) en complément de setEcommerceView et addEcommerceItem pour les vues produit et ajouts panier. Les montants doivent être des nombres, jamais des chaînes formatées avec une devise.
Pourquoi ma dimension personnalisée Matomo n'apparaît-elle pas dans les rapports ?
Le plus souvent parce que setCustomDimension a été appelé après trackPageView ou trackEvent au lieu d'avant, dans la même balise. L'ordre des appels _paq.push détermine si la dimension est rattachée au hit ou ignorée silencieusement.