Cal.com - Widget Integre (embed)
Ce qu'on va faire sur cette page
Cal.com est une alternative open-source a Calendly. Le widget integre envoie ses events a la page par postMessage, comme Calendly, mais sous forme d'objets et avec d'autres noms d'events. Le calendrier ci-dessous est un vrai calendrier de demonstration : tu peux reserver, aucun rendez-vous reel n'est pris et aucun email n'est envoye.
- Ouvrir GTM Preview
- Choisir un creneau et reserver dans le widget ci-dessous
- Observer les events "calcom" dans le Summary (via Custom Event)
- Copier le code du listener et l'ajouter dans un tag Custom HTML
Widget Cal.com integre - les interactions sont capturees via postMessage
Events captures en temps reel :
En attente d'interactions avec Cal.com...
// Listener JavaScript a mettre dans un tag Custom HTML (GTM)
// Declencheur : All Pages ou Page URL contient la page avec Cal.com
<script>
(function() {
var lastCalEvent = "";
window.addEventListener("message", function(e) {
var d = e.data;
// Cal.com envoie un objet : { type, namespace, fullType, data }
// fullType commence toujours par "CAL:" (ex : "CAL::bookingSuccessfulV2")
if (!d || typeof d !== "object") return;
if (typeof d.fullType !== "string" || d.fullType.indexOf("CAL:") !== 0) return;
// Les events qui commencent par "__" sont techniques
// (taille de l'iframe, navigation interne) : on les ignore
if (!d.type || d.type.indexOf("__") === 0) return;
// availabilityLoaded se repete en rafale : on ignore
// un event identique au precedent
if (d.type === lastCalEvent) return;
lastCalEvent = d.type;
window.dataLayer.push({
event: "calcom",
calcom_event: d.type,
calcom_data: d.data || {}
});
});
})();
</script>
// Les events Cal.com, dans l'ordre ou ils arrivent (valeur de calcom_event) :
// navigatedToBooker -> Le widget ouvre le calendrier
// linkReady -> Le widget est charge et affiche
// bookerViewed -> Le visiteur voit le calendrier
// bookerReady -> Les creneaux sont prets
// availabilityLoaded -> Les disponibilites sont chargees
// (se repete souvent : pas une etape de funnel)
// bookingSuccessfulV2
// -> CONVERSION : le rendez-vous est confirme !
// calcom_data contient uid, title, startTime, endTime, status...
// bookingSuccessful
// -> Ancienne version du meme event, envoyee juste avant.
// Ne la compte pas, sinon chaque RDV compte double.
// Plus rares : rescheduleBookingSuccessfulV2 (RDV deplace),
// bookingCancelled (RDV annule), linkFailed (le widget n'a pas pu charger)
// Configuration GTM pour Cal.com :
//
// Trigger : Custom Event
// Event name : calcom
// Condition : calcom_event egal a bookingSuccessfulV2
//
// Variables Data Layer :
// calcom_event
// calcom_data.uid (identifiant unique du RDV)
//
// Tag GA4 Event :
// Event name : calendar_booking
// Parametres :
// calendar_tool = "calcom"
// booking_id = {{DLV - calcom_data.uid}}
// Attention : n'envoie pas calcom_data.title a GA4. Par defaut, Cal.com
// y met le nom du prospect, et GA4 interdit les donnees personnelles.
// Dans GA4, marque calendar_booking comme evenement cle (conversion).
Cal.com vs Calendly
Calendly envoie des chaines de caracteres (calendly.event_scheduled), Cal.com envoie des objets ({ type: "bookingSuccessfulV2", data: {...} }).
Meme approche : on ecoute les postMessage, on push dans le dataLayer, on cree un Custom Event trigger dans GTM.
Un vrai calendrier de demonstration
Le widget affiche un vrai calendrier Cal.com, reserve a ce site. Les reservations sont enregistrees mais ne creent aucun rendez-vous : pas d'invitation, pas d'email, ni pour toi ni pour nous. Tu peux reserver autant de fois que tu veux pour tester ton tracking.