
【第623回】 Real-Time Offer Management : 顧客とオファーの Data Graph を作る
前回の記事では、TrailNest で案内する 3 つの特典と、Web・メール用のコンテンツを作成しました。
Weekend Adventure Offer:一定金額以上の購入で利用できる特典
Camp Under the Stars Offer:テントカテゴリの商品に対する特典
Sleep Better Outdoors Offer:Sleeping カテゴリの商品に対する特典
今回は、顧客の閲覧行動に合わせて、これらのオファーを選ぶためのデータを準備します。
例えば、テントの商品を閲覧した顧客にはテントの特典を、Sleeping の商品を閲覧した顧客には寝袋の特典を案内する構成です。
この回では、Web 行動の取り込み先とマッピングを設定し、顧客側とオファー側の2つの Data Graph を作成します。
顧客データの取り込みと ID 解決は、完了している前提で進めます。
Real-Time Offer Management シリーズ
今回作成する 2 つの Data Graph
今回使用する Data Graph には、それぞれ異なる役割があります。
TrailNest Offer Profile
顧客の情報と、その顧客が閲覧した商品のカテゴリを参照します。TrailNest Offer Catalog
オファーの情報、対象カテゴリ、Web・メール向けの表示内容を参照します。
この2つの Data Graph を、メールアドレスで直接結び付けるわけではありません。
後ほど作成する Recommender で、次の情報を比較します。
顧客が閲覧した商品のカテゴリ ⇔ オファーの対象カテゴリ
例えば、両方が Tents を指していれば、テント向けのオファーを候補にできます。
今回は、その比較に必要な情報を、最初から Data Graph に含めます。
① 商品とカテゴリの ID を確認する
最初に、前回作成した商品とカテゴリの ID を確認します。
今回使用する商品は、次の 2 つです。
Trail Duo Tent
Product Code:TN-TE-002
カテゴリ:Tents
Alpine Down Sleeping Bag
Product Code:TN-SL-001
カテゴリ:Sleeping
ここで注意したいのは、商品コードやカテゴリ名と、レコードを識別する ID は別の値であることです。
例えば、次の値は同じ意味ではありません。
TN-TE-002:商品コード
Tents:カテゴリ名
tents:以前の TrailNest で使用したカテゴリコード
Salesforce の商品・カテゴリのレコード ID
今回の Web 行動では、Data 360 に取り込まれた商品・カテゴリと照合できる IDを送信します。
そこで、CRM に移動して、次の 4 つの Salesforce ID(18 桁)を控えます。
Trail Duo Tent の商品 ID(01tWs00000HJotlIAD)
Alpine Down Sleeping Bag の商品 ID(01tWs00000HJovNIAT)
Tents のカテゴリ ID(0ZGWs000001fGLBOA2)
Sleeping のカテゴリ ID(0ZGWs000001fGMnOAM)
今回、Salesforce のレコード ID を確認する理由
一般的な Web サイトは、独自の商品コードやカテゴリコードを使用しています。Salesforce のレコード ID を、最初から持っているわけではありません。
今回は、Salesforce 上で作成したオファーの対象カテゴリと、Web の閲覧カテゴリを比較します。そのため、デモサイト側にコードと Salesforce ID の対応を用意し、閲覧イベントを送る際に対応する ID を設定します。
ここで控えた ID は、後の CloudPages 実装で使用します。これは今回のデモで採用する方法であり、すべての Web サイトに Salesforce ID の直接送信が必須という意味ではありません。
Offer 側のカテゴリも確認する
続いて、Offer Product Category を確認します。
Camp Under the Stars Offer が Tents に関連している
Sleep Better Outdoors Offer が Sleeping に関連している
ここに入っているカテゴリの参照値と、Web 行動で送るカテゴリ ID を揃えます。
後ほどの Filter で比較するのは、見た目のカテゴリ名ではなく、このカテゴリの識別値です。
② Website Connector を作成する
次に、新しい Salesforce 組織に、TrailNest の Web 行動を取り込む入口を作成します。
Data Cloud Setup → Websites & Mobile Apps を開き、新規作成します。
Connector Name:TrailNest Offers Website
Alias:off(offer の off です)
Connector Type:A Custom Website
Website Base URL:今回の Cloudpages URL

