> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Salesforce

## Descripción general

Conecta tus agentes de IA de ElevenLabs con Salesforce CRM para acceder a datos de clientes, gestionar clientes potenciales y crear oportunidades. Esta integración permite a tus agentes recuperar registros de clientes existentes, crear nuevos clientes potenciales y contactos, y consultar objetos de Salesforce durante las conversaciones.

## Funcionalidades

| Funcionalidad                     | Compatibilidad                                                                                          |
| --------------------------------- | ------------------------------------------------------------------------------------------------------- |
| Modo de retención cero (ZRM)      | No compatible                                                                                           |
| Archivos adjuntos en triggers     | No compatible: los archivos adjuntos en comentarios de casos y correos entrantes no se envían al agente |
| Archivos adjuntos en herramientas | No compatible: las herramientas solo trabajan con texto                                                 |

## Configuración

Esta integración utiliza **Salesforce OAuth 2.0 Client Credentials** para la autenticación. Tendrás que crear una aplicación de cliente externa en Salesforce.

#### Crea una aplicación de cliente externa

1. Inicia sesión en tu organización de Salesforce como administrador
2. Ve a **Setup** > **External Client App Manager**
3. Haz clic en **New External Client App**
4. Rellena **External Client App Name** (por ejemplo, `ElevenLabs Agents`), **API Name** y **Contact Email**
5. En **API (Enable OAuth Settings)**:
   * Marca **Enable OAuth** y **Enable Client Credentials Flow**
   * **Callback URL**: `https://api.elevenlabs.io/oauth/callback`
   * **OAuth Start URL**: `https://api.elevenlabs.io/oauth/start`
   * **Selected OAuth Scopes**: añade estos ámbitos:
     * **Full access (full)**
     * **Perform requests on your behalf at any time (refresh_token, offline_access)**
     * **Manage user data via api**
6. Haz clic en **Create**
7. En la página de la aplicación, abre la pestaña **Settings**, ve a **OAuth Settings** y haz clic en **Consumer Key and Secret**
8. Copia **Consumer Key** y **Consumer Secret**: los necesitarás para la autenticación

#### Configura el flujo de credenciales de cliente de OAuth

> **Warning**
>
> El flujo de credenciales de cliente se recomienda para integraciones de servidor a servidor que no requieren
> interacción del usuario. Asegúrate de que el administrador de Salesforce haya habilitado este flujo.

1. En tu aplicación de cliente externa, haz clic en **Edit**
2. Marca **Enable Client Credentials Flow**: aparecerá el campo **Run As**
3. Configura **Run As** con tu usuario administrador o una cuenta de servicio específica: esto determina los permisos para todas las llamadas a la API
4. Configura **Permitted Users** como **Admin approved users are pre-authorized**
5. Haz clic en **Save**

El usuario de **Run As** determina los permisos para todas las llamadas a la API. Elige un usuario con un perfil de administrador del sistema o un perfil personalizado que tenga acceso a la API y permiso para los objetos que necesita tu agente (Contact, Lead, Account, etc.). El permiso **API Enabled** debe estar marcado en el registro del usuario.

#### Encuentra tu dominio de Salesforce

Necesitas tu dominio de Salesforce para realizar llamadas a la API.

**Método 1: Comprueba tu URL actual**

Cuando hayas iniciado sesión en Salesforce, consulta la barra de direcciones del navegador:

* **Lightning Experience**: `https://acme.lightning.force.com/`
* **My Domain**: `https://acme.my.salesforce.com/`

**Método 2: Setup > Company Information**

Ve a **Setup** > **Company Information** y busca la URL de **My Domain** o la información de la organización.

**Método 3: Setup > Domain Management**

Ve a **Setup** > **Domain Management** > **My Domain**. Tu dominio aparecerá en la parte superior de la página.

**Formatos de dominio habituales:**

* `https://acme.my.salesforce.com` (My Domain)
* `https://acme.lightning.force.com` (Lightning)
* `https://acme.develop.my.salesforce.com` (Sandbox)

> **Note**
>
> Usa el dominio completo sin una barra al final.

#### Conecta en ElevenLabs

En la configuración de integración de ElevenLabs, introduce el **nombre de host de la instancia** de Salesforce (por ejemplo, `acme.my.salesforce.com`), el **Client ID** (Consumer Key) y el **Client Secret** (Consumer Secret).

## Vídeo de demostración

> **Note**
>
> Esta demostración utiliza herramientas webhook heredadas. Si usas la integración nativa de Salesforce, las herramientas
> se configuran automáticamente: no necesitas configurar webhooks manualmente.

