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.
Basic knowledge of Treasure Data
Basic knowledge of 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.
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:
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 Campaign
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.
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:
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 Campaign
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.
You can use TD console to create your data connector.
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.
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.
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.
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.
You can install the newest Treasure Data Toolbelt.
$ td --version 0.15.3 |
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:
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.
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 | +-----------------+---------------------+--------------------+---- |
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. |
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.
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. |
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", ... } | +-----------------------------------------+--------------+----------+-------+--------------+-----------------+----------------------------------------------+ |
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 |
td connector:delete
removes the schedule.
$ td connector:delete daily_salesforce_marketing_cloud_import |
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 |
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.
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.
You can specify file import mode in out
section of load.yml.
This is the default mode and records are appended to the target table.
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.
in: ... out: mode: replace |
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:
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.
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_secret | Salesforce Marketing Cloud | |
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_secret | Salesforce Marketing Cloud | |
target | must be contact (in this case) | |
contact_page_size | Number of records per page for target | 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_secret | Salesforce Marketing Cloud | |
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_secret | Salesforce Marketing Cloud | |
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 | 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 |