GTM server-side déplace l'exécution du tracking de l'appareil de l'utilisateur vers votre infrastructure. Moins de tags côté client, meilleure performance, contournement des bloqueurs de publicité et données first-party : voici comment l'implémenter concrètement dans PrestaShop.
Pourquoi passer au GTM server-side ?
Le GTM classique (client-side) charge tous ses tags directement dans le navigateur de l'utilisateur. Résultat : chaque pixel de tracking alourdit le chargement, les ad-blockers bloquent une part croissante des événements, et iOS 17+ avec le Private Relay opacifie les données de navigation.
Avec le GTM server-side, le flux change radicalement :
- Le navigateur envoie un seul hit vers votre serveur de tagging (au lieu de 5-10 requêtes vers des tiers)
- Votre serveur relaie les données vers GA4, Meta CAPI, Google Ads, etc.
- Les cookies first-party remplacent les cookies tiers, avec une durée de vie maîtrisée
- Le LCP s'améliore : moins de JavaScript tiers exécuté au chargement
Architecture cible pour PrestaShop
Voici l'architecture standard que nous allons mettre en place :
Navigateur (PrestaShop)
│
├─ Container GTM client → /gtm.js (chargé depuis votre domaine)
│ dataLayer.push({...})
│
└─ Hit vers sGTM → https://tracking.votre-boutique.com/collect
│
Serveur GTM (Cloud Run / GCP)
│
┌──────────────┼──────────────┐
▼ ▼ ▼
GA4 MP Meta CAPI Google Ads
La clé : le sous-domaine tracking.votre-boutique.com est servi depuis votre propre infrastructure. Pour les navigateurs, c'est un cookie first-party, donc non soumis aux restrictions ITP d'Apple.
Étape 1 : Déployer le serveur GTM sur Google Cloud Run
Google propose une image Docker officielle pour le serveur GTM. La solution la plus simple et économique pour un site e-commerce standard est Cloud Run.
# Déploiement via gcloud CLI
gcloud run deploy gtm-server \
--image gcr.io/cloud-tagging-10302018/gtm-cloud-image:stable \
--platform managed \
--region europe-west1 \
--set-env-vars CONTAINER_CONFIG=VOTRE_CONFIG_ID \
--allow-unauthenticated \
--min-instances 1 \
--max-instances 10
Le CONTAINER_CONFIG est récupéré dans l'interface GTM : Admin → Paramètres du container serveur → Récupérer le snippet de configuration.
Configurer le sous-domaine first-party
Dans votre DNS (Cloudflare, OVH, etc.), créez un enregistrement CNAME :
tracking.votre-boutique.com CNAME gtm-server-xxxx.run.app
Puis dans Cloud Run, ajoutez ce domaine personnalisé pour obtenir un certificat SSL automatique.
Étape 2 : Configurer le container client GTM
Dans GTM, le container client doit pointer vers votre serveur au lieu des serveurs Google. Deux paramètres à modifier :
Modifier l'URL du serveur de tagging
Dans GTM → Admin → Paramètres du container web, définissez le Server Container URL :
https://tracking.votre-boutique.com
Charger gtm.js depuis votre domaine
Remplacez le snippet GTM standard dans votre thème PrestaShop par la version server-side. Dans themes/votre-theme/templates/_partials/head.tpl :
{* GTM Server-Side — charger le script depuis le serveur de tagging *}
Le fichier gtm.js est maintenant servi depuis votre domaine, contournant les bloqueurs qui filtrent googletagmanager.com.
Étape 3 : Pousser le dataLayer depuis PrestaShop
Le serveur GTM ne change pas la façon dont vous poushez des événements. Votre dataLayer existant reste valide. Voici les événements e-commerce essentiels à implémenter via un module ou un hook PrestaShop.
Hook sur la fiche produit
// Dans votre module, méthode hookDisplayHeader
public function hookDisplayHeader(array $params): string
{
$controller = $this->context->controller;
if (!$controller instanceof ProductControllerCore) {
return '';
}
$product = $controller->getTemplateVarProduct();
return $this->generateDataLayerScript([
'event' => 'view_item',
'ecommerce' => [
'currency' => $this->context->currency->iso_code,
'value' => $product['price_amount'],
'items' => [[
'item_id' => $product['id'],
'item_name' => $product['name'],
'item_category' => $product['category_name'],
'price' => $product['price_amount'],
'quantity' => 1,
]],
],
]);
}
private function generateDataLayerScript(array $data): string
{
return '';
}
Événement purchase sur la page de confirmation
public function hookDisplayOrderConfirmation(array $params): string
{
$order = $params['order'];
$items = array_map(
fn(OrderDetail $detail) => [
'item_id' => $detail->product_reference,
'item_name' => $detail->product_name,
'price' => (float) $detail->unit_price_tax_incl,
'quantity' => (int) $detail->product_quantity,
],
$order->getOrderDetailList()
);
return $this->generateDataLayerScript([
'event' => 'purchase',
'ecommerce' => [
'transaction_id' => (string) $order->id,
'value' => (float) $order->total_paid_tax_incl,
'tax' => (float) $order->total_paid_tax_excl - $order->total_paid_tax_incl,
'shipping' => (float) $order->total_shipping_tax_incl,
'currency' => Currency::getIsoCodeById((int) $order->id_currency),
'items' => $items,
],
]);
}
Étape 4 : Configurer les clients et tags dans le serveur GTM
Dans l'interface du container serveur GTM, vous devez configurer :
Client GA4
Ajoutez le client Google Analytics : GA4 (natif). Il intercepte les hits GA4 envoyés par le container client et les relaie vers les serveurs Google en ajoutant des enrichissements serveur (IP géolocalisation, user-agent parsing).
Tag GA4 côté serveur
Créez un tag Google Analytics : GA4 avec votre Measurement ID. Activez l'option Redéfinir la durée du cookie pour étendre _ga à 400 jours (maximum légal first-party) au lieu des 7 jours imposés par ITP.
Meta Conversions API (CAPI)
Le vrai gain du server-side : envoyer les conversions à Meta sans dépendre du pixel navigateur. Installez le tag Facebook Conversions API depuis la galerie GTM. Configurez :
- Access Token : généré dans Meta Business Manager → Paramètres → Pixel
- Pixel ID : votre identifiant pixel Meta
- Event Name : mappé depuis les événements dataLayer (
purchase→Purchase) - Hachage des données utilisateur : email, téléphone hashés en SHA-256 côté serveur
Les pièges courants à éviter
Ne pas oublier le Consent Mode v2
Le serveur GTM ne bypass pas le consentement. Vos tags serveur doivent respecter les signaux Consent Mode envoyés par le container client. Configurez le paramètre consent_state dans vos tags serveur et activez le mode avancé pour ne déclencher qu'après consentement.
Dédupliquer les événements Meta
Si vous avez le pixel Meta côté client ET la CAPI côté serveur, Meta recevra chaque événement deux fois. Utilisez le paramètre Event ID (identique côté client et serveur) pour la déduplication :
// Dans le dataLayer, générer un ID unique par événement
dataLayer.push({
event: 'purchase',
event_id: 'purchase_' + orderId + '_' + Date.now(),
// ...
});
Tester avant de mettre en production
GTM Server fournit un mode preview. Dans l'interface, activez le Preview mode : une URL de debug s'affiche qui intercepte vos requêtes et affiche le flux client → serveur → destinations en temps réel. Utilisez-le systématiquement avant de publier.
Résultats attendus
Après une implémentation complète, voici ce que constatent nos clients PrestaShop :
- +15 à 25% d'événements remontés via CAPI Meta par rapport au pixel seul (les bloqueurs n'affectent plus le serveur)
- Réduction de 20 à 40% du LCP sur mobile (moins de scripts tiers en rendu bloquant)
- Cookies first-party 400 jours vs 7 jours avec ITP d'Apple
- Conformité RGPD renforcée : les données PII ne transitent plus par des tiers avant hachage
Conclusion
Le GTM server-side n'est plus réservé aux grandes plateformes. Sur PrestaShop, l'implémentation est accessible en quelques jours et les gains sont immédiats : performance, qualité de données et conformité RGPD. La migration la plus impactante est celle de Meta CAPI — commencez par là si votre budget tracking Meta est significatif.
Besoin d'aide pour l'implémentation sur votre boutique ? Contactez-moi pour en discuter !