Skip to content

Tracking UTM : Configuration complète ​

Le tracking UTM est la pièce maîtresse de l'attribution dans DURUM.ai. Sans lui, vos leads et ventes apparaissent dans le dashboard mais ne sont pas reliés aux bonnes publicités. Ce guide vous accompagne étape par étape pour configurer le tracking, peu importe l'outil de formulaire que vous utilisez.


Pourquoi c'est indispensable ​

Quand un prospect clique sur une publicité Meta, l'URL de destination contient des paramètres UTM qui identifient la campagne et l'annonce. Ces paramètres sont la seule façon pour DURUM.ai de savoir quelle pub a généré quel lead.

Le problème : ces paramètres vivent dans l'URL. Si votre formulaire ne les capture pas, l'information est perdue au moment où le prospect soumet le formulaire. Le lead arrive dans DURUM.ai, mais il est impossible de le relier à la bonne publicité.

La solution repose sur trois couches complémentaires qui se renforcent mutuellement.


Les trois couches de tracking ​

CoucheMéthodeFiabilitéEffort
Script de trackingScript DURUM.ai sur vos landing pagesTrès élevée1 ligne de code
Champs cachés dans le formulaireHidden fields dans votre CRM/outil de formulaireMaximaleConfiguration manuelle
Enrichissement serveurDURUM.ai cherche les UTMs dans les sessions antérieuresÉlevée (fallback)Automatique

Recommandation

La combinaison des couches 1 et 2 donne une couverture quasi-parfaite. La couche 3 rattrape automatiquement les cas où les deux premières auraient échoué.


Étape 1 : Paramètres URL dans Meta Ads ​

Dans vos publicités Meta, ajoutez les paramètres suivants dans le champ URL Parameters (au niveau de la publicité ou du compte). Copiez ce bloc tel quel :

utm_source=Meta&utm_medium=paid&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}&utm_campaign_id={{campaign.id}}&utm_ad_id={{ad.id}}&utm_adset_id={{adset.id}}

Les doubles accolades (campaign.name, ad.name, etc.) sont des macros Meta qui sont automatiquement remplacées par les vraies valeurs au moment du clic. Vous n'avez rien d'autre à faire de ce côté.

WARNING

Ne modifiez pas les noms des paramètres (utm_source, utm_campaign, etc.). DURUM.ai s'attend à recevoir ces noms exacts. Changer utm_content en ad_name par exemple empêcherait l'attribution.


Étape 2 : Script de tracking DURUM.ai ​

Ajoutez cette ligne dans le <head> de chacune de vos landing pages. Remplacez VOTRE_CLE par votre client_key DURUM.ai.

html
<script src="https://app.durum.ai/api/track.js" data-client="VOTRE_CLE"></script>

Ce que fait le script ​

Le script est léger (moins de 5 Ko) et effectue automatiquement les opérations suivantes :

  1. Capture les paramètres UTM de l'URL au chargement de la page
  2. Stocke les valeurs dans un cookie (30 jours) pour couvrir les visites multi-pages
  3. Publie les valeurs dans des cookies standards lus par les outils tiers (voir ci-dessous)
  4. Injecte les valeurs dans les champs cachés de vos formulaires
  5. Décore les liens et widgets de réservation sortants avec vos UTM
  6. Détecte la soumission du formulaire et envoie les UTMs à DURUM.ai

Le script fonctionne avec tous les outils de formulaire : GHL, Typeform, Calendly, Jotform, Tally, WordPress, Webflow, ClickFunnels et tout formulaire HTML standard.

Transmission aux outils tiers ​

Un cookie ne franchit jamais une frontière de domaine. Les outils que vous intégrez ne lisent donc pas tous l'attribution de la même façon, et le script couvre les trois cas :

CasComment l'outil reçoit l'attributionExemples
L'outil tourne en JavaScript sur votre pageCookies standards utm_source, utm_medium, utm_campaign, utm_term, utm_content et leurs équivalents first_utm_*Widget iClosed intégré
L'outil affiche un formulaire dans votre pageChamps cachés remplis automatiquementGHL, WordPress, Webflow
L'outil vit sur son propre domaineParamètres ajoutés à l'URL du lien ou de l'iframeCalendly, Typeform, lien direct iClosed

