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 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 ou 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 complementaires qui se renforcent mutuellement.
Les trois couches de tracking
| Couche | Méthode | Fiabilité | Effort |
|---|---|---|---|
| Script de tracking | Script DURUM.ai sur vos landing pages | Très élevée | 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 | Élevée (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 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 cote.
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 empecherait 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.
<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 :
- Capture les paramètres 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 réservation sortants avec vos UTM
- Détecté 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 même façon, et le script couvre les trois cas :
| Cas | Comment l'outil reçoit 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 intégré |
| L'outil affiche un formulaire dans votre page | Champs caches remplis automatiquement | GHL, WordPress, Webflow |
| L'outil vit sur son propre domaine | Paramètres ajoutes à 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 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 repondent pas à la même question.
Le canal (utm_source, utm_medium) répond a « d'ou 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 regie) répond a « 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'ecrasent jamais.
Concretement : un prospect clique votre publicité Meta lundi, ne fait rien, revient mardi par votre séquence de nurturing et réservé. 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 paye le lead et quel canal a déclenché la réservation.
Conséquence a connaître
Le canal et la publicité peuvent venir de deux clics différents. Dans le dashboard, un decoupage du revenu par source creditera le courriel, pendant qu'un decoupage par campagne creditera la publicité. Ces deux vues ne sont donc pas deux decoupages 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 possedes
Si vous preferez que la publicité 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 à l'attribution publicitaire.
Détection intelligente
Le script détecté 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 % a 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 (la ou votre domaine est géré) :
| Type | Nom | Valeur |
|---|---|---|
| CNAME | trk | cname.vercel-dns.com |
Cela créé 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
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 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 respecté le consentement exactement comme la version standard : aucune page vue n'est collectee si le visiteur a refusé (Loi 25 / RGPD). Passer les bloqueurs de publicité n'autorise jamais a passer outre le consentement.
Étape 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 sécurité supplementaire. 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 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 publicité (ad) | Oui |
utm_term | Nom du groupe d'annonces (adset) | Oui |
utm_campaign_id | ID numérique de la campagne Meta | Recommande |
utm_ad_id | ID numérique de la publicité Meta | Recommande |
utm_adset_id | ID numérique du groupe d'annonces | Recommande |
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)
- Allez dans Settings > Custom Fields > Contact
- Créez 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 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 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 paramètres 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 paramètres URL
- Définissez
client_keyavec 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 ou l'embed est place. Aucune configuration supplementaire n'est nécessaire.
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
- Définissez le Field Name avec le nom exact (ex:
utm_source) - Cochez Prepopulate et définissez le Query Parameter Name au même nom
Tally
- Dans les reglages du formulaire, ajoutez des Hidden Fields
- Nommez chaque champ exactement comme dans le tableau
- Tally capture automatiquement les paramètres URL correspondants
WordPress / Elementor
- Ajoutez des champs de type Hidden dans votre formulaire
- Définissez la Default Value comme URL Parameter et specifiez le nom (ex:
utm_source)
Webflow
- Ajoutez des champs
<input type="hidden">dans votre formulaire - Définissez l'attribut
nameavec le nom UTM exact - Le script DURUM.ai remplira automatiquement ces champs
HTML personnalisé
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.
É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 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 à 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+ a F et un détail de ce qui a été trouve :
| Grade | Signification |
|---|---|
| A+ | Tous les champs requis et recommandes sont présents |
| A | Tous les champs requis sont présents |
| B | La plupart des champs requis sont présents |
| C | Certains champs requis sont manquants |
| D/F | Configuration incomplete, l'attribution sera limitée |
La réponse indiqué aussi les champs manquants et les warnings eventuels pour corriger votre configuration.
Dépannage
Mes leads arrivent mais ne sont pas attribues
- Vérifiez que les paramètres UTM sont présents dans l'URL de destination de vos publicités Meta
- Vérifiez que le script DURUM.ai est bien installe sur la landing page
- Testez avec l'endpoint
/api/webhook/test-utmpour voir quels champs sont reçus - Vérifiez 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 été resolues. 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étecté pas la soumission
Certains formulaires très customises peuvent echapper à la détection 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 généré un <form> standard ou utilise fetch/XMLHttpRequest pour soumettre les données, le tracking fonctionnera. En cas de doute, ajoutez les champs caches HTML et le script s'occupera du reste.
Résumé
Pour une attribution complete dans DURUM.ai :
- Ajoutez les paramètres UTM dans vos publicités 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 étapes garantissent que chaque lead, booking et vente sera correctement attribue à la publicité qui l'a généré.