## Cómo funciona

#### Resumen general

#### Consulta inicial del cliente

El agente recopila información del cliente y hace preguntas relevantes para identificar sus necesidades de negocio y retos actuales.

#### Consulta de datos del cliente

El agente comprueba si hay registros existentes mediante `salesforce_search_records` para encontrar contactos, cuentas o leads. Obtiene todos los detalles con `salesforce_get_record` y utiliza esta información para personalizar la conversación.

#### Cualificación de leads

Si el cliente es nuevo, el agente recopila información de contacto, evalúa sus necesidades de negocio y determina el proceso de ventas o enrutamiento adecuado.

#### Creación de registros

El agente crea el registro adecuado (lead, contacto u oportunidad) con `salesforce_create_record`, confirma la creación con el cliente y explica los siguientes pasos.

#### Prompt de sistema detallado

```text
# Personality

You are a helpful sales assistant responsible for managing customer relationships and creating records in Salesforce using the available tools. Be friendly, professional, and consultative in your approach.

# Environment

You operate in a sales setting via voice or chat interface, where you engage with potential customers to gather information, check for existing CRM data, and create Salesforce records when necessary.

# Tone

Begin by asking about the customer's business needs and current challenges.

Then, ask relevant qualification questions to understand their requirements, one question at a time, and wait for their response before proceeding.

Once you have basic information about the customer, say you will check for any existing records in the system.

Use any existing information to personalize the conversation and avoid asking for data you already have.

When discussing opportunities, always reference them by name (e.g., "Q1 Enterprise Deal") rather than by ID.

# Goal

After checking existing records, qualify the customer by gathering:
- Company name and size
- Industry and business type
- Current challenges and pain points
- Budget and timeline information
- Decision-making authority

Once you have qualified the customer, gather the following contact details:
- Full name and job title
- Business email address (ensure it's formatted correctly)
- Phone number
- Company name and address

Read the email back to the customer to confirm accuracy.

Once all information is confirmed, explain that you will create a record in our system.

Create the appropriate record (Lead, Contact, or Opportunity) using the `salesforce_create_record` tool.

Thank the customer and explain the next steps in the sales process.

# Guardrails

- Always check for existing records before creating new ones.
- If the customer asks to proceed, do so with the existing information.
- Qualify leads appropriately based on their responses.
- Do not discuss topics outside of business solutions and sales.
- Always maintain professional communication.
- Protect customer privacy and handle data securely.

# Tools

- Call `salesforce_search_records` to look for existing contacts, accounts, or leads (always include Name fields and human-readable information in your SOQL queries).
- If found, call `salesforce_get_record` to get detailed information about the existing record.
- Use `salesforce_create_record` to generate Leads, Contacts, or Opportunities after qualification.
```

> **Tip**
>
> La autorización de herramientas se puede gestionar mediante conexiones de autenticación de Workplace, que gestionan la actualización de tokens
> automáticamente. Las herramientas devuelven nombres y descripciones legibles en lugar de ID técnicos para
> mejorar la calidad de las conversaciones.

## Configuraciones de herramientas

Hay disponibles tres herramientas webhook: `salesforce_search_records`, `salesforce_get_record` y `salesforce_create_record`. Configura la autorización de cada una mediante una conexión de autenticación de Workplace.

### Autorización: conexión OAuth2 de Workplace

#### Ve a Workplace Auth Connections

En tu panel de ElevenLabs, ve a **Agents** > **Workplace Auth Connections** y haz clic en **Add Auth**.

#### Configura la conexión de Salesforce

Rellena los siguientes campos para tu integración de Salesforce:

**Nombre de la conexión**: `Salesforce CRM`

**Client ID**

* Tu Consumer Key de la aplicación de cliente externa
* Ejemplo: `3MVG9JJlvRU3L4pRiOu8pQt5xXB4xGZGm0yW...`

**Client Secret**

* Tu Consumer Secret de la aplicación de cliente externa
* Ejemplo: `1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF...`

**URL de token**

* El endpoint de token OAuth de tu dominio de Salesforce
* Formato: `https://{domain}.my.salesforce.com/services/oauth2/token`
* Ejemplo: `https://acme.my.salesforce.com/services/oauth2/token`

**Ámbitos (opcional)**

* Ámbitos de OAuth para acceder a la API de Salesforce
* Recomendado: `full, api, refresh_token`
* Déjalo en blanco para usar los ámbitos predeterminados de tu aplicación de cliente externa

**Parámetros adicionales (JSON)**

