You can import Salesforce Marketing Cloud (beta) Data Source objects into Treasure Data using this data connector. Contact us for further details about the private beta.

You can use the same connection to export SFMC data. See Salesforce Marketing Cloud (ExactTarget) Export Integration.

Prerequisites

How to create an install package in Salesforce Marketing Cloud

After August 1st 2019, you can not create a Legacy Package in Salesforce Marketing Cloud, therefore we highly recommend that you create an Enhanced Package.

How to create legacy package

Log on to your Salesforce Marketing Cloud account

On the Welcome Page, click your name on top right corner then click Setup.

On left side menu of new screen, click App > Installed Packages .

On the Installed Packages screen, click New.

On the New Package Details pop up, enter the Name and Description. Uncheck (deselect) the checkbox Create with enhanced functionality (recommended) then click Save.

On the Package Details screen, click on Add Component

On the Add Component pop up, select API Integration then click Next.

On the Add API Integration screen:

On the Installed Packages screen, scroll down to Components panel, then take note of the Client Id and Client Secret. You use the information to write the data from Treasure Data to Salesforce Marketing Cloud.

How to create enhanced functionality package

Log on to your Salesforce Marketing Cloud account.

On the Welcome Page, click your name on top right corner then click Setup.

On left side menu of new screen, click App > Installed Packages.

On the Installed Packages screen, click New.

On the New Package Details pop up, enter the Name and Description and select the checkbox Create with enhanced functionality (recommended). Then click Save

On the Add Component pop up, select API Integration then click Next.

On the Choose Your Integration Type screen, select Server-to-Server then click Next.

On the Set Server-to-Server Properties screen:

On the Installed Packages screen, scroll down to Components panel, then take note of the Client Id, Client Secret and Authentication Base URI. You will use the information to write the data from Treasure Data to Salesforce Marketing Cloud.

Use the TD Console to create your connection

You can use TD console to create your data connector.

Create a new connection

When you configure a data connection, you provide authentication to access the integration. In Treasure Data, you configure the authentication and then specify the source information.

Go to Integrations Hub > Catalog and search and select Salesforce Marketing Cloud.

Create Legacy Package integration

On the New Authentication screen, select Package Type as Legacy Package, then enter the Client Id and Client Secret (which you obtained when you created legacy package in SFMC). Then click Continue.

Enter a Name for this integration and click Done.

Create Enhanced Package integration

On the New Authentication screen, select Package Type as Enhanced Functionality Package, then enter the Client Id, Client Secret and Authentication Base URI (which you obtained when you created the enhanced package in SFMC). Optionally, you could specify Account identifier or MID to access multiple BUs (more detail in How to get MID) and Scope to limit the token's scope (more detail in API scopes). Then, click Continue.

Enter a Name for this integration and click Done.

Create a new transfer

After creating the connection, you are automatically taken to Sources. Look for the connection you created and click New Transfer.

The following dialog opens. Complete the details and click Next.

Next, you see a Preview of your data similar to the following dialog. To make changes, click Advanced Settings otherwise, click Next.

From here, if you want to change some options such as skipping on errors or rate limits, click Advanced Settings:

Select the database and table where you want to transfer the data:

Specify the schedule of the data transfer using the following dialog and click Start Transfer:

You will see the new data transfer in progress listed under the My Input Transfers tab and a corresponding job are listed in the Jobs section.

Use Command Line

Install ‘td’ command v0.11.9 or later

You can install the newest Treasure Data Toolbelt.

$ td --version
0.15.3

Create Configuration File

Prepare configuration file (for eg: load.yml) as shown in the following example, with your Salesforce Marketing Cloud account access information.

in:
  type: salesforce_marketing_cloud
  client_id: xxxxxxxxxx
  client_secret: xxxxxxxxxx
  target: campaign (required, see Appendix A)
out:
  mode: replace

This example dumps Salesforce Marketing Cloud Campaign Data Source:

For more details on available out modes, see the Appendix.

(optional): Preview data to import

You can preview data to be imported using the command td connector:preview.

$ td connector:preview load.yml
+-----------------+---------------------+--------------------+----
| id:long         | name:string         | description:string | ...
+-----------------+---------------------+--------------------+----
| 42023           | "Hello"             | apps               |
| 42045           | "World"             | apps               |
+-----------------+---------------------+--------------------+----

Execute Load Job

Submit the load job. It may take a couple of hours depending on the data size. Users need to specify the database and table where their data are stored.