③ Web Connector Schema を登録する
Website Connector の Schema から、今回用意した JSON ファイルをアップロードします。
{
"records": [
{
"masterLabel": "Cart",
"developerName": "cart",
"category": "Engagement",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "interactionName",
"developerName": "interactionName",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "personalizationContentId",
"developerName": "personalizationContentId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "personalizationId",
"developerName": "personalizationId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
}
]
},
{
"masterLabel": "Cart Item",
"developerName": "cartItem",
"category": "Engagement",
"externalDataTranFields": [
{
"masterLabel": "cartEventId",
"developerName": "cartEventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "catalogObjectId",
"developerName": "catalogObjectId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "catalogObjectType",
"developerName": "catalogObjectType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "currency",
"developerName": "currency",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "personalizationContentId",
"developerName": "personalizationContentId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "personalizationId",
"developerName": "personalizationId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "price",
"developerName": "price",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "quantity",
"developerName": "quantity",
"dataType": "Number",
"isDataRequired": true
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
}
]
},
{
"masterLabel": "Catalog",
"developerName": "catalog",
"category": "Engagement",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "id",
"developerName": "id",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "interactionName",
"developerName": "interactionName",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "personalizationContentId",
"developerName": "personalizationContentId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "personalizationId",
"developerName": "personalizationId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "type",
"developerName": "type",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "attributeCategoryId",
"developerName": "attributeCategoryId",
"dataType": "Text",
"isDataRequired": false
}
]
},
{
"masterLabel": "Consent",
"developerName": "consentLog",
"category": "Engagement",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "provider",
"developerName": "provider",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "purpose",
"developerName": "purpose",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "status",
"developerName": "status",
"dataType": "Text",
"isDataRequired": true
}
]
},
{
"masterLabel": "Order",
"developerName": "order",
"category": "Engagement",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "interactionName",
"developerName": "interactionName",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "orderCurrency",
"developerName": "orderCurrency",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "orderId",
"developerName": "orderId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "orderTotalValue",
"developerName": "orderTotalValue",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "personalizationContentId",
"developerName": "personalizationContentId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "personalizationId",
"developerName": "personalizationId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
}
]
},
{
"masterLabel": "Order Item",
"developerName": "orderItem",
"category": "Engagement",
"externalDataTranFields": [
{
"masterLabel": "catalogObjectId",
"developerName": "catalogObjectId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "catalogObjectType",
"developerName": "catalogObjectType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "currency",
"developerName": "currency",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "orderEventId",
"developerName": "orderEventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "personalizationContentId",
"developerName": "personalizationContentId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "personalizationId",
"developerName": "personalizationId",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "price",
"developerName": "price",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "quantity",
"developerName": "quantity",
"dataType": "Number",
"isDataRequired": true
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
}
]
},
{
"masterLabel": "Contact Point Address",
"developerName": "contactPointAddress",
"category": "Profile",
"externalDataTranFields": [
{
"masterLabel": "addressLine1",
"developerName": "addressLine1",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "addressLine2",
"developerName": "addressLine2",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "addressLine3",
"developerName": "addressLine3",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "addressLine4",
"developerName": "addressLine4",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "city",
"developerName": "city",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "country",
"developerName": "country",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "postalCode",
"developerName": "postalCode",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "stateProvince",
"developerName": "stateProvince",
"dataType": "Text",
"isDataRequired": true
}
]
},
{
"masterLabel": "Contact Point Email",
"developerName": "contactPointEmail",
"category": "Profile",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "email",
"developerName": "email",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
}
]
},
{
"masterLabel": "Contact Point Phone",
"developerName": "contactPointPhone",
"category": "Profile",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "phoneNumber",
"developerName": "phoneNumber",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
}
]
},
{
"masterLabel": "Identity",
"developerName": "identity",
"category": "Profile",
"externalDataTranFields": [
{
"masterLabel": "addressLine1",
"developerName": "addressLine1",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "addressLine2",
"developerName": "addressLine2",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "addressLine3",
"developerName": "addressLine3",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "addressLine4",
"developerName": "addressLine4",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "city",
"developerName": "city",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "country",
"developerName": "country",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "email",
"developerName": "email",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "firstName",
"developerName": "firstName",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "isAnonymous",
"developerName": "isAnonymous",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "lastName",
"developerName": "lastName",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "phoneNumber",
"developerName": "phoneNumber",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "postalCode",
"developerName": "postalCode",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "stateProvince",
"developerName": "stateProvince",
"dataType": "Text",
"isDataRequired": false
}
]
},
{
"masterLabel": "Party Identification",
"developerName": "partyIdentification",
"category": "Profile",
"externalDataTranFields": [
{
"masterLabel": "category",
"developerName": "category",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "dateTime",
"developerName": "dateTime",
"dataType": "DateTime",
"isDataRequired": true
},
{
"masterLabel": "deviceId",
"developerName": "deviceId",
"dataType": "Text",
"isDataRequired": true,
"primaryIndexOrder": 1
},
{
"masterLabel": "eventId",
"developerName": "eventId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "eventType",
"developerName": "eventType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "IDName",
"developerName": "IDName",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "IDType",
"developerName": "IDType",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "pageView",
"developerName": "pageView",
"dataType": "Number",
"isDataRequired": false
},
{
"masterLabel": "sessionId",
"developerName": "sessionId",
"dataType": "Text",
"isDataRequired": true
},
{
"masterLabel": "sourceChannel",
"developerName": "sourceChannel",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceLocale",
"developerName": "sourceLocale",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourcePageType",
"developerName": "sourcePageType",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrl",
"developerName": "sourceUrl",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "sourceUrlReferrer",
"developerName": "sourceUrlReferrer",
"dataType": "Text",
"isDataRequired": false
},
{
"masterLabel": "userId",
"developerName": "userId",
"dataType": "Text",
"isDataRequired": true
}
]
}
]
}
このファイルは、Salesforce の推奨 Web Connector Schema をもとに、Catalog イベントへ次の項目を追加したものです。
項目名:attributeCategoryId
型:Text
用途:閲覧した商品のカテゴリ ID
元の推奨スキーマに含まれるイベント定義は保持しています。

