# Un champ « source du lead » rempli depuis les paramètres UTM et le referrer

> Avant d'envoyer un contact vers un CRM externe, autant lui attacher sa vraie provenance plutôt qu'un « direct » qui ne veut rien dire.

- Auteur : WordPress Développement
- Publié le : 2023-03-18
- Mis à jour le : 2023-03-18
- Catégorie : Astuces
- URL : https://www.wpmoderne.fr/tips/champ-source-lead-utm-referrer/

## L’essentiel

- Capturer les UTM à la première visite, pas au moment du formulaire
- Stocker la source en cookie de première partie
- Transmettre le champ au CRM sans jamais l'écraser côté serveur

`utm_source=linkedin&utm_medium=social&utm_campaign=lancement` : ces paramètres arrivent dans l'URL au premier clic, mais un visiteur ne remplit presque jamais un formulaire de contact dès sa première visite. Il navigue, revient trois jours plus tard depuis un favori ou une recherche directe, et c'est cette deuxième visite, sans aucun paramètre UTM, qui déclenche l'envoi du formulaire. Si la capture ne se fait qu'au moment de la soumission, la source réelle du lead — celle qui a coûté un budget d'acquisition — est perdue, remplacée par un vague « direct » qui ne dit rien à personne.

La bonne pratique consiste à capturer l'attribution dès la première page vue, la stocker côté client dans un cookie de première partie, puis la relire au moment du formulaire pour la joindre silencieusement à l'envoi vers le CRM. Ce n'est ni compliqué ni coûteux, mais ça demande de découpler deux moments qu'on a tendance à traiter comme un seul.

## Capturer à la première visite

Un script chargé en `footer`, sans dépendance, suffit à lire les paramètres de l'URL et le `document.referrer`, puis à les poser en cookie si aucun cookie d'attribution n'existe déjà. C'est ce « si aucun n'existe déjà » qui garantit qu'on garde la première source, et non la dernière — un choix d'attribution assumé, cohérent avec la plupart des CRM qui distinguent justement first touch et last touch.

```
document.addEventListener( 'DOMContentLoaded', function () {
    if ( document.cookie.match( /(?:^|; )agence_source=/ ) ) {
        return;
    }

    var params = new URLSearchParams( window.location.search );
    var source = params.get( 'utm_source' )
        || ( document.referrer ? new URL( document.referrer ).hostname : '' )
        || 'direct';
    var medium = params.get( 'utm_medium' ) || ( document.referrer ? 'referral' : 'none' );
    var campaign = params.get( 'utm_campaign' ) || '';

    var valeur = encodeURIComponent( JSON.stringify( { source: source, medium: medium, campaign: campaign } ) );
    var expire = new Date( Date.now() + 30 * 24 * 60 * 60 * 1000 ).toUTCString();
    document.cookie = 'agence_source=' + valeur + '; expires=' + expire + '; path=/; SameSite=Lax';
} );
```

### Trente jours, un choix, pas un hasard

La durée de vie du cookie mérite d'être choisie en fonction du cycle de décision réel du site, pas copiée d'un tutoriel. Un site B2B avec un cycle de trois mois perdra l'attribution de beaucoup de visiteurs avec un cookie à sept jours. Trente jours est un compromis raisonnable pour la plupart des formulaires de contact, mais un site à cycle long a intérêt à monter à 60 ou 90 jours.

## Relire la valeur au moment du formulaire

Côté PHP, un champ caché du formulaire — natif ou géré par une extension comme Gravity Forms ou Contact Form 7 — est rempli côté client au chargement de la page, via un petit script qui lit le cookie et injecte sa valeur dans le champ avant soumission. Le hook `wpcf7_before_send_mail` pour Contact Form 7, ou le filtre équivalent côté Gravity Forms, permet ensuite de lire ce champ côté serveur et de l'ajouter au tableau envoyé vers le CRM externe via `wp_remote_post()`.

> L'essentiel à retenir : Capturer les UTM à la première visite, pas au moment du formulaire ; Stocker la source en cookie de première partie ; Transmettre le champ au CRM sans jamais l'écraser côté serveur

```
add_action( 'wpcf7_before_send_mail', function ( $contact_form ) {
    $submission = WPCF7_Submission::get_instance();
    if ( ! $submission ) {
        return;
    }

    $data = $submission->get_posted_data();
    $source_brute = $data['champ_source'] ?? '{}';
    $source = json_decode( wp_unslash( $source_brute ), true );

    wp_remote_post( 'https://crm.example/api/leads', array(
        'timeout' => 8,
        'headers' => array( 'Content-Type' => 'application/json' ),
        'body'    => wp_json_encode( array(
            'email'       => $data['votre-email'] ?? '',
            'utm_source'  => $source['source'] ?? 'inconnu',
            'utm_medium'  => $source['medium'] ?? 'inconnu',
            'utm_campaign'=> $source['campaign'] ?? '',
        ) ),
    ) );
} );
```

## Ne jamais laisser le serveur réécrire la source

Une erreur fréquente : ajouter, côté PHP, une détection de referrer au moment de la soumission elle-même, « pour être sûr ». C'est précisément ce qu'il faut éviter : au moment où le formulaire est soumis, le referrer HTTP pointe vers la page du formulaire, pas vers la source d'acquisition d'origine. Cette réécriture tardive écrase silencieusement la vraie donnée par une valeur fausse mais plausible, ce qui est pire qu'une valeur manquante — personne ne va la remettre en doute.

- Capturer uniquement à la première visite, jamais à la soumission
- Ne jamais laisser un traitement serveur redéfinir un champ déjà rempli côté client
- Prévoir une valeur de repli explicite (« inconnu ») plutôt qu'une chaîne vide qui sera interprétée comme du direct par le CRM

> Une donnée d'attribution fausse coûte plus cher qu'une donnée manquante : elle oriente un budget marketing sur la base d'un mensonge silencieux.

## Pour aller plus loin

Ce mécanisme reste volontairement simple et ne remplace pas un outil d'attribution multi-touch complet. Il couvre le besoin le plus courant : donner à l'équipe commerciale une provenance fiable au moment où un lead lui est transmis, sans faire dépendre le site d'un script tiers ni d'un tag manager. Pour un site à fort volume de leads, la même logique peut être étendue en consignant chaque UTM rencontré dans une table dédiée, ce qui ouvre la porte à une vraie attribution multi-touch le jour où le besoin se fait sentir.
