Experience Platform Web SDKのA4T データのクライアント側ログ

Adobe Experience Platform Web SDKを使用すると、Web アプリケーションのクライアント側でAdobe Analytics for Target (A4T) ​ データを収集できます。

クライアントサイドのログとは、クライアントサイドで関連するTarget データが返されることを意味します。これにより、データを収集してAnalyticsと共有できます。 このオプションは、Data Insertion APIを使用してAnalyticsにデータを手動で送信する場合に有効にする必要があります。

NOTE
AppMeasurement.jsを使用してこれを実行する方法は現在開発中で、近日中に公開される予定です。

このドキュメントでは、Platform Web SDKのクライアントサイド A4T ログを設定する手順について説明し、一般的なユースケースの実装例を示します。

前提条件 prerequisites

このチュートリアルでは、パーソナライゼーションの目的でPlatform Web SDKを使用することに関連する基本的な概念とプロセスについて理解していることを前提としています。 概要が必要な場合は、次のドキュメントを参照してください。

Analytics クライアントサイドのログを設定 set-up-client-side-logging

次のサブセクションでは、Platform Web SDK実装に対してAnalytics クライアントサイドのログ記録を有効にする方法について説明します。

Analytics クライアント側ログを有効にする enable-analytics-client-side-logging

実装でAnalyticsのクライアントサイドのログ記録が有効になっていることを考慮するには、​ データストリーム ​でAdobe Analytics設定を無効にする必要があります。

Analytics データストリーム設定が無効です

SDKからA4T データを取得し、Analyticsに送信します a4t-to-analytics

このレポート方法を正しく機能させるには、Analytics ヒットでsendEvent コマンドから取得したA4T関連データを送信する必要があります。

Target Edgeが提案レスポンスを計算すると、Analytics クライアントサイドのログが有効になっているかどうかを確認します(例えば、Analyticsがデータストリームで無効になっている場合)。 クライアント側のログ記録が有効になっている場合、システムは応答の各提案にAnalytics トークンを追加します。

フローは次のようになります。

​ クライアントサイドのログフロー

次に、Analytics クライアントサイドのログが有効になっている場合のinteract応答の例を示します。 提案がAnalytics件のレポートを持つアクティビティ用の場合、scopeDetails.characteristics.analyticsToken個のプロパティがあります。

{
  "requestId": "1234",
  "handle": [
    {
      "payload": [
        {
          "id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
          "scope": "a4t-test",
          "scopeDetails": {
            "decisionProvider": "TGT",
            "activity": {
              "id": "434689"
            },
            "experience": {
              "id": "0"
            },
            "strategies": [
              {
                "algorithmID": "0",
                "trafficType": "0"
              }
            ],
            "characteristics": {
              "eventToken": "2lTS5KA6gj4JuSjOdhqUhGqipfsIHvVzTQxHolz2IpTMromRrB5ztP5VMxjHbs7c6qPG9UF4rvQTJZniWgqbOw==",
              "analyticsToken": "434689:0:0|2,434689:0:0|1"
            }
          },
          "items": [
            {
              "id": "1184844",
              "schema": "https://ns.adobe.com/personalization/html-content-item",
              "meta": {
                "geo.state": "bucuresti",
                "activity.id": "434689",
                "experience.id": "0",
                "activity.name": "a4t test form based activity",
                "offer.id": "1184844",
                "profile.tntId": "04608610399599289452943468926942466370-pybgfJ"
              },
              "data": {
                "id": "1184844",
                "format": "text/html",
                "content": "<div> analytics impressions </div>"
              }
            }
          ]
        },
        {
          "id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
          "scope": "a4t-test",
          "scopeDetails": {
            "decisionProvider": "TGT",
            "activity": {
              "id": "434689"
            },
            "characteristics": {
              "eventToken": "E0gb6q1+WyFW3FMbbQJmrg==",
              "analyticsToken": "434689:0:0|32767"
            }
          },
          "items": [
            {
              "id": "434689",
              "schema": "https://ns.adobe.com/personalization/measurement",
              "data": {
                "type": "click",
                "format": "application/vnd.adobe.target.metric"
              }
            }
          ]
        }
      ],
      "type": "personalization:decisions",
      "eventIndex": 0
    }
  ]
}

