メインコンテンツへスキップ
Data Feedsを使用すると、送信時にAPIから直接リアルタイムデータをメッセージに取り込むことができます。これにより、OneSignalにデータを事前にロードすることなく、高度にパーソナライズされたコンテンツを配信できます。 次のような頻繁に変更されるデータに対してData Feedsを使用します:
  • ユーザーの現在のリワードバランス
  • 最新の注文ステータス
  • パーソナライズされた製品の推奨
他のパーソナライゼーション方法(タグやダイナミックコンテンツなど)は静的データに最適ですが、Data Feedsはライブで頻繁に変化する値に最適です
Data Feedsは現在、Journeysを通じて送信されるメールメッセージのみで利用可能です。 他のチャネルが必要ですか?この短いアンケートにご記入ください

Data Feedsの仕組み

  1. Data Feedを作成 – OneSignalがAPIに接続する方法を構成します。
  2. Data Feedをメッセージテンプレートに添付します。
  3. Liquid構文を使用してメッセージにレスポンスフィールドを挿入します。
  4. 送信時に、OneSignalは各受信者に対してAPI呼び出しを行い、レスポンスを解析し、データをメッセージに注入します。

例:リワードポイントの表示

各顧客にリワードバランスを表示したいとします:
Hi {{ first_name }},

You have {{ data_feed.rewards.points }} points!
Your membership status is {{ data_feed.rewards.status_level }}.

Keep shopping to earn more points!
Sarahがこのメールを受け取ると、{{ data_feed.rewards.points }}{{ data_feed.rewards.status_level }}の代わりに実際のポイントバランスとメンバーシップステータスが表示されます。 以下では、この例を使用してData Feedを段階的に設定する方法を示します。

Data Feedの作成と使用

1. Data Feed構成の設定

サイドバーのData > Data Feedsに移動して、既存のData Feedsのリストを表示し、新しいData Feedを作成します。 各Data Feedには次が必要です:
  • Name:フィードのリストで区別するための「Customer Rewards API」のような説明的な名前。これらは一意であることを推奨しますが、必須ではありません。
  • Alias:Liquid構文で使用するrewardsのような短い名前。これらは一意である必要があり、スペースを含むことができず、特殊記号のない小文字の英数字のみを含むことができます。
  • Method:APIに接続する方法。通常これはGETですが、POSTもサポートされています。
  • URL:APIのアドレス。Liquid構文を含めることができ、ユーザー固有のデータを取得するためにAPIを呼び出すことができます。
例えば、リワードエンドポイントは次のようにフォーマットされる可能性があります。ここでは、データタグを使用してexternal ID(OneSignalに保存)を挿入し、そのユーザーのリワードデータを取得します:
https://acme.com/customers/user_id={{ external_id }}/rewards
  • Headers:API仕様に必要なヘッダーのキーと値のペアを入力します。典型的な重要な用途は、認証情報を含めることです。これらのフィールドは、必要に応じてLiquid構文もサポートしています。
  • Body:APIが必要とする場合、JSON形式でリクエストにボディを含めることができます。このエディターは、Journey Webhooksと同様にLiquid構文をサポートしています。
例えば、上記のURL文字列の代わりに、APIがリクエストのボディでユーザーのIDを指定する必要がある場合があります:
{
	"customer_id": "{{ external_id }}"
}
完全なData Feed構成は次のようになります:

Data Feed構成の例

使用する前にフィードをテストすることを推奨します。 Test Subscriptionsを使用してテストするため、テストサブスクリプション属性がAPIから実際の結果を返すことを確認してください。 最後に、新しいData FeedをActivateして、使用できるようにします。

2. Data Feedをメッセージテンプレートに添付

OneSignalが使用できるように、Data Feedをメッセージテンプレートに添付します。
  1. Messages > Templatesに移動します
  2. Messageセクションで、Personalizationボタンを選択します

Personalizationボタンのオプション

  1. Data Feedsをトグルオンにして、フィードを選択します

メッセージコンポーザーのData Feedsセクション

  1. テンプレートを保存します

3. メッセージでデータを使用

