Ir al contenido

Salesforce

Integración con Salesforce a través de su API REST (versión v59.0). La familia cubre el ciclo de vida de un registro: crear, leer por id, actualizar, hacer upsert por id externo, borrar y consultar cualquier cosa con SOQL.

Igual que la propia API de Salesforce, los nodos son genéricos: en lugar de un nodo por entidad, nombrás el sObject (Account, Contact, Lead, Opportunity, Case, o cualquier objeto personalizado terminado en __c) en un parámetro, y el mismo nodo te sirve para toda la organización.

La autenticación se resuelve con el módulo de credenciales (proveedor salesforce) mediante el flujo OAuth2 password grant. El token se pide una vez, se cachea en memoria unas dos horas y se renueva solo cuando expira.

NodoNombre internoLlamada HTTP
Salesforce: Crear registrosalesforceCreateRecordPOST /sobjects/{sobject}
Salesforce: Leer registrosalesforceGetRecordGET /sobjects/{sobject}/{id}
Salesforce: Actualizar registrosalesforceUpdateRecordPATCH /sobjects/{sobject}/{id}
Salesforce: Upsert registrosalesforceUpsertRecordPATCH /sobjects/{sobject}/{extField}/{extValue}
Salesforce: Consulta SOQLsalesforceQueryGET /query?q=...
Salesforce: Borrar registrosalesforceDeleteRecordDELETE /sobjects/{sobject}/{id}

Todas las rutas son relativas a {instance_url}/services/data/v59.0, y el instance_url viene junto con el token: nunca lo escribís.

Todos los nodos comparten la credencial; cinco de los seis comparten además el parámetro sobject. El resto está documentado en la página de cada operación.

ParámetroTipoObligatorioDescripción
credentials_idcredentialsSíCredencial de Salesforce (proveedor salesforce)
sobjecttextSí (salvo en la consulta SOQL)Nombre de API del objeto: Account, Contact, Lead, Opportunity, Case, MiObjeto__c…

Proveedor: salesforce. Creala en Credenciales → Agregar → Salesforce.

CampoDescripción
login_urlhttps://login.salesforce.com para producción, https://test.salesforce.com para una sandbox. Opcional: por defecto usa producción
client_idConsumer Key de tu Connected App
client_secretConsumer Secret de tu Connected App
usernameEl usuario de Salesforce con el que corre el flujo
passwordLa contraseña del usuario concatenada con el security token, sin separador
timeoutOpcional. Tiempo máximo de la petición en milisegundos (por defecto 30000)

El botón Test pide el token OAuth2 y, si todo va bien, muestra el instance_url al que resolvió: una forma rápida de confirmar que estás apuntando a la organización correcta.

Esta es la parte que más veces falla en el primer intento.

  • El motor envía grant_type=password a {login_url}/services/oauth2/token y después llama a la API con Authorization: Bearer {access_token}.
  • password es la contraseña más el security token, pegados. Si tu contraseña es Ventas2026! y el token es AbCd1234EfGh, el campo contiene Ventas2026!AbCd1234EfGh. El security token le llega al usuario por email desde Setup → Reset My Security Token y cambia cada vez que cambia la contraseña.
  • La Connected App tiene que tener habilitado el password grant y los scopes OAuth api (y normalmente refresh_token). Según la organización, el perfil del usuario puede necesitar además relajar las restricciones de IP.
  • Para una sandbox, poné login_url en https://test.salesforce.com y acordate de que el usuario lleva el sufijo de la sandbox (usuario@empresa.com.nombresandbox).
  • El token se cachea en memoria unas dos horas y lo comparten todos los nodos del flujo, así que no se agotan los límites de login de Salesforce en cada llamada. Ante un 401, el nodo pide un token nuevo y reintenta la llamada una vez, de forma transparente.

sobject es un campo de texto libre, no un desplegable, y su valor va directo a la URL. Tiene que ser el nombre de API del objeto, que en la práctica distingue mayúsculas y no siempre coincide con la etiqueta que ves en Salesforce:

Lo que gestionás en Salesforcesobject
Cuentas (empresas)Account
ContactosContact
CandidatosLead
OportunidadesOpportunity
Casos (soporte)Case
Objetos personalizadosEl nombre de API terminado en __c, ej. Suscripcion__c

El valor no se valida antes de la llamada: un nombre equivocado vuelve como 404 desde Salesforce. Con los nombres de campo pasa lo mismo: LastName, Company, StageName, y los personalizados terminados en __c. Los consultás en Setup → Object Manager → Fields & Relationships.

Cada nodo devuelve su resultado en data más un _meta con la versión del módulo y los tiempos. Como Salesforce responde 204 No Content a PATCH y DELETE, los nodos de actualizar, upsert y borrar arman ellos mismos el objeto de confirmación:

{
"data": { "id": "0015g00000AbCdEFGH", "success": true },
"_meta": { "moduleVersion": "1.0.0", "success": true, "id": "0015g00000AbCdEFGH", "totalMs": 380 }
}

El nodo de consulta SOQL devuelve el array records directamente en data, listo para recorrer.

Si algo falla, el nodo corta la rama y devuelve un objeto error:

{
"data": {},
"error": {
"message": "Required fields are missing: [LastName] (REQUIRED_FIELD_MISSING)",
"type": "validation",
"status": 400
}
}

Salesforce informa los errores como un array de { message, errorCode }; el nodo aplana la primera entrada en ese mensaje único y legible.

  • Las variables dinámicas tipo {{data.email}} se resuelven en todos los parámetros, incluidos los JSON y la consulta SOQL, porque el texto se resuelve primero y se parsea después.
  • Los reintentos son automáticos, con un tope de 3 intentos y espera exponencial, para errores de red, timeouts, 429/503 (respetando Retry-After) y 5xx. Los errores de validación (400), 404 y de autenticación no se reintentan.
  • El tiempo máximo por petición es de 30 segundos; podés subirlo con el campo timeout de la credencial.
  • Los secretos nunca se escriben completos en los logs: solo una forma enmascarada.
  • Los ids de Salesforce vienen en dos formas, de 15 caracteres (distingue mayúsculas) y de 18 (no las distingue). Las dos funcionan en los nodos.
Situación¿Se reintenta?Qué hacer
Validación (400)NoSalesforce explica el motivo en message (REQUIRED_FIELD_MISSING, INVALID_FIELD, una regla de validación…). Corregí los datos.
No encontrado (404)NoEl registro o el sObject no existe. Revisá el id y el nombre de API.
Autenticación (401/403)NoSi después del reintento automático con token nuevo sigue fallando, revisá la Connected App, el usuario, la contraseña + security token o los permisos del perfil.
Límite de tasa (429/503)SíSe respeta Retry-After y se reintenta la llamada.
Servidor (5xx)SíError temporal de Salesforce; se reintenta solo.
Red / TimeoutSíProblema transitorio; se reintenta solo.
  • HubSpot — la otra familia de CRM, basada en objetos genéricos y propiedades.
  • Monday — gestión del trabajo con un modelo de tableros parecido a un CRM.
  • Integraciones de CRM — casos de uso completos entre CRMs.
  • Variables dinámicas — cómo se resuelve {{data.campo}}.
  • Nodo HTTP — para los endpoints de Salesforce que estos nodos no cubren (Composite, Bulk API, describe…).