It is recommended to specify --time-column option, since Treasure Data’s storage is partitioned by time (see also data partitioning). If the option is not given, the data connector selects the first long or timestamp column as the partitioning time. The type of the column specified by --time-column must be either of long and timestamp type.

If your data doesn’t have a time column you can add it using add_time filter option. More details at add_time filter plugin

$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column modifieddate

The preceding command assumes you have already created database(td_sample_db) and table(td_sample_table). If the database or the table do not exist in TD this command will not succeed. Therefore, create the database and table manually or use --auto-create-table option with td connector:issue command to auto create the database and table:

$ td connector:issue load.yml --database td_sample_db --table td_sample_table --time-column modifieddate --auto-create-table

You can assign Time Format column to the "Partitioning Key" by "--time-column" option.

Scheduled execution

You can schedule periodic data connector execution for periodic Salesforce Marketing Cloud import. We configure our scheduler carefully to ensure high availability. By using this feature, you no longer need a cron daemon on your local data center.

Create the schedule

A new schedule can be created using the td connector:create command. The name of the schedule, cron-style schedule, the database and table where their data will be stored, and the Data Connector configuration file are required.

$ td connector:create \
    daily_salesforce_marketing_cloud_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml

The `cron` parameter also accepts these three options: `@hourly`, `@daily` and `@monthly`.

By default, schedule is setup in UTC timezone. You can set the schedule in a timezone using -t or --timezone option. The `--timezone` option only supports extended timezone formats like 'Asia/Tokyo', 'America/Los_Angeles' etc. Timezone abbreviations like PST, CST are *not* supported and may lead to unexpected schedules.

List the Schedules

You can see the list of currently scheduled entries by td connector:list.

$ td connector:list
+-----------------------------------------+--------------+----------+-------+--------------+-----------------+----------------------------------------------+
| Name                                    | Cron         | Timezone | Delay | Database     | Table           | Config                                       |
+-----------------------------------------+--------------+----------+-------+--------------+-----------------+----------------------------------------------+
| daily_salesforce_marketing_cloud_import | 10 0 * * *   | UTC      | 0     | td_sample_db | td_sample_table | {"type"=>"salesforce_marketing_cloud", ... } |
+-----------------------------------------+--------------+----------+-------+--------------+-----------------+----------------------------------------------+

Show the Setting and History of Schedules

td connector:show shows the execution setting of a schedule entry.

% td connector:show daily_salesforce_marketing_cloud_import
Name     : daily_salesforce_marketing_cloud_import
Cron     : 10 0 * * *
Timezone : UTC
Delay    : 0
Database : td_sample_db
Table    : td_sample_table

td connector:history shows the execution history of a schedule entry. To investigate the results of each individual execution, use td job <jobid>.

% td connector:history daily_salesforce_marketing_cloud_import
+--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+
| JobID  | Status  | Records | Database     | Table           | Priority | Started                   | Duration |
+--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+
| 578066 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-18 00:10:05 +0000 | 160      |
| 577968 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-17 00:10:07 +0000 | 161      |
| 577914 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-16 00:10:03 +0000 | 152      |
| 577872 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-15 00:10:04 +0000 | 163      |
| 577810 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-14 00:10:04 +0000 | 164      |
| 577766 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-13 00:10:04 +0000 | 155      |
| 577710 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-12 00:10:05 +0000 | 156      |
| 577610 | success | 10000   | td_sample_db | td_sample_table | 0        | 2015-04-11 00:10:04 +0000 | 157      |
+--------+---------+---------+--------------+-----------------+----------+---------------------------+----------+
8 rows in set

Delete the Schedule

td connector:delete removes the schedule.

$ td connector:delete daily_salesforce_marketing_cloud_import

Incremental Loading

For Data Extensions

Treasure Data supports incremental loading for Data Extensions that have a date field.

If incremental: true is set, the data connector loads records according to the range specified by the from_date and the fetch_days for the specified date field.

For example:

  incremental_column_name: mydatefield
  from_date: "2018-02-01T00:00:00.000Z"
  fetch_days: 2

If incremental: false is set, The data connector loads all records for the target specified. This is one time activity.

For Email Events

Treasure Data supports incremental loading for Email Events based on their event date.

If incremental: true is set

If incremental: false is set, The data connector loads all records for the target specified. This is one time activity.

Appendix

Modes for out plugin

You can specify file import mode in out section of load.yml.

append (default)

This is the default mode and records are appended to the target table.

in:
  ...
out:
  mode: append

replace (In td 0.11.10 and later)

This mode replaces data in the target table. Any manual schema changes made to the target table remains intact with this mode.

