Accueil
Expertises Toutes les expertises Server-side GTM & dataLayer Analytics Conversion API Data Warehouse
Cas clients Tous les cas clients E-commerce SaaS Apps mobiles Lead generation
Ressources Toutes les ressources Google Tag Manager Mobile App Tracking RGPD & Consent Mode Google Analytics (GA4) Server-side tracking
Outils gratuits Tous les outils Diagnostic server-side Générateur de plan de tracking
À propos Prendre RDV
GOOGLE TAG MANAGER

Comment Tracker une Iframe avec Google Tag Manager

Comment tracker une iframe avec GTM malgré la same-origin policy : la méthode postMessage, les cas Calendly et Typeform, et le choix entre un ou deux conteneurs GTM.

· 9 min de lecture
Dans ce guide
  1. La vraie limite : la same-origin policy
  2. postMessage, la méthode standard
  3. Quand vous ne contrôlez pas le code de l'iframe
  4. Un conteneur GTM dans l'iframe, ou un seul sur la page parente ?

Tracker ce qui se passe à l'intérieur d'une iframe (formulaire embarqué, prise de rendez-vous, simulateur tiers) est un cas classique mal documenté, parce que la vraie contrainte n'est pas dans GTM, elle est dans le navigateur lui-même.

La vraie limite : la same-origin policy

Confirmé par la documentation MDN : l'accès aux propriétés d'une fenêtre chargée depuis une autre origine est bloqué par le navigateur, y compris pour un script à l'intérieur d'une iframe qui voudrait accéder à sa page parente. Via contentWindow ou contentDocument, la page parente peut accéder au DOM de l'iframe seulement si elles partagent la même origine (même protocole, domaine et port). En cross-origin, cet accès est très restreint. Ce n'est pas une limitation de GTM, c'est une protection de sécurité du navigateur, aucun tag ni aucune configuration GTM ne la contourne.

postMessage, la méthode standard

Le seul canal de communication documenté entre deux origines différentes est Window.postMessage(). Le principe : l'iframe émet un message, la page parente l'écoute et relaie l'information dans le dataLayer.

Côté iframe (si vous contrôlez son code) :

code
window.parent.postMessage({
  event: "form_submitted",
  data: { formName: "contact" }
}, "https://votre-domaine-parent.com");

Côté page parente, dans une balise HTML personnalisée GTM :

code
window.addEventListener("message", function(e) {
  if (e.origin !== "https://domaine-iframe.com") return;
  if (e.data && e.data.event === "form_submitted") {
    window.dataLayer.push({
      event: "form_submitted",
      formData: e.data.data
    });
  }
});

Deux points de sécurité documentés à respecter systématiquement : ne jamais émettre avec postMessage(payload, '*'), qui envoie le message à n'importe quel parent sur n'importe quel domaine, et toujours vérifier e.origin côté réception avant de traiter le message, sous peine d'accepter des données injectées par une page tierce malveillante.

Quand vous ne contrôlez pas le code de l'iframe

Pour une iframe tierce (widget de prise de rendez-vous, formulaire externe), tout dépend de si le fournisseur envoie déjà des postMessage documentés.

Calendly : confirmé par sa documentation développeur officielle. L'embed standard Calendly envoie des événements avec le préfixe calendly., dont calendly.profile_page_viewed, calendly.event_type_viewed, calendly.date_and_time_selected et calendly.event_scheduled :

code
function isCalendlyEvent(e) {
  return e.origin === "https://calendly.com" && e.data.event && e.data.event.indexOf("calendly.") === 0;
}
window.addEventListener("message", function(e) {
  if (isCalendlyEvent(e)) {
    window.dataLayer.push({ event: e.data.event, calendlyPayload: e.data.payload });
  }
});

Point à vérifier avant de copier ce code tel quel : ça ne fonctionne que via l'embed JS standard de Calendly, pas via une iframe brute sans son script d'intégration.

Typeform : la documentation officielle met surtout en avant un système de callbacks (onSubmit) via son SDK d'embed, plus que du postMessage brut à écouter soi-même. Un événement form-submit observable en écoute passive existe et est utilisé par des implémentations tierces, mais il est moins formellement documenté par Typeform elle-même que ne l'est le système Calendly, à traiter avec cette réserve avant de bâtir un tracking dessus.

Un conteneur GTM dans l'iframe, ou un seul sur la page parente ?

Aucune position officielle Google ne tranche ce choix, mais la pratique convergente des consultants tracking donne une règle simple : quand vous contrôlez le code de l'iframe, un seul conteneur sur la page parente avec la méthode postMessage ci-dessus reste préférable, ça garde un Client ID et un Session ID unifiés côté domaine parent et évite la duplication de mesure. Un second conteneur GTM installé directement dans l'iframe se justifie quand l'iframe vit sur un domaine distinct avec son propre besoin de mesure autonome, ou quand vous n'avez aucune main sur le code de la page parente. Le risque documenté dans ce second cas : les déclencheurs standards ("Toutes les pages", clics) du conteneur de l'iframe se déclenchent aussi dans son propre contexte et peuvent générer des données dupliquées ou incorrectes si les tags ne sont pas contraints par des exceptions vérifiant le nom d'hôte.

Une implémentation plus complexe à discuter ?

Discuter de votre tracking
Christophe Dubois
Christophe Dubois

