Reglas:
- 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).
- 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.
- 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 + […]
- 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
}
]- 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).
- 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).
- 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)