> 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

## Översikt

Anslut dina AI-agenter från ElevenLabs till Salesforce CRM för att komma åt kunddata, hantera leads och skapa affärsmöjligheter. Integrationen gör det möjligt för dina agenter att hämta befintliga kundposter, skapa nya leads och kontakter samt fråga Salesforce-objekt under konversationer.

## Funktioner

| Funktion               | Stöd                                                                                                       |
| ---------------------- | ---------------------------------------------------------------------------------------------------------- |
| Nolllagringsläge (ZRM) | Stöds inte                                                                                                 |
| Bilagor i utlösare     | Stöds inte — bilagor i inkommande ärendekommentarer och e-postmeddelanden skickas inte vidare till agenten |
| Bilagor i verktyg      | Stöds inte — verktygen hanterar endast text                                                                |

## Konfiguration

Den här integrationen använder **Salesforce OAuth 2.0 Client Credentials** för autentisering. Du behöver skapa en External Client App i Salesforce.

#### Skapa en External Client App

1. Logga in i din Salesforce-organisation som administratör
2. Gå till **Setup** > **External Client App Manager**
3. Klicka på **New External Client App**
4. Fyll i **External Client App Name** (t.ex. `ElevenLabs Agents`), **API Name** och **Contact Email**
5. Under **API (Enable OAuth Settings)**:
   * Markera **Enable OAuth** och **Enable Client Credentials Flow**
   * **Callback URL**: `https://api.elevenlabs.io/oauth/callback`
   * **OAuth Start URL**: `https://api.elevenlabs.io/oauth/start`
   * **Selected OAuth Scopes**: lägg till dessa scopes:
     * **Full access (full)**
     * **Perform requests on your behalf at any time (refresh\_token, offline\_access)**
     * **Manage user data via api**
6. Klicka på **Create**
7. Öppna fliken **Settings** på appsidan, gå till **OAuth Settings** och klicka på **Consumer Key and Secret**
8. Kopiera **Consumer Key** och **Consumer Secret** — du behöver dem för autentisering

#### Konfigurera OAuth Client Credentials-flödet

> **Warning**
>
> Client Credentials Flow rekommenderas för server-till-server-integrationer där ingen användarinteraktion
> krävs. Kontrollera att din Salesforce-administratör har aktiverat detta flöde.

1. Klicka på **Edit** i din External Client App
2. Markera **Enable Client Credentials Flow** — fältet **Run As** visas
3. Ställ in **Run As** på din administratörsanvändare eller ett dedikerat tjänstkonto — detta avgör behörigheterna för alla API-anrop
4. Ställ in **Permitted Users** på **Admin approved users are pre-authorized**
5. Klicka på **Save**

Användaren i **Run As** avgör behörigheterna för alla API-anrop. Välj en användare med profilen System Administrator eller en anpassad profil som har API-åtkomst och behörighet till de objekt agenten behöver (Contact, Lead, Account osv.). Behörigheten **API Enabled** måste vara markerad i användarposten.

#### Hitta din Salesforce-domän

Din Salesforce-domän krävs för API-anrop.

**Metod 1: Kontrollera din aktuella URL**

När du är inloggad i Salesforce tittar du i webbläsarens adressfält:

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

**Metod 2: Setup > Company Information**

Gå till **Setup** > **Company Information** och leta efter URL:en för **My Domain** eller organisationsinformationen.

**Metod 3: Setup > Domain Management**

Gå till **Setup** > **Domain Management** > **My Domain**. Din domän visas högst upp på sidan.

**Vanliga domänformat:**

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

> **Note**
>
> Använd hela domänen utan avslutande snedstreck.

#### Anslut i ElevenLabs

I ElevenLabs integrationskonfiguration anger du ditt Salesforce-**instansvärdnamn** (t.ex. `acme.my.salesforce.com`), **Client ID** (Consumer Key) och **Client Secret** (Consumer Secret).

## Demovideo

> **Note**
>
> Den här demon använder äldre webhook-verktyg. Om du använder den inbyggda Salesforce-integrationen konfigureras
> verktygen automatiskt — du behöver inte konfigurera webhookar manuellt.

## Så fungerar det

#### Översikt

#### Inledande kundförfrågan

Agenten samlar in kundinformation och ställer relevanta frågor för att identifiera kundens verksamhetsbehov och aktuella utmaningar.

#### Sökning efter kunddata

Agenten söker efter befintliga poster med `salesforce_search_records` för att hitta kontakter, konton eller leads. Den hämtar fullständig information med `salesforce_get_record` och använder den för att anpassa samtalet.

#### Kvalificering av leads

Om kunden är ny samlar agenten in kontaktuppgifter, bedömer verksamhetsbehoven och avgör lämplig säljprocess eller routning.