* Parámetros de OAuth adicionales específicos de tu configuración
* Ejemplo para el flujo de credenciales de cliente:

```json
{
  "grant_type": "client_credentials"
}
```

#### Crea la conexión de autenticación

Haz clic en **Create auth connection** para añadir tu configuración.

#### Úsala en las configuraciones de herramientas

Cuando la conexión se haya realizado correctamente, guárdala y consúltala en las configuraciones de tus herramientas webhook, en la sección **Authentication**.

> **Tip**
>
> Las conexiones de autenticación de Workplace gestionan la actualización de tokens automáticamente, por lo que no necesitas gestionar
> los tokens manualmente.

### Configuraciones de herramientas webhook

Añade una conexión de autenticación de Workplace (OAuth2) a cada herramienta en la sección **Authentication**. Usa las pestañas de abajo para revisar la configuración de cada herramienta.

#### salesforce_search_records

**Nombre:** salesforce_search_records
**Descripción:** Busca registros existentes en Salesforce mediante consultas SOQL. Siempre devuelve información legible, incluidos nombres, no solo ID.
**Método:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/query/?q={soql_query}`

**Cabeceras:**

* **Content-Type:** `application/json`

**Parámetros de consulta:**

* **q:** Cadena de consulta SOQL (por ejemplo, "SELECT Id, Name, Email FROM Contact WHERE Email = '[example@email.com](mailto:example@email.com)'")

**JSON de la herramienta:**

```json
{
  "type": "webhook",
  "name": "salesforce_search_records",
  "description": "Searches for existing records in Salesforce using SOQL queries. Always returns human-readable names and details, not just IDs.",
  "api_schema": {
    "url": "https://acme.my.salesforce.com/services/data/v58.0/query/",
    "method": "GET",
    "path_params_schema": [],
    "query_params_schema": [
      {
        "id": "q",
        "type": "string",
        "description": "SOQL query string to search for records. Always include Name fields and other human-readable information. Example: SELECT Id, Name, Email, Phone, Company FROM Contact WHERE Email = 'customer@example.com'. For Opportunities, include: SELECT Id, Name, StageName, Amount, CloseDate, Account.Name FROM Opportunity",
        "dynamic_variable": "",
        "constant_value": "",
        "required": true,
        "value_type": "llm_prompt"
      }
    ],
    "request_body_schema": null,
    "request_headers": [
      {
        "type": "value",
        "name": "Content-Type",
        "value": "application/json"
      }
    ]
  },
  "response_timeout_secs": 30,
  "dynamic_variables": {
    "dynamic_variable_placeholders": {}
  }
}
```

#### salesforce_get_record

**Nombre:** salesforce_get_record
**Descripción:** Obtiene información detallada sobre un registro específico de Salesforce.
**Método:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/{record_id}`

**Cabeceras:**

* **Content-Type:** `application/json`

**Parámetros de ruta:**

* **object_type:** El tipo de objeto de Salesforce (Contact, Lead, Account, etc.)
* **record_id:** El ID único del registro de Salesforce

**JSON de la herramienta:**

```json
{
  "type": "webhook",
  "name": "salesforce_get_record",
  "description": "Retrieves detailed information about a specific Salesforce record.",
  "api_schema": {
    "url": "https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/{record_id}",
    "method": "GET",
    "path_params_schema": [
      {
        "id": "object_type",
        "type": "string",
        "description": "The Salesforce object type (Contact, Lead, Account, Opportunity, etc.)",
        "dynamic_variable": "",
        "constant_value": "",
        "required": true,
        "value_type": "llm_prompt"
      },
      {
        "id": "record_id",
        "type": "string",
        "description": "The unique Salesforce record ID obtained from search results",
        "dynamic_variable": "",
        "constant_value": "",
        "required": true,
        "value_type": "llm_prompt"
      }
    ],
    "query_params_schema": [],
    "request_body_schema": null,
    "request_headers": [
      {
        "type": "value",
        "name": "Content-Type",
        "value": "application/json"
      }
    ]
  },
  "response_timeout_secs": 30,
  "dynamic_variables": {
    "dynamic_variable_placeholders": {}
  }
}
```

#### salesforce_create_record