Form-based Experience Composer アクティビティの提案には、同じ提案の下にコンテンツとクリック指標の両方の項目を含めることができます。 したがって、scopeDetails.characteristics.analyticsToken プロパティにコンテンツ表示用の分析トークンを1つ持つ代わりに、対応して、scopeDetails.characteristics.analyticsDisplayTokenおよびscopeDetails.characteristics.analyticsClickToken プロパティで表示トークンとクリック分析トークンの両方を指定できます。

{
  "requestId": "1234",
  "handle": [
    {
      "payload": [
        {
          "id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
          "scope": "a4t-test",
          "scopeDetails": {
            "decisionProvider": "TGT",
            "activity": {
              "id": "434689"
            },
            "experience": {
              "id": "0"
            },
            "strategies": [
              {
                "algorithmID": "0",
                "trafficType": "0"
              }
            ],
            "characteristics": {
               "displayToken": "2lTS5KA6gj4JuSjOdhqUhGqipfsIHvVzTQxHolz2IpTMromRrB5ztP5VMxjHbs7c6qPG9UF4rvQTJZniWgqbOw==",
               "clickToken": "E0gb6q1+WyFW3FMbbQJmrg==",
               "analyticsDisplayToken": "434689:0:0|2,434689:0:0|1",
               "analyticsClickToken": "434689:0:0|32767"
            }
          },
          "items": [
            {
              "id": "1184844",
              "schema": "https://ns.adobe.com/personalization/html-content-item",
              "meta": {
                "geo.state": "bucuresti",
                "activity.id": "434689",
                "experience.id": "0",
                "activity.name": "a4t test form based activity",
                "offer.id": "1184844",
                "profile.tntId": "04608610399599289452943468926942466370-pybgfJ"
              },
              "data": {
                "id": "1184844",
                "format": "text/html",
                "content": "<div> analytics impressions </div>"
              }
            },
            {
              "id": "434689",
              "schema": "https://ns.adobe.com/personalization/measurement",
              "data": {
                "type": "click",
                "format": "application/vnd.adobe.target.metric"
              }
            }
          ]
        }
      ],
      "type": "personalization:decisions",
      "eventIndex": 0
    }
  ]
}

scopeDetails.characteristics.analyticsTokenからのすべての値、およびscopeDetails.characteristics.analyticsDisplayToken (表示されたコンテンツの場合)とscopeDetails.characteristics.analyticsClickToken (クリック指標の場合)は、収集し、Data Insertion API呼び出しにtnta タグとして含める必要があるA4T ペイロードです。

IMPORTANT
analyticsTokenanalyticsDisplayTokenanalyticsClickToken プロパティには、複数のトークンを含めることができ、1つのコンマ区切り文字列として連結できます。
次の節で提供する実装例では、複数のAnalytics トークンが反復的に収集されています。 Analytics トークンの配列を連結するには、次のような関数を使用します。
code language-javascript
var concatenateAnalyticsPayloads = function concatenateAnalyticsPayloads(analyticsPayloads) {
      if (analyticsPayloads.size > 1) {
          return [].concat(analyticsPayloads).join(',');
      }
      return [].concat(analyticsPayloads).join();
    };

実装例 implementation-examples

次のサブセクションでは、一般的なユースケースに対してAnalytics クライアントサイドのログを実装する方法を示します。

Form-Based Experience Composer件のアクティビティ form-based-composer

Platform Web SDKを使用して、Adobe Target フォームベースのExperience Composer アクティビティからの提案の実行を制御できます。

