Tracker les rendez-vous Calendly avec Google Tag Manager Web et Server

Mis à jour : samedi 29 août 2026

L’outil de réservation de rendez-vous Calendly

Calendly est un outil gratuit qui permet à vos prospects de réserver des rendez-vous en ligne. C’est un concurrent de Cal.com ou encore Hubspot Meetings.

Lorsque vous utilisez Calendly, vous pouvez soit utiliser une page de Calendly sur laquelle s’affichera votre calendrier ou alors vous pouvez l’intégrer directement (embed) sur votre site web via une iframe.

La partie GTM Web de cet article (le listener qui détecte la réservation) fonctionne uniquement si vous avez intégré Calendly sur votre site web via une iframe (Inline embed, Popup widget ou Popup text).

Si vous envoyez vos prospects directement sur une page Calendly, cette partie ne s’applique pas, mais la variable GTM Server présentée plus bas fonctionne aussi à partir des webhooks Calendly (voir l’encadré « Et sans iframe ? »).

Différentes façons d'intégrer Calendly sur un site web via une iframe
Différentes façons d'intégrer Calendly sur un site web via une iframe

Je vais maintenant vous montrer comment suivre les réservations de rendez-vous Calendly et également comment récupérer les données de la personne qui a pris un rendez-vous (adresse email, numéro de téléphone, nom, mais aussi paramètres UTM, réponses au formulaire de réservation et données de paiement) pour les transmettre aux plateformes publicitaires.

Vue d’ensemble du flux de données

Vous trouverez dans le schéma ci-dessous une vue d’ensemble du flux de données qui se produit lors de la réservation d’un rendez-vous Calendly.

Schéma du flux de données d'une réservation Calendly : du site web à GTM Web, GTM Server, l'API Calendly et les plateformes publicitaires
Le flux de données d'une réservation Calendly

Installer le listener Calendly dans GTM Web

Pour écouter la réservation de rendez-vous, vous devez ajouter ce code dans Google Tag Manager avec une balise HTML personnalisé.

Il s’agit du listener classique qui est facilement trouvable sur internet. Ce listener ne collecte pas les données utilisateurs mais uniquement l’URI de l’invité (personne qui a réservé un RDV). Nous allons ensuite utiliser cet URI dans GTM Server pour récupérer les informations renseignées par l’invité.

<script>
window.addEventListener('message', function(e) {
    if (e.data.event && e.data.event.indexOf('calendly.') === 0) {
        if (e.data.event === 'calendly.event_scheduled') {
            window.dataLayer = window.dataLayer || [];
            window.dataLayer.push({
                event: 'calendly_event_scheduled',
                invitee_uri: e.data.payload.invitee.uri
            });
        }
    }
});
/*
* v0.1.0
* Created by Data Marketing School at http://www.data-marketing-school.com
* Written by https://www.linkedin.com/in/lucasrollin/
*/
</script>

Copiez le code ci-dessus et collez-le dans une balise HTML personnalisé dans GTM Web.

Balise HTML personnalisé pour ajouter le listener Calendly
Balise HTML personnalisé pour ajouter le listener Calendly

Ma recommandation

Je vous conseille de déclencher cette balise uniquement sur la ou les pages qui contiennent l’iframe Calendly en utilisant le Page path pour filtrer les pages.

Exemple d’une réservation de RDV Calendly

Lors de la réservation d’un rendez-vous, l’événement calendly_event_scheduled est envoyé dans le dataLayer.

Événement calendly_event_scheduled dans le dataLayer contenant l'URI de l'invité
Événement calendly_event_scheduled dans le dataLayer contenant l'URI de l'invité

A ce stade, vous avez validé que le listener Calendly fonctionne correctement et que l’événement calendly_event_scheduled est bien envoyé dans le dataLayer avec l’URI de l’invité.

L’URI de l’invité a toujours cette forme : https://api.calendly.com/scheduled_events/{event_uuid}/invitees/{invitee_uuid}. Elle contient à la fois l’identifiant du rendez-vous et celui de l’invité, c’est tout ce dont la variable GTM Server aura besoin.

Variable dataLayer pour l’URI de l’invité

L’URI de l’invité va être utilisé côté serveur afin de récupérer les données de l’invité.

Mais avant ça, il est nécessaire de créer une variable dataLayer dans GTM Web pour accéder à cette donnée.

Variable dataLayer pour récupérer l'URI de l'invité dans GTM Web
Variable dataLayer pour récupérer l'URI de l'invité dans GTM Web

Flux de données GA4

Balise Google pour GA4