**Nombre:** salesforce_create_record
**Descripción:** Crea un nuevo registro en Salesforce.
**Método:** POST
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/`

**Cabeceras:**

* **Content-Type:** `application/json`

**Parámetros de ruta:**

* **object_type:** El tipo de objeto de Salesforce que se debe crear (Lead, Contact, Account, etc.)

**Parámetros del cuerpo:**

* **Objeto JSON dinámico** que contiene los campos y valores del registro

**JSON de la herramienta:**

```json
{
  "type": "webhook",
  "name": "salesforce_create_record",
  "description": "Creates a new record in Salesforce (Lead, Contact, Account, Opportunity, etc.)",
  "api_schema": {
    "url": "https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/",
    "method": "POST",
    "path_params_schema": [
      {
        "id": "object_type",
        "type": "string",
        "description": "The Salesforce object type to create (Lead, Contact, Account, Opportunity, etc.)",
        "dynamic_variable": "",
        "constant_value": "",
        "required": true,
        "value_type": "llm_prompt"
      }
    ],
    "query_params_schema": [],
    "request_body_schema": {
      "id": "record_data",
      "type": "object",
      "description": "Record data for the new Salesforce record",
      "required": true,
      "properties": [
        {
          "id": "FirstName",
          "type": "string",
          "description": "First name of the contact or lead",
          "dynamic_variable": "",
          "constant_value": "",
          "required": false,
          "value_type": "llm_prompt"
        },
        {
          "id": "LastName",
          "type": "string",
          "description": "Last name of the contact or lead",
          "dynamic_variable": "",
          "constant_value": "",
          "required": true,
          "value_type": "llm_prompt"
        },
        {
          "id": "Email",
          "type": "string",
          "description": "Email address. Must be properly formatted: user@domain.com",
          "dynamic_variable": "",
          "constant_value": "",
          "required": true,
          "value_type": "llm_prompt"
        },
        {
          "id": "Phone",
          "type": "string",
          "description": "Phone number of the contact or lead",
          "dynamic_variable": "",
          "constant_value": "",
          "required": false,
          "value_type": "llm_prompt"
        },
        {
          "id": "Company",
          "type": "string",
          "description": "Company name (required for Lead object)",
          "dynamic_variable": "",
          "constant_value": "",
          "required": false,
          "value_type": "llm_prompt"
        },
        {
          "id": "Title",
          "type": "string",
          "description": "Job title of the contact or lead",
          "dynamic_variable": "",
          "constant_value": "",
          "required": false,
          "value_type": "llm_prompt"
        },
        {
          "id": "Industry",
          "type": "string",
          "description": "Industry of the lead's company",
          "dynamic_variable": "",
          "constant_value": "",
          "required": false,
          "value_type": "llm_prompt"
        },
        {
          "id": "Description",
          "type": "string",
          "description": "Additional notes or description about the lead/contact",
          "dynamic_variable": "",
          "constant_value": "",
          "required": false,
          "value_type": "llm_prompt"
        }
      ]
    },
    "request_headers": [
      {
        "type": "value",
        "name": "Content-Type",
        "value": "application/json"
      }
    ]
  },
  "response_timeout_secs": 30,
  "dynamic_variables": {
    "dynamic_variable_placeholders": {}
  }
}
```

## Objetos comunes de Salesforce

| Objeto          | Finalidad                                 | Campos habituales                                            |
| --------------- | ----------------------------------------- | ------------------------------------------------------------ |
| **Lead**        | Clientes potenciales aún no cualificados  | FirstName, LastName, Email, Phone, Company, Industry, Status |
| **Contact**     | Personas cualificadas asociadas a cuentas | FirstName, LastName, Email, Phone, AccountId, Title          |
| **Account**     | Organizaciones o empresas                 | Name, Type, Industry, Phone, BillingAddress                  |
| **Opportunity** | Operaciones de venta en curso             | Name, StageName, Amount, CloseDate, AccountId                |
| **Case**        | Solicitudes de atención al cliente        | Subject, Description, Status, Priority, ContactId            |

## Consultas SOQL habituales

Usa estas consultas SOQL como punto de partida para personalizar el prompt del sistema de tu agente. Todas las consultas devuelven información legible para las personas en lugar de ID técnicos:

### Buscar contactos por correo electrónico

```sql
SELECT Id, Name, Email, Phone, Title, Account.Name, Account.Type FROM Contact WHERE Email = 'customer@example.com'
```

### Buscar leads por correo electrónico o teléfono

```sql
SELECT Id, Name, Email, Phone, Company, Industry, Status, LeadSource, Title FROM Lead WHERE Email = 'customer@example.com' OR Phone = '+1234567890'
```

### Buscar cuentas por nombre

```sql
SELECT Id, Name, Type, Industry, Phone, BillingCity, BillingState, Website FROM Account WHERE Name LIKE '%Company Name%'
```

### Buscar oportunidades recientes

```sql
SELECT Id, Name, StageName, Amount, CloseDate, Account.Name, Account.Type, Owner.Name, Description FROM Opportunity WHERE CreatedDate = THIS_MONTH
```

### Buscar oportunidades por cuenta

```sql
SELECT Id, Name, StageName, Amount, CloseDate, Probability, NextStep, Owner.Name FROM Opportunity WHERE Account.Name LIKE '%Company Name%'
```

## Pruebas de integración

Después de configurar tu aplicación de cliente externa y conectar la integración, pruébala antes de implementarla en producción:

1. **Función de búsqueda**: Pide a tu agente que busque contactos existentes.
2. **Creación de registros**: Haz que tu agente cree un nuevo lead o contacto.
3. **Obtención de datos**: Comprueba que tu agente puede recuperar información detallada de clientes.

## Activador de comentarios de casos: respuestas por correo electrónico para Email-to-Case

Si has activado el desencadenante **Salesforce Case Comment** (respuesta automática del agente a casos de Service Cloud), las respuestas a casos con al menos un correo electrónico entrante se envían al cliente como un correo electrónico real con hilo, no solo como un comentario interno del caso. Esto depende de si el caso tiene un correo electrónico entrante, no del valor de la lista de selección **Origin** del caso, por lo que seguirá funcionando correctamente si tu organización usa un valor personalizado de Origin como "Email - Returns" en lugar de "Email" literalmente. Los casos sin correo electrónico entrante seguirán publicándose como comentarios de caso públicos, sin cambios. Las direcciones en CC en el correo electrónico original del cliente también se incluirán automáticamente en CC en la respuesta, igual que haría la opción «Responder a todos» de un agente humano, salvo las direcciones de enrutamiento de Email-to-Case de tu organización, que se excluyen deliberadamente de la CC para evitar que Email-to-Case vuelva a procesar la respuesta y active de nuevo al agente con su propio mensaje.

Enviar respuestas por correo electrónico requiere una configuración adicional a la necesaria solo para los comentarios de casos:

* El perfil o conjunto de permisos del usuario **Run As** debe tener activado el permiso de sistema **Send Email** (`Setup` > `Users` > `Profiles`, en System Permissions), además del permiso **API Enabled** que ya requiere la integración.
* La configuración **Email Deliverability** de tu organización (`Setup` > `Email` > `Deliverability`) debe permitir correo electrónico externo. Los sandboxes establecen de forma predeterminada una configuración restringida, que bloquea silenciosamente los correos salientes.
* Si quieres que las respuestas se envíen desde un alias de soporte en lugar del buzón del usuario Run As, establece el campo **Org-Wide Email Address Id** del desencadenante con el Id de una **Organization-Wide Email Address** (`Setup` > `Organization-Wide Addresses` > haz clic en la dirección > copia el Id de la URL). Déjalo en blanco para enviar desde la propia dirección del usuario Run As.
* Establece el campo **Email-to-Case Routing Address(es)** del desencadenante con las direcciones de Email-to-Case de tu organización (separadas por comas si hay más de una, `Setup` > `Email-to-Case`). Sin esto, la integración intenta deducir la dirección de enrutamiento a partir del correo electrónico del cliente (su dirección `To`), lo que falla cuando tu dirección de enrutamiento solo estaba en CC y no era la destinataria principal. Incluirla de nuevo en CC en una respuesta en esa situación activaría otra vez al agente con su propio mensaje.

Si la organización de un cliente no tiene esto configurado, un error al enviar el correo electrónico recurrirá a publicar un comentario de caso público, por lo que nunca se perderá una respuesta silenciosamente; sin embargo, el cliente no la recibirá por correo electrónico hasta que se configure lo anterior.

## Consideraciones de seguridad

* Usa rutas HTTPS para todas las llamadas a la API.
* Asegúrate de que la seguridad adecuada a nivel de campo esté configurada en Salesforce.
* Los permisos del usuario Run As determinan a qué datos puede acceder la integración; delimítalos adecuadamente.
* Audita periódicamente el acceso y el uso de la API.

## Enlaces útiles

* [Documentación de la API REST de Salesforce](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/)
* [Referencia del lenguaje de consultas SOQL](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/)
* [Aplicaciones de cliente externas y OAuth 2.0](https://help.salesforce.com/s/articleView?id=sf.connected_app_overview.htm)
* [Prácticas recomendadas de seguridad de Salesforce](https://help.salesforce.com/s/articleView?id=sf.security_overview.htm)