# Salesforce Requirements

Primer's integration with Salesforce prioritizes security, ensuring your data is protected. If you have questions about security, our customer support team can offer a clear explanation of how we maintain safety during the integration.

#### APIs Primer Uses

Primer uses **Salesforce Bulk API 2.0** for large-scale data ingestion (initial syncs and most incremental updates), and falls back to **REST API** for specific edge cases (e.g., unsupported field types like base64 or complex fields).

* **Bulk API 2.0 (primary path)**
  * Used for high-volume objects (Accounts, Contacts, Leads)
  * Salesforce automatically determines chunk sizes and batching
  * Optimized for reliability over raw throughput
* **REST API (fallback)**
  * Used when Bulk API is not supported for certain fields
  * Can result in higher API call counts for those specific streams

<details>

<summary><strong>Why we prioritize Bulk API over REST/SOAP</strong></summary>

* Bulk API is used because:
  * Any operation >2,000 records is better suited for Bulk API
  * It reduces risk of timeouts and failures
  * It allows Salesforce to manage scaling internally
* REST/SOAP are not used for large-scale ingestion because:
  * Higher failure risk at scale
  * Less efficient for large datasets
  * Would not reduce total processing time meaningfully

</details>

#### Syncing Behavior

{% hint style="info" %}
**Typical Ingestion Rate: \~200,000 records per hour.** \
Example: 100K accounts + 300K contacts + 300K leads + 50K opportunities + 10K campaigns + 40K campaign members = 800K records = 4 hours to ingest & process.&#x20;

40 Bulk API 2.0 batches consumed
{% endhint %}

**The initial ingestion can take some time, and during this period, Salesforce filters may not be usable.**

<details>

<summary><strong>First Sync</strong> <strong>API Usage</strong></summary>

For large Salesforce instances (10M+ records), it’s normal to see higher-than-expected API usage during initial sync due to retries and Salesforce-managed chunking. This is expected and driven by a few factors:

1. **Automatic chunking by Salesforce**
   * Bulk API 2.0 splits large queries into smaller chunks behind the scenes
   * Each chunk contributes to total API usage
2. **Retry behavior (important)**
   * Primer uses **retry logic with exponential backoff** to ensure data completeness
   * Retries can occur due to:
     * Large dataset sizes (10M–25M+ records)
     * Network interruptions
     * Salesforce timeouts
     * Complex field types requiring REST fallback
   * These retries can significantly increase total API calls
3. **Long-running sync jobs**
   * Initial syncs can run for many hours or days depending on dataset size
   * Extended runtimes increase the likelihood of retries and reprocessing

👉 In practice, this means:

* API usage may exceed simple “rows ÷ batch size” estimates
* Higher call counts are often a tradeoff for **data completeness and reliability**

We cannot set a max consumption threshold on the API, but if you're interested in requesting this feature, please let us know.

</details>

After the initial ingestion, our approach is **incremental**. Typically minutes (e.g., \~10–15 minutes) once initial load is complete with very low API usage due to smaller data volume.&#x20;

We do not support limits on initial ingestion volume. Primer ingests the full dataset to ensure accurate audience building.

#### User Permissions

* "API Enabled" must be checked
* Primer will have the same access to objects and fields as the Salesforce user connected to Primer. So if fields are read-only or hidden for that user, that is what Primer will reflect.
  * For text fields, the fields should be set as 'text' only as opposed to 'text area' fields. &#x20;
  * You should give Primer "Read" access to the "Lead," "Contact," "Opportunity," and "Account" objects. **Primer does not currently delete any records, and we will never delete or overwrite data.**
  * Additional functionality for bulk import is available with allowing access to "Campaign" objects.
* High Assurance on Session security level required at login should be set to "Disabled" at the profile level. [Salesforce blocks some API access](https://help.salesforce.com/s/articleView?id=sf.security_require_2fa_api.htm\&type=5) when this setting is used on user Profiles and this will prevent Primer from accessing your Salesforce instance.
* Salesforce requires that the user account have the "View Setup and Configuration". Ensure the user account have the "View Setup and Configuration" permission. This permission is set on the Profile of the connected user under the "Administrative Permissions" heading.
* When connecting, the Salesforce authorization flow will request scopes `api` and `refresh_token`.

{% hint style="info" %}
We recommend using a stand-alone account specifically for Primer (often called a Service Account or Integration User) so you can see Primer updates in your audit history.&#x20;
{% endhint %}

#### Object Permissions

| Object        | Minimum Access | In-App Functionality |
| ------------- | -------------- | -------------------- |
| Lead          | Read           | Audience Building    |
| Contact       | Read           | Audience Building    |
| Account       | Read           | Audience Building    |
| Campaign      | Read           | Audience Building    |
| Opportunities | Read           | Audience Building    |

#### Permission Errors

From time to time, you may encounter two common errors with our Salesforce integration. These issues are generally related to the token used to connect Salesforce to Primer.

{% hint style="info" %}

#### Quick Fix: Reconnect and Reauthorize Salesforce: If you’re experiencing an error, the simplest solution is to **reconnect and reauthorize Salesforce** with Primer. This step often resolves token-related issues quickly.

{% endhint %}

#### **Common Causes of Salesforce Integration Errors**

There are several common reasons why token-related issues occur with the Salesforce integration. These include:

* **Expired Token**
  * **Explanation**: Tokens used to connect Salesforce accounts to Primer can expire periodically due to security or session settings.
  * **Solution**: Reauthorize your Salesforce connection to renew the token.
* **Inactive User Status**
  * **Explanation**: If the person who initially connected Salesforce to Primer has since become an inactive user in Salesforce, this can disrupt the integration.
  * **Solution**: Ensure the connected user is active in Salesforce, or reconnect with an active user account.
* **Changed Permissions**
  * **Explanation**: If the user’s permissions in Salesforce have been changed (e.g., role updates, restricted access), this may lead to integration errors.
  * **Solution**: Check and, if necessary, update the user permissions in Salesforce to ensure they meet the requirements for connecting with Primer.

#### Troubleshooting Guide

Regardless of the specific cause, the resolution steps are generally the same:

* **Reauthorize Salesforce**: Disconnect and reconnect Salesforce in Primer to reset the token.
* **Double-Check User Permissions**: Ensure the connecting user has sufficient permissions in Salesforce to maintain integration stability.

Following these steps should resolve most issues with the Salesforce integration. If you continue to encounter errors, please contact [Primer support](mailto:undefined) for further assistance.


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://support.sayprimer.com/primer/connections/setting-up-crm/salesforce-integration/salesforce-requirements.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
