> 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

## Visão geral

Conecte seus agentes de IA da ElevenLabs ao Salesforce CRM para acessar dados de clientes, gerenciar leads e criar oportunidades. Essa integração permite que seus agentes recuperem registros de clientes existentes, criem novos leads e contatos e consultem objetos do Salesforce durante conversas.

## Recursos

| Recurso                     | Suporte                                                                                            |
| --------------------------- | -------------------------------------------------------------------------------------------------- |
| Modo de retenção zero (ZRM) | Não compatível                                                                                     |
| Anexos em gatilhos          | Não compatível — anexos em comentários de casos e e-mails recebidos não são encaminhados ao agente |
| Anexos em ferramentas       | Não compatível — as ferramentas operam somente com texto                                           |

## Configuração

Esta integração usa **Credenciais de Cliente OAuth 2.0 do Salesforce** para autenticação. Você precisará criar um App de Cliente Externo no Salesforce.

#### Criar um App de Cliente Externo

1. Entre na sua organização do Salesforce como administrador
2. Acesse **Setup** > **External Client App Manager**
3. Clique em **New External Client App**
4. Preencha o **External Client App Name** (por exemplo, `ElevenLabs Agents`), o **API Name** e o **Contact Email**
5. Em **API (Enable OAuth Settings)**:
   * Marque **Enable OAuth** e **Enable Client Credentials Flow**
   * **Callback URL**: `https://api.elevenlabs.io/oauth/callback`
   * **OAuth Start URL**: `https://api.elevenlabs.io/oauth/start`
   * **Selected OAuth Scopes**: adicione estes escopos:
     * **Full access (full)**
     * **Perform requests on your behalf at any time (refresh_token, offline_access)**
     * **Manage user data via api**
6. Clique em **Create**
7. Na página do app, abra a aba **Settings**, acesse **OAuth Settings** e clique em **Consumer Key and Secret**
8. Copie a **Consumer Key** e a **Consumer Secret** — você precisará delas para a autenticação

#### Configurar o fluxo de Credenciais de Cliente OAuth

> **Warning**
>
> O fluxo de Credenciais de Cliente é recomendado para integrações servidor a servidor que não exigem
> interação do usuário. Verifique se o administrador do Salesforce habilitou esse fluxo.

1. No seu App de Cliente Externo, clique em **Edit**
2. Marque **Enable Client Credentials Flow** — um campo **Run As** será exibido
3. Defina **Run As** como seu usuário administrador ou uma conta de serviço dedicada — isso determina as permissões de todas as chamadas de API
4. Defina **Permitted Users** como **Admin approved users are pre-authorized**
5. Clique em **Save**

O usuário **Run As** determina as permissões de todas as chamadas de API. Escolha um usuário com perfil de Administrador do Sistema ou um perfil personalizado que tenha acesso à API e permissão para os objetos de que seu agente precisa (Contact, Lead, Account etc.). A permissão **API Enabled** precisa estar marcada no registro do usuário.

#### Encontrar seu domínio do Salesforce

Seu domínio do Salesforce é necessário para chamadas de API.

**Método 1: verifique sua URL atual**

Ao entrar no Salesforce, observe a barra de endereços do navegador:

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

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

Acesse **Setup** > **Company Information** e procure a URL do seu **My Domain** ou as informações da organização.

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

Acesse **Setup** > **Domain Management** > **My Domain**. Seu domínio será exibido no topo da página.

**Formatos de domínio comuns:**

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

> **Note**
>
> Use o domínio completo, sem barra no final.

#### Conectar no ElevenLabs

Na configuração da integração do ElevenLabs, informe o **nome de host da instância** do Salesforce (por exemplo, `acme.my.salesforce.com`), o **Client ID** (Consumer Key) e o **Client Secret** (Consumer Secret).

## Vídeo de demonstração

> **Note**
>
> Esta demonstração usa ferramentas de webhook legadas. Se você estiver usando a integração nativa do Salesforce, as ferramentas
> serão configuradas automaticamente — não é necessária nenhuma configuração manual de webhook.

## Como funciona

#### Visão geral

#### Consulta inicial do cliente

O agente coleta informações do cliente e faz perguntas relevantes para identificar seus requisitos de negócio e desafios atuais.

#### Consulta de dados do cliente

O agente verifica registros existentes usando `salesforce_search_records` para encontrar contatos, contas ou leads. Ele obtém todos os detalhes com `salesforce_get_record` e usa essas informações para personalizar a conversa.

#### Qualificação de lead

