Ce que vous allez apprendre
À la fin de ce tutoriel, vous saurez repérer les entreprises lemlist dont la synchronisation avec le CRM est bloquée par un domaine en doublon. Vous saurez rattacher leurs contacts à la bonne fiche et automatiser toute la procédure avec l’API lemlist, sans aucune intervention manuelle dans l’interface lemlist.
Pourquoi c’est important
Lorsque des contacts ne peuvent pas se synchroniser avec votre CRM, votre équipe commerciale travaille avec des données incomplètes. Des opportunités restent sans suivi, des comptes restent invisibles dans HubSpot, Salesforce ou Pipedrive, et les lacunes du pipeline passent inaperçues : aucune erreur n’est signalée aux commerciaux. UNIQUE_INDEX_ERROR_COMPANY est l’une des causes les plus fréquentes de ce problème. Pour les équipes qui gèrent de grandes bases de contacts, cette erreur peut bloquer des centaines de fiches à la fois, sans qu’elles s’en aperçoivent.
Cette erreur se produit parce que lemlist utilise le domaine de l’entreprise comme identifiant unique lors de la synchronisation. Si deux entreprises lemlist partagent le même domaine, seule la première à se synchroniser y parvient. Tous les contacts rattachés à la seconde restent bloqués tant que vous n’avez pas résolu le conflit.
lemlist n’enregistre plus les domaines d’adresses email personnelles (gmail.com, yahoo.com, outlook.com et ceux d’autres fournisseurs d’email courants) comme domaines d’entreprise. Les nouvelles entreprises ne sont donc plus créées avec l’un de ces domaines. Les entreprises créées à partir d’un domaine personnel avant ce changement ne sont pas mises à jour rétroactivement : cette procédure reste valable pour elles.
Sans accès à l’API, la seule solution consiste à ouvrir chaque doublon dans l’interface lemlist et à le corriger manuellement, un par un. Les trois routes de l’API présentées dans ce tutoriel permettent d’automatiser toute la procédure et d’en planifier l’exécution, pour résoudre les nouveaux conflits avant même que votre équipe ne les remarque.
Quand le nettoyage dans le CRM suffit
Si la répercussion des fusions du CRM est activée dans votre espace de travail, fusionner deux entreprises dans HubSpot ou Salesforce entraîne automatiquement leur fusion dans lemlist. Les contacts, l’historique, les tâches, les inscriptions aux campagnes et les listes de l’entreprise en doublon sont transférés vers celle qui est conservée, puis le doublon est supprimé. Le nettoyage dans votre CRM suffit alors : cette procédure n’est pas nécessaire.
Ce tutoriel reste utile dans les cas suivants :
Vous utilisez Pipedrive : les fusions effectuées dans ce CRM ne sont jamais répercutées dans lemlist, car l’API Pipedrive n’indique pas quelle fiche a été conservée après une fusion
Avant l’activation de la répercussion des fusions dans votre espace de travail, des doublons existaient déjà : ils ne sont pas traités rétroactivement
Le doublon ne vient pas d’une fusion dans le CRM, mais par exemple d’un import en masse qui a créé deux entreprises lemlist avec le même domaine
La répercussion des fusions est déployée progressivement et n’est pas encore activée sur tous les espaces de travail. En cas de doute pour votre espace de travail, contactez l’équipe support.
Avant de commencer
Vous disposez d’une clé API lemlist : consultez la documentation de l’API lemlist
Votre CRM (HubSpot, Salesforce ou Pipedrive) est connecté à lemlist
Vous êtes à l’aise avec les appels HTTP à une API
Facultatif : un accès à n8n, Zapier ou Make pour planifier l’exécution de la procédure
La procédure pas à pas
Partie 1 : comprendre les trois routes de l’API
La procédure repose sur trois routes de l’API. Avant de créer votre automatisation, prenez quelques minutes pour comprendre ce que renvoie chacune d’elles : la phase 2 sera plus facile à suivre.
1. GET /api/companies : filtrer par état de synchronisation avec le CRM
Le nouveau paramètre de requête crmSyncStatus permet de filtrer les entreprises selon leur état de synchronisation. Utilisez la valeur unique_index_error_company pour ne récupérer que les entreprises bloquées par un conflit de domaine.
GET /api/companies?crmSyncStatus=unique_index_error_company
Autres valeurs acceptées pour crmSyncStatus : synced, not_synced, error, property_doesnt_exist, required_field_missing, company_already_exists_with_name, company_already_exists_with_linkedin_url.
Chaque entreprise renvoyée dans la réponse comprend désormais un bloc crmSync :
"crmSync": { "provider": "hubspot", "crmRecordId": "12345", "syncDisabled": false, "errors": [ { "reason": "unique_index_error_company", "metadata": { "alreadyExistingCompanyId": "abc123" } } ]}
alreadyExistingCompanyId est l’identifiant de l’entreprise lemlist déjà synchronisée avec le CRM pour ce domaine. C’est à elle que vous rattacherez les contacts à l’étape 3.
💡 Ce champ vous évite d’avoir à deviner quelle entreprise est la bonne. L’API vous l’indique directement : c’est celle qui se synchronise déjà avec votre CRM.
2. GET /api/contacts : filtrer par entreprise
Quatre nouveaux filtres permettent de lister tous les contacts rattachés à une entreprise donnée. Vous ne pouvez en utiliser qu’un à la fois :
companyId
companyDomain
companyLinkedinUrl
companySalesnavUrl
GET /api/contacts?companyId={companyId}
Pour les filtres par domaine ou par URL, l’API recherche en interne le companyId correspondant. Si aucune correspondance n’est trouvée, elle renvoie une liste vide, et non une erreur 404.
💡 Ces filtres sont aussi utiles en dehors de la suppression des doublons. Si vous faites de la prospection ciblée par compte, vous pouvez récupérer tous les contacts associés au domaine d’une entreprise sans connaître son identifiant interne.
3. DELETE /api/companies/:companyId
Cette route supprime une fiche d’entreprise dans lemlist. Si des contacts y sont encore rattachés, la requête est refusée avec une erreur 400 COMPANY_HAS_CONTACTS qui inclut contactCount.
DELETE /api/companies/{companyId}
Ajoutez ?force=true pour détacher tous les contacts rattachés à l’entreprise avant de la supprimer. Le champ companyId de ces contacts n’est alors plus défini. La réponse contient unlinkedContacts : N, qui confirme le nombre de contacts détachés. Utilisez cette option lorsque les contacts n’ont pas besoin d’être rattachés à une autre entreprise, par exemple si le doublon contenait des fiches de test ou des contacts que vous ne souhaitez pas conserver.
DELETE /api/companies/{companyId}?force=true
Cette route supprime uniquement la fiche dans lemlist. Elle ne supprime ni ne modifie la fiche correspondante dans votre CRM : les éventuelles fiches orphelines doivent être traitées séparément dans le CRM.
Partie 2 : supprimer les doublons en quatre étapes
Maintenant que vous connaissez le rôle de chaque route, enchaînez les appels dans l’ordre ci-dessous. Ces quatre appels à l’API résolvent automatiquement tous les conflits de doublons. Exécutez-les manuellement pour un nettoyage ponctuel, ou programmez leur exécution chaque nuit dans n8n, Zapier ou Make.
Cette procédure part du principe que l’entreprise lemlist déjà associée au CRM est la bonne. Le doublon, c’est-à-dire la fiche qui génère l’erreur, est celui qui sera supprimé.
Étape 1 : lister toutes les entreprises bloquées
GET /api/companies?crmSyncStatus=unique_index_error_company
Pour chaque résultat, extrayez deux valeurs de l’entreprise renvoyée :
_id : l’identifiant de l’entreprise en doublon à supprimer
errors[0].metadata.alreadyExistingCompanyId : l’identifiant de la bonne entreprise à laquelle rattacher les contacts
Vous disposez maintenant de deux identifiants par conflit : celui de l’entreprise à supprimer et celui de l’entreprise à laquelle rattacher les contacts. Un seul appel à l’API suffit pour obtenir ces informations pour toutes les entreprises bloquées de votre espace de travail.
Étape 2 : lister les contacts rattachés au doublon
GET /api/contacts?companyId={WRONG_COMPANY_ID}
Cet appel renvoie tous les contacts actuellement rattachés à l’entreprise en doublon.
Avant de les rattacher à une autre entreprise, vous devez disposer de la liste complète des contacts concernés. Faites cet appel une fois pour chaque entreprise bloquée repérée à l’étape 1 : parcourez les résultats et récupérez tous les contacts à déplacer.
Étape 3 : rattacher chaque contact à la bonne entreprise
Pour chaque contact renvoyé à l’étape 2, utilisez son adresse email pour le créer ou le mettre à jour, en renseignant companyId avec l’identifiant de la bonne entreprise :
POST /api/contacts{ "email": "[email protected]", "companyId": "{RIGHT_COMPANY_ID}"}
Chaque contact est ainsi rattaché à l’entreprise qui se synchronise déjà avec votre CRM. Il appartient alors au bon compte et sera synchronisé au prochain cycle de synchronisation avec le CRM.
Étape 4 : supprimer le doublon désormais vide
DELETE /api/companies/{WRONG_COMPANY_ID}
Une fois tous les contacts rattachés à la bonne entreprise, le doublon n’a plus aucune fiche rattachée et peut être supprimé sans blocage. Le conflit de domaine est ainsi résolu : les prochaines synchronisations de la bonne entreprise s’effectueront sans erreur. Si vous n’avez pas effectué l’étape 3, utilisez ?force=true pour détacher les contacts et supprimer le doublon en un seul appel. Les contacts détachés ne seront toutefois associés à aucune entreprise tant que vous ne les aurez pas réaffectés.
Exemple concret
Voici un exemple concret : l’équipe RevOps d’une entreprise SaaS B2B découvre que plus de 200 contacts manquent dans HubSpot. Après avoir consulté les journaux de synchronisation dans Paramètres → Intégrations → HubSpot → Journaux, elle repère 14 entreprises qui présentent l’erreur UNIQUE_INDEX_ERROR_COMPANY. Toutes partagent leur domaine avec des entreprises déjà présentes dans le CRM, à la suite d’un import de données en masse réalisé plusieurs mois auparavant.
Plutôt que d’ouvrir les doublons dans l’interface lemlist et de les corriger un par un, ce qui lui aurait pris une bonne partie de la journée, l’équipe met en place une automatisation n8n en quatre étapes :
Récupérer toutes les entreprises avec crmSyncStatus=unique_index_error_company
Pour chaque entreprise bloquée, récupérer les contacts qui lui sont rattachés
Rattacher chaque contact à l’entreprise désignée par alreadyExistingCompanyId
Supprimer le doublon désormais vide
La première exécution résout les 14 conflits et débloque tous les contacts concernés, soit plus de 200. Ils apparaissent dans HubSpot au cycle de synchronisation suivant. L’équipe programme ensuite une exécution chaque nuit. Au cours des deux semaines suivantes, l’automatisation détecte et résout automatiquement trois nouveaux conflits, qui seraient passés inaperçus jusqu’à ce qu’un commercial signale des données manquantes.
Problèmes courants et solutions
DELETE renvoie 400 COMPANY_HAS_CONTACTS
Cause : des contacts sont encore rattachés à l’entreprise. L’étape 3 n’a pas été exécutée ou n’a pas abouti pour tous les contacts.
Relancez GET /api/contacts?companyId={WRONG_ID} pour vérifier combien de contacts restent rattachés
Effectuez l’étape 3 pour les contacts restants, puis relancez la requête DELETE
Vous pouvez aussi utiliser DELETE /api/companies/{WRONG_ID}?force=true pour détacher les contacts et supprimer l’entreprise en un seul appel. Les contacts détachés ne seront associés à aucune entreprise tant qu’ils n’auront pas été réaffectés
La réponse d’erreur ne contient pas alreadyExistingCompanyId
Cause : il s’agit d’un autre type de conflit. Ce champ n’apparaît que pour unique_index_error_company ; les autres motifs d’erreur ont des métadonnées différentes.
Vérifiez errors[0].reason dans le bloc crmSync
Si le motif n’est pas unique_index_error_company, cette procédure ne s’applique pas à la fiche d’entreprise concernée
Utilisez le filtre plus large crmSyncStatus=error pour afficher toutes les erreurs de synchronisation, puis faites le tri par motif
Les contacts ne se synchronisent toujours pas après le nettoyage
Cause : le contact est peut-être rattaché à une autre entreprise qui présente elle aussi des erreurs de synchronisation, ou le CRM a peut-être besoin de quelques minutes pour terminer le traitement.
Relancez GET /api/companies?crmSyncStatus=unique_index_error_company pour vérifier s’il reste d’autres conflits
Attendez quelques minutes, puis consultez les journaux de synchronisation dans Paramètres → Intégrations → [CRM] → Journaux
Si un contact a été détaché avec ?force=true, rattachez-le à une entreprise à l’aide de l’API des contacts
Le CRM contient encore des fiches orphelines après le nettoyage
Cause : DELETE /api/companies supprime uniquement la fiche dans lemlist, sans modifier votre CRM.
Connectez-vous à HubSpot, Salesforce ou Pipedrive
Repérez la fiche d’entreprise orpheline, puis supprimez-la ou fusionnez-la à l’aide des outils de votre CRM
Si la répercussion des fusions est activée pour HubSpot ou Salesforce, la fusion dans le CRM intègre aussi le doublon lemlist à l’entreprise conservée. Effectuez d’abord la fusion dans le CRM et laissez-la se répercuter, plutôt que de faire le nettoyage manuellement dans les deux outils
Utilisez la détection des doublons intégrée à votre CRM pour repérer les fiches similaires et éliminer les doublons
