
【第624回】 Real-Time Offer Management : 閲覧した商品カテゴリからオファーを選ぶ
前回の記事では、顧客情報と商品閲覧を参照する TrailNest Offer Profile と、オファーの情報を参照する TrailNest Offer Catalog を作成しました。
今回は、この 2 つの Data Graph を使い、顧客に案内するオファーを選ぶ設定を行います。
例えば、テントの商品を閲覧した顧客にはテントの特典を、寝袋の商品を閲覧した顧客には Sleeping の特典を案内します。
該当するオファーがない場合に備えて、共通のオファーも用意します。
今回は、Recommender、Content Schema、Personalization Point、Decision を設定します。CloudPages への表示と、実際の商品閲覧による切り替えは、次回に行います。
Real-Time Offer Management シリーズ
今回のオファーの選び方
今回の構成では、次のようにオファーを選びます。
Tents の閲覧履歴がある場合:Camp Under the Stars Offer
Sleeping の閲覧履歴がある場合:Sleep Better Outdoors Offer
該当するオファーがない場合:Weekend Adventure Offer
使用するのは、前回の Profile Data Graph に含めた 直近 7 日間・最大 10 件の商品閲覧データです。
今回は Affinity を計算せず、閲覧した商品のカテゴリと、オファーに関連付けたカテゴリを比較します。
両方のカテゴリを閲覧している場合は、Offer の Priority Number が小さいものを優先します。
今回の設定値は、次のとおりです。
Camp Under the Stars Offer:10
Sleep Better Outdoors Offer:20
Weekend Adventure Offer:30
そのため、Tents と Sleeping の両方が候補になった場合は、Camp Under the Stars Offer を選びます。
今回は「最後に見たカテゴリ」や「最も多く見たカテゴリ」を選ぶ構成ではありません。閲覧カテゴリに合うオファーを候補にし、その中から優先順位で選びます。
オファーの案内と、割引の適用は別の処理
今回作成するのは、顧客にどの特典を案内するかを選ぶ仕組みです。
例えば、Weekend Adventure Offer を返した時点で、顧客のカートが購入金額の条件を満たしているとは限りません。
「150 ドル以上の購入で 15 ドル引き」という特典を案内し、実際に条件を満たしているかは、後のカート処理で判定します。
今回:案内するオファーを選ぶ
後のカート実装:適用条件を確認し、割引後の金額を計算する
この 2 つを分けて進めます。
① オファーのデータを確認する
まず、前回作成した TrailNest Offer Catalog で、次の情報を参照できることを確認します。
Offer
Offer Treatment
Offer Product Category
Product Category
Weekend Adventure Offer の例
{
"ssot__Id__c": "1XhWs0000000JQrKAM",
"ssot__EndDateTime__c": "2026-12-31T05:53:00.000Z",
"ssot__Name__c": "Weekend Adventure Offer",
"ssot__OfferCodeText__c": "TN-OFFER-WEEKEND",
"ssot__PriorityNumber__c": 30,
"ssot__PromotionId__c": "0c8Ws000000mXmTIAU",
"ssot__StartDateTime__c": "2026-10-01T05:53:00.000Z",
"ssot__Status__c": "Active",
"ssot__OfferTreatment__dlm": [
{
"ssot__CallToActionText__c": "",
"ssot__CallToActionUrl__c": "",
"ssot__EngagementChannelType__c": "0eFWs000000ZQKjMAO",
"ssot__ImageUrl__c": "",
"ssot__Language__c": "en_US",
"ssot__Name__c": "TrailNest Weekend Email",
"ssot__OfferId__c": "1XhWs0000000JQrKAM",
"ssot__OfferBodyText__c": "Your next adventure deserves great gear. Enjoy $15 off when you spend $150 or more at TrailNest.",
"ssot__OfferHeadingText__c": "A Little Extra for Your Next Escape",
"OfferTreatmentCode__c": "TN-WEEKEND-EMAIL",
"ssot__Id__c": "7otWs0000000kIzIAI",
"ssot__OutputText__c": "",
"ssot__OutputFormatType__c": "Text",
"ssot__EngagementChannelType__dlm": [
{
"ssot__Id__c": "0eFWs000000ZQKjMAO",
"ssot__Name__c": "Email"
}
]
},
{
"ssot__CallToActionText__c": "Explore TrailNest",
"ssot__CallToActionUrl__c": "https://mcxkknz3m0zj3jqsxn4hm3dp3q-4.pub.sfmc-content.com/unerck1b2u5",
"ssot__EngagementChannelType__c": "0eFWs000000ZQKmMAO",
"ssot__ImageUrl__c": "",
"ssot__Language__c": "en_US",
"ssot__Name__c": "TrailNest Weekend Web",
"ssot__OfferId__c": "1XhWs0000000JQrKAM",
"ssot__OfferBodyText__c": "Save $15 when you spend $150 or more on TrailNest gear. Get ready for your next escape.",
"ssot__OfferHeadingText__c": "Your Next Adventure Starts Here",
"OfferTreatmentCode__c": "TN-WEEKEND-WEB",
"ssot__Id__c": "7otWs0000000kE9IAI",
"ssot__OutputText__c": "<section style=\"box-sizing:border-box;width:100%;padding:32px;border-radius:20px;background:#183b2c;color:#fff;font-family:Arial,Helvetica,sans-serif;\">\n <p style=\"margin:0 0 12px;color:#d9e8ce;font-size:12px;font-weight:700;letter-spacing:2px;\">\n TRAILNEST · WEEKEND ADVENTURE\n </p>\n <h2 style=\"margin:0 0 16px;color:#fff;font-size:32px;line-height:1.2;\">\n Your Next Adventure Starts Here\n </h2>\n <p style=\"margin:0 0 20px;font-size:18px;line-height:1.6;\">\n Save <strong>$15</strong> when you spend <strong>$150 or more</strong>\n on TrailNest gear.\n </p>\n <p style=\"margin:0;color:#d9e8ce;font-size:13px;line-height:1.6;\">\n Get ready for your next escape. Offer terms apply.\n </p>\n</section>",
"ssot__OutputFormatType__c": "HTML",
"ssot__EngagementChannelType__dlm": [
{
"ssot__Id__c": "0eFWs000000ZQKmMAO",
"ssot__Name__c": "Web"
}
]
}
]
}今回使用する Offer Code は、次のとおりです。
Weekend Adventure Offer:TN-OFFER-WEEKEND
Camp Under the Stars Offer:TN-OFFER-TENTS
Sleep Better Outdoors Offer:TN-OFFER-SLEEPING
② 共通オファー用の Recommender を作成する
最初に、共通オファーを返す Recommender を作成します。
この Recommender は、閲覧カテゴリに合うオファーが取得できなかった場合にも使用します。
Personalization アプリで Recommenders → New を開き、次の内容で設定します。
Data Space:default
Profile Data Graph:TrailNest Offer Profile
Item Data Graph:TrailNest Offer Catalog
Recommender Name:TrailNest Default Offer Recommendations
Recommender API Name:TrailNest_Default_Offer_Recommendations
Fallback Recommender:無効