Se o cliente for novo, o agente coleta informações de contato, avalia suas necessidades de negócio e determina o processo de vendas ou encaminhamento adequado.

#### Criação de registro

O agente cria o registro adequado (lead, contato ou oportunidade) usando `salesforce_create_record`, confirma a criação com o cliente e explica as próximas etapas.

#### Prompt de sistema detalhado

```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**
>
> A autorização das ferramentas pode ser gerenciada com as Workplace Auth Connections, que cuidam da atualização de tokens
> automaticamente. As ferramentas retornam nomes e descrições legíveis em vez de IDs técnicos para
> melhorar a qualidade das conversas.

## Configurações das ferramentas

Há três ferramentas de webhook disponíveis: `salesforce_search_records`, `salesforce_get_record` e `salesforce_create_record`. Configure a autorização de cada uma usando uma Workplace Auth Connection.

### Autorização - conexão OAuth2 do Workplace

#### Acessar Workplace Auth Connections

No painel do ElevenLabs, acesse **Agents** > **Workplace Auth Connections** e clique em **Add Auth**.

#### Configurar conexão do Salesforce

Preencha os campos a seguir para sua integração com o Salesforce:

**Nome da conexão**: `Salesforce CRM`

**Client ID**

* Sua Consumer Key do App de Cliente Externo
* Exemplo: `3MVG9JJlvRU3L4pRiOu8pQt5xXB4xGZGm0yW...`

**Client Secret**

* Sua Consumer Secret do App de Cliente Externo
* Exemplo: `1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF...`

**URL do token**

* O endpoint de token OAuth do seu domínio Salesforce
* Formato: `https://{domain}.my.salesforce.com/services/oauth2/token`
* Exemplo: `https://acme.my.salesforce.com/services/oauth2/token`

**Escopos (opcional)**

* Escopos OAuth para acesso à API do Salesforce
* Recomendado: `full, api, refresh_token`
* Deixe em branco para usar os escopos padrão do seu App de Cliente Externo

**Parâmetros extras (JSON)**

* Parâmetros OAuth adicionais específicos da sua configuração
* Exemplo para o fluxo de Credenciais de Cliente:

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

#### Criar conexão de autenticação

Clique em **Create auth connection** para adicionar sua configuração.

#### Usar nas configurações das ferramentas

Depois que a conexão for bem-sucedida, salve-a e faça referência a ela nas configurações das ferramentas de webhook, na seção **Authentication**.

> **Tip**
>
> As Workplace Auth Connections cuidam da atualização de tokens automaticamente, portanto você não precisa gerenciar
> tokens manualmente.

### Configurações das ferramentas de webhook

Adicione uma Workplace Auth Connection (OAuth2) a cada ferramenta na seção **Authentication**. Use as abas abaixo para analisar a configuração de cada ferramenta.

#### salesforce_search_records

**Nome:** salesforce_search_records
**Descrição:** Pesquisa registros existentes no Salesforce usando consultas SOQL. Sempre retorna informações legíveis, incluindo nomes, e não apenas IDs.
**Método:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/query/?q={soql_query}`

**Cabeçalhos:**

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

**Parâmetros de consulta:**

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

**JSON da ferramenta:**

```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

**Nome:** salesforce_get_record
**Descrição:** Obtém informações detalhadas sobre um registro específico do Salesforce.
**Método:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/{record_id}`

**Cabeçalhos:**

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

**Parâmetros de caminho:**

* **object_type:** O tipo de objeto do Salesforce (Contact, Lead, Account etc.)
* **record_id:** O ID exclusivo do registro do Salesforce

**JSON da ferramenta:**

```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

**Nome:** salesforce_create_record
**Descrição:** Cria um novo registro no Salesforce.
**Método:** POST
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/`

**Cabeçalhos:**

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

**Parâmetros de caminho:**

* **object_type:** O tipo de objeto do Salesforce a criar (Lead, Contact, Account etc.)

**Parâmetros do corpo:**

* **Objeto JSON dinâmico** contendo os campos e valores do registro

**JSON da ferramenta:**

```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 comuns do Salesforce

| Objeto          | Finalidade                                   | Campos comuns                                                |
| --------------- | -------------------------------------------- | ------------------------------------------------------------ |
| **Lead**        | Clientes em potencial ainda não qualificados | FirstName, LastName, Email, Phone, Company, Industry, Status |
| **Contact**     | Pessoas qualificadas associadas a contas     | FirstName, LastName, Email, Phone, AccountId, Title          |
| **Account**     | Organizações ou empresas                     | Name, Type, Industry, Phone, BillingAddress                  |
| **Opportunity** | Negócios de vendas em andamento              | Name, StageName, Amount, CloseDate, AccountId                |
| **Case**        | Solicitações de atendimento ao cliente       | Subject, Description, Status, Priority, ContactId            |

