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 ? »).

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.

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.

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.

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.

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.

É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.

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)

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.

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,valueetcurrencysont 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.

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

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

Cliquez ensuite sur Add to workspace pour importer le modèle dans votre conteneur 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.

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

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_urienvoyé par GTM Web.

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.

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

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

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é.

Créez ensuite une variable de type Constant pour stocker ce token dans 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.

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.

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.

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.

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.

Ajoutez ensuite une transformation de type Augment event.

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.

Vérifier la configuration
Preview GTM Web
Dans la preview de GTM Web, vous pouvez vérifier deux éléments :
- l’événement
calendly_event_scheduledest bien envoyé dans le dataLayer lors de la réservation d’un rendez-vous Calendly - l’événement
calendly_event_scheduledest 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 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.

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.

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_urin’a pas la formehttps://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
Peut-on tracker les rendez-vous Calendly sans GTM Server ?
Est-ce que ça fonctionne avec un lien Calendly plutôt qu'une iframe ?
Faut-il un abonnement Calendly payant ?
Quelles données puis-je récupérer sur l'invité ?
Est-ce conforme au RGPD ?
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.