Liquid構文を使用して、メッセージの任意の場所にレスポンスデータを挿入します。この例では、external_idが1a1-b2c3のSarahのレスポンスが次のようなシンプルなJSONブロブであるとします:
{
	"external_id": a1-b2c3,
	"points": 193,
	"status_level": "Gold"
}
ポイント数とステータスレベルをメッセージに挿入したい場合、これは典型的なドット記法で実現されます:
You have {{ data_feed.rewards.points }} points!
Your membership status is {{ data_feed.rewards.status_level }}.
これはOneSignalに次のように指示します:
  • Data Feedを使用
  • rewards Data Feedを使用
    • 復習:rewardsフィードは、受信者のexternal_idでAPIを呼び出すことを知っています
  • レスポンスから、points項目の値(193)とstatus_level項目(Gold)を挿入

要件と制限

APIは次を満たす必要があります:
  • ヘッダーに認証トークンを含むシングルステップ認証を受け入れる
  • 迅速に応答する。 250ms未満を推奨(これは送信速度に直接影響します)
  • JSONを返す。 現時点では他の形式はサポートされていません。
  • メッセージ送信のボリュームとレートを処理する。 APIのレート制限が低い場合、メッセージを迅速に配信できなくなります。
  • 妥当なサイズのペイロードを返す。 最高のパフォーマンスのために、レスポンスを50kb未満に保つことを推奨します。
現在の制限:
  • テンプレートごとに1つのData Feed。 将来的にこの制限を増やす予定です。これが必要な場合は、こちらの短いアンケートでお知らせください。
  • Data Feedごと、メッセージごとに1つのAPI呼び出し。 必要なすべてのものを1回の呼び出しで取得します。
  • Journeysのみ。 他の送信方法ではまだ利用できません。これが必要な場合は、こちらの短いアンケートでお知らせください。
  • 連鎖呼び出しなし。 1つのData Feedからのペイロードを使用して別のData Feedを呼び出すことはできません。

APIの設定

Data Feedを作成する前に、APIが次の要件を処理できることを確認してください:

認証

APIはヘッダーを介した認証を受け入れる必要があります:
Authorization: Bearer YOUR_TOKEN
または
X-API-Key: YOUR_KEY

JSONリクエストボディ

リクエストにボディを含める必要がある場合、APIはJSONを受け入れる必要があります。これは、ヘッダーにContent: application/jsonを含める必要があることを意味する場合があります。

JSONレスポンス

APIはJSONオブジェクトを返す必要があります。通常、これはヘッダーにAccept: application/jsonを含めることを意味します。

パーソナライゼーションパラメータ

通常、次のようにURLでユーザー識別子を渡します:
https://api.example.com/users/{{external_id}}/data
https://api.example.com/rewards?email={{email | url_encode}}
そして/またはボディで:
JSON
{
	"customer_id": "{{ external_id }}",
	"email": "{{ subscription.email }}"
}
このデータがOneSignalに存在することを確認してください(通常はデータタグとして、ただしカスタムイベントプロパティなどの他のオプションも利用可能です)。

レート制限

APIのレート制限を考慮してください。10,000人のユーザーに連続して送信する場合、10,000回のAPI呼び出しを行います。APIがこのボリュームを処理できることを確認してください。

エラーハンドリング

APIがエラーを返すか、ユーザーのデータがない場合、そのレシピエントにメッセージは送信されません。APIがすべての予想されるユーザーに対してデータを返すことを確認してください。

開始チェックリスト

Data Feedsを実装する前に、次の質問に答えてください:
  • メッセージに表示したいデータは何ですか?APIから取得する項目を特定したシンプルな概要から逆算して作業すると、考えを整理するのに役立ちます。
  • このデータは単一のAPIエンドポイントを介して利用可能ですか?
  • API リクエストをどのように認証しますか?
  • パーソナライズされたデータを取得するために、どの識別子または他のデータ項目を使用しますか?
  • その識別子はすでにOneSignalに保存されていますか?そうでない場合、どのように入力されますか?
  • APIは生成するリクエストのボリュームを処理できますか?
  • APIがユーザーのデータを持っていない場合はどうなりますか?

例と高度なユースケース

Data Feedsは、Liquid構文と組み合わせて、または他の機能と組み合わせて創造的な方法で使用して、より複雑なパーソナライゼーションを生成できます。

ループによる反復:カート放棄