## Consultas SOQL comuns

Use estas consultas SOQL como ponto de partida ao personalizar o prompt de sistema do seu agente. Todas as consultas retornam informações legíveis para humanos, em vez de IDs técnicos:

### Buscar contatos por e-mail

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

### Buscar leads por e-mail ou telefone

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

### Buscar contas por nome

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

### Buscar oportunidades recentes

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

### Buscar oportunidades por conta

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

## Teste da integração

Depois de configurar seu External Client App e conectar a integração, teste-a antes de implantá-la em produção:

1. **Funcionalidade de busca**: peça ao seu agente para buscar contatos existentes.
2. **Criação de registros**: peça ao seu agente para criar um novo lead ou contato.
3. **Recuperação de dados**: verifique se seu agente consegue recuperar informações detalhadas dos clientes.

## Acionador de comentários de caso: respostas por e-mail para Email-to-Case

Se você ativou o acionador **Salesforce Case Comment** (resposta automática do agente para Cases do Service Cloud), as respostas a Cases com pelo menos um e-mail recebido são enviadas de volta ao cliente como um e-mail real, encadeado — não apenas como um comentário interno no Case. Isso se baseia em o Case ter um e-mail recebido, e não no valor da lista de seleção **Origin** do Case; portanto, continua funcionando corretamente se sua organização usar um valor personalizado de Origin, como "Email - Returns", em vez do valor literal "Email". Cases sem e-mail recebido continuam sendo publicados como um comentário público no Case, sem alterações. Quaisquer endereços em CC no e-mail original do cliente também são automaticamente incluídos em CC na resposta, assim como aconteceria com o "Responder a todos" de um agente humano — exceto pelos endereços de roteamento de Email-to-Case da sua organização, que são deliberadamente excluídos do CC para que a resposta não seja reprocessada pelo Email-to-Case e não acione novamente o agente em sua própria mensagem.

O envio de respostas por e-mail exige algumas configurações adicionais além das necessárias apenas para comentários de Case:

* O Perfil ou Conjunto de permissões do usuário **Run As** precisa ter a permissão de sistema **Send Email** ativada (`Setup` > `Users` > `Profiles`, em System Permissions), além da permissão **API Enabled** já exigida para a integração.
* A configuração **Email Deliverability** da sua organização (`Setup` > `Email` > `Deliverability`) deve permitir e-mails externos — os Sandboxes usam por padrão uma configuração restrita, que bloqueia silenciosamente e-mails enviados.
* Se quiser que as respostas sejam enviadas de um alias de suporte em vez da própria caixa de correio do usuário Run As, defina o campo **Org-Wide Email Address Id** no acionador com o Id de um **Organization-Wide Email Address** (`Setup` > `Organization-Wide Addresses` > clique no endereço > copie o Id da URL). Deixe em branco para enviar do próprio endereço do usuário Run As.
* Defina o campo **Email-to-Case Routing Address(es)** no acionador com os endereços de Email-to-Case da sua organização (separados por vírgula, caso haja mais de um, `Setup` > `Email-to-Case`). Sem isso, a integração tentará adivinhar o endereço de roteamento a partir do e-mail do cliente (seu endereço `To`), o que não abrange casos em que seu endereço de roteamento estava apenas em CC, e não como destinatário principal — incluí-lo novamente em CC em uma resposta nessa situação acionaria novamente o agente em sua própria mensagem.

Se a organização de um cliente não tiver essas configurações, uma falha no envio do e-mail fará com que um comentário público no Case seja publicado como alternativa, para que uma resposta nunca seja descartada silenciosamente — mas o cliente não a receberá por e-mail até que as configurações acima sejam concluídas.

## Considerações de segurança

* Use endpoints HTTPS para todas as chamadas de API.
* Garanta que a segurança adequada em nível de campo esteja configurada no Salesforce.
* As permissões do usuário Run As determinam quais dados a integração pode acessar — defina o escopo delas adequadamente.
* Audite regularmente o acesso e o uso da API.

## Links úteis

* [Documentação da API REST do Salesforce](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/)
* [Referência da linguagem de consulta SOQL](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/)
* [External Client Apps e OAuth 2.0](https://help.salesforce.com/s/articleView?id=sf.connected_app_overview.htm)
* [Práticas recomendadas de segurança do Salesforce](https://help.salesforce.com/s/articleView?id=sf.security_overview.htm)