> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Custom Events でパーソナライズする

> Custom Eventプロパティを使用して、Liquid構文でJourneyメッセージをパーソナライズする方法を学びます。イベントの保存、アクセス、プッシュ・メール・SMSテンプレートでのレンダリング方法について説明します。

[Custom Events](./custom-events)を使用すると、イベントプロパティ（商品名、価格、URL、配列など）を利用してJourneyメッセージをパーソナライズできます。

イベントプロパティがテンプレートで利用可能になるのは、そのイベントが以下の条件を満たす場合のみです：

* Journeyのエントリーをトリガーする、または
* Journey内の**Wait Until**条件に一致する

保存されたイベントプロパティは、[Liquid構文](./using-liquid-syntax)を使用してアクセスできます。

***

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

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

<Steps>
  <Step title="プロパティ付きのCustom Eventを送信する">
    [Custom Events](./custom-events)ペイロードの例：

    ```json JSON theme={null}
    {
      "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",
    }
    ```
  </Step>

  <Step title="Journeyメッセージテンプレートでイベントプロパティを参照する">
    [Liquid構文](./using-liquid-syntax)を使用してイベントプロパティにアクセスします。

    ### 一般的な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 Liquid theme={null}
    {{ 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
    ```

    <Warning>
      無効なLiquidまたは存在しないプロパティは空文字列としてレンダリングされます。メッセージは送信されます。フォールバックを設定するには、[defaultフィルター](./using-liquid-syntax#default)を使用してください。
    </Warning>
  </Step>

  <Step title="Journeyを作成する">
    Custom Eventをエントリールールおよび/またはWait Until条件として使用するようにJourneyを設定します。

    * エントリールールについては、[Journeys設定](./journeys-settings)を参照してください。
    * Wait Until条件については、[Journeysアクション](./journeys-actions)を参照してください。

    テンプレートを含むメッセージノードを追加します。
  </Step>
</Steps>

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

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

<Warning>
  あるJourneyに保存されたイベントは、別のJourneyからアクセスすることはできません。
</Warning>

***

## Custom Event Liquidリファレンス

Journey内で保存されたイベントにアクセスするには、以下のオブジェクトを使用します。

<ParamField body="journey.first_event">
  このJourneyインスタンスで最初に保存されたイベントです。

  * **Custom Eventエントリールール**を使用している場合、これはJourneyへのエントリーを引き起こしたイベントです。
  * Custom Eventエントリールールを使用していない場合、これはWait Until条件に一致して保存された最初のイベントです。

  ```liquid Liquid theme={null}
  Thanks for purchasing {{ journey.first_event.properties.item | default: "your item" }}!
  ```
</ParamField>

<ParamField body="journey.last_event">
  このJourneyインスタンスで最も最近に保存されたイベントです。

  * イベントが1つしか保存されていない場合、`first_event`と`last_event`は同じ結果を返します。

  ```liquid Liquid theme={null}
  Your most recent purchase was {{ journey.last_event.properties.item | default: "made" }}!
  ```
</ParamField>

<ParamField body="journey.event.EVENT_NAME">
  特定の名前を持つ最も最近に保存されたイベントです。

  * `EVENT_NAME`をイベント名（例：`purchase`）に置き換えてください。
  * 同じイベント名が複数回使用された場合、最も最近のインスタンスが返されます。

  ```liquid Liquid theme={null}
  {% assign event = journey.event.purchase %}
  ```

  イベント名にスペースや特殊文字が含まれる場合は、[ブラケット記法](https://shopify.dev/docs/api/liquid/basics#referencing-handles)を使用してください。

  **イベントの例：** `"name": "order status"`

  ```liquid Liquid theme={null}
  {% assign event = journey.event["order status"] %}
  ```
</ParamField>

<ParamField body="journey.all_events" type="array">
  このJourneyインスタンスで保存されたすべてのイベントで、保存された順序で格納されています。

  * [forループ](./using-liquid-syntax#for-loops)を使用してイテレーションできます。

  ```liquid Liquid theme={null}
  {% for event in journey.all_events %}
  • {{ event.properties.item | default: "Item" }} — ${{ event.properties.price | default: "0.00" }}
  {% endfor %}
  ```

  * `journey.first_event`は`journey.all_events[0]`の省略形です。
  * `journey.last_event`は配列内の最も最近のイベントの省略形です。
</ParamField>

***

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

この例では、Custom Eventsを使用してカゴ落ちメッセージをパーソナライズする方法を示します。[カゴ落ちチュートリアル](./abandoned-cart)をベースにしています。

**Custom Eventセットの例：**

```json JSON theme={null}
{
  "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にリンクするボタン

<Frame caption="カゴ落ちメールテンプレートの例">
  <img src="https://mintcdn.com/onesignal/KSCNwSpBCNSQ8xdF/images/docs/fd61543-Screenshot_2023-08-28_at_10.52.05_AM.png?fit=max&auto=format&n=KSCNwSpBCNSQ8xdF&q=85&s=4128b15d8d53d69c6626e129eee538fa" width="693" height="1477" data-path="images/docs/fd61543-Screenshot_2023-08-28_at_10.52.05_AM.png" />
</Frame>

<Steps>
  <Step title="メールテンプレートを作成する">
    **Messages > Templates > New Email Template**に移動し、ドラッグ＆ドロップエディターを開きます。
  </Step>

  <Step title="レイアウト構造を追加する">
    5つの行を作成します：

    * 行1、2、4：**段落**ブロックを含む1列
    * 行3：**HTML | 段落 | 段落 | 段落**の4列
    * 行5：**ボタン**ブロックを含む1列

    <Frame caption="カゴ落ち用の基本メールテンプレート">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/starter-template-abandoned-cart.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=551e9ec4618f64fdc0b6ab610a537c48" width="2968" height="2124" data-path="images/email/starter-template-abandoned-cart.png" />
    </Frame>
  </Step>

  <Step title="アイテム数を表示する">
    行1に以下を追加します：

    ```liquid Liquid theme={null}
    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 Liquid theme={null}
    {% 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 %}
    ```
  </Step>

  <Step title="forループを開始する">
    [forループ](./using-liquid-syntax#for-loops)を使用して、各カートアイテムに対して商品表示行を繰り返します。

    行2（ループ開始）に以下を追加します：

    ```liquid Liquid theme={null}
    {% for product in journey.first_event.properties.cart %}
    ```

    **これが行うこと：**

    * `cart`配列内の各オブジェクトをイテレーションするループを開始します
    * 現在のアイテムを表す一時変数`product`を作成します
    * `{% for %}`と`{% endfor %}`の間のすべてが、カートアイテムごとに1回繰り返されます
    * `product`は任意の名前（例：`item`、`cartItem`）に変更できます。ただし一貫して使用してください

    <Warning>
      forループの配置について：`{% for %}`構文は必ず独立したテキストブロック行に配置してください。他のコンテンツを含む複数列の行の中に入れると、一部のメールクライアントでレンダリングが壊れる可能性があります。
    </Warning>
  </Step>

  <Step title="商品の詳細を表示する">
    この4列の行は、画像、名前、数量、価格を表示します。ループ内にあるため、すべてのカートアイテムに対して繰り返されます。

    行3（商品詳細）を設定します：

    **列1 - HTMLブロック**（商品画像）：

    ```html theme={null}
    <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番目のオブジェクト
    * すべてのカートアイテムに対して行が自動的に繰り返されます

    <Warning>
      **フィールド名の一致：** `product_image`などのキーは、イベントペイロードと完全に一致する必要があります（大文字小文字を区別）。不一致の場合、空文字列としてレンダリングされます。
    </Warning>
  </Step>

  <Step title="forループを終了する">
    繰り返しを停止する場所を示すためにループを閉じます。

    行4（ループ終了）に以下を追加します：

    ```liquid Liquid theme={null}
    {% endfor %}
    ```

    <Note>
      すべての`{% for %}`には対応する`{% endfor %}`が必要です。これがないとメールのレンダリングが壊れます。
    </Note>
  </Step>

  <Step title="カートURLボタンを追加する">
    行5の**ボタン**ブロックで、アクションURLを以下に設定します：

    ```liquid Liquid theme={null}
    {{journey.first_event.properties.cart_url}}
    ```

    <Frame caption="スタイリングなしのカゴ落ち用基本メールテンプレート完成版">
      <img src="https://mintcdn.com/onesignal/v-hm59YoewwF90UX/images/email/finished-template-abandoned-cart-custom-event.png?fit=max&auto=format&n=v-hm59YoewwF90UX&q=85&s=67217e202cc57ca4039e0b34d2501f15" width="2968" height="1716" data-path="images/email/finished-template-abandoned-cart-custom-event.png" />
    </Frame>
  </Step>

  <Step title="テンプレートをテストする">
    * テンプレートを空のJourneyに追加し、エントリールールをCustom Eventに設定します。
    * Journeyを有効にし、Custom Event APIを使用して自分自身をエントリーさせます。
    * データが正しく表示されることを確認します。

    <Check>成功です！テンプレートに独自のスタイリングを適用できるようになりました。[ドラッグ＆ドロップでメールをデザインする](./design-emails-with-drag-and-drop)を参照してください。</Check>
  </Step>
</Steps>

### プッシュテンプレート

プッシュ通知はスペースが限られているため、1つのアイテムを表示し、合計数を記載します。

**メッセージフィールド：**

[条件文](./using-liquid-syntax#if-elsif-else)を使用して、正しい文法でアイテムとカウントを表示します。

```liquid Liquid theme={null}
{% 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 Liquid theme={null}
{{journey.first_event.properties.cart.first.product_image | default: "https://i.imgur.com/ssPCfbC.png"}}
```

**起動URLフィールド：**

```liquid Liquid theme={null}
{{journey.first_event.properties.cart_url | default: "https://yourdomain.com/cart"}}
```

テスト用のJourneyに追加し、別のCustom Event API呼び出しで自分自身をエントリーさせて、テストプッシュ通知を送信します。以下のような通知が表示されるはずです：

<Frame caption="カゴ落ちプッシュテンプレートの例">
  <img src="https://mintcdn.com/onesignal/4HyuQPBpu-4xjmQC/images/docs/d0db985-Screenshot_2023-08-28_at_9.30.23_AM.png?fit=max&auto=format&n=4HyuQPBpu-4xjmQC&q=85&s=6cf03ce9b622ba399656f2b14fb055f3" width="688" height="656" data-path="images/docs/d0db985-Screenshot_2023-08-28_at_9.30.23_AM.png" />
</Frame>

<Check>成功です！さらにテンプレートを作成して、[カゴ落ちJourney](./abandoned-cart)で使用できます。</Check>

***

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

**よくある間違い：**

| 間違い                                         | 失敗する理由                 | 正しい構文                                          |
| ------------------------------------------- | ---------------------- | ---------------------------------------------- |
| `{{ 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フィルター](./using-liquid-syntax#default)を使用してください
* イベントスキーマがテンプレートの期待と一致していることを検証してください

***

## 関連ページ

<Columns cols={2}>
  <Card title="メッセージパーソナライズ" href="./message-personalization" icon="sparkles">
    Custom Eventsと他の方法を使い分けるタイミングを含む、OneSignalのすべてのパーソナライズオプションの概要です。
  </Card>

  <Card title="Custom Events" href="./custom-events" icon="bolt">
    SDKまたはAPIを使用したCustom Eventsの実装と送信の完全ガイドです。
  </Card>

  <Card title="Journeys概要" href="./journeys-overview" icon="route">
    トリガー、条件、アクションを使用した自動メッセージングワークフローの構築方法を学びます。
  </Card>

  <Card title="Journey設定" href="./journeys-settings" icon="gear">
    イベントトリガーのエントリールールとJourneyの動作を設定します。
  </Card>

  <Card title="Wait Untilアクション" href="./journeys-actions#wait-until" icon="clock">
    Wait Untilノードを使用して、Journey進行中に追加のイベントを保存します。
  </Card>

  <Card title="Liquid構文の使用" href="./using-liquid-syntax" icon="droplet">
    フィルター、条件分岐、ループ、文字列操作を含むLiquidの完全リファレンスです。
  </Card>

  <Card title="テンプレート" href="./templates" icon="file">
    Journeysで使用する再利用可能なメッセージテンプレートを作成・管理します。
  </Card>
</Columns>

<Info>
  サポートが必要ですか？

  サポートチームとチャットするか、`support@onesignal.com`にメールしてください

  以下を含めてください：

  * 発生している問題の詳細と再現手順（利用可能な場合）
  * OneSignal App ID
  * 該当する場合は、External IDまたはSubscription ID
  * 該当する場合は、OneSignalダッシュボードでテストしたメッセージのURL
  * 関連する[ログまたはエラーメッセージ](/docs/ja/capturing-a-debug-log)

  お気軽にお問い合わせください！
</Info>

***