Dans GTM Web, créez une balise Google pour votre flux GA4, renseignez l’identifiant de mesure de votre propriété GA4. Si vous n’en avez pas ou que vous ne souhaitez pas envoyer de données à GA4 à l’avenir, vous pouvez utiliser G-XXX.

Dans Configuration settings, renseignez les paramètres server_container_url et send_page_view.

Si vous n’avez pas encore mis en place Google Tag Manager Serveur pour le tracking de votre site web, consultez mon article dédié sur le sujet ou réservez un appel découverte avec moi.

Balise Google pour GA4 dans GTM Web
Balise Google pour GA4 dans GTM Web

Événement GA4 calendly_event_scheduled

Toujours dans GTM Web, vous devez ensuite créer une balise d’événement GA4 afin d’envoyer l’événement calendly_event_scheduled à votre serveur GTM.

Pour cela, vous devrez renseigner le paramètre server_container_url avec l’URL de votre serveur GTM.

Si vous n’avez pas encore mis en place Google Tag Manager Serveur pour le tracking de votre site web, consultez mon article dédié sur le sujet ou réservez un appel découverte avec moi.

Événement GA4 calendly_event_scheduled envoyé au serveur depuis GTM Web
Événement GA4 calendly_event_scheduled envoyé au serveur depuis GTM Web

Variable Calendly dans GTM Serveur

J’ai développé une variable GTM Serveur, Enrich from Calendly API by DMS, qui interroge l’API Calendly à partir de l’URI de l’invité et renvoie un seul objet regroupant tout ce que Calendly sait de la réservation :

  • les détails du rendez-vous (nom du type d’événement, date de début et de fin, lieu, participants)
  • les données utilisateur de l’invité (email, numéro de téléphone, prénom, nom), déjà formatées pour les balises Google Ads, Meta ou GA4
  • les paramètres UTM transmis à Calendly (utm_source, utm_medium, utm_campaign, etc.)
  • les réponses au formulaire de réservation et, le cas échéant, au routing form
  • les données de paiement lorsque le rendez-vous est payant (montant, devise, identifiant de transaction)
Variable Enrich from Calendly API by DMS
Variable Enrich from Calendly API by DMS

Concrètement, la variable réalise jusqu’à trois appels à l’API Calendly : un pour le rendez-vous, un pour l’invité et, si l’invité est passé par un routing form, un pour ses réponses. Seul l’appel invité est indispensable : si les autres échouent, la variable renvoie quand même le reste des données et écrit la raison de l’échec dans la console de la preview.

Schéma des appels de la variable Enrich from Calendly API by DMS à l'API Calendly et de l'objet renvoyé
Ce que fait la variable Enrich from Calendly API by DMS

Voici le format de l’objet renvoyé par la variable (les clés absentes chez Calendly sont simplement omises) :

{
    // Détails du rendez-vous
    name: "30 Minute Meeting",
    start_time: "2026-08-31T07:00:00Z",
    end_time: "2026-08-31T07:30:00Z",
    location: { type: "google_conference", join_url: "https://..." },
    invitees_counter: { total: 1, active: 1, limit: 1 },
    event_created_at: "2026-08-29T15:49:46Z",
    event_updated_at: "2026-08-29T15:49:50Z",

    // Invité
    timezone: "Europe/Paris",
    created_at: "2026-08-29T15:49:46Z",
    updated_at: "2026-08-29T15:49:46Z",
    user_data: {
        email_address: "[email protected]",
        phone_number: "+33612345678", // si disponible
        address: {
            first_name: "John",
            last_name: "Doe"
        }
    },

    // Paramètres UTM transmis à Calendly (si présents)
    tracking: {
        utm_source: "newsletter",
        utm_medium: "email",
        utm_campaign: "webinar"
    },

    // Réponses au formulaire de réservation
    event_questions: ["Comment nous avez-vous connu ?"],
    event_answers: ["Une newsletter"],
    event_answers_by_question: { "Comment nous avez-vous connu ?": "Une newsletter" },

    // Réponses au routing form (si l'invité est passé par un routing form)
    routing_form_questions: ["Quel est votre budget ?"],
    routing_form_answers: ["50k"],
    routing_form_answers_by_question: { "Quel est votre budget ?": "50k" },

    // Rendez-vous payant uniquement
    transaction_id: "ch_3Q7xKjL2eZvKYlo2",
    value: 150,
    currency: "EUR",
    payment_successful: true,
    payment: { provider: "stripe", amount: 150, currency: "EUR", ... }
}

