> 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

## Vue d’ensemble

Connectez vos agents IA ElevenLabs à Salesforce CRM pour accéder aux données client, gérer les leads et créer des opportunités. Cette intégration permet à vos agents de récupérer les fiches client existantes, de créer de nouveaux leads et contacts, et d’interroger les objets Salesforce pendant les conversations.

## Fonctionnalités

| Fonctionnalité                       | Prise en charge                                                                                                    |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------ |
| Mode zéro rétention (ZRM)            | Non pris en charge                                                                                                 |
| Pièces jointes dans les déclencheurs | Non prises en charge, les pièces jointes aux commentaires de cas et emails entrants ne sont pas transmis à l'agent |
| Pièces jointes dans les outils       | Non prises en charge, les outils fonctionnent uniquement avec du texte                                             |

## Configuration

Cette intégration utilise les **identifiants client Salesforce OAuth 2.0** pour l'authentification. Vous devez créer une application cliente externe dans Salesforce.

#### Créer une application cliente externe

1. Connectez-vous à votre organisation Salesforce en tant qu'administrateur
2. Accédez à **Setup** > **External Client App Manager**
3. Cliquez sur **New External Client App**
4. Renseignez les champs **External Client App Name** (par exemple, `ElevenLabs Agents`), **API Name** et **Contact Email**
5. Sous **API (Enable OAuth Settings)** :
   * Cochez **Enable OAuth** et **Enable Client Credentials Flow**
   * **Callback URL** : `https://api.elevenlabs.io/oauth/callback`
   * **OAuth Start URL** : `https://api.elevenlabs.io/oauth/start`
   * **Selected OAuth Scopes** : ajoutez les portées suivantes :
     * **Full access (full)**
     * **Perform requests on your behalf at any time (refresh_token, offline_access)**
     * **Manage user data via api**
6. Cliquez sur **Create**
7. Sur la page de l'application, ouvrez l'onglet **Settings**, accédez à **OAuth Settings**, puis cliquez sur **Consumer Key and Secret**
8. Copiez la **Consumer Key** et le **Consumer Secret**, ils seront nécessaires pour l'authentification

#### Configurer le flux OAuth Client Credentials

> **Warning**
>
> Le flux Client Credentials est recommandé pour les intégrations de serveur à serveur ne nécessitant
> aucune interaction utilisateur. Vérifiez que votre administrateur Salesforce a activé ce flux.

1. Dans votre application cliente externe, cliquez sur **Edit**
2. Cochez **Enable Client Credentials Flow**, un champ **Run As** apparaît
3. Définissez **Run As** sur votre utilisateur administrateur ou un compte de service dédié, cela détermine les autorisations pour tous les appels API
4. Définissez **Permitted Users** sur **Admin approved users are pre-authorized**
5. Cliquez sur **Save**

L'utilisateur **Run As** détermine les autorisations de tous les appels API. Choisissez un utilisateur doté d'un profil System Administrator ou d'un profil personnalisé ayant accès à l'API et aux objets dont votre agent a besoin (Contact, Lead, Account, etc.). L'autorisation **API Enabled** doit être cochée dans la fiche utilisateur.

#### Trouver votre domaine Salesforce

Votre domaine Salesforce est nécessaire pour les appels API.

**Méthode 1 : vérifier votre URL actuelle**

Lorsque vous êtes connecté à Salesforce, consultez la barre d'adresse de votre navigateur :

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

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

Accédez à **Setup** > **Company Information** et recherchez l'URL de votre **My Domain** ou les informations sur votre organisation.

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

Accédez à **Setup** > **Domain Management** > **My Domain**. Votre domaine s'affiche en haut de la page.

**Formats de domaine courants :**

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

> **Note**
>
> Utilisez le domaine complet, sans barre oblique finale.

#### Se connecter dans ElevenLabs

Dans la configuration de l'intégration ElevenLabs, saisissez le **nom d'hôte de l'instance** Salesforce (par exemple, `acme.my.salesforce.com`), le **Client ID** (Consumer Key) et le **Client Secret** (Consumer Secret).

## Vidéo de démonstration

> **Note**
>
> Cette démonstration utilise des outils webhook hérités. Si vous utilisez l'intégration Salesforce native, les outils
> sont configurés automatiquement, aucune configuration manuelle de webhook n'est nécessaire.

## Fonctionnement

#### Vue d'ensemble

#### Demande initiale du client

L'agent recueille les informations du client et pose des questions pertinentes pour identifier ses besoins métier et ses difficultés actuelles.

#### Recherche des données client

L'agent vérifie les fiches existantes avec `salesforce_search_records` afin de trouver des contacts, comptes ou prospects. Il récupère les informations complètes avec `salesforce_get_record` et les utilise pour personnaliser la conversation.

#### Qualification des prospects

