> 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

## Panoramica

Collega i tuoi agenti IA di ElevenLabs a Salesforce CRM per accedere ai dati dei clienti, gestire lead e creare opportunità. Questa integrazione consente ai tuoi agenti di recuperare i record dei clienti esistenti, creare nuovi lead e contatti e interrogare oggetti Salesforce durante le conversazioni.

## Funzionalità

| Funzionalità                        | Supporto                                                                                                    |
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------- |
| Modalità a conservazione zero (ZRM) | Non supportata                                                                                              |
| Allegati nei trigger                | Non supportati — gli allegati nei commenti ai casi e nelle email in arrivo non vengono inoltrati all'agente |
| Allegati negli strumenti            | Non supportati — gli strumenti operano solo sul testo                                                       |

## Configurazione

Questa integrazione utilizza **Salesforce OAuth 2.0 Client Credentials** per l'autenticazione. Dovrai creare un'External Client App in Salesforce.

#### Crea un'External Client App

1. Accedi alla tua organizzazione Salesforce come amministratore
2. Vai a **Setup** > **External Client App Manager**
3. Fai clic su **New External Client App**
4. Compila **External Client App Name** (ad esempio, `ElevenLabs Agents`), **API Name** e **Contact Email**
5. In **API (Enable OAuth Settings)**:
   * Seleziona **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**: aggiungi questi scope:
     * **Full access (full)**
     * **Perform requests on your behalf at any time (refresh\_token, offline\_access)**
     * **Manage user data via api**
6. Fai clic su **Create**
7. Nella pagina dell'app, apri la scheda **Settings**, vai a **OAuth Settings** e fai clic su **Consumer Key and Secret**
8. Copia **Consumer Key** e **Consumer Secret**: ti serviranno per l'autenticazione

#### Configura il flusso OAuth Client Credentials

> **Warning**
>
> Il flusso Client Credentials è consigliato per integrazioni server-to-server che non richiedono
> l'interazione dell'utente. Assicurati che l'amministratore Salesforce abbia abilitato questo flusso.

1. Nella tua External Client App, fai clic su **Edit**
2. Seleziona **Enable Client Credentials Flow**: verrà visualizzato il campo **Run As**
3. Imposta **Run As** sul tuo utente amministratore o su un account di servizio dedicato: questo determina le autorizzazioni per tutte le chiamate API
4. Imposta **Permitted Users** su **Admin approved users are pre-authorized**
5. Fai clic su **Save**

L'utente **Run As** determina le autorizzazioni per tutte le chiamate API. Scegli un utente con un profilo System Administrator o un profilo personalizzato che disponga dell'accesso API e delle autorizzazioni per gli oggetti necessari al tuo agente (Contact, Lead, Account ecc.). L'autorizzazione **API Enabled** deve essere selezionata nel record dell'utente.

#### Trova il tuo dominio Salesforce

Il dominio Salesforce è necessario per le chiamate API.

**Metodo 1: controlla l'URL corrente**

Dopo aver effettuato l'accesso a Salesforce, guarda la barra degli indirizzi del browser:

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

**Metodo 2: Setup > Company Information**

Vai a **Setup** > **Company Information** e cerca l'URL **My Domain** o le informazioni sull'organizzazione.

**Metodo 3: Setup > Domain Management**

Vai a **Setup** > **Domain Management** > **My Domain**. Il tuo dominio verrà mostrato nella parte superiore della pagina.

**Formati di dominio comuni:**

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

> **Note**
>
> Usa il dominio completo senza barra finale.

#### Connetti in ElevenLabs

Nella configurazione dell'integrazione ElevenLabs, inserisci l'**hostname dell'istanza** Salesforce (ad esempio, `acme.my.salesforce.com`), il **Client ID** (Consumer Key) e il **Client Secret** (Consumer Secret).

## Video dimostrativo

> **Note**
>
> Questa demo utilizza strumenti webhook legacy. Se utilizzi l'integrazione Salesforce nativa, gli strumenti
> vengono configurati automaticamente: non è necessaria alcuna configurazione manuale dei webhook.

## Come funziona

#### Panoramica

#### Richiesta iniziale del cliente

L'agente raccoglie le informazioni del cliente e pone domande pertinenti per identificare le sue esigenze aziendali e le sfide attuali.

#### Ricerca dei dati del cliente

L'agente verifica l'esistenza di record usando `salesforce_search_records` per trovare contatti, account o lead. Recupera tutti i dettagli con `salesforce_get_record` e usa queste informazioni per personalizzare la conversazione.

#### Qualificazione del lead

Se il cliente è nuovo, l'agente raccoglie le informazioni di contatto, valuta le sue esigenze aziendali e determina il processo di vendita o l'instradamento più adatto.

