Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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..

Collect contact information and campaign data.  Collect email event data about your customers, such as follows:

  • Emails opened

  • Links clicked

  • Forwarded or bounced email

  • Survey data

  • Unsubscribe requests

You have import options such as:

  • individual email event types or multiple user email event types

  • incremental import Email Event object based on the eventDate timestamp

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

expandTo see sample workflows for importing Salesforce Marketing Cloud data, go to Treasure Boxes.

Table of Contents

Prerequisites

  • Basic knowledge of Treasure Data

  • Basic knowledge of Salesforce Marketing Cloud

...

Limitation

Occasionally, data imported using this integration experiences data inconsistency issues because boolean values are incorrectly or inconsistently imported. A symptom of this data inconsistency is that VARCHAR or BIGINT values are saved as false with a string data type or 0 as BIGINT when the value shown in Salesforce Marketing Cloud is True or False.

Treasure Data recommends that you follow the Salesforce integration migration instructions.

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.

...

Create a Legacy Package

Log on to your Salesforce Marketing Cloud account

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

Image Modified


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

Image Modified


On the Installed Packages screen, click select New.

Image Modified


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

Image Modified


On the Package Details screen, click on select Add Component.

Image Modified


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

Image Modified


On the Add API Integration screen:

  • Scroll to the CHANNELS section and select the Read checkbox on Email

  • Scroll to the CONTACT section and select the Read checkbox on Audiences and List and Subscribers

  • Scroll to the DATA section and select the Read and Write checkbox on Data Extensions, Read for Tracking Events

  • Scroll to HUB section and and select the Read checkbox on the Campaign

Image Modified


Image Modified


Image Modified


Image Modified


On the Installed Packages screen, scroll down to the 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.

Image Modified


How to

...

Create Enhanced Functionality Package

Log on to your Salesforce Marketing Cloud account.

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

Image Modified


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

Image Modified


On the Installed Packages screen, click select New.

Image Modified


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

Image Modified


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

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

Image Modified


Image Modified


On the Set Server-to-Server Properties screen:

  • Scroll to the CHANNELS section and select the Read checkbox on Email

  • Scroll to CONTACT section and select the Read checkbox on Audiences and List and Subscribers

  • Scroll to DATA section and select the Read and Write checkbox on Data Extensions, Read for Tracking Events

  • Scroll to HUB section and select the Read checkbox on the Campaign

Image Modified


Image RemovedImage Added


Image Modified


Image Modified


On the Installed Packages screen, scroll down to the 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.

Image Modified


Use the TD Console to

...

Create Your Connection

You can use TD console 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.

Image Modified


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 Select Continue.

Image Modified


Enter a Name for this integration and click select Done.

Image Modified


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 Select Continue.

Image Modified


Enter a Name for this integration and click select Done.

Image Modified



Create a

...

New Transfer

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

Image Modified



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

Image Modified


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

Image Modified


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

Image Modified


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

Image Modified


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

Image Modified


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.

Code Block
$ 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.

Code Block
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:

  • client_id: Salesforce Marketing Cloud client id.

  • client_secret: Salesforce Marketing Cloud client secret.

  • target: Salesforce Marketing Cloud entity object to be imported.

    • See the Appendix. for the list of available target.

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.

Code Block
$ 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

Code Block
$ 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:

Code Block
$ 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.

Code Block
$ 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.

Code Block
$ 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.

Code Block
% 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>.

Code Block
% 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.

Code Block
$ 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:

Code Block
  incremental_column_name: mydatefield
  from_date: "2018-02-01T00:00:00.000Z"
  fetch_days: 2
  • 1st iteration: The data connector fetches records from Sep 01 00:00:00 UTC 2016 to Sep 03 00:00:00 UTC 2016

  • 2nd iteration: The data connector fetches records for the next available 2 day period, from Sep 03 00:00:00 UTC 2016 until Sep 05 00:00:00 UTC 2016. This process repeats for each successive iteration.

  • When the increment includes the present date, additional records are fetched as each complete time period becomes available.

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

  • 1st iteration: the connector loads the data from specified Start Time (from all time if not set) to specified End Time (to the time the job was scheduled to run if not set)

  • 2nd iteration: the connector loads the data from previous End Time to the time job is scheduled

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.

Code Block
in:
  ...
out:
  mode: append

...

.

...

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

Code Block
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 model attributes. If you select this option, you also input the number of attributes per request. The default value of this field is 100.

Image Modified



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 extensionextensions.

Image Modified


The target Email Events provides an option to filter:

  • Email name matching pattern (exact or partial match)

  • Email events type that you want to ingest

  • Two options to define a date range to ingesting events on a specific date-time range.

Image Modified

Sample configuration for each target

For Campaign target

Code Block
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

Code Block
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

Code Block
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

Code Block
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

...