メインコンテンツへスキップ
Custom Eventsを使用すると、イベントプロパティ(商品名、価格、URL、配列など)を利用してJourneyメッセージをパーソナライズできます。 イベントプロパティがテンプレートで利用可能になるのは、そのイベントが以下の条件を満たす場合のみです:
  • Journeyのエントリーをトリガーする、または
  • Journey内のWait Until条件に一致する
保存されたイベントプロパティは、Liquid構文を使用してアクセスできます。

Custom Eventパーソナライズの仕組み

以下の手順に従って、Journeyメッセージにイベントプロパティを追加します:
1

プロパティ付きのCustom Eventを送信する

Custom Eventsペイロードの例:
JSON
{
  "name": "purchase",
  "properties": {
    "item": "Blue Sweater",
    "price": "29.99",
    "order status": "pending",
    "details": [
      {
        "manufacturer": "Company A",
        "model": "1234567890"
      },
      {
        "manufacturer": "Company B",
        "model": "9876543210"
      }
    ]
  },
  "external_id": "user_12345",
  "timestamp": "2025-10-21T19:09:32.263Z",
}
2

Journeyメッセージテンプレートでイベントプロパティを参照する

Liquid構文を使用してイベントプロパティにアクセスします。

一般的なLiquidアクセスパターン

取得したい内容Liquid出力
イベント名{{ journey.first_event.name }}purchase
プロパティ{{ journey.first_event.properties.item }}Blue Sweater
ネストされたプロパティ{{ journey.first_event.properties.details.first.manufacturer }}Company A
特殊文字を含むプロパティ{{ journey.last_event.properties["order status"] }}pending
タイムスタンプ{{ journey.last_event.timestamp | date: "%B %d, %Y at %I:%M %p" }}October 21, 2025 at 07:09 PM

ネストされたLiquidアクセスパターン

ドット記法とブラケット記法を使用して、ネストされたプロパティにもアクセスできます:
Liquid
{{ journey.first_event.properties.details.first.manufacturer }} = Company A
{{ journey.first_event.properties.details.last.manufacturer }} = Company B
{{ journey.first_event.properties.details[0].manufacturer }} = Company A
{{ journey.first_event.properties.details[1].manufacturer }} = Company B
無効なLiquidまたは存在しないプロパティは空文字列としてレンダリングされます。メッセージは送信されます。フォールバックを設定するには、defaultフィルターを使用してください。
3

Journeyを作成する

Custom Eventをエントリールールおよび/またはWait Until条件として使用するようにJourneyを設定します。テンプレートを含むメッセージノードを追加します。

イベントプロパティの保存ルール

  • エントリールールとWait Untilステップを組み合わせることで、Journey内で複数のイベントを使用できます。
  • 最大値:1ユーザーあたり1 Journeyインスタンスにつき保存されるイベントプロパティは100件まで(古いものから削除されます)。
  • イベントプロパティはユーザーごと、Journeyインスタンスごとに保存されます。
  • エントリー前に送信されたイベントにはアクセスできません。
  • ユーザーがJourneyを終了すると、イベントプロパティはクリアされます。
あるJourneyに保存されたイベントは、別のJourneyからアクセスすることはできません。

Custom Event Liquidリファレンス

Journey内で保存されたイベントにアクセスするには、以下のオブジェクトを使用します。
journey.first_event
このJourneyインスタンスで最初に保存されたイベントです。
  • Custom Eventエントリールールを使用している場合、これはJourneyへのエントリーを引き起こしたイベントです。
  • Custom Eventエントリールールを使用していない場合、これはWait Until条件に一致して保存された最初のイベントです。
Liquid
Thanks for purchasing {{ journey.first_event.properties.item | default: "your item" }}!
journey.last_event
このJourneyインスタンスで最も最近に保存されたイベントです。
  • イベントが1つしか保存されていない場合、first_eventlast_eventは同じ結果を返します。