#### Creazione del record

L'agente crea il record appropriato (lead, contatto o opportunità) usando `salesforce_create_record`, ne conferma la creazione al cliente e spiega i passaggi successivi.

#### System prompt dettagliato

```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**
>
> L'autorizzazione degli strumenti può essere gestita tramite Workplace Auth Connections, che gestisce il rinnovo dei token
> automaticamente. Gli strumenti restituiscono nomi e descrizioni leggibili invece di ID tecnici per
> migliorare la qualità delle conversazioni.

## Configurazioni degli strumenti

Sono disponibili tre strumenti webhook: `salesforce_search_records`, `salesforce_get_record` e `salesforce_create_record`. Configura l'autorizzazione per ciascuno tramite una Workplace Auth Connection.

### Autorizzazione - connessione OAuth2 Workplace

#### Vai a Workplace Auth Connections

Nella dashboard di ElevenLabs, vai a **Agents** > **Workplace Auth Connections** e fai clic su **Add Auth**.

#### Configura la connessione Salesforce

Compila i seguenti campi per l'integrazione Salesforce:

**Nome della connessione**: `Salesforce CRM`

**Client ID**

* La Consumer Key della tua External Client App
* Esempio: `3MVG9JJlvRU3L4pRiOu8pQt5xXB4xGZGm0yW...`

**Client Secret**

* Il Consumer Secret della tua External Client App
* Esempio: `1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF...`

**URL del token**

* L'endpoint OAuth per il token del tuo dominio Salesforce
* Formato: `https://{domain}.my.salesforce.com/services/oauth2/token`
* Esempio: `https://acme.my.salesforce.com/services/oauth2/token`

**Scope (facoltativi)**

* Scope OAuth per l'accesso alle API Salesforce
* Consigliati: `full, api, refresh_token`
* Lascia vuoto per utilizzare gli scope predefiniti della tua External Client App

**Parametri aggiuntivi (JSON)**

* Parametri OAuth aggiuntivi specifici della tua configurazione
* Esempio per il flusso Client Credentials:

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

#### Crea una connessione di autenticazione

Fai clic su **Create auth connection** per aggiungere la configurazione.

#### Utilizza nelle configurazioni degli strumenti

Quando la connessione è stata stabilita, salvala e utilizzala nelle configurazioni degli strumenti webhook nella sezione **Authentication**.

> **Tip**
>
> Workplace Auth Connections gestisce automaticamente il rinnovo dei token, quindi non devi gestire
> manualmente i token.

### Configurazioni degli strumenti webhook

Aggiungi una Workplace Auth Connection (OAuth2) a ogni strumento nella sezione **Authentication**. Usa le schede seguenti per consultare la configurazione di ogni strumento.

#### salesforce\_search\_records