Quelques détails sur le formatage des données utilisateur :

  • l’email est nettoyé (espaces retirés, mis en minuscules), comme l’attendent les APIs de conversion
  • le numéro de téléphone est récupéré lorsqu’il est disponible (rappel SMS ou réponse au formulaire de réservation)
  • le prénom et le nom sont issus des champs dédiés de Calendly, ou à défaut découpés à partir du nom complet (un nom composé comme “de la Fontaine” est conservé en entier)
  • pour un rendez-vous payant, transaction_id, value et currency sont remontés au premier niveau pour être directement utilisables dans une balise de conversion

Et sans iframe ?

La variable fonctionne aussi à partir des webhooks Calendly. Si vous recevez les notifications invitee.created ou invitee.canceled dans un client de votre conteneur serveur, la valeur payload.uri du webhook est exactement l’URI attendue par le champ Invitee URI. La suite de la configuration est identique.

Importer la variable depuis la galerie GTM Serveur

Rendez-vous dans la section Variables de GTM Serveur, cliquez sur New.

Création d'une nouvelle variable dans GTM Server
Création d'une nouvelle variable dans GTM Server

Cliquez ensuite sur le bandeau bleu en haut pour accéder à la galerie de modèles de variables.

Galerie de modèles de variables dans GTM Server
Galerie de modèles de variables dans GTM Server

Recherchez Calendly et cliquez sur le modèle Enrich from Calendly API by DMS de Data Marketing School.

Recherche du modèle Enrich from Calendly API by DMS
Recherche du modèle Enrich from Calendly API by DMS

Cliquez ensuite sur Add to workspace pour importer le modèle dans votre conteneur GTM Server.

Import du modèle Enrich from Calendly API by DMS dans GTM Server
Import du modèle Enrich from Calendly API by DMS dans GTM Server

Créer une variable Calendly à partir du template

Dans la section Variables de GTM Serveur et cliquez sur New pour créer une nouvelle variable.

Création d'une nouvelle variable dans GTM Server
Création d'une nouvelle variable dans GTM Server

Sélectionnez la variable Enrich from Calendly API by DMS que vous venez d’importer.

Sélection du modèle de variable Calendly dans GTM Server
Sélection du modèle de variable Calendly dans GTM Server

Une fois la variable sélectionnée, vous pouvez voir que vous avez 2 champs à renseigner :

  • Personal Access Token : il s’agit d’un token que vous devez générer dans votre compte Calendly pour permettre à la variable de s’authentifier auprès de l’API Calendly.
  • Invitee URI : il s’agit d’une variable de données d’événements (Event data) que vous devez créer dans GTM Server pour lire le paramètre invitee_uri envoyé par GTM Web.
Modèle de variable Calendly sélectionné dans GTM Server
Modèle de variable Calendly sélectionné dans GTM Server

Récupérer le Personal Access Token dans Calendly

Dans votre compte Calendly, rendez-vous dans la section Integrations & apps puis cliquez sur API and webhooks.

Section Integrations et apps dans Calendly
Section Integrations et apps dans Calendly

Cliquez ensuite sur Generate New Token dans la section Personal Access Token.

Générer un Personal Access Token dans Calendly
Générer un Personal Access Token dans Calendly

Lors de la création du token, Calendly vous demande de choisir les scopes (les autorisations) du token. Deux scopes sont utiles pour cette variable :

  • scheduled_events:read : obligatoire, il permet de lire le rendez-vous et l’invité
  • routing_forms:read : optionnel, il permet de lire les réponses au routing form. Sans ce scope, la variable renvoie quand même toutes les autres données et signale simplement l’erreur du routing form dans la console de la preview
Sélection des scopes du Personal Access Token dans Calendly
Sélection des scopes du Personal Access Token dans Calendly

Plusieurs hôtes dans votre organisation Calendly ?

Un token créé par un membre classique ne permet de lire que les rendez-vous de ce membre. Si vous voulez enrichir les réservations de plusieurs hôtes (plusieurs commerciaux par exemple), créez le token avec un compte admin ou owner de l’organisation. Sinon, certains invités renverront une erreur 403 et d’autres non, ce qui est assez déroutant à débugger.

Copiez ensuite le token généré.

Personal Access Token copié dans Calendly
Personal Access Token copié dans Calendly

Créez ensuite une variable de type Constant pour stocker ce token dans GTM Server.

Personal Access Token collé dans la variable Calendly de GTM Server
Personal Access Token collé dans la variable Calendly de GTM Server

Créer la variable Event data invitee_uri

Ensuite, vous devez créer une variable de type Event data pour récupérer l’URI de l’invité qui est envoyé dans le dataLayer par GTM Web lors de la réservation d’un rendez-vous.

