Salesforce Marketing Cloud Engagement
For an overview of Salesforce support in Striim, see Salesforce.
The Salesforce Pardot reader reads data from an instance of Salesforce Marketing Cloud Engagement (formerly Pardot) automation tool using the Account Engagement API (see Get Started with Account Engagement API).
The Striim Salesforce Pardot Reader supports the following features:
Salesforce Pardot Object API versions 3 and 4.
Salesforce Pardot sObjects.
OAuth authentication.
Reading from multiple Pardot objects with column filtering and exclusion.
Preserving existing operations and operation metadata.
Starting data capture from a specified initial timestamp.
Recovering data after a pipeline or system failure.
Building a pipeline with Salesforce Pardot Reader
You can read data from Salesforce Marketing Cloud Engagement (formerly Pardot) using the Salesforce Pardot Reader and write to any target supported by Striim.
We recommend that you create a single Striim application using the Reader in Automated mode. In this mode, the Reader performs an initial load of existing data and automatically transitions to continuous incremental replication after the initial load has completed. For foundational concepts about pipeline phases, see Pipelines.
Reader modes
The Salesforce Pardot Reader supports three modes.
Mode | Description | When to use | Wizard | Flow Designer, TQL, API |
|---|---|---|---|---|
Automated (recommended) | Performs an initial load of the selected objects and then automatically transitions to continuous incremental replication without requiring manual intervention. | Use this mode for most pipelines, especially when you are building a new pipeline. | Yes | Yes |
Initial Load | Performs a one-time snapshot of the selected objects and does not continue with continuous incremental replication after completion. | Use this mode when you need to run the initial load separately from incremental replication or to perform an ad hoc resynchronization of the source data. | No | Yes |
Incremental Load | Continuously replicates new or updated records using a configured watermark field and polling interval. | Use this mode if the initial load has already been completed and you want to replicate only new or updated data going forward. | No | Yes |
Two ways to build a Salesforce Pardot pipeline
Before creating a pipeline, complete the required setup and configuration steps as described in Initial setup for Salesforce Pardot Reader.
You can build pipelines in one of two ways: using the pipeline wizard (recommended), or manually using Flow Designer, TQL, or the REST API.
Using the pipeline wizard (recommended)
If you are building near-real-time pipelines from Salesforce Marketing Cloud Engagement to supported targets, we recommend using a wizard from the Create App page to build an application that reads from Salesforce Pardot. The wizard automatically:
Creates a single application using the Reader in Automated mode.
Configures both initial load and continuous incremental replication.
Creates the target schema and tables that match the selected objects.
Copies existing data during the initial load phase.
Automatically transitions to incremental replication when the initial load completes.
Configures watermark tracking and polling intervals.
The wizard simplifies setup, promotes best practices, and reduces configuration errors.
Creating a pipeline manually
If your use case or organizational policies do not allow the use of the pipeline wizard (for example, you are using a CI/CD system to move configurations to production) or if the wizards do not support your target, you can manually create and configure an application using Flow Designer, TQL, or the Striim REST API.
When creating a pipeline manually, set the Reader's Mode property to Automated. This allows a single application to handle both initial load and continuous replication without requiring changes between phases. You may also use the Reader in Initial Load or Incremental Load mode when your architecture requires separate applications for each phase.
Configuration guidelines
When configuring the Salesforce Pardot Reader, follow these best practices.
Set the Reader mode. Choose the mode that aligns with your use case. We recommend that you start with Automated mode.
Identify the Incremental Load Marker. Before performing the initial load, identify a reliable, monotonically increasing field for each object. In the Incremental Load Marker property, specify this using the format
<object_name>=<field_name>. If all objects share the same marker field, you can simply specify<field_name>. This field is used as the watermark for incremental replication. If an object does not have such a field, the system performs a full table copy during each incremental sync. Not all Pardot objects support incremental load; see the supported objects table in the programmer's reference for details.Configure schema creation. If the required schemas do not already exist on the target and you want Striim to create them automatically, enable Migrate Schema. If any tables from the source schema already exist on the target, this operation will fail. If you prefer not to have Striim create target schemas, pre-create target tables using native or third-party utilities and ensure that the target schema is compatible with the source schema. Leave Migrate Schema disabled in this case.
Configure continuous replication. Set the Incremental Load Marker field and the Polling Interval. The polling interval must be at least 120 seconds to avoid data loss due to API inconsistency. Configure the target for upsert semantics using appropriate key columns.
Set Start Timestamp (optional). If you need to start reading from a specific point in time, provide a timestamp value in the format
yyyy-MM-dd HH:mm:ss.
Sample TQL for Salesforce Pardot Reader
The following TQL performs an initial load (since the default Mode is InitialLoad). For most pipelines, set Mode to Automated to perform initial load and then automatically transition to incremental replication.
CREATE SOURCE PardotIL USING SalesforcePardotReader ( autoAuthTokenRenewal: true, OAuthAuthorizationFlows: 'PASSWORD', ThreadPoolCount: '5', securityToken: '<user_security_token>', UserName: '<username>', BusinessUnitId: '<pardot_business_unit_id>', consumerKey: '<connected_app_consumer_key>', consumerSecret: '<connected_app_consumer_secret>', SObjects: '%', Password: '<user_password>' ) OUTPUT TO PardotIL_OutputStream;
Initial setup for Salesforce Pardot Reader
Verifying the Salesforce Pardot Reader configuration
Use the following cURL commands (see Using cURL in the REST Examples and curl.haxx.se) to verify your configuration and get information about available resources and sObjects.
Get an access token using the Salesforce login URL.
curl https://login.salesforce.com/services/oauth2/token -d "grant_type=password" \ -d "client_id=<your consumer key>" -d "client_secret=<your consumer secret>" \ -d "username=<your username>" -d "password=<your password>"
Using the access token returned by that command, test the REST API URL for your organization. The instance is typically the first part of the URL you see in your browser when logged into Salesforce, such as "mycompany" in mycompany.salesforce.com. Alternatively, ask your Salesforce technical administrator for access to a connected app. (For more information, see Understanding the Username-Password OAuth Authentication Flow.)
If you do not have a proxy server:
curl https://<your Salesforce instance>.salesforce.com/services/data/ \ -H 'Authorization: Bearer <token>'
If you have a proxy server (change the proxy server URL to match yours):
curl -x http://mycompany.proxy.server.com:8080/ \ https://<your Salesforce instance >.salesforce.com/services/data/ \ -H 'Authorization: Bearer <token>'
List available REST resources and sObjects (see List Available REST Resources and Get a List of Objects).
curl https://<your Salesforce instance>.salesforce.com/services/data/v41.0 \ -H 'Authorization: Bearer <token>' curl https://<your Salesforce instance>.salesforce.com/services/data/v41.0/sobjects \ -H 'Authorization: Bearer <token>'
For additional information, see Salesforce's REST API Developer Guide .
Configuring OAuth for Salesforce Pardot Reader
Authenticating Striim to Salesforce Pardot requires an active Salesforce account, a license for Salesforce Pardot, and a Striim app connected to Salesforce. Add the pardot_api OAuth scope to the connected app.
Configuring OAuth for automatic authentication token renewal
From the connected app, get the values of the Consumer Key and Consumer Secret.
In the Salesforce Pardot Reader, set the values of the Consumer Key and Consumer Secret.
Generate a security token following the instructions in Salesforce documentation.
In the Salesforce Pardot Reader, set the value of the Security token.
Configuring OAuth for manual authentication token renewal
Generate an authentication token using the following command:
curl https://login.salesforce.com/services/oauth2/token -d "grant_type=password"\ -d "client_id=<your consumer key>"\ -d "client_secret=<your consumer secret>"\ -d "username=<your username>"\ -d "password=<your password>"
In the Salesforce Pardot Reader, set the value of the authentication token.
Generate a security token following the instructions in Salesforce documentation.
In the Salesforce Pardot Reader, set the value of the Security token.
Programmer's reference for Salesforce Pardot Reader
Supported objects
The Striim Salesforce Pardot Reader supports the following objects:
Name | Supported modes | Supported operations |
|---|---|---|
Account | Initial Load | Insert |
Campaign | Initial Load | Insert |
CustomField | All | Insert |
CustomRedirect | All | Insert, Update |
DynamicContent | All | Insert, Update |
Initial Load | Insert | |
EmailClicks | All | Insert |
EmailTemplate | Initial Load | Insert |
Form | All | Insert, Update |
LifecycleHistory | All | Insert |
LifecycleStage | Initial Load | Insert |
ListMembership | All | Insert |
List | All | Insert, Update |
Opportunity | All | Insert |
Prospect | All | Insert, Update |
ProspectAccount | Initial Load | Insert |
Tag | All | Insert, Update |
TagObject | All | Insert |
User | All | Insert |
Visit | InitialLoad | Insert |
Visitor | All | Insert, Update |
VisitorActivity | All | Insert |
Salesforce Pardot Reader properties
property | type | default value | notes |
|---|---|---|---|
Auth Token | com.webaction. security.Password | If autoAuthTokenRenewal is set to false , specify your Salesforce access token (see Set Up Authorization on developer.salesforce.com: the first section, "Setting Up OAuth 2.0," explains how to create a "connected app"; the second section, "Session ID Authorization," explains how to get the token using When Auto Auth Token Renewal is | |
Auto Auth Token Renewal | Boolean | False | With the default value of False, when the specified Auth Token expires the application will halt and you will need to modify it to update the auth token before restarting. This setting is recommended only for development and testing, not in a production environment. When this property is False, you must specify Auth Token, Password, and Username. Set to True to renew the auth token automatically. In this case, leave Auth Token blank and set the Consumer Key, Consumer Secret, Password, Security Token, and Username properties. |
Business Unit ID | String | Specify the Account Engagement instance from which the adapter will read (see Find my Account Engagement Account ID). | |
Connection Retry Policy | String | retryInterval=30, maxRetries=3 | With the default setting, if a connection attempt is unsuccessful, the adapter will try again in 30 seconds ( |
Consumer Key | String | If Auto Auth Token Renewal is set to true, specify the Consumer Key (see Set Up Authorization on developer.salesforce.com). | |
Consumer Secret | String | If Auto Auth Token Renewal is set to true, specify the Consumer Key (see Set Up Authorization on developer.salesforce.com). When Auto Auth Token Renewal is | |
Custom Params | String | This property optionally enables overrides for individual source parameters while fetching records. Salesforce documentation provides a complete list of parameters for different objects. The parameter format is | |
Exclude Objects | String | Optionally, specify a list of objects, separated by semicolons, to be excluded from any wildcard selection specified in sObjects. This property does not support wildcards. | |
Export Status Check interval | String | 120s | This property specifies how often, in seconds, Striim will check the status of a bulk export job. Higher values result in fewer API calls and directly affect the performance of an export job. When Use Bulk Export is False, this property is ignored and does not appear in Flow Designer. |
JWT Certificate Name | String | When Auto Auth Token is False or OAuth Authorization Flows is PASSWORD, this property is ignored and not visible in the Flow Designer. | |
JWT Keystore Password | com.webaction. security.Password | When Auto Auth Token is False or OAuth Authorization Flows is PASSWORD, this property is ignored and not visible in the Flow Designer. | |
JWT Keystore Path | String | When Auto Auth Token is False or OAuth Authorization Flows is PASSWORD, this property is ignored and not visible in the Flow Designer. | |
Migrate Schema | Boolean | False | Do not change this setting. It is reserved for use by applications created using Auto Schema Conversion wizards (see Using Auto Schema Conversion). |
Mode | Enum | InitialLoad | This setting controls the basic behavior or the adapter. Use the default value of InitialLoad to read all existing data and stop. Set to IncrementalLoad to read all new data continuously. |
OAuth Authorization Flows | enum | PASSWORD | This property selects the authorization method the adapter will use. With the default value of PASSWORD, Salesforce Writer will authorize using OAuth 2.0 username and password (see Salesforce Help> Docs> Identify Your Users and Manage Access > OAuth 2.0 Username-Password Flow for Special Scenarios). In this case, you must specify values for the Consumer Key, Consumer Secret, Password, Security Token, and Username properties. Set to JWT_BEARER to authorize using OAuth 2.0 JWT bearer tokens instead (see Salesforce Help> Docs> Identify Your Users and Manage Access > OAuth 2.0 JWT Bearer Flow for Server-to-Server Integration). In this case, you must specify the Consumer Key, JWT Certificate Name, JWT Keystore Password, JWT Keystore Path, and Username properties. |
Objects | See sObjects. | ||
Pardot API Version | Enum | V4 | With the default value of V4, the reader will use Salesforce Pardot API version 4. Set to V3 to use API version 3. |
Password | com.webaction. security.Password | When Auto Auth Token Renewal is set to true, specify the password for the specified Username (see Encrypted passwords). When Auto Auth Token Renewal is False or OAuth Authorization Flows is JWT_BEARER, this property is ignored and not visible in the Flow Designer. | |
Polling Interval | String | 120s | This property controls how often the adapter reads from the source. By default, it checks the source for new data every two minutes (120 seconds). If there is new data, the adapter reads it and sends it to the adapter's output stream. If you encounter Salesforce REQUEST_LIMIT_EXCEEDED errors, you may need to increase this value or contact Salesforce to raise your API limits (see Salesforce Developer Limits and Allocations Quick Reference). When Mode is InitialLoad, this property is ignored and not displayed in the Flow Designer. The specified polling interval should be always greater than 2 minutes or 120s in order to avoid data loss due to API inconsistency. |
Security Token | com.webaction. security.Password | When Auto Auth Token Renewal is set to When Auto Auth Token Renewal is False or OAuth Authorization Flows is JWT_BEARER, this property is ignored and not visible in the Flow Designer. | |
sObjects | String | Specify which standard objects to be read from Salesforce Pardot. To read all objects, use the In the Flow Designer this property is shown as Objects. For more information, see Account Engagement API / Get Started / Object Field References. | |
Start Timestamp | String | By default, Salesforce Pardot Reader reads only new events. Optionally, specify the time (based on LastModifiedDate) from which to start reading older events in the format | |
Thread Pool Count | Integer | 0 | With the default value of 0, the reader uses a single thread in the Striim JVM. Set this number to match the number of concurrent transactions for your Account Engagement API (see Get Started with Account Engagement API > Rate Limits). |
Use Bulk Export | Boolean | False | When Mode is InitialLoad, this controls which API the adapter will use. (When Mode is IncrementalLoad, this property is ignored and not displayed in the Flow Designer.) With the default value of False, the reader uses the Account Engagement API. Set to true to use the asynchronous bulk export API (see Version 4 Docs / Export / Export API Overview) during initial load. The following objects support bulk export:
Bulk export is limited to one year of historical data. Use the When Use Bulk Export is True, the Export Status Check Interval property is enabled. |
Username | String | If Auto Auth Token Renewal is set to true, specify an appropriate username (see Add a Single User on help.salesforce.com). When Auto Auth Token Renewal is |
The output type is WAEvent.
Operational considerations for Salesforce Pardot Reader
Limitations
The Account Engagement API supports up to five concurrent transactions (see Get Started with Account Engagement API > Rate Limits). Exceeding this limit may cause your application to terminate.
When an object does not support incremental load, all records for that object are synced at each poll. To avoid duplicate records, enable Merge mode for the targets of such objects.
When an object does not have a createAt or updatedAt field and Striim can not otherwise determine a timestamp for the object, it will be duplicated in the target at every polling interval.
The Salesforce Pardot Reader formats all timestamps using the Striim server's timezone, regardless of the timezone configured on the Pardot instance. If the Striim server and the Pardot instance are not in the same timezone,
created_atandupdated_atvalues in WAEvents may not match the values returned by the Account Engagement API. To avoid this mismatch, ensure that the Striim server and the Pardot instance use the same timezone.