続いて、Rule-Based Recommendations を選択します。
並び順を設定する
Item Data Graph の Direct Attributes から、Offer の Priority Number を選択します。
Data Graph Resource:Priority Number
Sort Order:Ascending
今回は共通オファーを 1 件に絞るため、並び順による違いはありませんが、閲覧カテゴリ用の Recommender と同じ基準にしておきます。

有効なオファーだけを対象にする
次の画面に進むと、Offer 用の既定のフィルターが表示されています。
条件の意味は、次のとおりです。
Status が Active
開始日時を過ぎている
終了日時を過ぎていない
共通オファーだけを対象にする
ここでは Include 側で、次の条件を追加します。既定のフィルター条件はそのまま残してください。以下の条件も、すべての条件を満たす場合に候補となる設定にしてください。
Item Data Graph Resource:Offer の Offer Code
Filter Type:Static
Operator:Is Equal To
Value:TN-OFFER-WEEKEND

設定を保存し、Recommender の処理が正常に完了したことを確認します。

③ 閲覧カテゴリ用の Recommender を作成する
続いて、顧客が閲覧したカテゴリに合うオファーを返す Recommender を作成します。
Recommenders → New から、次の内容で設定します。
Data Space:default
Profile Data Graph:TrailNest Offer Profile
Item Data Graph:TrailNest Offer Catalog
Recommender Name:TrailNest Browse Offer Recommendations
Recommender API Name:TrailNest_Browse_Offer_Recommendations
※ Fallback の設定は後ほど行います。まずは Recommender 本体を設定します。

Rule-Based Recommendations を選択し、並び順を設定します。
Data Graph Resource:Offer の Priority Number
Sort Order:Ascending
オファーのカテゴリと、閲覧したカテゴリを比較する
Filters の Include 側で、カテゴリを比較する条件を追加します。
Item Data Graph Resource:Offer Product Category の Product Category
Filter Type:Profile Data Graph
Operator:Matches Any
比較先の Resource:Product Browse Engagement の Product Category

この条件は、次の意味です。
「このオファーの対象カテゴリが、この顧客が閲覧したカテゴリのいずれかに含まれているか?」
例えば、閲覧履歴に Tents のカテゴリ ID が入っていれば、Tents に関連付けられたオファーが候補になります。
比較するのはカテゴリ名ではなく、両方の項目に入っている カテゴリ ID です。
今回使用する ID は、次のとおりです。
Tents:0ZGWs000001fGLBOA2
Sleeping:0ZGWs000001fGMnOAM
ここで ID を固定入力するわけではありません。Offer 側と顧客の閲覧履歴側の項目を指定し、そこに入っている値同士を比較します。
保存し、処理が正常に完了したことを確認します。

④ 共通オファーを Fallback に設定する
閲覧カテゴリに合うオファーがない場合に備えて、共通オファーを返す設定を追加します。
TrailNest Browse Offer Recommendations を編集し、次のように設定します。
Fallback Recommender:有効
選択する Recommender:TrailNest Default Offer Recommendations

