---
title: Integrate analytics with Salesforce
slug: content-marketing-platform/docs/integrate-analytics-with-salesforce
docTags: 
createdAt: 2026-07-20T15:45:18.642Z
---

This topic describes integrating the Content Marketing Platform (CMP) with Salesforce. Salesforce is a cloud computing software-as-a-service (SaaS) company specializing in customer relationship management (CRM).

Integrating Salesforce into your CMP instance shows how your content influences closed-won opportunities in Salesforce. **Deals Influenced,** and **Revenue Influenced** metrics correspond to the number of deals and revenue related to Salesforce contacts who saw your content. Additionally, you can see which deals were influenced by each piece of content.

## Set up Salesforce with CMP

:::hint{type="info"}
**Note**

For the analytics integration with Salesforce to fully work, integrate CMP with a marketing automation platform to capture lead data such as Eloqua, Marketo, or Pardot. See [Integrate analytics with Eloqua](docId\:CMRc8AQXSdA6fxRHqaYV-) or [Integrate analytics with Marketo](docId\:AkwYvahDP5QcMEKSCp3Pf). If you use Pardot, follow the steps below to integrate Salesforce and provide a **Business Unit ID** so that you can also integrate Pardot.
:::

1.  In Salesforce, select **Manage Users** > **Profiles** and click **New Profile**.

   ![Integrations-salesforce-analytics-1.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/opMPv-zhbjjoHqxQc6H7G-20260720-145809.png)
2. Select **Read Only** in **Existing Profile** and enter a **Profile Name**: *Read Only - Password never expires*

   ![Integrations-salesforce-analytics-2.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/bwvI7UDFtlkVGPdivKI4L-20260720-145809.png)
3. Make sure that you enable **Password Never Expires**.

   ![Integrations-salesforce-analytics-3.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/znOaalMICEMKvIQ2whPef-20260720-145809.png)
4. Go to the **Password Policies** section to select **Never Expires** in **User passwords expire in**.

   ![Integrations-salesforce-analytics-4.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/Gdde9S48sYbGGur4YZPIK-20260720-145809.png)

   :::hint{type="info"}
   **Note**

   Ensure the profile has **View All** access to **Accounts, Contacts,** and **Opportunities**.

   ![Integrations-salesforce-analytics-5.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/Hac-EZ2sUnu-cK38GrO-P-20260720-145809.png)
   :::
5. Go to **Administer** > **Manage Users** > **Users**, and create a user in Salesforce with the *Read Only - Password never expires* profile.

   ![Integrations-salesforce-analytics-7.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/4MA0BkRJZaBJMgz3rgeoa-20260720-145809.png)
6. In Content Marketing Platform (CMP), go to your avatar > **Salesforce**.

   ![Integrations-salesforce-analytics-8.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/LwWqnkQf5PKsWpO3z25A7-20260720-145809.png)
7. Click **Add a Salesforce Account** and log in with the user's username and password. This action may happen automatically if your browser is already logged into Salesforce.

   ![Integrations-salesforce-analytics-9.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/eImFsf4nU26SnZAFP-Ux2-20260720-145809.png)

   ![Integrations-salesforce-analytics-10.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/HDiudp0M_wLBeSCFInU0W-20260720-145809.png)
8. Click *Allow*.

   ![Integrations-salesforce-analytics-11.png](https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/rl1d53btK9zhfbKbnqDZH-20260720-145809.png)

:::Paragraph{indent="1"}
The following message displays, indicating a successful integration of your Salesforce account.
:::

::Image[]{src="https://api.archbee.com/api/optimize/BrbvVORKJ5iIeSMZye5kI/okRooz4cNTGgcqeevxrW5-20260720-145809.png" size="100" alt="Integrations-salesforce-analytics-12.png" isUploading="false" showCaption="false" indent="2"}

If you go to the newly authenticated user's page in Salesforce, the **Content Marketing Platform** displays in **OAuth Connected Apps** and **Login History**.

:::hint{type="info"}
**Note**

CMP uses **Business Unit ID** for Pardot integration. You must fill out **Business Unit ID** to use Pardot as the marketing automation system for ROI Analytics. If you are not connecting to Pardot, leave it blank.
:::

## Questions and answers

### How are deals and revenue influenced calculated?

See [Measure ROI](docId\:WwgoPWggIaPR2NVkNnABx).

### What are the requirements?