#### Skapa post

Agenten skapar lämplig post (lead, kontakt eller affärsmöjlighet) med `salesforce_create_record`, bekräftar skapandet med kunden och förklarar nästa steg.

#### Detaljerad systemprompt

```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**
>
> Verktygsauktorisering kan hanteras med Workplace Auth Connections, som automatiskt hanterar tokenuppdatering.
> Verktygen returnerar läsbara namn och beskrivningar i stället för tekniska ID:n för att
> förbättra samtalskvaliteten.

## Verktygskonfigurationer

Tre webhook-verktyg är tillgängliga: `salesforce_search_records`, `salesforce_get_record` och `salesforce_create_record`. Konfigurera auktorisering för vart och ett med en Workplace Auth Connection.

### Auktorisering – Workplace OAuth2-anslutning

#### Gå till Workplace Auth Connections

Gå till **Agents** > **Workplace Auth Connections** i din ElevenLabs-dashboard och klicka på **Add Auth**.

#### Konfigurera Salesforce-anslutning

Fyll i följande fält för din Salesforce-integration:

**Connection Name**: `Salesforce CRM`

**Client ID**

* Din Consumer Key från External Client App
* Exempel: `3MVG9JJlvRU3L4pRiOu8pQt5xXB4xGZGm0yW...`

**Client Secret**

* Din Consumer Secret från External Client App
* Exempel: `1234567890ABCDEF1234567890ABCDEF1234567890ABCDEF...`

**Token URL**

* OAuth-tokenändpunkten för din Salesforce-domän
* Format: `https://{domain}.my.salesforce.com/services/oauth2/token`
* Exempel: `https://acme.my.salesforce.com/services/oauth2/token`

**Scopes (valfritt)**

* OAuth-scopes för åtkomst till Salesforce API
* Rekommenderas: `full, api, refresh_token`
* Lämna tomt för att använda standard-scopes från din External Client App

**Extra Parameters (JSON)**

* Ytterligare OAuth-parametrar för din konfiguration
* Exempel för Client Credentials-flödet:

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

#### Skapa autentiseringsanslutning

Klicka på **Create auth connection** för att lägga till din konfiguration.

#### Använd i verktygskonfigurationer

När anslutningen har lyckats sparar du den och refererar till den i dina webhook-verktygskonfigurationer under avsnittet **Authentication**.

> **Tip**
>
> Workplace Auth Connections hanterar tokenuppdatering automatiskt, så du behöver inte hantera
> tokens manuellt.

### Konfigurationer för webhook-verktyg

Lägg till en Workplace Auth Connection (OAuth2) till varje verktyg i avsnittet **Authentication**. Använd flikarna nedan för att granska konfigurationen för varje verktyg.

#### salesforce\_search\_records

**Namn:** salesforce\_search\_records
**Beskrivning:** Söker efter befintliga poster i Salesforce med SOQL-frågor. Returnerar alltid lättläst information, inklusive namn, inte bara ID:n.
**Metod:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/query/?q={soql_query}`

**Headers:**

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

**Frågeparametrar:**

* **q:** SOQL-frågesträng (t.ex. "SELECT Id, Name, Email FROM Contact WHERE Email = '[example@email.com](mailto:example@email.com)'")

**Verktygs-JSON:**

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

**Namn:** salesforce\_get\_record
**Beskrivning:** Hämtar detaljerad information om en specifik Salesforce-post.
**Metod:** GET
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/{record_id}`

**Headers:**

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

**Sökvägsparametrar:**

* **object\_type:** Salesforce-objekttypen (Contact, Lead, Account osv.)
* **record\_id:** Det unika ID:t för Salesforce-posten

**Verktygs-JSON:**

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

**Namn:** salesforce\_create\_record
**Beskrivning:** Skapar en ny post i Salesforce.
**Metod:** POST
**URL:** `https://acme.my.salesforce.com/services/data/v58.0/sobjects/{object_type}/`

**Headers:**

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

**Sökvägsparametrar:**

* **object\_type:** Salesforce-objekttypen som ska skapas (Lead, Contact, Account osv.)

**Body-parametrar:**

* **Dynamiskt JSON-objekt** som innehåller postens fält och värden

**Verktygs-JSON:**

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

## Vanliga Salesforce-objekt

| Objekt          | Syfte                                          | Vanliga fält                                                 |
| --------------- | ---------------------------------------------- | ------------------------------------------------------------ |
| **Lead**        | Potentiella kunder som ännu inte kvalificerats | FirstName, LastName, Email, Phone, Company, Industry, Status |
| **Contact**     | Kvalificerade personer kopplade till konton    | FirstName, LastName, Email, Phone, AccountId, Title          |
| **Account**     | Organisationer eller företag                   | Name, Type, Industry, Phone, BillingAddress                  |
| **Opportunity** | Pågående säljaffärer                           | Name, StageName, Amount, CloseDate, AccountId                |
| **Case**        | Kundtjänstärenden                              | Subject, Description, Status, Priority, ContactId            |