Fallback Recommender は、メインの Recommender が必要な件数を返せない場合に、不足分を補う機能です。
今回は後ほど、返却件数を 最大 1 件に設定します。
そのため、次の動作を目指します。
閲覧カテゴリに合うオファーがある:そのオファーを 1 件返す
閲覧カテゴリに合うオファーがない:共通オファーで 1 件を補う
共通オファー自体が期限切れなどで候補から外れている場合は、Fallback を設定していても返却できません。共通オファーも Active と有効期間の条件を満たしている必要があります。
Fallback を設定して、保存します。
⑤ Content Schema を作成する
次に、選ばれたオファーについて、どの情報を Web 側へ返すかを設定します。
Personalization アプリで Content Schemas → New を開きます。
Data Space:default
Personalization Type:Recommendations
Name:TrailNest Offer Content
API Name:TrailNest_Offer_Content

Add Attribute は追加しない
今回は、見出しや本文を Offer Treatment に登録済みです。
Decision に直接入力する追加の見出しなどは使用しないため、Add Attribute では項目を追加せず、次へ進みます。
Offer の返却項目を選ぶ
データソースの DMO は Offer を選択します。
今回の Item Data Graph は Offer を起点にしているため、Content Schema 側も Offer を起点にします。
返却項目には、次の情報を含めます。
Status
Start Date Time
Priority Number
End Date Time
Promotion
Offer Code
Name

Offer Treatment の返却項目を追加する
続いて、Add Related Object Attributes から Offer Treatment を追加します。

今回は、Offer Treatment から、次の項目を含めます。
Offer
Call to Action Text
Offer Treatment ID
Offer Body
Output
Image URL
Output Format
Call to Action URL
Offer Treatment Code
Language
Engagement Channel Type
Offer Heading
Name

Output には、前の記事で作成した Web 用の HTML が入っています。
設定を保存します。
⑥ Personalization Point を作成する
続いて、Web サイトからオファーを取得する際の呼び出し先を作成します。
Personalization Points → New → Manual Setup を開き、次の内容で設定します。
Data Space:default
Profile Data Graph:Real-Time の TrailNest Offer Profile
Name:TrailNest Offer Recommendations
API Name:TrailNest_Offer_Recommendations
Personalization Type:Recommendations
Content Schema:TrailNest Offer Content
Maximum Number of Recommendations to Return:1
Authentication Required:未チェック

保存し、Decision の作成へ進みます。
⑦ Decision を作成する
作成した Point に、次の Decision を追加します。
Decision Name:TrailNest Recommended Offer
Decision API Name:TrailNest_Recommended_Offer
Decision State:Live
Recommender:TrailNest Browse Offer Recommendations
Targeting Rules:Always

ここで指定するのは、閲覧カテゴリ用の Recommender です。
共通オファー用の Recommender は、その Fallback として設定済みのため、この Decision で別途指定する必要はありません。
Always は、この Decision を条件なしで評価するという意味です。
実際に返すオファーは、その先の Recommender が、顧客の閲覧データを使って選びます。
今回の役割は、次のように分かれています。
Decision:今回の Recommender を使用する
Recommender:閲覧カテゴリと一致するオファーを選ぶ
Fallback Recommender:候補がなければ共通オファーで補う
Content Schema:選ばれたオファーの返却項目を決める
設定を保存します。
⑧ Simulate で共通オファーを確認する
まずは、共通オファー用の TrailNest Default Offer Recommendations を開き、Simulate を実行します。
Sample Recipient:TrailNest Offer Profile で参照できる Unified Individual
Anchor Item ID:指定しない
返却結果に、次のオファーが含まれることを確認します。
Name:Weekend Adventure Offer
Offer Code:TN-OFFER-WEEKEND

この確認では、共通オファーの取り込み、Offer Code の絞り込み、有効期間の条件が機能するかを確認します。
閲覧カテゴリによる切り替えは次回確認する
現時点では、CloudPages からの商品閲覧イベントをまだ送信していません。
そのため、Tents と Sleeping の切り替えは、次回の Web 実装後に確認します。
確認するパターンは、次のとおりです。
閲覧履歴なし:Weekend Adventure Offer
Tents のみ閲覧:Camp Under the Stars Offer
Sleeping のみ閲覧:Sleep Better Outdoors Offer
両方を閲覧:優先順位が高い Camp Under the Stars Offer
最後のパターンでは、Tents の Priority Number が 10、Sleeping が 20 であることを確認します。
いかがでしたでしょうか。
今回は、顧客の商品閲覧を使って、案内するオファーを選ぶ仕組みを作成しました。
Profile Data Graph から閲覧カテゴリを参照し、Item Data Graph のオファーと比較します。該当するオファーを優先順位で選び、候補がない場合は共通オファーで補います。
次回は、CloudPages に TrailNest の Web サイトを用意し、商品閲覧イベントの送信とオファーの表示を実装します。
テントや寝袋の商品を閲覧することで、案内される特典が変わるところまで確認していきます。
今回は以上です。