特定の決定範囲に対する提案をリクエストする場合、返される提案には適切なAnalytics トークンが含まれます。 ベストプラクティスは、Experience Platform Web SDK sendEvent コマンドをチェーンし、返された提案を繰り返し実行して、Analytics トークンを同時に収集しながら実行することです。

次のように、Form-Based Experience Composer アクティビティスコープのsendEvent コマンドをトリガーできます。

alloy("sendEvent", {
    "decisionScopes": ["a4t-test"],
    "xdm": {
      "web": {
        "webPageDetails": {
          "name": "Home Page"
        }
      }
    }
  }
).then(function(results) {
  for (var i = 0; i < results.propositions.length; i++) {
    //Execute the propositions and collect the Analytics payload
  }
});

ここから、提案を実行し、最終的にAnalyticsに送信されるペイロードを構築するためのコードを実装する必要があります。 次に、results.propositionsの例を示します。

[
  {
    "id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
    "scope": "a4t-test",
    "scopeDetails": {
      "decisionProvider": "TGT",
      "activity": {
        "id": "434689"
      },
      "experience": {
        "id": "0"
      },
      "strategies": [
        {
          "algorithmID": "0",
          "trafficType": "0"
        }
      ],
      "characteristics": {
        "eventToken": "2lTS5KA6gj4JuSjOdhqUhGqipfsIHvVzTQxHolz2IpTMromRrB5ztP5VMxjHbs7c6qPG9UF4rvQTJZniWgqbOw==",
        "analyticsToken": "434689:0:0|2,434689:0:0|1"
      }
    },
    "items": [
      {
        "id": "1184844",
        "schema": "https://ns.adobe.com/personalization/html-content-item",
        "meta": {
          "geo.state": "bucuresti",
          "activity.id": "434689",
          "experience.id": "0",
          "activity.name": "a4t test form based activity",
          "offer.id": "1184844",
          "profile.tntId": "04608610399599289452943468926942466370-pybgfJ"
        },
        "data": {
          "id": "1184844",
          "format": "text/html",
          "content": "<div> analytics impressions </div>"
        }
      }
    ]
  },
  {
    "id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
    "scope": "a4t-test",
    "scopeDetails": {
      "decisionProvider": "TGT",
      "activity": {
        "id": "434689"
      },
      "characteristics": {
        "eventToken": "E0gb6q1+WyFW3FMbbQJmrg==",
        "analyticsToken": "434689:0:0|32767"
      }
    },
    "items": [
      {
        "id": "434689",
        "schema": "https://ns.adobe.com/personalization/measurement",
        "data": {
          "type": "click",
          "format": "application/vnd.adobe.target.metric"
        }
      }
    ]
  },
  {
    "id": "AT:eyJhY3Rpdml0eUlkIjoiNDM0Njg5IiwiZXhwZXJpZW5jZUlkIjoiMCJ9",
    "scope": "a4t-test",
    "scopeDetails": {
      "decisionProvider": "TGT",
      "activity": {
        "id": "434688"
      },
      "experience": {
        "id": "0"
      },
      "strategies": [
        {
          "algorithmID": "0",
          "trafficType": "0"
        }
      ],
      "characteristics": {
          "displayToken": "91TS5KA6gj4JuSjOdhqUhGqipfsIHvVzTQxHolz2IpTMromRrB5ztP5VMxjHbs7c6qPG9UF4rvQTJZniWgqgEt==",
          "clickToken": "Tagb6q1+WyFW3FMbbQJrtg==",
          "analyticsDisplayTokens": "434688:0:0|2,434688:0:0|1",
          "analyticsClickTokens": "434688:0:0|32767"
        }
      }
    },
    "items": [
      {
        "id": "1184845",
        "schema": "https://ns.adobe.com/personalization/html-content-item",
        "meta": {
          "geo.state": "bucuresti",
          "activity.id": "434688",
          "experience.id": "0",
          "activity.name": "a4t test form based activity 1",
          "offer.id": "1184845"
        },
        "data": {
          "id": "1184845",
          "format": "text/html",
          "content": "<div> analytics impressions 1</div>"
        }
      },
      {
        "id": "434688",
        "schema": "https://ns.adobe.com/personalization/measurement",
        "data": {
          "type": "click",
          "format": "application/vnd.adobe.target.metric"
        }
      }
    ]
  }
]