Sitemap の登録と Web SDK の設置は、CloudPages の HTML と合わせて Web 実装の回で行います。
④ Web のデータストリームを作成する
Data 360 の Data Streams → New を開き、Website を選択します。
Website Connector:TrailNest Offers Website
Data Space:default

今回の構成で使用するイベントとして、少なくとも次を含めます。
Catalog:商品閲覧
Identity:ブラウザ側の Individual 情報
イベントと項目を確認して、データストリームをデプロイします。

データストリームを作成しただけでは、Product Browse Engagement への項目の対応付けは完了していません。 続いて、マッピングを設定します。
⑤ 商品閲覧のマッピングを設定する
作成された Behavioral Events のデータストリームを開き、Start Data Mapping またはマッピングの編集画面を開きます。
今回の取り込み先は、Product Browse Engagement です。
共通項目をマッピングする
All Event Data の項目を、次のように対応付けます。
eventId → Product Browse Engagement ID
dateTime → Engagement Date Time
dateTime → Created Date
deviceId → Individual

Catalog の項目をマッピングする
Catalog の項目を、次のように対応付けます。
catalog.attributeCategoryId → Product Category
catalog.id → Product
catalog.interactionName → Engagement Channel Action
eventType → Engagement Type

Identity をマッピングする
Identity のデータストリームでは、Individual DMO に対してマッピングします。
deviceId → Individual ID
dateTime → Created Date
firstName → First Name
lastName → Last Name
isAnonymous → Is Anonymous

contactPointEmail をマッピングする
contactPointEmail のデータストリームでは、Contact Point Email DMO に対してマッピングします。
dateTime → Created Date
deviceId → Contact Point Email ID
deviceId → Party
email → Email Address

設定を保存します。
今回はデモなので、もっとも簡易にメールアドレスの一致を条件とする ID 解決のマッチルール によって、CRM の顧客 Profile と Web 側の Profile を同じ Unified Individual に関連付けます。

⑥ DMO の関連を確認する
Profile Data Graph に商品閲覧を追加する前に、DMO の関連を確認します。
Data 360 の Data Model で Product Browse Engagement を開き、Individual との関連を確認します。
Product Browse Engagement の Individual
Individual の Individual ID
商品閲覧の複数レコードが、1 つの Individual に関連する構成です。
標準の関連が存在している場合は、その関連を使用します。関連がない場合は、上記の項目を使用する 多対 1 の関連を設定します。