Liquid
Your most recent purchase was {{ journey.last_event.properties.item | default: "made" }}!
journey.event.EVENT_NAME
特定の名前を持つ最も最近に保存されたイベントです。
  • EVENT_NAMEをイベント名(例:purchase)に置き換えてください。
  • 同じイベント名が複数回使用された場合、最も最近のインスタンスが返されます。
Liquid
{% assign event = journey.event.purchase %}
イベント名にスペースや特殊文字が含まれる場合は、ブラケット記法を使用してください。イベントの例: "name": "order status"
Liquid
{% assign event = journey.event["order status"] %}
journey.all_events
array
このJourneyインスタンスで保存されたすべてのイベントで、保存された順序で格納されています。
  • forループを使用してイテレーションできます。
Liquid
{% for event in journey.all_events %}
{{ event.properties.item | default: "Item" }} — ${{ event.properties.price | default: "0.00" }}
{% endfor %}
  • journey.first_eventjourney.all_events[0]の省略形です。
  • journey.last_eventは配列内の最も最近のイベントの省略形です。

例:Custom Eventsを使用したカゴ落ちテンプレート

この例では、Custom Eventsを使用してカゴ落ちメッセージをパーソナライズする方法を示します。カゴ落ちチュートリアルをベースにしています。 Custom Eventセットの例:
JSON
{
  "events": [
    {
      "name": "cart_abandoned",
      "properties": {
        "cart_url": "https://yourdomain.com/username/cart",
        "cart": [
          {
            "product_name": "24 Pack of Acorns",
            "product_image": "https://i.imgur.com/ssPCfbC.png",
            "product_price": "$12.99",
            "product_quantity": "1"
          },
          {
            "product_name": "Fancy Sweater",
            "product_image": "https://i.imgur.com/8QWTfV4.png",
            "product_price": "$9.99",
            "product_quantity": "1"
          }
        ]
      },
      "external_id": "ID_OF_THE_USER"
    }
  ]
}

メールテンプレート

この例では、以下を表示するメールテンプレートの作成方法を示します:
  • カート内のアイテム数
  • forループを使用した各商品の画像、名前、数量、価格
  • 顧客固有のカートURLにリンクするボタン
1

メールテンプレートを作成する

Messages > Templates > New Email Templateに移動し、ドラッグ&ドロップエディターを開きます。
2

レイアウト構造を追加する

5つの行を作成します:
  • 行1、2、4:段落ブロックを含む1列
  • 行3:HTML | 段落 | 段落 | 段落の4列
  • 行5:ボタンブロックを含む1列
3

アイテム数を表示する

行1に以下を追加します:
Liquid
We're holding onto {{journey.first_event.properties.cart.size}} items in your cart, but don't wait too long!
文法的には「1 item」と「2 items」を条件分岐で使い分けることもできますが、カゴ落ちメールでは複数形で問題ない場合がほとんどです。
Liquid
{% assign cart = message.custom_data.cart %}
{% assign item_count = cart.size | plus: 0 %}
{% if item_count == 1 %}
We're holding onto {{item_count}} item in your cart, but don't wait too long, other squirrels are getting ahead!
{% endif %}
{% if item_count > 1 %}
We're holding onto {{item_count}} items in your cart, but don't wait too long, other squirrels are getting ahead!
{% endif %}
4

forループを開始する

forループを使用して、各カートアイテムに対して商品表示行を繰り返します。行2(ループ開始)に以下を追加します:
Liquid
{% for product in journey.first_event.properties.cart %}
これが行うこと:
  • cart配列内の各オブジェクトをイテレーションするループを開始します
  • 現在のアイテムを表す一時変数productを作成します
  • {% for %}{% endfor %}の間のすべてが、カートアイテムごとに1回繰り返されます
  • productは任意の名前(例:itemcartItem)に変更できます。ただし一貫して使用してください
forループの配置について:{% for %}構文は必ず独立したテキストブロック行に配置してください。他のコンテンツを含む複数列の行の中に入れると、一部のメールクライアントでレンダリングが壊れる可能性があります。
5

商品の詳細を表示する