Les cookies sont posés sur votre domaine principal, ils restent donc lisibles depuis n'importe lequel de vos sous-domaines. Un funnel dont l'optin vit sur go.exemple.com et la réservation sur www.exemple.com fonctionne sans configuration.

Placement du script

Chargez le script dans le <head>, avant tout widget tiers. Il écrit alors les cookies avant que le widget ne cherche à les lire.


Modèle d'attribution : le canal et la publicité ​

Le script distingue deux informations qui n'ont pas la même durée de vie, parce qu'elles ne répondent pas à la même question.

Le canal (utm_source, utm_medium) répond à « d'où vient le dernier clic ? ». Il suit le dernier touch. Si votre prospect revient par un courriel, le canal devient email.

La publicité (utm_campaign, utm_term, utm_content et les identifiants de régie) répond à « quelle publicité a produit ce lead ? ». Elle n'est remplacée que par une autre publicité. Un clic dans un courriel, un lien en bio ou un partage organique ne l'écrasent jamais.

Concrètement : un prospect clique votre publicité Meta lundi, ne fait rien, revient mardi par votre séquence de nurturing et réserve. L'attribution transmise est utm_source=email avec la campagne, l'adset et la publicité Meta d'origine. Vous savez à la fois quelle publicité a payé le lead et quel canal a déclenché la réservation.

Conséquence à connaître

Le canal et la publicité peuvent venir de deux clics différents. Dans le dashboard, un découpage du revenu par source créditera le courriel, pendant qu'un découpage par campagne créditera la publicité. Ces deux vues ne sont donc pas deux découpages du même total.

Le champ first_utm_* conserve, lui, le tout premier touch connu du contact, pendant un an.

Taguez vos courriels comme des canaux possédés

Si vous préférez que la publicité reste créditée comme source, taguez les liens de vos courriels et SMS avec utm_channel=email plutôt qu'avec utm_source=email. Le script traite alors ce clic comme un assist et ne touche pas du tout à l'attribution publicitaire.

Détection intelligente ​

Le script détecte les soumissions de formulaire via six méthodes différentes, ce qui lui permet de fonctionner même avec les formulaires les plus exotiques :

  • Soumission HTML native (formulaires standard, GHL, WordPress)
  • Iframe Typeform (via postMessage)
  • Iframe Calendly (via postMessage)
  • Appels AJAX et fetch (formulaires SPA, React, Vue)
  • Pages de remerciement (détection par MutationObserver)
  • Changements d'URL (redirections SPA vers /merci, /thank-you)

Domaine first-party (CNAME) ​

Par défaut, le script est servi depuis app.durum.ai, un domaine tiers. Les bloqueurs de publicité et la protection anti-pistage de Safari/iOS peuvent alors bloquer une partie des mesures, surtout les pages vues.