in:
  ...
out:
  mode: replace

Available targets

Target

Description

Campaign

The e-mail campaign

Contact

The contact list

Data Extensions

The data extensions to satisfy the need for flexible data storage

Email Events

The events associated with an email marketing send

The target Contact provides an option to ingest data in multiple requests in case you have too many contact model’s attributes. If you select this option, you also input the number of attributes per request. The default value of this field is 100.

In some cases, your data breaks because some attributes are faulty. You can use the option Attribute set names will be ignored to skip faulty attributes. This option helps you to ingest data without error from Salesforce Marketing Cloud’s API.

The target Data Extensions provides an option to filter data extensions that you want to ingest and another option to enable ingesting shared data extension.

The target Email Events provides option to filter:


Sample configuration for each target

For Campaign target

in: 
 type: salesforce_marketing_cloud 
 client_id: XXXXXX 
 client_secret: XXXXXX 
 target: campaign 
out: 
 mode: replace

Parameters

Description

Default value

type

must be salesforce_marketing_cloud

client_id

Salesforce Marketing Cloud Client ID

client_secret

Salesforce Marketing Cloud Client Secret

target

must be campaign (in this case)

For Contact target

in:
 type: salesforce_marketing_cloud 
 client_id: XXXXXX 
 client_secret: XXXXXX 
 target: contact 
 contact_page_size: 50 
 contact_attributes_request_limit: 100 
 contact_multiple_requests: true 
 ignore_attribute_set_names: 
 - attribute_1 
 - attribute_2
out: 
 mode: replace

Parameters

Description

Default value

type

must be salesforce_marketing_cloud

client_id

Salesforce Marketing Cloud Client ID

client_secret

Salesforce Marketing Cloud Client Secret

target

must be contact (in this case)

contact_page_size

Number of records per page for target contact. This option is useful when you have a large of data

1000

contact_attributes_request_limit

Number of attributes to ingest for each contact in a single request. When number of attributes greater than this value, it is split into multiple requests

100

contact_multiple_requests

Enable plugin to ingest contact detail with so many attributes in multiple requests (This only effects when number of attributes greater than 100 )

false

ignore_attribute_set_names

List of attributes are ignored. Useful when you want to eliminate some unnecessary attributes

null

For Data Extension target

in: 
 type: salesforce_marketing_cloud 
 client_id: XXXXXX 
 client_secret: XXXXXX 
 target: data_extension 
 data_extension_names: 
 - data_extension_1
 - data_extension_2
 incremental: true 
 shared_data_extension: true 
 incremental_column_name: date 
 from_date: "2018-11-30T17:00:00.000Z" 
 fetch_days: 1
out: 
 mode: replace 

Parameters

Description

Default value

type

must be salesforce_marketing_cloud

client_id

Salesforce Marketing Cloud Client ID

client_secret

Salesforce Marketing Cloud Client Secret

target

must be data_extension (in this case)

data_extension_names

List of data extension names you want to ingest. Leave it to null to ingest all

null

shared_data_extension

Set this flag to true when you want to ingest the data from shared data extensions

false

incremental

Set this flag to true if you want to get newer data between each schedule only

false

incremental_column_name

Column used for incremental loading. Must be set if you set incremental = true

null

from_date

Set this to ingest data from this date

null

fetch_days

Duration to ingest is from_date to from_date + fetch_days

1

For Email Event target

in: 
 type: salesforce_marketing_cloud 
 client_id: XXXXXX 
 client_secret: XXXXXX 
 target: email_event 
 search_term: "email name" 
 search_mode: "exact" 
 email_event_types: 
 - value : all 
 start_time: "2019-03-26T07:20:00.000Z" 
 end_time: "2019-03-26T07:53:00.000Z" 
 incremental: true
out: 
 mode: replace 

Parameters

Description

Default value

type

must be salesforce_marketing_cloud

client_id

Salesforce Marketing Cloud Client ID

client_secret

Salesforce Marketing Cloud Client Secret

target

must be email_event (in this case)

search_term

Name of email you want to ingest

null

search_mode

Mode for name matching pattern. Must be exact or partial only

exact

email_event_types

List of event types you want to import. Valid options are as follows:

- value : all
- value : bounce
- value : click
- value : forward
- value : forwardOptIn
- value : open
- value : sent
- value : survey
- value : unsub

null

start_time

Set this to ingest data from this time

null

end_time

Set this to ingest data to this time

null

incremental

Set this flag to true if you want to get newer data between each schedule only

false