メインコンテンツへスキップ
見出し画像
Photo byaniwatanabe

【第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 サイトを用意し、商品閲覧イベントの送信とオファーの表示を実装します。

    テントや寝袋の商品を閲覧することで、案内される特典が変わるところまで確認していきます。

    今回は以上です。


    次の記事はこちら

    前回の記事はこちら

    私の note のトップページはこちら

     
     
    Salesforce Marketing Cloud、Agentforce、Data Cloud、Salesforce 認定資格に関する実践的な情報を発信しています。これらの記事が、皆さまの学習や日々の業務に少しでもお役に立てば幸いです。