⑦ Real-Time Profile Data Graph を作成する
顧客情報と商品閲覧をまとめて参照するため、Unified Individual を起点とした Real-Time Profile Data Graph を作成します。
Data Graphs → New → Start from Scratch を開きます。
Name:TrailNest Offer Profile
Data Space:default
種類:Real-Time Data Graph
Primary Data Model Object:Unified Individual

詳細設定はデフォルトのままで OK です。

顧客の関連を追加する
次の順で関連オブジェクトを追加します。
Unified Individual → Unified Link Individual → Individual
Unified Individual では、次の項目を選択します。
Unified Individual ID
First Name
Last Name
Unified Link Individual では、主キーと、統合先・統合元を関連付ける項目を含めます。
Individual では、次の項目を選択します。
Individual ID
Key Qualifier Individual Id
First Name
Last Name
各オブジェクトで自動選択される必須項目は保持します。
メールで使用する情報を追加する
Individual の配下に、次のオブジェクトを追加します。
Contact Point Email
Contact Point Email ID
Key Qualifier Contact Point Email Id
Key Qualifier Party
Party
Data Source
Email Address
商品閲覧を追加する
さらに、Individual の配下に Product Browse Engagement を追加します。
次の項目を選択します。
Created Date
Individual
Key Qualifier Individual
Key Qualifier Product Browse Engagement Id
Product Browse Engagement Id
Engagement Channel Action
Engagement Date Time
Engagement Type
Product
Product Category
閲覧履歴の保持範囲を設定する
商品閲覧を無期限に判断材料にするのではなく、今回のデモでは 直近 7 日間の閲覧を使用する方針にします。
Product Browse Engagement の保持設定で、次を指定します。
Recency Field:Engagement Date Time
Record Limit:10
Time Limit:7 Days
今回は Affinity の点数を計算する構成ではありません。Data Graph に含まれる閲覧カテゴリを、オファー選択の判断材料にします。
保存してビルドする
Save and Build を実行します。

この時点で Web イベントをまだ送信していない場合、商品閲覧のデータが空でも構いません。まずは、商品閲覧を含む Data Graph の定義を作成します。
実際の閲覧データが返ることは、CloudPages からイベントを送信する回で確認します。
⑧ Offer 用の Item Data Graph を作成する
続いて、候補となるオファーとコンテンツを参照する Data Graph を作成します。
Data Graphs → New → Start from Scratch を開きます。
Name:TrailNest Offer Catalog
Data Space:default
種類:Standard Data Graph
Primary Data Model Object:Offer

Offer の項目を選択する
次の項目を選択します。
Offer ID
Key Qualifier Offer Id
End Date Time
Name
Offer Code
Priority Number
Promotion
Status
Start Date Time
Offer Treatment を追加する
Offer に関連する Offer Treatment を追加し、次の項目を選択します。
Key Qualifier Offer
Key Qualifier Offer Treatment Id
Offer
Offer Treatment Id
Call to Action Text
Call to Action URL
Engagement Channel Type
Image URL
Language
Name
Offer Body
Offer Heading
Offer Treatment Code
Output
Output Format
前回登録した Web 用の HTML は、Output に入っています。
チャネル情報を追加する
Offer Treatment の配下に Engagement Channel Type を追加します。
Engagement Channel Type Id
Key Qualifier Engagement Channel Type Id
Name
これにより、Web 用と Email 用の Treatment を区別できるようにします。
オファーの対象カテゴリを追加する
Offer の配下に Offer Product Category を追加します。
Key Qualifier Offer
Key Qualifier Offer Product Category Id
Offer
Offer Product Category Id
Product Category
さらに、その配下に Product Category を追加します。
Key Qualifier Product Category Id
Product Category Id
Category Name
このうち、Offer Product Category が保持する Product Category の参照値を、顧客の閲覧カテゴリと比較するために使用します。

必要な項目を追加したら、更新間隔は Daily で Save and Build を実行します。
いかがでしたでしょうか。
今回は、TrailNest の商品閲覧を取り込むための Website Connector とマッピングを設定し、顧客側とオファー側の Data Graph を作成しました。
顧客側では「どのカテゴリの商品を閲覧したか」、オファー側では「どのカテゴリを対象とした特典か」を参照します。
これで、顧客の閲覧カテゴリに合うオファーを選ぶための準備ができました。
次回は、この 2 つの Data Graph を使用し、共通オファー用と閲覧カテゴリ用の Recommender、Content Schema、Personalization Point を設定します。
今回は以上です。