この4列の行は、画像、名前、数量、価格を表示します。ループ内にあるため、すべてのカートアイテムに対して繰り返されます。行3(商品詳細)を設定します:列1 - HTMLブロック(商品画像):
<img src="{{product.product_image}}" alt="Product image" style="max-width:100%;" />
列2~4 - テキストブロック(商品名、数量、価格):
  • 列2:{{product.product_name}}
  • 列3:{{product.product_quantity}}
  • 列4:{{product.product_price}}
ループの動作:
  • 最初のイテレーションでは、product = カート配列の最初のオブジェクト
  • {{product.product_image}}は最初のアイテムの画像を取得します
  • 2回目のイテレーションでは、product = 2番目のオブジェクト
  • すべてのカートアイテムに対して行が自動的に繰り返されます
フィールド名の一致: product_imageなどのキーは、イベントペイロードと完全に一致する必要があります(大文字小文字を区別)。不一致の場合、空文字列としてレンダリングされます。
6

forループを終了する

繰り返しを停止する場所を示すためにループを閉じます。行4(ループ終了)に以下を追加します:
Liquid
{% endfor %}
すべての{% for %}には対応する{% endfor %}が必要です。これがないとメールのレンダリングが壊れます。
7

カートURLボタンを追加する

行5のボタンブロックで、アクションURLを以下に設定します:
Liquid
{{journey.first_event.properties.cart_url}}
8

テンプレートをテストする

  • テンプレートを空のJourneyに追加し、エントリールールをCustom Eventに設定します。
  • Journeyを有効にし、Custom Event APIを使用して自分自身をエントリーさせます。
  • データが正しく表示されることを確認します。
成功です!テンプレートに独自のスタイリングを適用できるようになりました。ドラッグ&ドロップでメールをデザインするを参照してください。

プッシュテンプレート

プッシュ通知はスペースが限られているため、1つのアイテムを表示し、合計数を記載します。 メッセージフィールド: 条件文を使用して、正しい文法でアイテムとカウントを表示します。
Liquid
{% assign cart = journey.first_event.properties.cart %}
{% assign item_count = cart.size | plus: 0 %}
{% if item_count == 1 %}
You left {{cart.first.product_name}} in your cart.
{% endif %}
{% if item_count == 2 %}
You left {{cart.first.product_name}} and {{item_count | minus: 1}} more item in your cart.
{% endif %}
{% if item_count > 2 %}
You left {{cart.first.product_name}} and {{item_count | minus: 1}} more items in your cart.
{% endif %}
画像フィールド:
Liquid
{{journey.first_event.properties.cart.first.product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
起動URLフィールド:
Liquid
{{journey.first_event.properties.cart_url | default: "https://yourdomain.com/cart"}}
テスト用のJourneyに追加し、別のCustom Event API呼び出しで自分自身をエントリーさせて、テストプッシュ通知を送信します。以下のような通知が表示されるはずです:
成功です!さらにテンプレートを作成して、カゴ落ちJourneyで使用できます。

トラブルシューティングとベストプラクティス

よくある間違い:
間違い失敗する理由正しい構文
{{ journey.first_event.item }}.propertiesが不足{{ journey.first_event.properties.item }}
{{ journey.event.purchase.item }}.propertiesが不足{{ journey.event.purchase.properties.item }}
{{ journey.first_event.properties.Item }}大文字小文字が間違い(itemが正しい){{ journey.first_event.properties.item }}
{{ event.properties.item }}journey.プレフィックスが不足{{ journey.first_event.properties.item }}
ベストプラクティス:
  • テンプレートは本番環境に適用する前に必ずテストしてください
  • オプションのプロパティにはdefaultフィルターを使用してください
  • イベントスキーマがテンプレートの期待と一致していることを検証してください

関連ページ

サポートが必要ですか?サポートチームとチャットするか、support@onesignal.comにメールしてください以下を含めてください:
  • 発生している問題の詳細と再現手順(利用可能な場合)
  • OneSignal App ID
  • 該当する場合は、External IDまたはSubscription ID
  • 該当する場合は、OneSignalダッシュボードでテストしたメッセージのURL
  • 関連するログまたはエラーメッセージ
お気軽にお問い合わせください!