お客様の取引をロイヤルティチャレンジに適用する前に、チャレンジサービスが理解できる Adobe ロイヤルティイベント 形式である必要があります。 POS システム、モバイルアプリ、e コマースプラットフォームなどの顧客イベントでは、通常、顧客自身のデータスキーマを使用します。 イベント トランスフォーマは、アップストリーム システムに変更を加えることなく、このギャップを埋めます。
概要
イベント定義は、プラットフォームに2つのことを伝えます。
- 要求するイベント – 受信イベントがこの定義に属していることを認識する方法(一致)
- リシェイプする方法 – 顧客のフィールドをロイヤルティイベント形式(変換)にマッピングするJSONata式
組織ごとに複数のイベント定義を設定できます。 プラットフォームはそれらを順番に評価し、一致する最初のものを適用します。 どの定義にも一致しないイベントは、ネイティブ取り込みに失敗します( フォールバック – ネイティブロイヤルティイベント を参照)。
Adobeロイヤルティイベントのフォーマット
すべてのイベント定義では、次の形式でJSON オブジェクトを生成する必要があります。 これは、チャレンジサービスが処理する入力です。
{
"_id": "string — optional; used for duplicate detection if enabled",
"event_name": "string — used for internal metrics and reporting only (e.g. 'purchase', 'visit')",
"timestamp": "ISO 8601 date-time string — when the event occurred",
"utc_offset": "string — UTC offset of the store or device (e.g. '-07:00'); required for daypart matching",
"location_id": "string — optional; store or location identifier",
"transaction_id": "string — optional; dedup key for the transaction",
"loyalty_identity": {
"id": "string — the member's loyalty ID"
},
"item_list": [
{
"item_set": ["string", "..."], // one or more identifiers — SKU, category, event code, etc.
"item_name": "string — optional human-readable label",
"quantity": 1, // integer; how many units
"unit_price": 4.99, // float; price per unit
"sub_total": 4.99 // float; line total (quantity × unit_price)
}
]
}
フィールドノート
loyalty_identityid — メンバーのロイヤルティ IDを含める必要があります。item_listitem_settimestamputc_offset_idsub_totalイベント定義フィールド
guidname"Starbucks POS Purchase")xdmSchemaIdtransformerマッチングの仕組み
データ収集コアサービス(DCCS)を介して到着したイベントでは、エンベロープにXDM スキーマ参照が含まれます。 プラットフォームは/body/xdmMeta/schemaRef/idからスキーマ IDを読み取り、各定義のxdmSchemaIdと比較します。
プラットフォームは、組織のイベント定義 を順番 に歩き、最初の一致を適用します。 一致が見つかると、xdmEntity本文がトランスフォーマに渡されます。
トランスフォーマの書き方
transformer フィールドはJSONata式です。 受信イベント JSONを入力として受け取り、有効なAdobe Loyalty Event オブジェクトを返す必要があります。
ターゲット形式の各トップレベルフィールドを、ソースイベントの対応するパスにマッピングします。
| code language-jsonata |
|---|
|
この定義に一致するすべてのイベントが同じ論理アクティビティを表す場合、event_nameをハードコードします。
| code language-jsonata |
|---|
|
event_nameは内部指標とレポートに使用されます。 タスクフィルターとして使用されません。タスクの選定は、イベント名ではなくitem_set個のコンテンツによって決定されます。
DCCS ルートを介して到着するイベントの場合、メンバーのIDは通常、カスタムテナントプロパティではなく、標準のXDM identityMap フィールドに格納されます。 identityMapは名前空間でキー設定されたマップです。キー自体は名前空間名で、値はID オブジェクトの配列です。
| code language-jsonata |
|---|
|
-
名前空間置換:
Emailを、組織がロイヤルティメンバーに使用する名前空間に置き換えます –Loyalty、ECID、CRMIDなど。プライマリロイヤルティプロファイル IDを保持する名前空間から常に読み取ります。 -
常に
[0]を使用:identityMap.Emailは配列です。 インデックスを使用しない場合、複数のIDが存在し、loyalty_identity.idがリストになる場合、JSONataは1つの値ではなくシーケンスを返します。[0]を持つ最初の要素にピン留めします。 -
IDのカスタムテナントフィールドを使用しない: カスタムフィールドグループでは、電子メールのようなフィールドが公開されることがあります(例:
_yourtenant.identification.core.email)。 サンプルデータでは、これは値を返し、正しく見えますが、実稼動イベントでは頻繁に空になります。 信頼できるID ソースは常にidentityMapです。
item_setを作成していますitem_setは文字列識別子の配列です。 チャレンジタスクがフィルタリングされる可能性のあるすべてのフィールドを含めます。
| code language-jsonata |
|---|
|
非トランザクションイベント(チェックイン、アンケート完了、カスタムトリガー)の場合は、1つのIDで十分です。
| code language-jsonata |
|---|
|
unit_priceunit_priceは単価にする必要があります。 一部のソーススキーマでは、代わりにラインの合計(価格×数量)が保存されます。 ソースフィールドがラインの合計である場合は、数量で割って単価を取得します。
| code language-jsonata |
|---|
|
ソースフィールドが行合計の場合にのみ分割します。 既に単価を保管している場合は、それを直接マッピングします。単価を数量で割ると、誤った値が生成されます。
transaction_idソースイベントにトランザクション IDが含まれていない場合は、タイムスタンプから安定したIDを取得できます。
| code language-jsonata |
|---|
|
これにより、ISO タイムスタンプがエポックミリ秒に変換され、特定のイベントに対して決定論的な値が生成されます。 利用可能な場合は、プラットフォーム独自のID生成関数を使用します。
完全なJSONata関数ライブラリを使用できます。 便利な例:
| code language-jsonata |
|---|
|
例
シナリオ: モバイルアプリがチェックインイベントを送信します。 行項目はありません。イベント自体が対象アクティビティです。
受信イベント:
| code language-json |
|---|
|
イベント定義:
| code language-json |
|---|
|
書式設定されたトランスフォーマ (読みやすくするため):
| code language-jsonata |
|---|
|
Output Adobe ロイヤルティイベント:
| code language-json |
|---|
|
含める/除外の制限のないチャレンジタスクは、このイベントを対象となる訪問としてカウントします。単一のitem_set エントリ ["store-checkin"]は、すべての項目を許可する任意のタスクと一致します。
シナリオ:販売時点情報管理システムは、トランザクションペイロードを送信します。 各行項目にはSKUがあり、カテゴリに属しています。 チャレンジタスクでは、SKUとカテゴリーを使用して何が適しているかを判断します。
受信イベント:
| code language-json |
|---|
|
イベント定義:
| code language-json |
|---|
|
書式設定されたトランスフォーマ:
| code language-jsonata |
|---|
|
Output Adobe ロイヤルティイベント:
| code language-json |
|---|
|
include: ["BEVERAGE"]を持つチャレンジタスクは、コーヒー品目が選定され(そのitem_setには"BEVERAGE"が含まれます)、そのタスクに対する支出の$9.00が累積されます。 マフィン行項目は除外されます。
シナリオ:件のイベントはAdobe Journey Optimizerを流れます。 受信イベントは、既知のスキーマ IDを持つXDM エクスペリエンスイベントです。 プラットフォームは、パスと値のチェックではなく、スキーマ IDを使用して照合を行います。
受信XDM エンティティ本文 (AJO イベントから抽出されたxdmEntity):
| code language-json |
|---|
|
イベント定義:
| code language-json |
|---|
|
書式設定されたトランスフォーマ:
| code language-jsonata |
|---|
|
注: イベントがXDM スキーマ IDで一致する場合、トランスフォーマはイベントの
xdmEntity部分のみを受け取り、外側のAJO エンベロープは受け取りません。 トランスフォーマ式のすべてのパスは、XDM エンティティ本文に対する相対パスです。
JSON スキーマ検証の追加(オプション)
変換を試みる前に、プラットフォームで受信イベントの構造を検証する場合は、schema フィールドをJSON文字列としてエンコードされたJSON スキーマ 文書に設定します。
スキーマの検証に失敗したイベントは、変換の実行前に拒否されます。 エラー応答には特定の検証エラーが含まれるため、不正なアップストリームイベントを簡単に診断できます。
| code language-json |
|---|
|
このスキーマをイベント定義のschema フィールドに縮小JSON文字列として渡します。
フォールバック – ネイティブロイヤルティイベント
受信イベントと一致するイベント定義がない場合、プラットフォームはネイティブのAdobe ロイヤルティイベントとして直接取り込もうとします。 ペイロードが既に上記のロイヤルティイベント形式に準拠している場合、トランスは必要なく、イベントはそのまま適用されます。 これにより、イベントが事前にフォーマットされている顧客は、変換を完全にバイパスできます。
API リファレンス
すべてのイベント定義操作では、基本パス /loyalty/metadata/config/eventsが使用されます。
| code language-http |
|---|
|
| code language-http |
|---|
|
| code language-http |
|---|
|
| code language-http |
|---|
|
変圧器の検証
JSONata式は、イベント定義が保存されたときに構文について検証されます。 式が無効な場合、APIは解析エラーの説明を含む422 エラーを返します。
デプロイする前にトランスフォーマをテストするには、JSONata Exerciserを使用します。ソースイベントを入力として貼り付け、トランスフォーマ式を使用して、出力が期待されるロイヤルティイベント形式と一致することを確認します。
陥りやすい失敗
これらのミスはすべて、単純な1項目のテストペイロードでエラーなく実行されます。これはまさに、検出されずに失敗する理由です。 デプロイする前に、必ず2つ以上の製品でペイロードに対してトランスフォーマをテストしてください。
最も頻繁な間違い。 productListItems.SKUを持つ単一のオブジェクトリテラルを使用すると、すべてのSKUとすべての数量が、製品ごとに1行の項目を生成するのではなく、グループ化されたシーケンスに取り込まれます。
✗は、すべての項目を1つに折りたたみます:
| code language-jsonata |
|---|
|
2つの製品を使用すると、item_setは両方のSKUを保持し、quantityは[1, 4]のような配列になります。
✓製品ごとに1つの行項目:
| code language-jsonata |
|---|
|
.{ } マップは製品ごとに1回実行され、各製品が独自のエントリになります。
identityMap.Emailは配列です。 [0]を使用しない場合、プロファイルがその名前空間に複数のIDを持つ場合、idは単一の文字列ではなく値のリストになります。
✗ identityMap.Email.id
✓ identityMap.Email[0].id
_yourtenant.identification.core.emailなどの電子メール形式のフィールドが公開されることがあります。 サンプルデータでは値が返され、正しく見えますが、実稼動イベントでは頻繁に空になり、loyalty_identity.idがnullになります。 常にidentityMapをIDのソースとして使用してください。item_setに漏洩しているネストされた配列item_setにカテゴリーフィールドを追加するのは簡単ですが、productCategories自体が配列である場合、結果は予測不可能に展開されます。
✗は予想よりも多くのエントリを生成する可能性があります:
| code language-jsonata |
|---|
|
3つのカテゴリを持つ製品は、4つの値を持つitem_setを生成します。
✓ネストされた配列をインデックス化して、1つの値を正確に取得します:
| code language-jsonata |
|---|
|
item_listが空または見つかりませんitem_listが空または存在しないイベントは、無効として拒否されます。 非トランザクションイベント(チェックイン、カスタムトリガー)の場合、自然な行の項目はないので、合成の行を生成します。
| code language-jsonata |
|---|
|
timestampをISO 8601ではなくUnix エポック整数として使用プラットフォームにはISO 8601文字列が必要です。 ソースイベントがエポックからミリ秒単位で進行する場合は、次のように変換します。
| code language-jsonata |
|---|
|
utc_offsetが省略されましたutc_offsetを使用しない場合、日別ウィンドウのマッチングと連続日ストリーク数の両方がスキップされます。 ストアまたはデバイスのUTC オフセットを、ソースイベントが利用可能な場所からマッピングします。xdmEntity ボディのみを受け取り、外側のAJO エンベロープは受け取りません。 すべてのパスは、XDM エンティティのルートに対する相対パスである必要があります。 エクスプレッションが外側のエンベロープ(例:/body/xdmMeta/...)にあるフィールドを参照している場合、それらのフィールドは見つからず、nullが暗黙的に生成されます。