GA4 via le serveur

Objectif : que plus aucun hit GA4 ne parte du navigateur vers Google. Tout transite par sgtm.monsite.fr, où vous gardez la main sur les données avant de les relayer à GA4.

Server-Side Niveau : intermédiaire ~25 min

Le principe

Le flux se décompose en trois temps :

  1. Le tag Google (GA4) du conteneur web envoie ses hits /g/collect vers votre endpoint first-party au lieu de google-analytics.com.
  2. Le client GA4 du conteneur serveur revendique ces requêtes et les transforme en événements.
  3. Le tag GA4 serveur relaie (et éventuellement enrichit/filtre) les événements vers Google Analytics.

Étape 1 — Côté conteneur web

Dans votre tag Google Tag (conteneur web), ajoutez le paramètre de configuration :

ParamètreValeur
server_container_urlhttps://sgtm.monsite.fr
first_party_collectiontrue (recommandé)

Équivalent en gtag.js pur, si le site n'utilise pas GTM web :

HTML — gtag.js avec transport vers le serveur
<script async src="https://sgtm.monsite.fr/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){ dataLayer.push(arguments); }
  gtag('js', new Date());

  gtag('config', 'G-XXXXXXXXXX', {
    server_container_url: 'https://sgtm.monsite.fr'
  });
</script>
💡
Servir gtag.js depuis votre domaineNotez le src du script : le conteneur serveur sait aussi servir la librairie gtag.js elle-même. Un bloqueur qui filtre googletagmanager.com ne bloquera pas ce chargement first-party.

Étape 2 — Le client GA4 serveur

Dans le conteneur serveur, le client « GA4 » est présent par défaut. Vérifiez dans Clients → GA4 :

Étape 3 — Le tag GA4 serveur

1

Créer le tag

Tags → Nouveau → Google Analytics : GA4. Par défaut il hérite des champs de l'événement entrant : inutile de re-mapper quoi que ce soit pour un simple relais.

2

Déclencheur

Ajoutez un déclencheur personnalisé : Client Name = GA4. Ainsi, tout événement revendiqué par le client GA4 est relayé.

3

Enrichir ou filtrer (optionnel)

C'est ici que le server-side prend sa valeur : supprimer un paramètre sensible, réécrire une URL, ajouter une donnée CRM via une variable Firestore, etc. Exemple courant : retirer les PII d'une page_location.

Étape 4 — Événements e-commerce

Les événements e-commerce GA4 transitent tels quels : c'est le format du dataLayer web qui compte. Exemples à réutiliser dans vos démos :

JavaScript — view_item
dataLayer.push({ ecommerce: null }); // on vide l'objet précédent
dataLayer.push({
  event: "view_item",
  ecommerce: {
    currency: "EUR",
    value: 89.90,
    items: [{
      item_id: "SKU_TSHIRT_BLEU",
      item_name: "T-shirt Sirdata Blue",
      item_brand: "Sirdata",
      item_category: "Vêtements",
      price: 89.90,
      quantity: 1
    }]
  }
});
JavaScript — purchase
dataLayer.push({ ecommerce: null });
dataLayer.push({
  event: "purchase",
  ecommerce: {
    transaction_id: "T-2026-0042",
    currency: "EUR",
    value: 159.80,
    tax: 26.63,
    shipping: 4.99,
    coupon: "DEMO10",
    items: [
      {
        item_id: "SKU_TSHIRT_BLEU",
        item_name: "T-shirt Sirdata Blue",
        item_brand: "Sirdata",
        price: 89.90,
        quantity: 1
      },
      {
        item_id: "SKU_HOODIE_VERT",
        item_name: "Hoodie ABconsent Green",
        item_brand: "Sirdata",
        price: 69.90,
        quantity: 1
      }
    ]
  }
});

🧪 À rejouer en démo : le playground contient tout le funnel e-commerce (view_itemadd_to_cartbegin_checkoutpurchase).

Ouvrir le playground

Étape 5 — Vérifier & déboguer

JavaScript — événement avec debug_mode
dataLayer.push({
  event: "demo_debug",
  debug_mode: true,
  demo_label: "visible dans GA4 DebugView"
});
⚠️
Pensez au consentementRouter GA4 par votre serveur ne dispense pas du recueil de consentement : les hits analytics restent soumis à analytics_storage. La suite logique est le tuto Consent Mode v2 & CMP Sirdata.