Tracking UTM -- Configuration complete
Le tracking UTM est la piece maitresse de l'attribution dans DURUM.ai. Sans lui, vos leads et ventes apparaissent dans le dashboard mais ne sont pas relies aux bonnes publicites. Ce guide vous accompagne etape par etape pour configurer le tracking, peu importe l'outil de formulaire que vous utilisez.
Pourquoi c'est indispensable
Quand un prospect clique sur une publicite Meta, l'URL de destination contient des parametres UTM qui identifient la campagne et l'annonce. Ces parametres sont la seule facon pour DURUM.ai de savoir quelle pub a genere quel lead.
Le probleme : ces parametres vivent dans l'URL. Si votre formulaire ne les capture pas, l'information est perdue au moment ou le prospect soumet le formulaire. Le lead arrive dans DURUM.ai, mais il est impossible de le relier a la bonne publicite.
La solution repose sur trois couches complementaires qui se renforcent mutuellement.
Les trois couches de tracking
| Couche | Methode | Fiabilite | Effort |
|---|---|---|---|
| Script de tracking | Script DURUM.ai sur vos landing pages | Tres elevee | 1 ligne de code |
| Champs caches dans le formulaire | Hidden fields dans votre CRM/outil de formulaire | Maximale | Configuration manuelle |
| Enrichissement serveur | DURUM.ai cherche les UTMs dans les sessions anterieures | Elevee (fallback) | Automatique |
Recommandation
La combinaison des couches 1 et 2 donne une couverture quasi-parfaite. La couche 3 rattrape automatiquement les cas ou les deux premieres auraient echoue.
Etape 1 -- Parametres URL dans Meta Ads
Dans vos publicites Meta, ajoutez les parametres suivants dans le champ URL Parameters (au niveau de la publicite 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 remplacees par les vraies valeurs au moment du clic. Vous n'avez rien d'autre a faire de ce cote.
WARNING
Ne modifiez pas les noms des parametres (utm_source, utm_campaign, etc.). DURUM.ai s'attend a recevoir ces noms exacts. Changer utm_content en ad_name par exemple empecherait l'attribution.
Etape 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.
<script src="https://app.durum.ai/api/track.js" data-client="VOTRE_CLE"></script>Ce que fait le script
Le script est leger (moins de 5 Ko) et effectue automatiquement les operations suivantes :
- Capture les parametres UTM de l'URL au chargement de la page
- Stocke les valeurs dans un cookie (30 jours) pour couvrir les visites multi-pages
- Publie les valeurs dans des cookies standards lus par les outils tiers (voir ci-dessous)
- Injecte les valeurs dans les champs caches de vos formulaires
- Decore les liens et widgets de reservation sortants avec vos UTM
- Detecte la soumission du formulaire et envoie les UTMs a 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 frontiere de domaine. Les outils que vous integrez ne lisent donc pas tous l'attribution de la meme facon, et le script couvre les trois cas :
| Cas | Comment l'outil recoit l'attribution | Exemples |
|---|---|---|
| L'outil tourne en JavaScript sur votre page | Cookies standards utm_source, utm_medium, utm_campaign, utm_term, utm_content et leurs equivalents first_utm_* | Widget iClosed integre |
| L'outil affiche un formulaire dans votre page | Champs caches remplis automatiquement | GHL, WordPress, Webflow |
| L'outil vit sur son propre domaine | Parametres ajoutes a l'URL du lien ou de l'iframe | Calendly, Typeform, lien direct iClosed |
Les cookies sont poses 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 reservation sur www.exemple.com fonctionne sans configuration.
Placement du script
Chargez le script dans le <head>, avant tout widget tiers. Il ecrit alors les cookies avant que le widget ne cherche a les lire.
Modele d'attribution : le canal et la publicite
Le script distingue deux informations qui n'ont pas la meme duree de vie, parce qu'elles ne repondent pas a la meme question.
Le canal (utm_source, utm_medium) repond a « d'ou vient le dernier clic ? ». Il suit le dernier touch. Si votre prospect revient par un courriel, le canal devient email.
La publicite (utm_campaign, utm_term, utm_content et les identifiants de regie) repond a « quelle publicite a produit ce lead ? ». Elle n'est remplacee que par une autre publicite. Un clic dans un courriel, un lien en bio ou un partage organique ne l'ecrasent jamais.
Concretement : un prospect clique votre publicite Meta lundi, ne fait rien, revient mardi par votre sequence de nurturing et reserve. L'attribution transmise est utm_source=email avec la campagne, l'adset et la publicite Meta d'origine. Vous savez a la fois quelle publicite a paye le lead et quel canal a declenche la reservation.
Consequence a connaitre
Le canal et la publicite peuvent venir de deux clics differents. Dans le dashboard, un decoupage du revenu par source creditera le courriel, pendant qu'un decoupage par campagne creditera la publicite. Ces deux vues ne sont donc pas deux decoupages du meme total.
Le champ first_utm_* conserve, lui, le tout premier touch connu du contact, pendant un an.
Taguez vos courriels comme des canaux possedes
Si vous preferez que la publicite reste creditee comme source, taguez les liens de vos courriels et SMS avec utm_channel=email plutot qu'avec utm_source=email. Le script traite alors ce clic comme un assist et ne touche pas du tout a l'attribution publicitaire.
Detection intelligente
Le script detecte les soumissions de formulaire via six methodes differentes, ce qui lui permet de fonctionner meme 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 (detection par MutationObserver)
- Changements d'URL (redirections SPA vers /merci, /thank-you)
Domaine first-party (CNAME)
Par defaut, le script est servi depuis app.durum.ai, un domaine tiers. Les bloqueurs de publicite 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 % a 90-95 %), servez le pixel en first-party depuis un sous-domaine de votre propre site. Deux etapes :
1. Ajoutez un enregistrement DNS chez votre registraire (la ou votre domaine est gere) :
| Type | Nom | Valeur |
|---|---|---|
| CNAME | trk | cname.vercel-dns.com |
Cela cree trk.votre-domaine.com. DURUM ajoute ce domaine et emet le certificat SSL automatiquement.
2. Remplacez le script par sa version first-party (aucun data-client requis, le domaine resout votre compte) :
<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 resistent aux bloqueurs qui filtrent par domaine tiers, et Safari/Firefox les traitent en first-party.
Ce qui reste hors de portee
Meme en first-party, aucun pixel JavaScript ne compte 100 % des pages vues (JS desactive, bloqueurs par signature, refus de consentement). Pour un total exhaustif identique a celui de votre plateforme de funnel (qui compte cote serveur), il faut reconcilier 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 collectee si le visiteur a refuse (Loi 25 / RGPD). Passer les bloqueurs de publicite n'autorise jamais a passer outre le consentement.
Etape 3 -- Champs caches dans vos formulaires
Le script de tracking couvre la majorite des cas, mais ajouter des champs caches dans vos formulaires apporte une couche de securite supplementaire. C'est aussi la seule facon de garantir que votre CRM stocke les UTMs directement dans le contact.
Convention de nommage
Les noms de champs doivent etre exactement comme dans ce tableau. Respectez les minuscules et les underscores.
| Nom du champ | Description | Requis |
|---|---|---|
utm_source | Source du trafic (Meta, Google, etc.) | Oui |
utm_medium | Type de trafic (paid, organic, email) | Oui |
utm_campaign | Nom de la campagne | Oui |
utm_content | Nom de la publicite (ad) | Oui |
utm_term | Nom du groupe d'annonces (adset) | Oui |
utm_campaign_id | ID numerique de la campagne Meta | Recommande |
utm_ad_id | ID numerique de la publicite Meta | Recommande |
utm_adset_id | ID numerique du groupe d'annonces | Recommande |
WARNING
Les noms de champs sont sensibles a la casse. UTM_Source ou utmSource ne seront pas reconnus. Utilisez toujours la version en minuscules avec underscore.
Configuration par plateforme
GoHighLevel (GHL)
- Allez dans Settings > Custom Fields > Contact
- Creez chaque champ du tableau ci-dessus comme Single Line Text
- Nommez chaque champ exactement comme dans le tableau (ex:
utm_source) - Dans votre formulaire ou page de capture, ajoutez ces champs en mode Hidden
- GHL supporte le pre-remplissage natif via les parametres URL : les champs nommes
utm_source,utm_campaign, etc. sont automatiquement remplis depuis l'URL
TIP
Avec GHL, le script DURUM.ai et les custom fields sont complementaires. Le script remplit les champs caches au chargement de la page, et GHL les enregistre dans le contact au moment de la soumission.
Typeform
- Dans les parametres de votre formulaire, allez dans Hidden Fields
- 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 - Typeform extrait automatiquement les valeurs depuis les parametres URL
- Definissez
client_keyavec votre cle client DURUM.ai
Calendly
Calendly capture automatiquement les parametres UTM standards (utm_source, utm_medium, utm_campaign, utm_content, utm_term) depuis l'URL de la page ou l'embed est place. Aucune configuration supplementaire n'est necessaire.
Le script DURUM.ai complete le tracking en capturant les identifiants Meta (utm_ad_id, utm_campaign_id) que Calendly ne supporte pas nativement.
Jotform
- Ajoutez des champs Hidden Field dans votre formulaire
- Definissez le Field Name avec le nom exact (ex:
utm_source) - Cochez Prepopulate et definissez le Query Parameter Name au meme nom
Tally
- Dans les reglages du formulaire, ajoutez des Hidden Fields
- Nommez chaque champ exactement comme dans le tableau
- Tally capture automatiquement les parametres URL correspondants
WordPress / Elementor
- Ajoutez des champs de type Hidden dans votre formulaire
- Definissez la Default Value comme URL Parameter et specifiez le nom (ex:
utm_source)
Webflow
- Ajoutez des champs
<input type="hidden">dans votre formulaire - Definissez l'attribut
nameavec le nom UTM exact - Le script DURUM.ai remplira automatiquement ces champs
HTML personnalise
Si vous utilisez un formulaire HTML sur mesure, ajoutez ces champs caches entre les balises <form> :
<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.
Etape 4 -- Tester votre configuration
DURUM.ai fournit un endpoint de test pour verifier que vos UTMs sont correctement transmis.
Test via URL
Ouvrez cette URL dans votre navigateur en remplacant 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_adsetTest via webhook
Envoyez un webhook de test identique a 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 reponse
La reponse contient un grade de A+ a F et un detail de ce qui a ete trouve :
| Grade | Signification |
|---|---|
| A+ | Tous les champs requis et recommandes sont presents |
| A | Tous les champs requis sont presents |
| B | La plupart des champs requis sont presents |
| C | Certains champs requis sont manquants |
| D/F | Configuration incomplete, l'attribution sera limitee |
La reponse indique aussi les champs manquants et les warnings eventuels pour corriger votre configuration.
Depannage
Mes leads arrivent mais ne sont pas attribues
- Verifiez que les parametres UTM sont presents dans l'URL de destination de vos publicites Meta
- Verifiez que le script DURUM.ai est bien installe sur la landing page
- Testez avec l'endpoint
/api/webhook/test-utmpour voir quels champs sont recus - Verifiez la convention de nommage des champs caches dans votre formulaire
Les UTMs contiennent des placeholders non resolus
Si vous voyez des valeurs comme campaign_name ou des accolades non resolues au lieu des vraies valeurs, cela signifie que les macros Meta n'ont pas ete resolues. Verifiez que les parametres UTM sont configures au bon niveau dans Meta Ads Manager (au niveau de la publicite, pas du compte).
Le script de tracking ne detecte pas la soumission
Certains formulaires tres customises peuvent echapper a la detection automatique. Dans ce cas, les champs caches dans le formulaire prennent le relais. Assurez-vous d'avoir configure les hidden fields comme explique dans la section de votre plateforme.
J'utilise un outil qui n'est pas liste
Le script DURUM.ai fonctionne avec tout formulaire HTML standard. Si votre outil genere un <form> standard ou utilise fetch/XMLHttpRequest pour soumettre les donnees, le tracking fonctionnera. En cas de doute, ajoutez les champs caches HTML et le script s'occupera du reste.
Resume
Pour une attribution complete dans DURUM.ai :
- Ajoutez les parametres UTM dans vos publicites Meta
- Installez le script de tracking sur vos landing pages (1 ligne)
- Ajoutez les champs caches dans vos formulaires (nommage exact requis)
- Testez avec l'endpoint de validation
Ces trois etapes garantissent que chaque lead, booking et vente sera correctement attribue a la publicite qui l'a genere.