Variable Event data pour récupérer l'URI de l'invité dans GTM Server
Variable Event data pour récupérer l'URI de l'invité dans GTM Server

Configuration complète de la variable Calendly

Vous avez maintenant tous les éléments nécessaires pour configurer la variable Calendly dans GTM Server. Il ne vous reste plus qu’à renseigner le champ Personal Access Token avec la variable Constant que vous avez créée pour stocker le token et à renseigner le champ Invitee URI avec la variable Event data que vous venez de créer.

Variable Enrich from Calendly API by DMS configurée
Variable Enrich from Calendly API by DMS configurée

Extraire les données utilisateur de l’objet Calendly

La variable Calendly renvoie un objet complet, or les balises Google Ads, Meta ou GA4 attendent uniquement l’objet user_data dans le paramètre user_data de l’événement. Il faut donc extraire cette propriété avant de l’injecter dans l’événement.

Pour cela, importez le modèle de variable Object Property Extractor depuis la galerie de modèles de variables de GTM Server, de la même façon que pour la variable Calendly.

Variable Object Property Extractor pour extraire user_data de l'objet Calendly
Variable Object Property Extractor pour extraire user_data de l'objet Calendly

Créez ensuite une variable à partir de ce modèle. Elle comporte 2 champs :

  • Object : sélectionnez la variable Calendly que vous venez de configurer
  • Property : renseignez user_data

Le champ Property accepte la notation pointée pour aller chercher une propriété imbriquée, par exemple user_data.email_address si vous ne voulez que l’adresse email.

Variable Object Property Extractor pour extraire user_data de l'objet Calendly
Variable Object Property Extractor pour extraire user_data de l'objet Calendly

Cette variable renvoie uniquement la partie user_data de l’objet Calendly :

{
    email_address: "[email protected]",
    phone_number: "+33612345678", // si disponible
    address: {
        first_name: "John",
        last_name: "Doe"
    }
}

Pas seulement user_data

Cette méthode fonctionne pour n’importe quelle propriété de l’objet Calendly. Créez autant de variables Object Property Extractor que nécessaire en changeant simplement le champ Property : tracking pour les paramètres UTM, event_answers_by_question pour les réponses au formulaire, value pour le montant d’un rendez-vous payant, start_time pour la date du rendez-vous, etc.

Enrichir l’événement calendly_event_scheduled dans GTM Serveur

La dernière étape de configuration consiste à ajouter les données Calendly dans l’événement GA4 calendly_event_scheduled lorsque celui-ci est reçu dans GTM Serveur. Je prends ici l’exemple du paramètre user_data, qui contiendra les données utilisateur de l’invité extraites grâce à la variable Object Property Extractor que vous venez de créer. Mais ce n’est qu’un exemple : vous pouvez ajouter de la même manière n’importe quelle autre donnée de l’objet Calendly (paramètres UTM, réponses au formulaire de réservation ou au routing form, montant du rendez-vous, etc.), chacune avec sa propre variable Object Property Extractor.

Ceci va se matérialiser par la création d’une Transformations de type Augment event.

Dans GTM Server, rendez-vous dans la section Transformations puis cliquez sur New pour créer une nouvelle transformation.

Section Transformations dans GTM Serveur
Section Transformations dans GTM Serveur

Ajoutez ensuite une transformation de type Augment event.

Transformation de type Augment Event dans GTM Serveur
Transformation de type Augment Event dans GTM Serveur

Configurez ensuite la transformation pour qu’elle s’applique lorsque l’événement calendly_event_scheduled est reçu. Dans la section Parameters to augment, ajoutez un nouveau champ user_data et renseignez sa valeur avec la variable Object Property Extractor que vous avez configurée précédemment. Ajoutez autant de champs que de données Calendly que vous souhaitez transmettre à vos balises, un par variable Object Property Extractor.

Configuration de la transformation Augment Event pour enrichir l'événement calendly_event_scheduled avec les données utilisateur de l'invité
Configuration de la transformation Augment Event pour enrichir l'événement calendly_event_scheduled avec les données utilisateur de l'invité

Vérifier la configuration

Preview GTM Web

Dans la preview de GTM Web, vous pouvez vérifier deux éléments :

  1. l’événement calendly_event_scheduled est bien envoyé dans le dataLayer lors de la réservation d’un rendez-vous Calendly
  2. l’événement calendly_event_scheduled est bien envoyé au serveur GTM grâce à la balise d’événement GA4 - Event - calendly_event_scheduled que vous avez configuré précédemment