Si le client est nouveau, l'agent collecte ses coordonnées, évalue ses besoins métier et détermine le processus commercial ou le routage approprié.

#### Création de fiche

L'agent crée la fiche appropriée (prospect, contact ou opportunité) avec `salesforce_create_record`, confirme sa création au client et explique les étapes suivantes.

#### Prompt système détaillé

```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'autorisation des outils peut être gérée avec Workplace Auth Connections, qui assure automatiquement le renouvellement des jetons.
> Les outils renvoient des noms et des descriptions lisibles plutôt que des identifiants techniques afin
> d'améliorer la qualité des conversations.

## Configurations des outils

Trois outils webhook sont disponibles : `salesforce_search_records`, `salesforce_get_record` et `salesforce_create_record`. Configurez l'autorisation de chacun avec une Workplace Auth Connection.

### Autorisation : connexion OAuth2 Workplace

#### Accéder à Workplace Auth Connections

Dans votre Dashboard ElevenLabs, accédez à **Agents** > **Workplace Auth Connections**, puis cliquez sur **Add Auth**.

#### Configurer la connexion Salesforce

Renseignez les champs suivants pour votre intégration Salesforce :

**Nom de connexion** : `Salesforce CRM`

**Client ID**

* Votre Consumer Key de l'application cliente externe
* Exemple : `3MVG9JJlvRU3L4pRiOu8pQt5xXB4xGZGm0yW...`

**Client Secret**

* Votre Consumer Secret de l'application cliente externe
* Exemple : `1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF...`

**URL du jeton**

* Le point de terminaison OAuth de jeton de votre domaine Salesforce
* Format : `https://{domain}.my.salesforce.com/services/oauth2/token`
* Exemple : `https://acme.my.salesforce.com/services/oauth2/token`

**Portées (facultatif)**

* Portées OAuth pour l'accès à l'API Salesforce
* Recommandé : `full, api, refresh_token`
* Laissez vide pour utiliser les portées par défaut de votre application cliente externe

**Paramètres supplémentaires (JSON)**

* Paramètres OAuth supplémentaires propres à votre configuration
* Exemple pour le flux Client Credentials :

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

#### Créer une connexion d'authentification

Cliquez sur **Create auth connection** pour ajouter votre configuration.

#### Utiliser dans les configurations d'outils

Une fois la connexion établie, enregistrez-la et référencez-la dans les configurations de vos outils webhook, dans la section **Authentication**.

> **Tip**
>
> Workplace Auth Connections gère automatiquement le renouvellement des jetons, vous n'avez donc pas besoin de les gérer
> manuellement.

### Configurations des outils webhook

Ajoutez une Workplace Auth Connection (OAuth2) à chaque outil dans la section **Authentication**. Utilisez les onglets ci-dessous pour consulter la configuration de chaque outil.

#### salesforce_search_records

**Nom :** salesforce_search_records
**Description :** Recherche des fiches existantes dans Salesforce à l'aide de requêtes SOQL. Renvoie toujours des informations lisibles, y compris les noms, et pas uniquement des identifiants.
**Méthode :** GET
**URL :** `https://acme.my.salesforce.com/services/data/v58.0/query/?q={soql_query}`

**En-têtes :**

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

**Paramètres de requête :**

* **q :** chaîne de requête SOQL (par exemple, "SELECT Id, Name, Email FROM Contact WHERE Email = '[example@email.com](mailto:example@email.com)'")

**JSON de l'outil :**

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

**Nom :** salesforce_get_record
**Description :** Récupère des informations détaillées sur une fiche Salesforce spécifique.
**Méthode :** GET
**URL :** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/{record_id}`

**En-têtes :**

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

**Paramètres de chemin :**

* **object_type :** type d'objet Salesforce (Contact, Lead, Account, etc.)
* **record_id :** identifiant unique de la fiche Salesforce

**JSON de l'outil :**

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

**Nom :** salesforce_create_record
**Description :** Crée une nouvelle fiche dans Salesforce.
**Méthode :** POST
**URL :** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/`

**En-têtes :**

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

**Paramètres de chemin :**

* **object_type :** type d'objet Salesforce à créer (Lead, Contact, Account, etc.)

**Paramètres du corps :**

* **Objet JSON dynamique** contenant les champs et les valeurs de la fiche

**JSON de l'outil :**

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

## Objets Salesforce courants

| Objet           | Objectif                                     | Champs courants                                              |
| --------------- | -------------------------------------------- | ------------------------------------------------------------ |
| **Lead**        | Clients potentiels non encore qualifiés      | FirstName, LastName, Email, Phone, Company, Industry, Status |
| **Contact**     | Personnes qualifiées associées à des comptes | FirstName, LastName, Email, Phone, AccountId, Title          |
| **Account**     | Organisations ou entreprises                 | Name, Type, Industry, Phone, BillingAddress                  |
| **Opportunity** | Opportunités commerciales en cours           | Name, StageName, Amount, CloseDate, AccountId                |
| **Case**        | Demandes de service client                   | Subject, Description, Status, Priority, ContactId            |

