> ## Documentation Index
> Fetch the complete documentation index at: https://docs.callers.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Salesforce

> Connect Salesforce with Callers to sync leads, log calls, and automate follow‑ups across your workflows.

<Note>
  All Salesforce integration actions are sent from the following IP addresses:

  ```copy theme={null}
  35.245.204.86
  35.221.61.75
  ```

  If your systems are behind a firewall, whitelist these IP addresses to ensure action requests are delivered.
</Note>

### Connecting Salesforce to Callers

<Steps>
  <Step title="Open App Center and select Salesforce">
    * Choose your environment (Production/Development)
    * Click **Connect**

    <Frame caption="Select Salesforce and click Connect">
      <img src="https://mintcdn.com/voxiaai/2Y_NBqcKTc0nnMSy/images/documentation/integrations/salesforce-app-center.png?fit=max&auto=format&n=2Y_NBqcKTc0nnMSy&q=85&s=697cafad391fb14b612e15648dfa979b" alt="salesforce connect" style={{borderRadius: '10px'}} width="1015" height="1054" data-path="images/documentation/integrations/salesforce-app-center.png" />
    </Frame>
  </Step>

  <Step title="Authorize in Salesforce">
    * Sign in to your Salesforce account and grant access

    <Frame caption="Salesforce login and consent">
      <img src="https://mintcdn.com/voxiaai/2Y_NBqcKTc0nnMSy/images/documentation/integrations/salesforce-login.png?fit=max&auto=format&n=2Y_NBqcKTc0nnMSy&q=85&s=027ab3d739ad12cc4aa59cd9ec0cbd9f" alt="salesforce login" style={{borderRadius: '10px'}} width="1218" height="1782" data-path="images/documentation/integrations/salesforce-login.png" />
    </Frame>
  </Step>

  <Step title="Finish and verify">
    * Return to Callers and ensure the connection shows as **Connected**
  </Step>
</Steps>

***

## Available Actions

<br />

<AccordionGroup>
  <Accordion title="Run Query (Advanced)" icon="database">
    Executes a SOQL query and returns matching records.
  </Accordion>

  <Accordion title="Create Object (Advanced)" icon="square-plus">
    Creates a new record (e.g., Lead, Contact) using fields from the Data JSON.
  </Accordion>

  <Accordion title="Update Object (Advanced)" icon="pen-to-square">
    Updates an existing record by Id.
  </Accordion>

  <Accordion title="Upsert (Advanced)" icon="repeat">
    Creates or updates a record using an external key (External Id).
  </Accordion>

  <Accordion title="Batch Upsert (Advanced)" icon="arrows-rotate">
    Bulk create/update for an array of records.
  </Accordion>

  <Accordion title="Custom API Call" icon="globe">
    Call any supported Salesforce REST endpoint with a custom request body.
  </Accordion>
</AccordionGroup>

***

### Create Object (Advanced)

* **When to use**: creating a new record in the selected object.
* **Required fields**:
  * Object — target object (e.g., `Contact`)
  * Data — JSON with object fields
* **Sample Data**:

```json theme={null}
{
  "LastName": "{{ lastName }}",
  "FirstName": "{{ firstName }}",
  "Email": "{{ email }}",
  "AccountId": "001XXXXXXXXXXXX"
}
```

<Frame caption="Create Object — example configuration">
  <img src="https://mintcdn.com/voxiaai/2Y_NBqcKTc0nnMSy/images/documentation/integrations/salesforce-create-object.png?fit=max&auto=format&n=2Y_NBqcKTc0nnMSy&q=85&s=819ece6891300827a73791f702920d6b" alt="salesforce create object" style={{borderRadius: '10px'}} width="1907" height="1229" data-path="images/documentation/integrations/salesforce-create-object.png" />
</Frame>

<Tip>Use Salesforce API field names, such as `LastName`, `FirstName`.</Tip>

