Salesforce data-out integration
Getting started
To send data to Salesforce, you connect the destination and authenticate through the Customer.io External Client App (ECA). Before you connect, a Salesforce admin needs to install the ECA in your Salesforce org.
- Go to Data & Integrations > Integrations and select the Salesforce entry in the Directory tab.
- (Optional) Select the data sources you want to connect to this destination. You can always connect data sources later. We’ll only show you data sources that work with your integration.
- Give your destination a Name so you’ll recognize it in Customer.io.
- If you send data to a Salesforce sandbox, enable the Sandbox Instance setting before you connect. Your sandbox username is likely the same as your production username with the sandbox name appended—for example,
user@acme.com.testfor a sandbox namedtest. (This is a Salesforce convention, not a Customer.io requirement.) - Install the Customer.io External Client App (ECA) in your Salesforce org. You only need to do this once per Salesforce environment, so you can skip this step if you already installed the ECA for another Salesforce integration—like if you already send data to Customer.io from Salesforce.
- Click Connect and log in to Salesforce. We set your instance URL automatically from the OAuth login.
- Click Enable Destination.
Install Customer.io as an External Client App
You may not need to do this if you already set up a Salesforce data-in integration. You only need to set up the external client app (ECA) once per Salesforce environment. If you set up a data-in integration, it’s likely you already installed the ECA package as a part of that setup.
Customer.io connects to Salesforce through the Customer.io External Client App (ECA). If you set up your destination before June 17, 2026, it might still use the retired “Connected App.” See Upgrade from the retired Connected App.
Customer.io provides the installation link during setup, but you can also install the ECA package directly using one of the static links below:
- Production: Salesforce ECA install (prod)
- Sandbox: Salesforce ECA install (sandbox)
If the installation fails due to insufficient privileges, check whether the Salesforce user has been assigned to a Salesforce person with the “Download AppExchange Packages” permission. This permission is required to install the ECA.
For more about Salesforce’s changes to how integrations connect, see Salesforce’s partner changes documentation.
- Open the External Client App installation link for your Salesforce environment—either the link Customer.io provides for your connection or the appropriate static link above.
- Determine who should access the app.
- Acknowledge the warning about the app not being a part of the AppExchange Partner Program and click Upgrade.
- Return to Customer.io.
Upgrade from the retired Connected App
Customer.io moved from a “connected app” to an “external client app” in June 2026, supporting updates to Salesforce’s authentication requirements. If you set up your integration before June 17, 2026, you’ll need to upgrade to the External Client App before October 31, 2026 to keep your Salesforce integration working. You can’t reconnect through the old Connected App; if your connection to Salesforce stops working for any reason before the October 31 deadline, you need to migrate to the External Client App to restore it.
A Salesforce admin must install the External Client App. Anyone who can edit the integration in Customer.io can then re-authenticate with Salesforce.
- Install the Customer.io External Client App in your Salesforce org. You can skip this step if a Salesforce admin already installed the app for another Salesforce integration.
- In Customer.io, open your Salesforce integration and click Upgrade authentication in the banner.
- Confirm that a Salesforce admin installed the External Client App, and click Continue.
- Log in to Salesforce with the Salesforce user you want Customer.io to use for this connection. We recommend using an integration user.
- When Salesforce prompts you to grant access to the app, click Allow.
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.
| Action | Default Trigger | Description |
|---|---|---|
| Lead | type = "identify" | Create, update, or upsert leads in Salesforce. |
| Contact | Create, update, or upsert contacts in Salesforce. | |
| Task for Message Delivery | type = "track"andmatch(event, "Email*")andcustomer.WhoId != null | Create a task in Salesforce for each email delivery event, with a task description that links back to the delivery in Customer.io. |
| Custom Object | Create, update, or upsert records in any custom or standard object in Salesforce. | |
| Case | Create, update, or upsert cases in Salesforce. | |
| Opportunity | Create, update, or upsert opportunities in Salesforce. | |
| Account | type = "group" | Create, update, or upsert accounts in Salesforce. |
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
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
__cappended 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
__cappended 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 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 to determine if a field is a valid Record Matcher.