## Requêtes SOQL courantes

Utilisez ces requêtes SOQL comme points de départ pour personnaliser le prompt système de votre agent. Toutes les requêtes renvoient des informations lisibles plutôt que des identifiants techniques :

### Rechercher des contacts par email

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

### Rechercher des prospects par email ou téléphone

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

### Rechercher des comptes par nom

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

### Rechercher des opportunités récentes

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

### Rechercher des opportunités par compte

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

## Tester l'intégration

Après avoir configuré votre application cliente externe et connecté l'intégration, testez-la avant le déploiement en production :

1. **Fonction de recherche** : demandez à votre agent de rechercher des contacts existants.
2. **Création de fiche** : demandez à votre agent de créer un prospect ou un contact.
3. **Récupération de données** : vérifiez que votre agent peut récupérer des informations client détaillées.

## Déclencheur de commentaire de cas : réponses par email pour Email-to-Case

Si vous avez activé le déclencheur **Salesforce Case Comment** (réponse automatique de l'agent aux cas Service Cloud), les réponses aux cas comportant au moins un email entrant sont renvoyées au client sous la forme d'un véritable email avec fil de discussion, et non uniquement comme commentaire de cas interne. Cela dépend de la présence d'un email entrant dans le cas, et non de la valeur de la liste déroulante **Origin** du cas. Le fonctionnement reste donc correct si votre organisation utilise une valeur Origin personnalisée telle que « Email - Returns » plutôt que la valeur exacte « Email ». Les cas sans email entrant continuent d'être publiés sous forme de commentaire de cas public, sans modification. Toute adresse mise en copie dans l'email initial du client est également automatiquement mise en copie dans la réponse, comme le ferait la fonction « Répondre à tous » d'un agent humain, à l'exception des adresses de routage Email-to-Case de votre organisation, volontairement exclues de la copie afin que la réponse ne soit pas réintégrée par Email-to-Case et ne redéclenche pas l'agent sur son propre message.

L'envoi de réponses par email nécessite une configuration supplémentaire par rapport aux seuls commentaires de cas :

* Le profil ou l'ensemble d'autorisations de l'utilisateur **Run As** doit inclure l'autorisation système **Send Email** (`Setup` > `Users` > `Profiles`, sous System Permissions), en plus de l'autorisation **API Enabled** déjà requise pour l'intégration.
* Le paramètre **Email Deliverability** de votre organisation (`Setup` > `Email` > `Deliverability`) doit autoriser les emails externes. Les Sandboxes utilisent par défaut un paramètre restrictif, qui bloque silencieusement les emails sortants.
* Si vous souhaitez que les réponses soient envoyées depuis un alias de support plutôt que depuis la boîte mail de l'utilisateur Run As, définissez le champ **Org-Wide Email Address Id** du déclencheur sur l'Id d'une **Organization-Wide Email Address** (`Setup` > `Organization-Wide Addresses` > cliquez sur l'adresse > copiez l'Id depuis l'URL). Laissez ce champ vide pour envoyer depuis l'adresse de l'utilisateur Run As.
* Définissez le champ **Email-to-Case Routing Address(es)** du déclencheur sur les adresses Email-to-Case de votre organisation (séparées par des virgules s'il y en a plusieurs, `Setup` > `Email-to-Case`). Sans cela, l'intégration essaie de deviner l'adresse de routage à partir de l'email du client (son adresse `To`), ce qui ne fonctionne pas lorsque votre adresse de routage était seulement en copie plutôt que destinataire principale. La remettre en copie dans une réponse dans ce cas redéclencherait l'agent sur son propre message.

Si l'organisation d'un client n'a pas configuré ces éléments, un échec d'envoi d'email entraîne la publication d'un commentaire de cas public. Ainsi, aucune réponse n'est perdue silencieusement, mais le client ne la recevra pas par email tant que la configuration ci-dessus n'est pas effectuée.

## Considérations de sécurité

* Utilisez des points de terminaison HTTPS pour tous les appels API.
* Vérifiez que la sécurité au niveau des champs est correctement configurée dans Salesforce.
* Les autorisations de l'utilisateur Run As déterminent les données auxquelles l'intégration peut accéder, définissez-les de manière appropriée.
* Auditez régulièrement l'accès à l'API et son utilisation.

## Liens utiles

* [Documentation de l'API REST Salesforce](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/)
* [Référence du langage de requête SOQL](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/)
* [Applications clientes externes et OAuth 2.0](https://help.salesforce.com/s/articleView?id=sf.connected_app_overview.htm)
* [Bonnes pratiques de sécurité Salesforce](https://help.salesforce.com/s/articleView?id=sf.security_overview.htm)