- A Marketo instance authenticated with CMP (see [Integrating Marketo For Analytics](docId\:WLh8dyutclURhpKme9vNG)) or an Eloqua instance authenticated with CMP and connected to Salesforce (see [Integrating Eloqua with the CMP](docId\:CMRc8AQXSdA6fxRHqaYV-)).
- The CMP JavaScript Snippet (see [Install the JavaScript Snippet](docId\:Ue8xv91-ZPfbnmYMypS2U)).

### How does it work?

First, authenticate a Salesforce user account with [Salesforce’s OAuth2.0 integrations](https://developer.salesforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com). CMP periodically synchs your **Accounts, Contacts, Opportunities, Opportunity Contact Roles, Record Types,** and **Users** to the system by making calls to Salesforce’s API on behalf of your authenticated user. CMP then relates your closed or won opportunities to contacts who have viewed content on your site and calculates the number of deals and revenue influenced.

### How does CMP know what content contacts have viewed?

If a Salesforce Contact exists in Marketo or Eloqua as a Lead or Contact, you can join them using their email address. CMP uses the web viewing history of Leads or Contacts to identify the content that Salesforce contacts have interacted with.

### Is giving CMP access to my organization’s Salesforce instance risky?

No, because CMP never modifies any data in your Salesforce instance because the user has a Read-Only profile. CMP does not store your Salesforce login credentials. Authentication happens through [Salesforce’s OAuth2.0 Integration](https://developer.salesforce.com/page/Digging_Deeper_into_OAuth_2.0_on_Force.com), which returns an access token that Optimizely Content Marketing Platform (CMP) uses to make requests to Salesforce’s API. CMP stores encrypted data, and only your organization in CMP can access it.

### Will CMP exceed my daily Salesforce instance API call quota?

The answer depends on your current daily API call usage. [Salesforce bases the maximum number of daily requests on your Salesforce Edition and the number of licenses](https://developer.salesforce.com/docs/atlas.en-us.salesforce_app_limits_cheatsheet.meta/salesforce_app_limits_cheatsheet/salesforce_app_limits_platform_api.htm). 

CMP only requests **Opportunities** and **Contacts** created or modified in the past day, which amounts to only a few API calls daily. CMP makes two requests to get IDs of created or modified contacts and opportunities and two requests to get each set of objects for each data page. The requests occur twice daily, so CMP makes at least 8 API calls. The maximum would be however many Contact or Opportunity objects were created or modified per day divided by SFDC page size (500). Upon initial ingestion, CMP can sync your Contacts and Opportunities in periodic batches to ensure you do not exceed your API call quotas.

### What data does CMP store from Salesforce?

CMP fetches recently created or updated Salesforce **Accounts**, **Contacts**, **Opportunities**, **Opportunity Contact Roles**, **Record Types**, and **Users** using the Salesforce REST API; see [Execute a SOQL Query](https://developer.salesforce.com/docs/atlas.en-us.api_rest.meta/api_rest/dome_query.htm).

**Account** fields store:

- Id
- IsDeleted
- Name
- ParentId
- Website
- LastModified
- CreatedDate
- AccountSource
- RecordTypeId
- CurrencyIsoCode
- Industry

**Contact** fields stored:

- CreatedDate
- Email
- Name
- AccountId
- LeadSource

**Opportunity** fields stored:

- Id
- CreatedDate
- Name
- AccountId
- Amount
- CloseDate
- IsClosed
- IsDeleted
- IsWon
- Type
- LeadSource
- StageName
- OwnerId
- RecordTypeId

**Opportunity Contact Role** fields stored:

- Id
- ContactId
- IsDeleted
- IsPrimary
- OpportunityId
- Role
- CreatedDate
- LastModifiedDate

**Record Type** fields stored:

- Id
- CreatedDate
- LastModifiedDate
- Description
- Name
- IsActive
- SObjectType

**User** fields stored:

- Id
- CreatedDate
- LastModifiedDate
- FirstName
- LastName
- Email
- Name

### How often does CMP request data from Salesforce?

CMP automatically fetches **Accounts**, **Contacts**, **Opportunities**, **Opportunity Contact Roles**, **Record Types,** and **Users** twice daily at 0400 and 1000 UTC for records created or updated the previous day.

### What about historical data?

Historical data from **Accounts**, **Contacts**, **Opportunities**, **Opportunity Contact Roles**, **Record Types**, and **Users** from Salesforce must be manually back-filled by CMP through the API to have existing contacts. If a known contact related to a Salesforce opportunity visits content published from CMP, it counts toward ROI Analytics metrics. Otherwise, no contact record can exist in CMP and cannot count towards ROI Analytics metrics.