コンテンツ項目を含む提案からAnalytics トークンを抽出するには、次のような関数を実装できます。

function getDisplayAnalyticsPayload(proposition) {
  if (!proposition || !proposition.scopeDetails || !proposition.scopeDetails.characteristics) {
    return;
  }
  var characteristics = proposition.scopeDetails.characteristics;
  if (characteristics.analyticsDisplayToken) {
    return characteristics.analyticsDisplayToken;
  }
  return characteristics.analyticsToken;
}

提案には、対象となるアイテムのschema プロパティで示すように、様々なタイプのアイテムを含めることができます。 Form-Based Experience Composer アクティビティでサポートされている提案項目スキーマは4つあります。

var HTML_SCHEMA = "https://ns.adobe.com/personalization/html-content-item";
var MEASUREMENT_SCHEMA = "https://ns.adobe.com/personalization/measurement";
var JSON_SCHEMA = "https://ns.adobe.com/personalization/json-content-item";
var REDIRECT_SCHEMA = "https://ns.adobe.com/personalization/redirect-item";

HTML_SCHEMAJSON_SCHEMAはオファーのタイプを反映するスキーマですが、MEASUREMENT_SCHEMAはDOM要素に添付する必要がある指標を反映しています。

訪問者が以前に表示されたコンテンツを実際にクリックした時点で、クリック指標のAnalytics ペイロードを収集し、コンテンツ項目とは別にAnalyticsに送信する必要があります。

この場合、クリック指標A4T ペイロードを取得するための次のヘルパー関数が便利です。

function getClickAnalyticsPayload(proposition) {
  if (!proposition || !proposition.scopeDetails || !proposition.scopeDetails.characteristics) {
    return;
  }
  var characteristics = proposition.scopeDetails.characteristics;
  if (characteristics.analyticsClickToken) {
    return characteristics.analyticsClickToken;
  }
  return characteristics.analyticsToken;
}

実装の概要 implementation-summary

要約すると、Experience Platform Web SDKでForm-Based Experience Composer アクティビティを適用する場合は、次の手順を実行する必要があります。

  1. Form-Based Experience Composer アクティビティオファーを取得するイベントを送信します。

  2. コンテンツの変更をページに適用します。

  3. decisioning.propositionDisplay通知イベントを送信します。

  4. SDK レスポンスからAnalytics表示トークンを収集し、Analytics ヒットのペイロードを構築します。

  5. Data Insertion APIを使用してペイロードをAnalyticsに送信します。

  6. 配信された提案にクリック指標がある場合は、クリックが実行されたときにdecisioning.propositionInteract通知イベントが送信されるように、クリックリスナーを設定する必要があります。 onBeforeEventSend ハンドラーは、decisioning.propositionInteract イベントをインターセプトする際に、次のアクションが発生するように設定する必要があります。

    1. xdm._experience.decisioning.propositionsからクリックトークン Analyticsを収集しています
    2. 収集したAnalytics ペイロードを含むクリック Analytics ヒットをData Insertion API経由で送信します。