Pour une couverture maximale (d'environ 70-85 % à 90-95 %), servez le pixel en first-party depuis un sous-domaine de votre propre site. Deux étapes :

1. Ajoutez un enregistrement DNS chez votre registraire (là où votre domaine est géré) :

TypeNomValeur
CNAMEtrkcname.vercel-dns.com

Cela crée trk.votre-domaine.com. DURUM ajoute ce domaine et émet le certificat SSL automatiquement.

2. Remplacez le script par sa version first-party (aucun data-client requis, le domaine résout votre compte) :

html
<script src="https://trk.votre-domaine.com/api/track.js"></script>

Le script et les beacons deviennent alors un sous-domaine de votre propre site : ils résistent aux bloqueurs qui filtrent par domaine tiers, et Safari/Firefox les traitent en first-party.

Ce qui reste hors de portée

Même en first-party, aucun pixel JavaScript ne compte 100 % des pages vues (JS désactivé, bloqueurs par signature, refus de consentement). Pour un total exhaustif identique à celui de votre plateforme de funnel (qui compte côté serveur), il faut réconcilier avec le total serveur de la plateforme. Le pixel, lui, vous apporte la source de chaque page vue.

Consentement

Le pixel first-party respecte le consentement exactement comme la version standard : aucune page vue n'est collectée si le visiteur a refusé (Loi 25 / RGPD). Passer les bloqueurs de publicité n'autorise jamais à passer outre le consentement.


Étape 3 : Champs cachés dans vos formulaires ​

Le script de tracking couvre la majorité des cas, mais ajouter des champs cachés dans vos formulaires apporte une couche de sécurité supplémentaire. C'est aussi la seule façon de garantir que votre CRM stocke les UTMs directement dans le contact.

Convention de nommage ​

Les noms de champs doivent être exactement comme dans ce tableau. Respectez les minuscules et les underscores.

Nom du champDescriptionRequis
utm_sourceSource du trafic (Meta, Google, etc.)Oui
utm_mediumType de trafic (paid, organic, email)Oui
utm_campaignNom de la campagneOui
utm_contentNom de la publicité (ad)Oui
utm_termNom du groupe d'annonces (adset)Oui
utm_campaign_idID numérique de la campagne MetaRecommandé
utm_ad_idID numérique de la publicité MetaRecommandé
utm_adset_idID numérique du groupe d'annoncesRecommandé

WARNING

Les noms de champs sont sensibles à la casse. UTM_Source ou utmSource ne seront pas reconnus. Utilisez toujours la version en minuscules avec underscore.


Configuration par plateforme ​

GoHighLevel (GHL) ​

  1. Allez dans Settings > Custom Fields > Contact
  2. Créez chaque champ du tableau ci-dessus comme Single Line Text
  3. Nommez chaque champ exactement comme dans le tableau (ex: utm_source)
  4. Dans votre formulaire ou page de capture, ajoutez ces champs en mode Hidden
  5. GHL supporte le pré-remplissage natif via les paramètres URL : les champs nommés utm_source, utm_campaign, etc. sont automatiquement remplis depuis l'URL

TIP

Avec GHL, le script DURUM.ai et les custom fields sont complémentaires. Le script remplit les champs cachés au chargement de la page, et GHL les enregistre dans le contact au moment de la soumission.

Typeform ​

  1. Dans les paramètres de votre formulaire, allez dans Hidden Fields
  2. Ajoutez les champs suivants : utm_source, utm_medium, utm_campaign, utm_content, utm_term, utm_campaign_id, utm_ad_id, utm_adset_id, client_key
  3. Typeform extrait automatiquement les valeurs depuis les paramètres URL
  4. Définissez client_key avec votre clé client DURUM.ai

Calendly ​

Calendly capture automatiquement les paramètres UTM standards (utm_source, utm_medium, utm_campaign, utm_content, utm_term) depuis l'URL de la page où l'embed est placé. Aucune configuration supplémentaire n'est nécessaire.

Le script DURUM.ai complète le tracking en capturant les identifiants Meta (utm_ad_id, utm_campaign_id) que Calendly ne supporte pas nativement.

Jotform ​

  1. Ajoutez des champs Hidden Field dans votre formulaire
  2. Définissez le Field Name avec le nom exact (ex: utm_source)
  3. Cochez Prepopulate et définissez le Query Parameter Name au même nom

Tally ​

  1. Dans les réglages du formulaire, ajoutez des Hidden Fields
  2. Nommez chaque champ exactement comme dans le tableau
  3. Tally capture automatiquement les paramètres URL correspondants

WordPress / Elementor ​

  1. Ajoutez des champs de type Hidden dans votre formulaire
  2. Définissez la Default Value comme URL Parameter et spécifiez le nom (ex: utm_source)

Webflow ​

  1. Ajoutez des champs <input type="hidden"> dans votre formulaire
  2. Définissez l'attribut name avec le nom UTM exact
  3. Le script DURUM.ai remplira automatiquement ces champs

HTML personnalisé ​

Si vous utilisez un formulaire HTML sur mesure, ajoutez ces champs cachés entre les balises <form> :

html
<input type="hidden" name="utm_source">
<input type="hidden" name="utm_medium">
<input type="hidden" name="utm_campaign">
<input type="hidden" name="utm_content">
<input type="hidden" name="utm_term">
<input type="hidden" name="utm_campaign_id">
<input type="hidden" name="utm_ad_id">
<input type="hidden" name="utm_adset_id">
<input type="hidden" name="client_key" value="VOTRE_CLE">

Le script DURUM.ai injectera automatiquement les valeurs depuis le cookie UTM au chargement de la page.


Étape 4 : Tester votre configuration ​

DURUM.ai fournit un endpoint de test pour vérifier que vos UTMs sont correctement transmis.

Test via URL ​

Ouvrez cette URL dans votre navigateur en remplaçant les valeurs :

https://app.durum.ai/api/webhook/test-utm?client_key=VOTRE_CLE&utm_source=Meta&utm_medium=paid&utm_campaign=test_campagne&utm_content=test_annonce&utm_term=test_adset

Test via webhook ​

Envoyez un webhook de test identique à ce que votre formulaire enverrait :

POST https://app.durum.ai/api/webhook/test-utm?client_key=VOTRE_CLE
Content-Type: application/json

{
  "email": "test@example.com",
  "utm_source": "Meta",
  "utm_medium": "paid",
  "utm_campaign": "campagne_test",
  "utm_content": "annonce_test",
  "utm_term": "adset_test"
}

Comprendre la réponse ​

La réponse contient un grade de A+ à F et un détail de ce qui a été trouvé :

GradeSignification
A+Tous les champs requis et recommandés sont présents
ATous les champs requis sont présents
BLa plupart des champs requis sont présents
CCertains champs requis sont manquants
D/FConfiguration incomplète, l'attribution sera limitée

La réponse indique aussi les champs manquants et les warnings éventuels pour corriger votre configuration.


Dépannage ​

Mes leads arrivent mais ne sont pas attribués ​

  1. Vérifiez que les paramètres UTM sont présents dans l'URL de destination de vos publicités Meta
  2. Vérifiez que le script DURUM.ai est bien installé sur la landing page
  3. Testez avec l'endpoint /api/webhook/test-utm pour voir quels champs sont reçus
  4. Vérifiez la convention de nommage des champs cachés dans votre formulaire

Les UTMs contiennent des placeholders non résolus ​

Si vous voyez des valeurs comme campaign_name ou des accolades non résolues au lieu des vraies valeurs, cela signifie que les macros Meta n'ont pas été résolues. Vérifiez que les paramètres UTM sont configurés au bon niveau dans Meta Ads Manager (au niveau de la publicité, pas du compte).

Le script de tracking ne détecte pas la soumission ​

Certains formulaires très customisés peuvent échapper à la détection automatique. Dans ce cas, les champs cachés dans le formulaire prennent le relais. Assurez-vous d'avoir configuré les hidden fields comme expliqué dans la section de votre plateforme.

J'utilise un outil qui n'est pas listé ​

Le script DURUM.ai fonctionne avec tout formulaire HTML standard. Si votre outil génère un <form> standard ou utilise fetch/XMLHttpRequest pour soumettre les données, le tracking fonctionnera. En cas de doute, ajoutez les champs cachés HTML et le script s'occupera du reste.


Résumé ​

Pour une attribution complète dans DURUM.ai :

  1. Ajoutez les paramètres UTM dans vos publicités Meta
  2. Installez le script de tracking sur vos landing pages (1 ligne)
  3. Ajoutez les champs cachés dans vos formulaires (nommage exact requis)
  4. Testez avec l'endpoint de validation

Ces trois étapes garantissent que chaque lead, booking et vente sera correctement attribué à la publicité qui l'a généré.

Propulsé par DURUM.ai : attribution publicitaire et intelligence opérationnelle