You might not have access to this feature!

This feature is only available on our premium and enterprise plans. [Talk to our team](mailto:premium@customer.io) about upgrading your plan.

# Salesforce Data-Out Integration

[PremiumThis feature is available for Premium plans.](/accounts-and-workspaces/plan-features/) [EnterpriseThis feature is available for Enterprise plans.](/accounts-and-workspaces/plan-features/)

## About this integration

Our Salesforce destination helps you create, update, or upsert records for any object type. Customer.io sends data to the Salesforce REST API.

[Mode How we forward source data to the destination: through Customer.io's servers or directly from our JavaScript client.](/cdp/destinations/getting-started/#connection-mode)

[Web sources Indicates whether or not this integration supports our the JavaScript client.](/cdp/sources/getting-started/#types-of-sources)

[API sources Indicates whether or not this integration supports our server libraries (Go, NodeJS, Python), API, Mobile SDK, and other data sources.](/cdp/sources/getting-started/#types-of-sources)

[Supported calls The API methods this integration supports.](/cdp/sources/source-spec/source-events/)

[Integration name The name of this integration if you want to enable or disable it in the `integrations` object.](/cdp/sources/source-spec/common-fields/#the-integrations-object)

Standard

[identify](/api/cdp/#operation/identify) and [group](/api/cdp/#operation/group)

Salesforce (Actions)

 Do you want to capture data *from* Salesforce?

Check out our [Salesforce Source](/integrations/data-in/connections/salesforce). With the Salesforce data-in *and* data-out integrations, you can set up a complete, end-to-end integration!

## Getting started[](#getting-started)

1.  Go to **[Data & Integrations > Integrations](https://fly.customer.io/workspaces/last/journeys/integrations/all/directory)** and select the **About this integration** entry in the *Directory* tab.
    
2.  (Optional) Select the data sources that you want to connect to your outbound integration. You can always connect data sources later. We’ll only show you data sources that work with your integration.
    
3.  Configure your integration.
    
4.  Click **Enable Destination**.
    

## Actions[](#actions)

When you’re done setting things up, you can go to the *Actions* tab to see how we map incoming data to your integration.

You may need to add actions for this integration

While we often have default triggers for actions, we don't always add those actions as defaults. You may need to add actions to make sure that you're sending all the data that you want to send to your integration. See our [actions](/integrations/data-out/actions/) page for help setting up actions.

### Mapping actions to Salesforce Operations[](#mapping-actions-to-salesforce-operations)

When you set up an action, you’ll select the *Operation* that you want to perform on a record. Our outgoing Salesforce integration supports the following operations:

*   **Create**: Pushes new records to Salesforce. This operation works when you want to push new records but don’t need data within each row to remain up to date or when you’re working with static data that you won’t update later, like events.
*   **Upsert**: Pushes new records to Salesforce and updates fields on existing records in Salesforce. This operation helps you push records into Salesforce and keep data up to date.
*   **Update**: Updates fields on existing records in Salesforce. This operation works when you know that you already have records in Salesforce that you update or add new information to
*   **Delete**: Deletes existing records in Salesforce.

### Matching records with delete, update, and upsert[](#matching-records-with-delete-update-and-upsert)

When you use the `delete`, `update` and `upsert` operations, you need to specify one or more *Record Matchers*. A record matcher is a value we’ll query Salesforce for to find and match the records you want to upsert, delete, or update. You can use any field in your source data as a record matcher, including:

*   **External IDs**. To map an External ID, the Salesforce API name should have `__c` appended to it.
*   **Record IDs**. To map a Record ID, the Salesforce API name is `Id`.
*   **Standard fields**. To map a standard field, the Salesforce API name should match what is in Salesforce for the given field, for example `Email`.
*   **Custom fields**. To map a custom field, the field needs to be predefined in Salesforce and the Salesforce API name should have `__c` appended to it.

You can also set the *Record Matchers Operator* if you have multiple record matchers. This determines whether Salesforce matches on any record matcher (**OR**), or all record matchers (**AND**). **If you have multiple Record Matchers, you should use fields that result in unique records**. If the operator is set to *Or* and Salesforce finds multiple matching records, it won’t perform the operation. We’ll record a 300 status for the request, and will not retry it.

Note that you should only set Record Matchers that that have the “Filter” property in Salesforce; these are fields Salesforce can query. For example, we can’t perform a Salesforce query on the `Description` field because it is not a filterable property. You can look up the standard field properties in [Salesforce’s API documentation](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/intro_rest.htm) to determine if a field is is a valid *Record Matcher*.