## Vanliga SOQL-frågor

Använd dessa SOQL-frågor som utgångspunkt när du anpassar agentens systemprompt. Alla frågor returnerar lättläst information i stället för tekniska ID:n:

### Sök efter kontakter via e-post

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

### Sök efter leads via e-post eller telefon

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

### Sök efter konton via namn

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

### Sök efter senaste affärsmöjligheter

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

### Sök efter affärsmöjligheter via konto

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

## Testa integrationen

När du har konfigurerat din External Client App och anslutit integrationen bör du testa den innan du driftsätter i produktion:

1. **Sökfunktion**: Be agenten söka efter befintliga kontakter.
2. **Skapa poster**: Låt agenten skapa ett nytt lead eller en ny kontakt.
3. **Hämta data**: Kontrollera att agenten kan hämta detaljerad kundinformation.

## Utlösare för ärendekommentarer: e-postsvar för Email-to-Case

Om du har aktiverat utlösaren **Salesforce Case Comment** (automatiskt agentsvar på Service Cloud Cases) skickas svar på Cases med minst ett inkommande e-postmeddelande tillbaka till kunden som ett riktigt e-postmeddelande i samma tråd — inte bara som en intern Case Comment. Detta baseras på om Case har ett inkommande e-postmeddelande, inte på Casets picklist-värde **Origin**, så det fungerar fortfarande korrekt om din organisation använder ett anpassat Origin-värde som "Email - Returns" i stället för det exakta "Email". Cases utan inkommande e-postmeddelanden publiceras fortfarande som en offentlig Case Comment, utan ändringar. Alla adresser som har CC:ats i kundens ursprungliga e-postmeddelande CC:as också automatiskt i svaret, precis som en mänsklig agents "Reply All" skulle fungera — förutom din organisations Email-to-Case-routningsadress(er), som medvetet undantas från CC så att svaret inte tas in på nytt av Email-to-Case och utlöser agenten för dess eget meddelande.

Att skicka e-postsvar kräver ytterligare konfiguration utöver den som behövs enbart för Case Comments:

* Användarens profil eller Permission Set i **Run As** måste ha systembehörigheten **Send Email** aktiverad (`Setup` > `Users` > `Profiles`, under System Permissions), utöver behörigheten **API Enabled** som redan krävs för integrationen.
* Organisationens inställning för **Email Deliverability** (`Setup` > `Email` > `Deliverability`) måste tillåta extern e-post — Sandboxes har som standard en begränsad inställning som tyst blockerar utgående e-post.
* Om du vill att svar ska skickas från ett supportalias i stället för Run As-användarens egen inkorg anger du fältet **Org-Wide Email Address Id** på utlösaren till Id för en **Organization-Wide Email Address** (`Setup` > `Organization-Wide Addresses` > klicka på adressen > kopiera Id från URL:en). Lämna det tomt för att skicka från Run As-användarens egen adress.
* Ange fältet **Email-to-Case Routing Address(es)** på utlösaren till organisationens Email-to-Case-adress(er) (kommaseparerade om det finns fler än en, `Setup` > `Email-to-Case`). Utan detta försöker integrationen gissa routningsadressen utifrån kundens e-postmeddelande (dess `To`-adress), vilket missar fall där routningsadressen endast var CC:ad och inte primär mottagare — att CC:a tillbaka den i ett svar i den situationen skulle utlösa agenten för dess eget meddelande.

Om en kunds organisation inte har detta konfigurerat återgår ett misslyckat e-postutskick till att publicera en offentlig Case Comment, så ett svar aldrig tyst tappas — men kunden får det inte via e-post förrän ovanstående har konfigurerats.

## Säkerhetsaspekter

* Använd HTTPS-slutpunkter för alla API-anrop.
* Se till att korrekt säkerhet på fältnivå är konfigurerad i Salesforce.
* Behörigheterna för användaren i Run As avgör vilka data integrationen kan komma åt — begränsa dem på lämpligt sätt.
* Granska regelbundet API-åtkomst och användning.

## Användbara länkar

* [Salesforce REST API-dokumentation](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/)
* [Referens för SOQL-frågespråket](https://developer.salesforce.com/docs/atlas.en-us.soql_sosl.meta/soql_sosl/)
* [External Client Apps och OAuth 2.0](https://help.salesforce.com/s/articleView?id=sf.connected_app_overview.htm)
* [Bästa praxis för Salesforce-säkerhet](https://help.salesforce.com/s/articleView?id=sf.security_overview.htm)