<Tip>
  For exact object and field API names (and allowed values), refer to the official Salesforce Object Reference: [Salesforce Standard Objects and Fields](https://developer.salesforce.com/docs/atlas.en-us.object_reference.meta/object_reference/sforce_api_objects_list.htm).
</Tip>

***

### Update Object (Advanced)

* **When to use**: modify fields on an existing record by its Id.
* **Required fields**:
  * Object — target object (e.g., `Account`)
  * Id — record Id (e.g., `001XXXXXXXXXXXX`)
  * Data — JSON with fields to update
* **Sample Data**:

```json theme={null}
{
  "Name": "{{ accountName }}",
  "Website": "{{ website }}"
}
```

<Frame caption="Update Object — example configuration">
  <img src="https://mintcdn.com/voxiaai/luq4ferUKXjoXX5g/images/documentation/integrations/salesforce-update-object.png?fit=max&auto=format&n=luq4ferUKXjoXX5g&q=85&s=f5c7debd4029abf9a8f1be93b3b29024" alt="salesforce update object" style={{borderRadius: '10px'}} width="3287" height="1482" data-path="images/documentation/integrations/salesforce-update-object.png" />
</Frame>

***

### Upsert (Advanced)

* **When to use**: idempotent create/update by an external key.
* **Required fields**:
  * Object — target object (e.g., `Lead`)
  * External Id Field — external key field name (e.g., `External_Id__c`)
  * Data — JSON with record data
* **Sample Data**:

```json theme={null}
{
  "External_Id__c": "{{ leadExternalId }}",
  "Company": "{{ company }}",
  "LastName": "{{ lastName }}",
  "Email": "{{ email }}"
}
```

***

<Frame caption="Upsert — created new record (insert)">
  <img src="https://mintcdn.com/voxiaai/luq4ferUKXjoXX5g/images/documentation/integrations/sales-force-upsert-insert.png?fit=max&auto=format&n=luq4ferUKXjoXX5g&q=85&s=b9693144c106b17d1b0f8ef17d34010a" alt="salesforce upsert insert" style={{borderRadius: '10px'}} width="3297" height="1504" data-path="images/documentation/integrations/sales-force-upsert-insert.png" />
</Frame>

<Frame caption="Upsert — updated existing record">
  <img src="https://mintcdn.com/voxiaai/luq4ferUKXjoXX5g/images/documentation/integrations/sales-force-upsert-update.png?fit=max&auto=format&n=luq4ferUKXjoXX5g&q=85&s=2f7c6cced7ae77d3f4feabb35c9fb444" alt="salesforce upsert update" style={{borderRadius: '10px'}} width="3295" height="1484" data-path="images/documentation/integrations/sales-force-upsert-update.png" />
</Frame>

***

### Run Query (Advanced)

* **When to use**: fetch records using SOQL.
* **Required fields**:
  * SOQL Query — query string
* **Sample SOQL**:

```sql theme={null}
SELECT Id, FirstName, LastName, Email FROM Contact WHERE Email = '{{ email }}'
```

***

<Frame caption="Run Query — example configuration">
  <img src="https://mintcdn.com/voxiaai/luq4ferUKXjoXX5g/images/documentation/integrations/salesforce-custom-query.png?fit=max&auto=format&n=luq4ferUKXjoXX5g&q=85&s=a0a2123cb1f62ec5f8bab884dbe346c8" alt="salesforce run query" style={{borderRadius: '10px'}} width="3300" height="1493" data-path="images/documentation/integrations/salesforce-custom-query.png" />
</Frame>

***

### Custom API Call

* **When to use**: you need an endpoint not covered by built‑in actions.
* **Parameters**: Method, Endpoint, Headers, Body (JSON)
* **Sample Body**:

```json theme={null}
{
  "Name": "{{ accountName }}",
  "Website": "{{ website }}"
}
```

<Warning>Ensure required API permissions are enabled and you are using the correct REST API version.</Warning>

<Frame caption="Custom API Call — example configuration">
  <img src="https://mintcdn.com/voxiaai/luq4ferUKXjoXX5g/images/documentation/integrations/sales-force-custom-api-call.png?fit=max&auto=format&n=luq4ferUKXjoXX5g&q=85&s=536b1c5320ffaa2fad4be0d3719b7441" alt="salesforce custom api" style={{borderRadius: '10px'}} width="3326" height="1514" data-path="images/documentation/integrations/sales-force-custom-api-call.png" />
</Frame>

***

## Using Variables

You can inject scenario/transcript variables into action fields. Make sure:

* Variables are defined in previous steps
* Value types match Salesforce fields (Email, Phone, Date/Time, etc.)
* Numeric/boolean fields receive properly typed values

***