alloy("sendEvent", {
    "decisionScopes": ["a4t-test"],
    "xdm": {
      "web": {
        "webPageDetails": {
          "name": "Home Page"
        }
      }
    }
  }
).then(function(results) {
  var analyticsPayload = new Set();
  results.propositions.forEach(function (proposition) {
    proposition.items.forEach(function (item) {
      if (item.schema === HTML_SCHEMA) {
        // 1. Apply offer
        // 2. Collect executed propositions and send the decisioning.propositionDisplay notification event
        // 3. Collect the display Analytics tokens
      }
      if (item.schema === MEASUREMENT_SCHEMA) {
        // Setup click listener, so that when clicked:
        // 1. Collect clicked propositions and send the decisioning.propositionInteract notification event
        // Note: onBeforeEventSend handler should be configured, so that when intercepting decisioning.propositionInteract events:
        //   1. Collect the click Analytics tokens from xdm._experience.decisioning.propositions
        //   2. Send the click Analytics hit with the collected Analytics payload via Data Insertion API
      }
    });
  });
  // Send the page view Analytics hit with the collected display Analytics payload via Data Insertion API
});

Visual Experience Composer (VEC) アクティビティ visual-experience-composer-acitivties

Platform Web SDKを使用すると、Visual Experience Composer (VEC) ​を使用して作成されたオファーを処理できます。

NOTE
このユースケースを実装する手順は、​ フォームベースのExperience Composer アクティビティ ​の手順とよく似ています。 詳しくは、前の節を参照してください。

自動レンダリングが有効になっている場合は、ページで実行された提案からAnalytics トークンを収集できます。 ベストプラクティスは、Experience Platform Web SDK sendEvent コマンドをチェーンし、返された提案を繰り返し実行して、Web SDKがレンダリングしようとしているものをフィルタリングすることです。

alloy("sendEvent", {
    "renderDecisions": true,
    "xdm": {
      "web": {
        "webPageDetails": {
          "name": "Home Page"
        }
      }
    }
  }
).then(function (results) {
  var analyticsPayloads = new Set();

  for (var i = 0; i < results.propositions.length; i++) {

    var proposition = propositions[i];
    var renderAttempted = proposition.renderAttempted;

    if (renderAttempted === true) {
      var analyticsPayload = getDisplayAnalyticsPayload(proposition);

      if (analyticsPayload !== undefined) {
        analyticsPayloads.add(analyticsPayload);
      }
    }
  }
  var analyticsPayloadsToken = concatenateAnalyticsPayloads(analyticsPayloads);
  // Send the page view Analytics hit with collected Analytics payload via Data Insertion API
});

onBeforeEventSendを使用したページ指標の処理 using-onbeforeeventsend

Adobe Target アクティビティを使用すると、ページ上に異なる指標を設定できます。これは、手動でDOMに添付するか、自動的にDOMに添付されます(VECが作成したアクティビティ)。 どちらのタイプも、web ページ上の遅延したエンドユーザーインタラクションです。

これを考慮するため、ベストプラクティスは、onBeforeEventSend Adobe Experience Platform Web SDK フックを使用してAnalytics ペイロードを収集することです。 onBeforeEventSend フックは、configure コマンドを使用して設定する必要があり、データストリームを介して送信されるすべてのイベントに反映されます。

次に、onBeforeEventSentをトリガーAnalytics ヒットに設定する方法の例を示します。

alloy("configure", {
  datastreamId: "datastream configuration ID",
  orgId: "adobe ORG ID",
  onBeforeEventSend: function(options) {
    const xdm = options.xdm;
    const eventType = xdm.eventType;
    if (eventType === "decisioning.propositionInteract") {
      const analyticsPayloads = new Set();
      const propositions = xdm._experience.decisioning.propositions;

      for (var i = 0; i < propositions.length; i++) {
        var proposition = propositions[i];
        analyticsPayloads.add(getClickAnalyticsPayload(proposition));
      }
      // Trigger the Analytics hit
    }
  }
});

次のステップ next-steps

このガイドでは、Platform Web SDKのA4T データのクライアント側のログ記録について説明しました。 Edge NetworkでのA4T データの処理方法について詳しくは、​ サーバーサイドのログ記録に関するガイドを参照してください。

recommendation-more-help
target-dev-help-dev