**Nome:** salesforce\_search\_records
**Descrizione:** Cerca record esistenti in Salesforce utilizzando query SOQL. Restituisce sempre informazioni leggibili, inclusi i nomi, non solo gli ID.
**Metodo:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/query/?q={soql_query}`

**Header:**

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

**Parametri query:**

* **q:** stringa di query SOQL (ad esempio, "SELECT Id, Name, Email FROM Contact WHERE Email = '[example@email.com](mailto:example@email.com)'")

**JSON dello strumento:**

```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
**Descrizione:** Recupera informazioni dettagliate su uno specifico record Salesforce.
**Metodo:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/{record_id}`

**Header:**

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

**Parametri path:**

* **object\_type:** il tipo di oggetto Salesforce (Contact, Lead, Account ecc.)
* **record\_id:** l'ID univoco del record Salesforce

**JSON dello strumento:**

```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
**Descrizione:** Crea un nuovo record in Salesforce.
**Metodo:** POST
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/`

**Header:**

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

**Parametri path:**

* **object\_type:** il tipo di oggetto Salesforce da creare (Lead, Contact, Account ecc.)

**Parametri body:**

* **Oggetto JSON dinamico** contenente i campi e i valori del record

**JSON dello strumento:**

```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": {}
  }
}
```

## Oggetti Salesforce comuni

| Oggetto         | Scopo                                      | Campi comuni                                                 |
| --------------- | ------------------------------------------ | ------------------------------------------------------------ |
| **Lead**        | Potenziali clienti non ancora qualificati  | FirstName, LastName, Email, Phone, Company, Industry, Status |
| **Contact**     | Persone qualificate associate agli account | FirstName, LastName, Email, Phone, AccountId, Title          |
| **Account**     | Organizzazioni o aziende                   | Name, Type, Industry, Phone, BillingAddress                  |
| **Opportunity** | Trattative di vendita in corso             | Name, StageName, Amount, CloseDate, AccountId                |
| **Case**        | Richieste di assistenza clienti            | Subject, Description, Status, Priority, ContactId            |

## Query SOQL comuni

Usa queste query SOQL come punto di partenza per personalizzare il system prompt del tuo agente. Tutte le query restituiscono informazioni leggibili anziché ID tecnici:

### Cerca contatti per email

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

### Cerca lead per email o telefono

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

### Cerca account per nome

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

### Cerca opportunità recenti

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

### Cerca opportunità per account

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

## Test dell'integrazione

Dopo aver configurato l'External Client App e connesso l'integrazione, esegui un test prima della distribuzione in produzione:

1. **Funzione di ricerca**: chiedi al tuo agente di cercare contatti esistenti.
2. **Creazione di record**: fai creare al tuo agente un nuovo lead o contatto.
3. **Recupero dei dati**: verifica che il tuo agente possa recuperare informazioni dettagliate sui clienti.

## Trigger dei commenti ai casi: risposte email per Email-to-Case

Se hai abilitato il trigger **Salesforce Case Comment** (risposta automatica dell'agente ai casi di Service Cloud), le risposte ai casi con almeno un'email in arrivo vengono inviate al cliente come email reali all'interno della conversazione, non soltanto come commenti interni al caso. Questo si basa sulla presenza di un'email in arrivo nel caso, non sul valore dell'elenco di selezione **Origin** del caso; pertanto continua a funzionare correttamente anche se la tua organizzazione usa un valore Origin personalizzato come "Email - Returns" anziché il valore letterale "Email". I casi senza email in arrivo continuano a essere pubblicati come commento pubblico al caso, senza modifiche. Anche gli indirizzi in CC nell'email originale del cliente vengono automaticamente inclusi in CC nella risposta, proprio come farebbe un operatore umano con "Reply All", ad eccezione degli indirizzi di instradamento Email-to-Case della tua organizzazione, che vengono deliberatamente esclusi dalla CC affinché la risposta non venga nuovamente acquisita da Email-to-Case e non riattivi l'agente sul proprio messaggio.

L'invio delle risposte email richiede una configurazione aggiuntiva rispetto a quella necessaria per i soli commenti ai casi:

* Il profilo o il Permission Set dell'utente **Run As** deve avere abilitata l'autorizzazione di sistema **Send Email** (`Setup` > `Users` > `Profiles`, in System Permissions), oltre all'autorizzazione **API Enabled** già richiesta per l'integrazione.
* L'impostazione **Email Deliverability** della tua organizzazione (`Setup` > `Email` > `Deliverability`) deve consentire email esterne: per impostazione predefinita, le Sandbox usano un'impostazione con restrizioni che blocca silenziosamente le email in uscita.
* Se vuoi che le risposte provengano da un alias di assistenza anziché dalla casella di posta dell'utente Run As, imposta il campo **Org-Wide Email Address Id** del trigger sull'Id di un **Organization-Wide Email Address** (`Setup` > `Organization-Wide Addresses` > fai clic sull'indirizzo > copia l'Id dall'URL). Lascialo vuoto per inviare dall'indirizzo dell'utente Run As.
* Imposta il campo **Email-to-Case Routing Address(es)** del trigger sugli indirizzi Email-to-Case della tua organizzazione (separati da virgole se sono più di uno, `Setup` > `Email-to-Case`). Senza questa impostazione, l'integrazione prova a dedurre l'indirizzo di instradamento dall'email del cliente (il relativo indirizzo `To`), ma non rileva i casi in cui l'indirizzo di instradamento era solo in CC anziché il destinatario principale. In quella situazione, reinserirlo in CC in una risposta riattiverebbe l'agente sul proprio messaggio.

Se l'organizzazione di un cliente non ha configurato questi elementi, un errore nell'invio dell'email pubblica un commento pubblico al caso come fallback, così una risposta non viene mai persa silenziosamente; tuttavia, il cliente non la riceverà via email finché la configurazione sopra descritta non sarà completata.

## Considerazioni sulla sicurezza

* Usa endpoint HTTPS per tutte le chiamate API.
* Assicurati che in Salesforce sia configurata una sicurezza corretta a livello di campo.
* Le autorizzazioni dell'utente Run As determinano a quali dati può accedere l'integrazione: definiscine adeguatamente l'ambito.
* Verifica regolarmente l'accesso e l'utilizzo delle API.

## Link utili

* [Documentazione API REST Salesforce](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/)
* [Riferimento del linguaggio di query 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)
* [Best practice per la sicurezza di Salesforce](https://help.salesforce.com/s/articleView?id=sf.security_overview.htm)