Une cliente se désabonne, reçoit la confirmation, et retrouve la newsletter dans sa boîte la semaine suivante. Personne n'a touché au paramétrage, le lien de désabonnement fonctionne en recette, et pourtant la réclamation arrive au service client avec le mot CNIL dedans.
Dans Marketing Cloud Engagement, ce scénario n'est presque jamais un bug. C'est une conséquence du modèle de données, et plus précisément d'une valeur : la Subscriber Key.
La Subscriber Key identifie un abonné. Deux lignes qui portent la même adresse email mais deux clés différentes sont, pour la plateforme, deux personnes distinctes. Tout le reste en découle.
| Sujet | Comportement | Conséquence avec deux clés |
|---|---|---|
| Envoi | Les doublons sont écartés d'un envoi sur la base de la clé | Deux fois le même email dans la même boîte |
| Désabonnement | Le lien agit sur l'abonné identifié par sa clé | La personne reste active sous l'autre clé |
| Statut | Chaque abonné porte son propre statut | Une adresse en erreur reste active ailleurs |
| Contacts | Chaque clé crée un contact, et les contacts comptent au contrat | La même personne est facturée deux fois |
L'origine du problème est presque toujours la même : une data extension d'envoi reliée aux abonnés par l'adresse email, parce que le fichier source ne contenait pas l'identifiant client. Un import de fidélité, une liste d'un prestataire, un export d'un site événementiel, et la base se dédouble sans le moindre message d'erreur.
⚠️ Le signal à surveiller : une réclamation pour un désabonnement non respecté est rarement isolée. Si le cas existe, il en existe souvent des milliers, et chacun est un manquement au RGPD.
La data view système _Subscribers expose All Subscribers en SQL. Première requête, le volume : combien d'adresses existent sous plusieurs clés.
SELECT
s.EmailAddress,
COUNT(*) AS NbCles,
MIN(s.DateJoined) AS PremiereInscription
FROM _Subscribers AS s
WHERE s.EmailAddress IS NOT NULL
GROUP BY s.EmailAddress
HAVING COUNT(*) > 1
Quelques dizaines de lignes relèvent du nettoyage. Plusieurs milliers signalent une source d'alimentation mal reliée, qui continue de produire des doublons à chaque exécution.
Deuxième requête, les cas à risque : les abonnés encore actifs alors que la même adresse est désabonnée sous une autre clé. Ce sont eux qui déclenchent les réclamations.
SELECT
actif.SubscriberKey,
actif.EmailAddress,
MAX(desab.DateUnsubscribed) AS DateDesabonnement
FROM _Subscribers AS actif
INNER JOIN _Subscribers AS desab
ON desab.EmailAddress = actif.EmailAddress
AND desab.SubscriberKey <> actif.SubscriberKey
WHERE actif.Status = 'active'
AND desab.Status = 'unsubscribed'
GROUP BY actif.SubscriberKey, actif.EmailAddress
Le GROUP BY évite d'écrire deux fois la même clé active quand l'adresse a été désabonnée sous plusieurs autres clés, ce qui ferait échouer l'écriture dans une data extension dont SubscriberKey est la clé primaire.
💡 Business units : _Subscribers porte des données du niveau entreprise. Depuis une business unit enfant, on interroge ENT._Subscribers pour obtenir la liste complète.
La correction de fond prend des semaines. En attendant, un script d'exclusion empêche les envois vers ces adresses. C'est une expression AMPscript évaluée pour chaque destinataire au moment de l'envoi : si elle renvoie vrai, le destinataire est écarté.
RowCount(LookupRows("Desabonnes_Autre_Cle", "EmailAddress", emailaddr)) > 0
Le test porte sur l'adresse et non sur la clé, pour couvrir tous les doublons d'un coup. LookupRows ne tient pas compte de la casse, ce qui évite de laisser passer une adresse saisie avec des majuscules. Salesforce prévient en revanche qu'un script d'exclusion complexe ou appliqué à une grande table ralentit l'envoi : sur un gros volume, mieux vaut filtrer l'audience avant son entrée dans le parcours.
Tant que l'alimentation reste reliée par l'email, les doublons reviennent. Trois étapes, dans cet ordre :
⚠️ Ne nettoyez pas en supprimant des lignes dans All Subscribers : supprimer un abonné efface aussi son statut. S'il revient par un import, il redevient actif, et le contact reste compté tant qu'il n'est pas supprimé dans Contact Builder.
Salesforce déconseille l'adresse email comme Subscriber Key. Une bonne clé est unique, stable dans le temps, indépendante du canal et partagée avec vos autres systèmes. En pratique, c'est l'identifiant client de votre système maître, ou l'identifiant du Contact ou du Lead quand Marketing Cloud Connect est en place. La Contact Key doit porter la même valeur.
Changer de clé après coup n'est pas une opération de maintenance : Salesforce indique qu'une migration se prépare avec votre interlocuteur commercial et peut immobiliser les envois et les imports plusieurs jours. Autant la choisir correctement avant la première alimentation.
Dans Adobe Campaign, la clé technique d'un destinataire est générée par la base, et la réconciliation se fait avec les clés que vous choisissez à chaque import. Dans Marketing Cloud, la Subscriber Key joue les deux rôles à la fois : c'est vous qui la fournissez, et elle ne se corrige pas facilement.
Le mécanisme du désabonnement est en revanche familier : une liste noire posée sur une fiche destinataire ne protège pas une seconde fiche portant la même adresse. La différence tient à la déduplication, que Campaign peut appliquer sur l'adresse au moment de préparer une diffusion, alors que Marketing Cloud s'appuie sur la clé.
Avant de chercher un bug dans un parcours ou dans un lien de désabonnement, lancez la première requête. Si NbCles dépasse 1 sur des milliers d'adresses, le problème n'est pas dans l'envoi : il est dans le modèle de données, et aucun réglage d'interface ne le corrigera.
Deux lignes qui portent la meme adresse email mais deux cles differentes sont, pour la plateforme, deux personnes distinctes. Le lien de desabonnement agit sur l'abonne identifie par sa cle, donc la personne reste active sous l'autre cle. Ce scenario n'est presque jamais un bug, c'est une consequence du modele de donnees.
La data view systeme _Subscribers expose All Subscribers en SQL : un GROUP BY sur EmailAddress avec HAVING COUNT(*) > 1 donne le nombre d'adresses existant sous plusieurs cles. Quelques dizaines de lignes relevent du nettoyage, plusieurs milliers signalent une source d'alimentation mal reliee qui continue de produire des doublons a chaque execution. Depuis une business unit enfant, on interroge ENT._Subscribers pour obtenir la liste complete.
Un script d'exclusion, expression AMPscript evaluee pour chaque destinataire au moment de l'envoi, ecarte le destinataire quand elle renvoie vrai. Le test porte sur l'adresse et non sur la cle, pour couvrir tous les doublons d'un coup, et LookupRows ne tient pas compte de la casse. Salesforce previent toutefois qu'un script d'exclusion complexe ou applique a une grande table ralentit l'envoi : sur un gros volume, mieux vaut filtrer l'audience avant son entree dans le parcours.
Non. Supprimer un abonne efface aussi son statut : s'il revient par un import, il redevient actif. Le contact, lui, reste compte tant qu'il n'est pas supprime dans Contact Builder, avec le processus de suppression de contacts.
Salesforce deconseille l'adresse email. Une bonne cle est unique, stable dans le temps, independante du canal et partagee avec vos autres systemes : en pratique l'identifiant client de votre systeme maitre, ou l'identifiant du Contact ou du Lead quand Marketing Cloud Connect est en place, la Contact Key portant la meme valeur. Changer de cle apres coup n'est pas une operation de maintenance : la migration se prepare avec votre interlocuteur commercial et peut immobiliser les envois et les imports plusieurs jours.
Je peux analyser vos doublons, vos exclusions et vos envois, et vous rendre un diagnostic écrit avec les requêtes à lancer chez vous.
Me décrire votre contexte →