custom_dataフィールドを使用して、バックエンドから動的データを送信し、Liquid構文を使ってテンプレート内でレンダリングします。
custom_data:
- メッセージ固有のデータです
- 保存されません
- APIリクエスト中のみ存在します
template_idと一緒に使用する必要があります
Liquid
custom_dataを使用するタイミング
custom_dataは以下の場合に使用します:
- データがメッセージごとに変わる場合(注文合計、カートアイテム、残高)
- 配列が必要な場合(商品リスト、明細項目、おすすめ商品)
- データを永続化すべきでない場合(ワンタイムコード、一時的なURL)
- バックエンドからトリガーされるメッセージを送信する場合
- 1回のAPIリクエストで一括パーソナライゼーションを行いたい場合
custom_dataパーソナライゼーションの仕組み
メッセージにcustom_dataを追加するには、いくつかの手順が必要です:
テンプレートを作成する
ダッシュボードまたはCreate Template APIを使用して、Push、メール、またはSMSのテンプレートを作成します。
APIリクエストでcustom_dataを送信する
以下を含めてCreate Message APIを呼び出します:
template_id- テンプレートのIDcustom_data- データオブジェクト- オーディエンスターゲティング(
include_player_ids、include_aliases、またはセグメント)
データパターン
custom_dataで使用できる一般的なデータパターンの例です。
フラットJSONの例
名前、ID、URL、またはその他の単一値データなど、基本的なパーソナライゼーションにはシンプルなキーバリューペアを使用します。 ユースケース: 各フィールドに単一の値を含むトランザクションメッセージ(請求書、領収書、確認)。 テンプレート:Liquid
JSON
Text
配列データの例
カート内の商品、注文の明細項目、おすすめ商品など、複数のアイテムを扱うためにオブジェクトの配列を渡します。配列は直接アクセス(インデックス指定)と反復処理(ループ)の両方を可能にします。 ユースケース: 商品リスト、ランキング、注文サマリー、またはその他の複数アイテムデータの表示。 インデックス指定テンプレート(最初のアイテムにアクセス):Liquid
Liquid
Text
{{message.custom_data.cart_items.size}}— 配列内のアイテム数(この例では2を返します){{message.custom_data.cart_items.first.item_name}}— 最初のアイテムの名前([0]と同等){{message.custom_data.cart_items.last.item_name}}— 最後のアイテムの名前
一括パーソナライゼーションの例
1回のAPIリクエストを複数のユーザーに送信し、各受信者がexternal_idに基づいたパーソナライズされたコンテンツを表示できるようにします。
仕組み:
custom_dataをキーがexternal_idで値がユーザー固有のデータであるオブジェクトとして構造化します- テンプレートで
subscription.external_idを使用して現在の受信者のデータを検索します - OneSignalは受信者ごとに、その受信者固有のデータでテンプレートを1回レンダリングします
subscription.external_idには現在の受信者のexternal_idが含まれています(例:「user123」)message.custom_data.users[subscription.external_id]はcustom_dataオブジェクトからそのユーザーのデータを検索しますuserはそのユーザーのデータのショートハンド変数になります- 各受信者は自分のパーソナライズされたコンテンツのみを見ることができます
- John(user123):「Hi John, you have 150 points. Your level is Gold.」
- Sarah(user456):「Hi Sarah, you have 200 points. Your level is Platinum.」
一括パーソナライゼーションの要件:
- すべての受信者がOneSignalで
external_idを設定している必要があります include_aliases内の各external_idに対応するキーがcustom_data.usersに必要です- 受信者のexternal_idが
custom_dataに存在しない場合、そのメッセージのフィールドは空になります
例:custom_dataを使用したカゴ落ちメッセージ
custom_dataを使用して、メールとプッシュの両方でカゴ落ちメッセージを構築する方法です。
このアプローチを使用するタイミング:
- サーバーがカゴ落ちを検出した場合(例:最後のアクティビティから1時間後)
- リアルタイムのカートデータがデータベースにある場合
- 画像、名前、価格付きの複数の商品を表示したい場合
- 各ユーザーのアイテムと数量が異なる可能性がある場合
- バックエンドからメッセージをオーケストレーションしたい場合
custom_dataペイロードの例
この例のCreate Message APIリクエストです。
JSON
| フィールド | 型 | 用途 |
|---|---|---|
cart_url | string | 顧客固有のカートリンク(ボタン/起動URLに使用) |
cart | array | 商品リスト — カウント、ループ、詳細表示に対応 |
product_image | string | 商品画像(配列内のアイテムごと) |
product_name | string | 商品名(アイテムごと) |
product_quantity | string | 数量(アイテムごと) |
product_price | string | フォーマット済み価格(アイテムごと) |
フィールド名は自由に設定できます。テンプレートのLiquid構文が一致していることを確認してください。
メールテンプレート
この例では、以下を表示するメールテンプレートの構築方法を説明します:- カートアイテム数
- forループを使用した各商品の画像、名前、数量、価格
- 顧客固有のカートURLにリンクするボタン

レイアウト構造を追加する
5つの行を作成します:
- 行1、2、4:Paragraphブロックを含む1列
- 行3:HTML | Paragraph | Paragraph | Paragraphの4列
- 行5:Buttonブロックを含む1列

