Objetivo de aprendizaje
Al terminar esta guía, sabrás cómo identificar las empresas de lemlist cuya sincronización con el CRM está bloqueada por un conflicto de dominio duplicado, reasignar sus contactos al registro correcto y automatizar todo el flujo de trabajo de limpieza con la API de lemlist, sin ningún trabajo manual en la interfaz de lemlist.
¿Por qué es importante?
Cuando los contactos no se pueden sincronizar con tu CRM, tu equipo de ventas trabaja con datos incompletos. Los negocios se quedan sin seguimiento, las cuentas no aparecen en HubSpot, Salesforce o Pipedrive, y los huecos en el pipeline pasan desapercibidos: el comercial no ve ningún error. UNIQUE_INDEX_ERROR_COMPANY es una de las causas más habituales, y en los equipos con bases de datos de contactos grandes puede bloquear cientos de registros a la vez sin que nadie lo note.
El error se produce porque lemlist usa el dominio de la empresa como identificador único al sincronizar. Si dos empresas de lemlist comparten el mismo dominio, solo se sincroniza correctamente la primera. Todos los contactos vinculados a la segunda quedan bloqueados hasta que resuelvas el conflicto.
lemlist ya no guarda un dominio de email personal (gmail.com, yahoo.com, outlook.com y otros proveedores habituales) como dominio de empresa, por lo que las empresas nuevas ya no se crean con uno. Las empresas creadas a partir de un dominio personal antes de este cambio no se actualizan de forma retroactiva, y este flujo de trabajo sigue aplicándose a ellas.
Sin acceso a la API, la única solución es manual: abrir cada duplicado en la interfaz de lemlist y corregirlos uno a uno. Los tres endpoints de esta guía te permiten automatizar todo el proceso y ejecutarlo de forma programada, para que los nuevos conflictos se resuelvan antes de que tu equipo llegue a notarlos.
Cuando tu CRM ya se encarga de esto
Si tu espacio de trabajo tiene activada la replicación de fusiones del CRM, al fusionar dos empresas en HubSpot o Salesforce, la empresa correspondiente de lemlist se integra automáticamente en la que se conserva: los contactos, el historial, las tareas, las entradas en campañas y las listas se transfieren, y el duplicado se elimina. En ese caso basta con hacer la limpieza en tu CRM y no necesitas este flujo de trabajo.
Esta guía sigue siendo útil cuando:
Usas Pipedrive: las fusiones nunca se replican en este caso, porque la API de Pipedrive no indica qué registro se conservó tras una fusión
Los duplicados se crearon antes de que se activara la replicación de fusiones en tu espacio de trabajo: los duplicados anteriores no se procesan de forma retroactiva
El duplicado no procede de ninguna fusión en el CRM; por ejemplo, una importación masiva que creó dos empresas de lemlist con el mismo dominio
La replicación de fusiones se está implementando de forma progresiva y no está activa en todos los espacios de trabajo. Contacta con el equipo de asistencia si no sabes si se aplica al tuyo.
Requisitos previos
Tienes una clave de API de lemlist; consulta la documentación de la API de lemlist
Tu CRM (HubSpot, Salesforce o Pipedrive) está conectado a lemlist
Sabes hacer llamadas HTTP a una API
Opcional: acceso a n8n, Zapier o Make para ejecutar el flujo de trabajo de forma programada
Lección principal — Flujo de trabajo paso a paso
Fase 1: Conoce los tres endpoints de la API
Tres endpoints hacen todo el trabajo. Antes de crear tu automatización, dedica unos minutos a entender qué devuelve cada uno: así la Fase 2 te resultará mucho más clara.
1. GET /api/companies — filtrar por estado de sincronización con el CRM
El nuevo parámetro de consulta crmSyncStatus filtra las empresas según su estado de sincronización. Pasa unique_index_error_company para obtener solo las empresas bloqueadas por un conflicto de dominio.
GET /api/companies?crmSyncStatus=unique_index_error_company
Otros valores admitidos para crmSyncStatus: synced, not_synced, error, property_doesnt_exist, required_field_missing, company_already_exists_with_name, company_already_exists_with_linkedin_url.
Ahora, cada empresa de la respuesta incluye un bloque crmSync:
"crmSync": { "provider": "hubspot", "crmRecordId": "12345", "syncDisabled": false, "errors": [ { "reason": "unique_index_error_company", "metadata": { "alreadyExistingCompanyId": "abc123" } } ]}
alreadyExistingCompanyId es la empresa de lemlist que ya ocupa el slot del CRM en conflicto: es la empresa a la que reasignarás los contactos en el paso 3.
💡 Este campo hace el trabajo difícil por ti. En lugar de adivinar qué empresa es la correcta, la API te lo indica directamente: es la que ya se sincroniza con tu CRM.
2. GET /api/contacts — filtrar por empresa
Cuatro nuevos filtros, mutuamente excluyentes, te permiten listar todos los contactos vinculados a una empresa concreta. Pasa uno de ellos:
companyId
companyDomain
companyLinkedinUrl
companySalesnavUrl
GET /api/contacts?companyId={companyId}
Las variantes de dominio y URL se convierten internamente en un companyId. Si no se encuentra ninguna coincidencia, el endpoint devuelve una lista vacía, no un 404.
💡 Estos filtros también son útiles más allá de la limpieza de duplicados: cualquier equipo que haga prospección basada en cuentas puede usarlos para obtener todos los contactos de un dominio de empresa sin necesidad de conocer el ID interno.
3. DELETE /api/companies/:companyId
Elimina un registro de empresa de lemlist. Si todavía hay contactos vinculados, la solicitud se rechaza con un error 400 COMPANY_HAS_CONTACTS que incluye un contactCount.
DELETE /api/companies/{companyId}
Pasa ?force=true para desvincular todos los contactos antes de la eliminación. Los contactos desvinculados se quedan sin companyId. La respuesta incluye unlinkedContacts: N, que confirma cuántos se desvincularon. Usa esta opción cuando no sea necesario reasignar los contactos; por ejemplo, si el duplicado contenía registros de prueba o contactos que no quieres conservar.
DELETE /api/companies/{companyId}?force=true
Este endpoint solo elimina el registro de lemlist. No elimina ni modifica el registro correspondiente en tu CRM: cualquier registro huérfano del CRM debe limpiarse por separado en el propio CRM.
Fase 2: Ejecuta el flujo de trabajo de limpieza en cuatro pasos
Ahora que sabes qué hace cada endpoint, encadénalos en orden. Estas cuatro llamadas a la API resuelven automáticamente todos los conflictos de duplicados. Ejecútalas manualmente para una limpieza puntual o prográmalas cada noche en n8n, Zapier o Make.
Este flujo de trabajo da por hecho que la empresa de lemlist que ya está asignada al CRM es la correcta. Lo que se elimina es el duplicado, es decir, el registro que genera el error.
Paso 1 — Lista todas las empresas bloqueadas
GET /api/companies?crmSyncStatus=unique_index_error_company
Para cada resultado, extrae dos valores del bloque crmSync:
_id: la empresa duplicada (incorrecta) que hay que eliminar
errors[0].metadata.alreadyExistingCompanyId: la empresa correcta a la que hay que reasignar los contactos
Ahora tienes dos ID por conflicto: la empresa que hay que eliminar y la empresa a la que hay que reasignar los contactos. Una sola llamada a la API te da la visión completa de todas las empresas bloqueadas de tu espacio de trabajo.
Paso 2 — Lista los contactos vinculados al duplicado
GET /api/contacts?companyId={WRONG_COMPANY_ID}
Esto devuelve todos los contactos vinculados actualmente a la empresa duplicada.
Antes de reasignar, necesitas una lista completa de los contactos afectados. Ejecuta esta llamada una vez por cada empresa bloqueada del paso 1: recorre cada resultado y reúne todos los contactos que hay que mover.
Paso 3 — Reasigna cada contacto a la empresa correcta
Para cada contacto devuelto en el paso 2, haz un upsert por email y establece companyId con la empresa correcta:
POST /api/contacts{ "email": "[email protected]", "companyId": "{RIGHT_COMPANY_ID}"}
La reasignación vincula cada contacto a la empresa que ya se sincroniza con tu CRM. Tras este paso, el contacto pertenece a la cuenta correcta y se sincronizará en el siguiente ciclo del CRM.
Paso 4 — Elimina el duplicado, que ahora está vacío
DELETE /api/companies/{WRONG_COMPANY_ID}
Con todos los contactos reasignados, el duplicado ya no tiene registros vinculados y se puede eliminar sin problemas. Así se resuelve el conflicto de dominio: las próximas sincronizaciones de la empresa correcta se completarán sin errores. Si te saltaste el paso 3, usa ?force=true para desvincular y eliminar en una sola llamada, pero ten en cuenta que los contactos desvinculados no tendrán ninguna empresa asociada hasta que los reasignes.
Aplicación práctica
Así es como funciona en la práctica. El equipo de revenue operations de una empresa SaaS B2B descubre que faltan más de 200 contactos en HubSpot. Tras revisar los registros de sincronización en Settings → Integrations → HubSpot → Logs, encuentra 14 empresas marcadas con UNIQUE_INDEX_ERROR_COMPANY, todas con dominios compartidos con empresas que ya estaban en su CRM tras una importación masiva de datos realizada varios meses antes.
En lugar de abrir cada duplicado en la interfaz de lemlist y corregirlos uno a uno, lo que les habría llevado buena parte del día, crean un flujo de trabajo de cuatro pasos en n8n:
Obtener todas las empresas con crmSyncStatus=unique_index_error_company
Para cada empresa bloqueada, obtener sus contactos vinculados
Reasignar cada contacto al alreadyExistingCompanyId
Eliminar el duplicado, que ahora está vacío
La primera ejecución resuelve los 14 conflictos y desbloquea los más de 200 contactos, que aparecen en HubSpot en el siguiente ciclo de sincronización. El equipo programa el flujo de trabajo para que se ejecute cada noche. Durante las dos semanas siguientes, detecta y resuelve automáticamente tres conflictos nuevos, que el equipo no habría notado hasta que un comercial avisara de que faltaban datos.
Solución de problemas y errores comunes
DELETE devuelve 400 COMPANY_HAS_CONTACTS
Causa: todavía hay contactos vinculados; el paso 3 no se ejecutó o no se completó para todos los contactos.
Vuelve a ejecutar GET /api/contacts?companyId={WRONG_ID} para comprobar cuántos contactos quedan
Completa el paso 3 para los contactos restantes y vuelve a intentar el DELETE
Otra opción es usar DELETE /api/companies/{WRONG_ID}?force=true para desvincular y eliminar en una sola llamada; los contactos desvinculados no tendrán empresa hasta que los reasignes
Falta alreadyExistingCompanyId en la respuesta de error
Causa: el tipo de conflicto es diferente. Este campo solo aparece con unique_index_error_company; los demás motivos de error tienen metadatos distintos.
Revisa errors[0].reason en el bloque crmSync
Si el motivo no es unique_index_error_company, este flujo de trabajo no se aplica a ese registro
Usa crmSyncStatus=error como filtro más amplio para ver todos los errores de sincronización y clasifícalos por motivo
Los contactos siguen sin sincronizarse después de la limpieza
Causa: puede que el contacto esté vinculado a otra empresa que también tiene errores de sincronización, o que el CRM necesite unos minutos para procesar los cambios.
Vuelve a ejecutar GET /api/companies?crmSyncStatus=unique_index_error_company para comprobar si hay más conflictos
Espera unos minutos y revisa los registros de sincronización en Settings → Integrations → [CRM] → Logs
Si un contacto se desvinculó con ?force=true, reasígnalo con la API de contactos
El CRM sigue mostrando registros huérfanos después de la limpieza
Causa: DELETE /api/companies solo elimina el registro de lemlist; no modifica tu CRM.
Inicia sesión en HubSpot, Salesforce o Pipedrive
Busca el registro de empresa huérfano y elimínalo o fusiónalo con las herramientas de tu CRM
En HubSpot y Salesforce con la replicación de fusiones activada, al fusionar en el CRM también se integra el duplicado de lemlist: haz primero la fusión en el CRM y deja que se propague, en lugar de limpiar ambos lados a mano
Usa la detección de duplicados integrada de tu CRM para identificar y limpiar registros similares