ユーザーのカート内のアイテムの配列とカートの合計金額を返すData Feed cartがあるとします:
JSON
{
  "items": [
    {
      "name": "Blue Running Shoes",
      "price": 84.00,
      "image_url": "https://acme.com/blue-running-shoes.png"
    },
    {
      "name": "Protein Bar",
      "price": 5.99,
      "image_url": "https://acme.com/protein-bar.png"
    }
  ],
  "total": 89.99
}
カート内の各アイテムとカート合計を表示したい場合、Liquidでforループを使用できます:
HTML
<ul>
  {% for item in data_feed.cart.items %}
    <li>
      <strong>{{ item.name }}</strong><br>
      ${{ item.price }}<br>
      <img src="{{ item.image_url }}" alt="{{ item.name }}">
    </li>
  {% endfor %}
</ul>

<p>Cart total: ${{ data_feed.cart.total }}</p>

これにより次の結果が得られます:
- Blue Running Shoes
- $84.00
- <running shoes image>
- Protein Bar
- $5.99
- <protein bar image>
Cart total: $89.99
メールブロックエディターを使用している場合、特に画像やリンクを含める必要があるこの種の複雑なLiquid構文を挿入する際は、最良の結果を得るためにカスタムHTMLブロック要素を使用してください。

カスタムイベントプロパティ

前のカート放棄の例を続けて、最初にその特定のカートをどのように取得するかをどのように知ることができますか? 1つの方法は、プロパティにcart_idを含むcart_abandoned カスタムイベントによってトリガーされるJourneyを作成することです。この例では、そのイベントがAPI経由でOneSignalに送信されています:
curl
curl --request POST \
  --url https://api.onesignal.com/apps/{app_id}/custom_events \
  --header 'Accept: application/json' \
  --data '{
  "events": [
    {
      "name": "cart_abandoned",
      "external_id": "user_12345",
      "properties": {
        "cart_id": 98765
      }
    }
  ]
}'

Journeyエントリのカスタムイベント

ユーザーuser_12345は、このイベントが発火されたときにJourneyに入り、その後メールを送信するノードに到達します。そのメールテンプレートは、URLが次のように特定のカートの内容を取得するように設定されたcart Data Feedで設定されています:
https://acme.com/carts/{{ journey.event.cart_abandoned.data.cart_id }}
したがって、この特定のイベントが取り込まれてJourneyをトリガーすると:
  1. cart_idの値98765がJourneyに保存されます
  2. メールステップに到達すると、cart Data Feedはそのcart_id値を参照し、それを使用してカートAPIを呼び出します
  3. 返されたJSONプロパティが解析され、前の例と同様にメールに挿入されます

条件付き表示:注文ステータス

顧客の注文のステータスを含めたいが、注文が発送された場合にのみ追跡番号リンクを含めたいとします。これを行うには、ifステートメントを使用できます:
Your order is {{data_feed.order.status}}!

{% if data_feed.order.tracking_number != empty %}
Track it here: {{data_feed.order.tracking_url}}
{% endif %}
ここでは、tracking_numberが存在する場合にのみ追跡リンクが表示されます。

パーソナライゼーションなしの自動化

Data Feedsを使用して、受信者ごとにパーソナライズする必要なく、メッセージに最新の情報を自動的に挿入できます。 例えば、メールの上部にバナー画像を挿入し、休日や他の月次イベントに合わせて毎月変更しているとします。毎月新しい画像をOneSignalにアップロードし、すべてのテンプレートを変更することを覚えておくのではなく、CMSまたは他のアセット管理場所から現在のバナー画像URLを取得するData Feedを設定することができます。 次のようにURLに変数なしでエンドポイントを指すbanner Data Feedを設定します:
https://acme.com/assets/email-banner
これは現在のバナーURLを含むレスポンスを返します:
JSON
{
	"banner_url": "https://acme.com/assets/email-banner/2025july.png"
}
メールテンプレートを設定して、{{ data_feed.banner.banner_url }}を画像ソースURLとして使用し、今後このプロセスを自動化します。

トラブルシューティング

データが表示されない

  1. Data Feedがテンプレートに添付されていることを確認します
  2. Liquid構文がJSON構造と正確に一致していることを確認します
  3. APIエンドポイントを手動でテストして、データを返していることを確認します
  4. ユーザーが必要なデータタグ(external_idなど)を持っていることを確認します

メッセージの送信が遅い

  1. APIのレスポンス時間を確認します
  2. APIが同時リクエストを処理できることを確認します

一部の受信者がメッセージを受信していない

  1. APIがそれらのユーザーのデータを持っていない可能性があります
  2. Data Feed構成のエラーログで404またはエラーを確認します
  3. APIログで404またはエラーを確認します
  4. それらのユーザーがOneSignalで必要な識別子を持っていることを確認します