アイテム数を表示する
行1に以下を追加します:文法を改善するために、「1 item」と「2 items」を条件分岐で使い分けることもできますが、カゴ落ちメールでは通常、複数形で問題ありません。
Liquid
Liquid
ループを開始する
forループを使用して、カート内の各アイテムに対して商品表示行を繰り返します。行2(ループ開始)のテキストブロックに以下を追加します:この処理の内容:
Text
cart配列内の各オブジェクトを反復するループを開始します- 現在のアイテムを表す
productという一時変数を作成します {% for %}と{% endfor %}の間のすべてがカートアイテムごとに1回繰り返されますproductは任意の名前(例:item、cartItem)に変更できますが、一貫性を保ってください
商品詳細を表示する
この4列の行は、画像、名前、数量、価格を表示します。ループ内にあるため、カートアイテムごとに繰り返されます。行3(商品詳細)を設定します:列1 - HTMLブロック(商品画像):列2〜4 - テキストブロック(商品名、数量、価格):
HTML
- 列2:
{{product.product_name}} - 列3:
{{product.product_quantity}} - 列4:
{{product.product_price}}
- 最初の反復では、
product= カート配列の最初のオブジェクト {{product.product_image}}は最初のアイテムの画像URLを取得します- 2回目の反復では、
product= 2番目のオブジェクト - この行はすべてのカートアイテムに対して自動的に繰り返されます
ループを終了する
ループを閉じて、繰り返しの終了位置を示します。行4(ループ終了)に以下を追加します:
Liquid
すべての
{% for %}には対応する{% endfor %}が必要です。これがない場合、メールのレンダリングが崩れます。テンプレートをテストする
- 例の
custom_dataペイロードを使用してAPIリクエストをセットアップします - 自分宛にメールを送信します。
- データが正しく表示されることを確認します。
成功です!これで独自のスタイルをテンプレートに適用できます。ドラッグ&ドロップでメールをデザインするを参照してください。
プッシュテンプレート
プッシュ通知には文字数制限とオペレーティングシステムの制約があるため、すべてのアイテムを表示する代わりに、最初の商品を表示し、適切な文法で合計数を示します。 以下は構築するプッシュ通知の例です:
Liquid
詳細については、Liquid構文の使用を参照してください。
Liquid
詳細については、通知画像とリッチメディアを参照してください。
Liquid
成功です!テンプレートを保存し、その
template_idをCreate message APIリクエストでcustom_dataプロパティと一緒に使用してテストしてください。トラブルシューティングとベストプラクティス
- シンプルに保つ:テンプレートで実際に使用するデータのみを含めてください
- 2KB以下に抑える:特に配列を含む場合、ペイロードサイズを監視してください
- 一貫した命名規則を使用する:全体を通して
snake_caseまたはcamelCaseで統一してください - 送信前にバリデーションする:null値、空の配列、必須フィールドを確認してください
- オプションフィールドには常にdefaultフィルターを使用してください:
Liquid
- ループ前に配列サイズを確認してください:
Liquid
- エッジケースでテストしてください:空の配列、欠落フィールド、最大アイテム数
- バリデーションエラーをキャッチするために、APIレスポンスをサーバーサイドでログに記録してください
- メッセージ配信率を監視してください — 急激な低下はLiquidエラーを示している可能性があります
- 重要なトランザクションメッセージ用にフォールバックテンプレートを準備しておいてください
- 複雑なLiquidロジックを使用する代わりに、バックエンドで複雑なデータを事前にフォーマットしてください
- テンプレートをキャッシュして、多数のAPI呼び出しで再利用してください
- 大量のトランザクションメッセージとマーケティングキャンペーンを分離することを検討してください
メッセージは送信されるがコンテンツが空白
メッセージは送信されるがコンテンツが空白
原因: Liquid構文エラーまたはフィールド名の不一致解決方法:
custom_dataとテンプレート間でフィールド名が完全に一致していることを確認してください(大文字小文字を区別)- タイプミスを確認してください:
{{message.custom_data.name}}であり、{{message.custm_data.name}}ではありません - 欠落フィールドをキャッチするためにdefaultフィルターを使用してください
- 本番環境に導入する前に、実際の
custom_data構造でテンプレートをテストしてください
APIエラー:リクエストボディが大きすぎます
APIエラー:リクエストボディが大きすぎます
原因:
custom_dataが2KB制限を超えています解決方法:- ペイロードから不要なフィールドを削除してください
- 可能な場合はフィールド名と値を短縮してください
- 配列を最初の3〜5アイテムに制限してください
- 大きな静的コンテンツ(完全なHTMLなど)はテンプレートに移動してください
関連ページ
メッセージパーソナライゼーション
Data Tags、ユーザー属性、セグメンテーションを含む、OneSignalのすべてのパーソナライゼーションオプションの概要。
Create Message API
custom_data、ターゲティングオプション、すべての利用可能なフィールドを含む、メッセージ送信の完全なAPIリファレンス。
Liquid構文の使用
フィルター、条件分岐、ループ、文字列操作を含む、完全なLiquid構文リファレンス。
Templates
Push、メール、SMS、アプリ内チャネル用の再利用可能なメッセージテンプレートの作成と管理。
サポートが必要ですか?サポートチームとチャットするか、
support@onesignal.comにメールしてください以下を含めてください:- 発生している問題の詳細と再現手順(利用可能な場合)
- OneSignal App ID
- 該当する場合は、External IDまたはSubscription ID
- 該当する場合は、OneSignalダッシュボードでテストしたメッセージのURL
- 関連するログまたはエラーメッセージ