Preview de GTM Web pour vérifier que l'événement calendly_event_scheduled est bien envoyé dans le dataLayer et au serveur
Preview de GTM Web pour vérifier que l'événement calendly_event_scheduled est bien envoyé dans le dataLayer et au serveur

Preview GTM Server

Dans la preview de GTM Server, vous pouvez vérifier que l’événement calendly_event_scheduled est bien reçu et qu’il contient le paramètre invitee_uri.

Preview de GTM Server pour vérifier que l'événement calendly_event_scheduled est bien reçu avec le paramètre invitee_uri
Preview de GTM Server pour vérifier que l'événement calendly_event_scheduled est bien reçu avec le paramètre invitee_uri

Dans l’onglet Variables, vérifiez également que votre variable Calendly est bien valorisée avec l’objet complet (détails du rendez-vous, user_data, tracking, réponses au formulaire) et que la variable Object Property Extractor ne contient bien que la partie user_data.

Preview de GTM Server pour vérifier que la variable Calendly est bien valorisée avec les données de l'invité
Preview de GTM Server pour vérifier que la variable Calendly est bien valorisée avec les données de l'invité

Si la variable Calendly est undefined, ouvrez l’onglet Console de la preview : la variable y écrit la raison de l’échec. Les cas les plus fréquents sont :

  • URI invalide : le paramètre invitee_uri n’a pas la forme https://api.calendly.com/scheduled_events/{event_uuid}/invitees/{invitee_uuid}. Vérifiez la variable Event data et le listener GTM Web.
  • 401 : le Personal Access Token est absent, incorrect ou a été révoqué.
  • 403 : le token n’a pas le scope scheduled_events:read, ou il a été créé par un membre qui n’est pas l’hôte de ce rendez-vous (voir l’encadré sur le rôle admin plus haut).
  • 404 : l’invité n’existe plus, par exemple après une reprogrammation, qui crée un nouvel invité avec une nouvelle URI.

Tous les tags (meta, google ads, etc.) que vous déclenchez à la réception de l’événement calendly_event_scheduled dans GTM Server vont maintenant pouvoir accéder aux données utilisateur de l’invité grâce au paramètre user_data que nous avons ajouté dans la transformation Augment Event.

Félicitations

Vous avez maintenant mis en place le tracking des rendez-vous Calendly avec Google Tag Manager Web et Server. Vous pouvez désormais suivre les réservations de rendez-vous et transmettre les données utilisateur de vos invités aux plateformes publicitaires, et même exploiter les paramètres UTM, les réponses au formulaire ou le montant des rendez-vous payants pour aller plus loin.

FAQ - Calendly GTM Server

Partiellement. Le listener GTM Web suffit pour envoyer un événement « rendez-vous pris » à GA4 ou Google Ads, mais sans aucune donnée sur l'invité. Pour récupérer l'email, le téléphone, les paramètres UTM ou le montant du rendez-vous, il faut interroger l'API Calendly avec un token secret, ce qui ne doit jamais se faire côté navigateur. C'est pour cela que cette partie se fait dans GTM Server.
Non pour la partie web : le listener écoute les messages envoyés par l'iframe Calendly intégrée sur votre site. Si vous envoyez vos prospects directement sur une page Calendly, deux options : intégrer Calendly sur votre site (Inline embed, Popup widget ou Popup text), ou passer par les webhooks Calendly reçus par un client GTM Server. La variable Enrich from Calendly API by DMS fonctionne avec les deux.
Le Personal Access Token est disponible sur tous les plans Calendly, y compris le plan gratuit : l'email, le nom et le téléphone de l'invité remontent donc sans abonnement. Les routing forms et les rendez-vous payants sont en revanche des fonctionnalités des offres payantes de Calendly.
Tout ce que Calendly expose via son API pour ce rendez-vous : email, prénom, nom, numéro de téléphone, fuseau horaire de l'invité, nom, date et lieu du rendez-vous, paramètres UTM, réponses au formulaire de réservation et au routing form, et données de paiement (montant, devise, identifiant de transaction) pour un rendez-vous payant.
Les données récupérées sont des données personnelles. Leur transmission à Google Ads, Meta ou tout autre outil doit reposer sur le consentement du visiteur et être mentionnée dans votre politique de confidentialité. Le token Calendly, qui donne accès à tous les rendez-vous de votre organisation, reste côté serveur dans une variable Constant de GTM Server et ne doit jamais être placé dans GTM Web.

Discutons de votre tracking

Une question sur cet article, besoin d'un audit de votre configuration ou migration server-side ? Écrivez-moi, je réponds sous 24h.