Consultant tracking & data, freelance senior depuis 2012. Architecture de mesure, server-side, attribution.

Remonter en haut

Besoin d'un accompagnement sur ce sujet ?

Freelance google tag manager
POUR ALLER PLUS LOIN

Articles liés

Server side Tracking

Piwik PRO : Mesure Hybride (First-Party Collector) et Installation avec GTM

Ce que signifie réellement la mesure hybride chez Piwik PRO, son Consent Manager intégré et son intégration Google Consent Mode, sa grille tarifaire réelle, et les templates GTM officiels.

12 Jun. 2026 ·11 min
Google Tag Manager

Comment Mettre en Place le 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.

23 Sep. 2025 ·11 min
Server side Tracking

Google Tag Gateway (GTG) : Fonctionnement, Interet et Limites

Google Tag Gateway expliqué : first-party serving via Cloudflare, Akamai ou Fastly, différence réelle avec le server-side GTM, mise en place et le point de vigilance RGPD sur le consentement.

14 Jul. 2026 ·9 min
Google Tag Manager

Comment Installer Google Tag Manager sur Ecwid : Guide Complet

Installer Google Tag Manager sur Ecwid : connexion native, piège de l'iframe, et événements e-commerce réels (achat, panier) avec la JS API storefront.

08 Jun. 2026 ·13 min
RGPD - Consent Mode

Consent Mode v2 sur WooCommerce : CMP, GTM et conversions

Consent Mode v2 sur WooCommerce : CMP, GTM Consent Initialization, tags GA4/Ads, et comment éviter de tuer vos conversions.

16 Sep. 2026 ·9 min
Audit Tracking

Auditer le tracking PrestaShop : conversions, funnels et ROAS faussés

Audit tracking PrestaShop : plugins vs GTM, écarts commandes/GA4/Ads, Consent Mode, funnels et plan de correction ROAS.

16 Sep. 2026 ·10 min
Audit Tracking

Auditer le tracking Shopify : pourquoi vos achats remontent mal

Audit tracking Shopify : écarts achats vs GA4/Ads/Meta, pixels doublons, checkout, Consent Mode et plan de correction actionnable.

16 Sep. 2026 ·10 min
Google Tag Manager

Comment tracker un formulaire Brevo (ex-Sendinblue) avec GTM

Tracker un formulaire Brevo avec GTM : script MutationObserver sur #success-message, dataLayer generate_lead, Element Visibility et pièges iframe.

16 Sep. 2026 ·9 min
Paid Acquisition

TikTok Pixel & Events API : implémentation avec GTM (web + server-side)

Installer TikTok Pixel et Events API via GTM : events ecom/lead, event_id pour dédup, server-side et checklist de debug TikTok.

16 Sep. 2026 ·11 min
Google Tag Manager

Installer Google Tag Manager sur WooCommerce (guide complet)

Installer GTM sur WooCommerce : dataLayer e-commerce, events GA4, Consent Mode, pièges plugins et checklist pour des achats fiables.

16 Sep. 2026 ·12 min
Google Tag Manager

Comment tracker un formulaire avec GTM (méthode universelle)

Méthode universelle pour tracker un formulaire avec GTM : dataLayer, submit vs thank-you, GA4, Ads, Meta, déduplication et checklist de recette.

16 Sep. 2026 ·11 min
Audit Tracking

Audit des conversions dupliquées Google Ads × Meta : comment les détecter et les corriger

Vos conversions Google Ads et Meta sont-elles comptées deux fois ? Méthode d’audit : pixel + CAPI, Conversion Linker, GTM, et corrections concrètes.

16 Sep. 2026 ·9 min
SERVICES ASSOCIÉS

Pour aller plus loin sur votre projet

EXPERTISE ASSOCIÉE

GTM & dataLayer

GTM & dataLayer

Un conteneur mal structuré suffit à fausser vos conversions, votre ROAS et vos arbitrages marketing.

Voir l'expertise
FAQ

Questions fréquemment posées

Pourquoi ne peut-on pas simplement lire le contenu d'une iframe depuis GTM ?

À cause de la same-origin policy du navigateur : l'accès au DOM d'une iframe depuis la page parente (ou l'inverse) n'est possible que si les deux partagent la même origine. C'est une protection de sécurité du navigateur, pas une limitation de GTM.

Comment faire remonter un événement depuis une iframe vers le dataLayer ?

Via window.postMessage() côté iframe et un écouteur window.addEventListener('message', ...) côté page parente qui relaie les données reçues vers dataLayer.push(). Il faut toujours vérifier e.origin en réception et ne jamais émettre avec un destinataire '*'.

Calendly envoie-t-il des événements exploitables pour le tracking ?

Oui, confirmé par sa documentation officielle : l'embed JS standard Calendly envoie des postMessage préfixés calendly. (profile_page_viewed, event_type_viewed, date_and_time_selected, event_scheduled), à condition d'utiliser l'embed standard et pas une iframe brute sans son script.

Faut-il installer un second conteneur GTM à l'intérieur d'une iframe ?

Seulement si l'iframe est sur un domaine distinct avec un besoin de mesure autonome, ou si vous n'avez pas accès au code de la page parente. Sinon, un seul conteneur sur la page parente avec la méthode postMessage évite la duplication de mesure et garde une identité de session unifiée.

Prendre rendez-vous