Paso a paso: conectar CRM con intermediario

Reglas:

  1. Crear el webhook en el intermediario (Make/n8n/custom)
    • Método: POST
    • URL pública HTTPS (esta URL será el crmAccessToken en LinkedScope).
    • El endpoint debe aceptar el header auth (este valor será el crmSecretToken en LinkedScope).
    • El body recibido desde LinkedScope es vacío (null / sin payload).
  2. Implementar validación de auth en el intermediario
    • Leer req.headers.auth.
    • Si es diferente del token esperado, devolver 401/403.
    • Si es válido, continuar con la búsqueda en el CRM.
  3. Buscar deals en el CRM y mapear al formato esperado
    • Tu flujo intermediario debe consultar los endpoints del CRM deseado y devolver negocios abiertos (open/created date) en los últimos 24 meses
    • Construir un array JSON puro (no un objeto con deals)
    • Retorno obligatorio: HTTP 200 + application/json + […]
  4. Estructura esperada del JSON de respuesta
    • La raíz debe ser un array: [ {deal1}, {deal2} ]
    • Campos recomendados por deal:
      • dealName, dealLink, companyName, createdAt, dealStage, dealValue
    • Campos de identificación (muy recomendados):
      • linkedinCompanyId o companyUrn / company_urn
      • opcional: linkedinCompanyUrl (/company/123 o /company/slug)
    • Estado:
      • isWon: true | false | null
      • También acepta strings como won/lost/closedwon/closedlost

Ejemplo práctico:

[
{
"dealId": "D-1001",
"dealName": "Plan Enterprise",
"dealLink": "https://crm.ejemplo.com/deals/D-1001",
"pipeline": "Ventas",
"ownerName": "Ana Silva",
"ownerEmail": "[email protected]",
"companyName": "ACME",
"companyDomain": "acme.com",
"linkedinCompanyId": "89482395",
"dealStage": "Propuesta enviada",
"dealValue": 15000,
"createdAt": "2025-11-01T10:23:00Z",
"closedAt": null,
"isWon": null
}
]
  1. Configurar en LinkedScope (Settings > Integrations > Any CRM)
    • Campo 1 (trigger/webhook URL): URL del webhook del intermediario.
    • Campo 2 (token): secreto compartido.
    • Guardar. El backend valida llamando al webhook (dummyFetch).
  2. Validación y sincronización
    • Si el webhook/auth falla al guardar: error de credenciales (CRM Credentials Error).
    • Con la conexión guardada, LinkedScope usa este webhook para cargar deals/users/stages.
    • Opcional: disparar sync manual vía POST /api/v1/crm-sync/invoke (autenticado).
  3. Checklist de errores comunes
    • Devolver { deals: […] } en lugar de […] → incorrecto.
    • Si no envías ownerName / ownerEmail / dealStage → usuarios/etapas quedan incompletos o vacíos.
    • URL sin http/https → bloqueado en la UI.
    • Token vacío → la integración ANY tiende a devolver vacío.

Para la respuesta del webhook:

  • La respuesta debe ser un array JSON ([ … ]), no un objeto.
  • Devolver negocios abiertos en los últimos 24 meses (2 años), para una mejor experiencia.
  • Técnicamente el parser acepta deals con campos faltantes (aplica fallback), por lo que lo “obligatorio por deal” es mínimo.
  • En la práctica, para que funcione bien, devuelve como mínimo:
    • dealName, dealLink, companyName, createdAt, dealStage, dealValue
  • Muy recomendado:
    • id/dealId/deal_id (dedupe)
    • linkedinCompanyId o companyUrn (mejor matching)
    • ownerName y ownerEmail (owners/listados)