跳转到主要内容
数据源让您在发送时直接从您的 API 拉取实时数据到消息中。这让您可以提供高度个性化的内容,而无需预先将数据加载到 OneSignal 中。 当您的数据经常变化时,请使用数据源,例如:
  • 用户当前的奖励余额
  • 最新订单状态
  • 个性化产品推荐
其他个性化方法(如标签动态内容)适用于静态数据。数据源最适合实时、快速变化的值
数据源目前仅适用于通过 Journeys 发送的电子邮件消息。 需要其他渠道?填写这份简短调查

数据源的工作原理

  1. 创建数据源 – 配置 OneSignal 如何连接到您的 API。
  2. 将数据源附加到消息模板。
  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 收到这封电子邮件时,Liquid 变量将被替换为她实际的积分余额和会员状态。以下各节将逐步介绍如何设置此示例。

创建和使用数据源

1. 设置您的数据源配置

在侧边栏中导航至数据 > 数据源,查看现有数据源列表并创建新的数据源。 每个数据源必须具有:
  • 名称:描述性名称,如”客户奖励 API”,帮助您区分数据源。建议使用唯一名称,但不是必需的。
  • 别名:像 rewards 这样的简短标识符,用于 Liquid 语法(例如 {{ data_feed.rewards.points }})。必须唯一,小写字母数字字符,不含空格或特殊字符。
  • 方法:OneSignal 联系您的 API 所使用的 HTTP 方法。通常为 GET,但也支持 POST
  • URL:您的 API 端点。支持 Liquid 语法,使 OneSignal 能够获取特定用户的数据。
例如,您的奖励端点可能接受用户的 external_id(存储在 OneSignal 中)作为 URL 参数:
https://acme.com/customers/user_id={{ external_id }}/rewards
  • 标头:您的 API 所需的键值对(例如身份验证令牌)。支持 Liquid 语法。
  • 请求体:可选的 JSON 请求体。支持 Liquid 语法,与 Journey Webhooks 相同。
例如,您的 API 可能要求在请求体中传入用户 ID,而不是在 URL 中:
{
	"customer_id": "{{ subscription.external_id }}"
}
完整的数据源配置如下所示:
Data Feed configuration showing name, alias, method, URL, and headers
在投入生产之前测试您的数据源。数据源测试针对您的测试订阅运行,因此请确认这些订阅具有能从您的 API 返回真实结果的属性。
最后,激活您的新数据源,使其准备好使用。

2. 将数据源附加到您的消息模板

将您的数据源附加到消息模板,让 OneSignal 知道要使用它。
  1. 导航至消息 > 模板
  2. 在消息部分,选择个性化按钮
Personalization button in the message template editor
  1. 打开数据源并选择您的数据源
Data Feeds toggle and feed selector in the message composer
  1. 保存您的模板

3. 在消息中使用数据

使用 Liquid 语法在消息中的任何地方插入响应数据。继续奖励示例,对于 Sarah(其 external_ida1-b2c3)的 API 响应可能如下所示:
{
	"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:
  • 使用数据源
  • 使用 rewards 数据源
    • 请记住:rewards 数据源知道用收件人的 external_id 调用 API
  • 从响应中,插入 points 项的值(193)和 status_level 项的值(Gold)

要求和限制

您的 API 需要:
  • 接受单步身份验证,在标头中使用身份验证令牌
  • 快速响应。 推荐在 250 毫秒以内(这直接影响发送速度)
  • 返回 JSON。 目前不支持其他格式。
  • 处理您的发送量。 如果您的 API 速率限制较低,会减慢消息投递速度。
  • 返回合理大小的负载。 建议保持响应在 50 KB 以下以获得最佳性能。
当前限制:
  • 每个模板一个数据源。 在单次 API 响应中获取您需要的所有数据。
  • 每个数据源每条消息一次 API 调用。
  • 仅限 Journeys。 尚未适用于其他发送方法。
  • 没有链式调用。 一个数据源的负载不能用于调用另一个数据源。
需要每个模板支持多个数据源或其他渠道的支持?分享您的用例以帮助确定这些功能的优先级。

设置您的 API

在创建数据源之前,确保您的 API 能够处理以下要求:

身份验证

您的 API 应通过标头接受身份验证:
Authorization: Bearer YOUR_TOKEN
X-API-Key: YOUR_KEY

JSON 请求体

如果您需要在请求中包含请求体,您的 API 应接受 JSON。这可能意味着您的标头需要包含 Content-Type: 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}}
和/或在请求体中:
{
	"customer_id": "{{ external_id }}",
	"email": "{{ subscription.email }}"
}
确保这些数据在 OneSignal 中存在(通常作为标签,但也有其他选项,如自定义事件属性)。

速率限制

考虑您的 API 速率限制。向 10,000 个用户发送意味着快速连续进行 10,000 次 API 调用。确保您的 API 能够处理此数量。

错误处理

如果您的 API 返回错误或没有用户数据,消息不会发送给该收件人。确保您的 API 为所有预期用户返回数据。

入门清单

在实施数据源之前,请回答以下问题:
  • 我想在消息中显示什么数据?从包含要从 API 填充的项目的简单大纲开始,有助于整理思路。
  • 这些数据是否可以通过单个 API 端点获得?
  • 我将如何验证 API 请求?
  • 我将使用什么标识符或其他数据项来获取个性化数据?
  • 该标识符是否已经存储在 OneSignal 中?如果没有,将如何填充?
  • 我的 API 能否处理我将产生的请求量?
  • 如果我的 API 没有用户数据会怎样?

示例和高级用例

数据源可以与 Liquid 语法结合使用,或与其他功能创造性地结合使用,以产生更复杂的个性化效果。
假设您有一个数据源 cart,它返回用户购物车中的商品数组,以及购物车的总金额:
{
  "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 循环:
<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. 数据源已附加到模板(在个性化 > 数据源下)。
  2. 您的 Liquid 语法与 JSON 响应结构完全匹配——{{ data_feed.<alias>.<field> }}
  3. 使用相同标识符手动调用 API 端点时返回有效 JSON。
  4. 收件人在 OneSignal 中存储了所需的标识符(例如 external_id)。

为什么消息发送缓慢?

数据源 API 调用在发送时对每个收件人运行。如果您的 API 响应缓慢或无法处理并发请求,消息投递速度会成比例降低。目标响应时间在 250 毫秒以内,并确保您的基础设施能够处理您的发送量。

为什么某些收件人没有收到消息?

如果某个收件人的数据源 API 调用失败——由于 404、超时或数据缺失——OneSignal 将完全跳过该收件人。请检查数据源配置中的错误日志以及您自己的 API 日志中的失败情况。验证这些用户在 OneSignal 中是否具有所需的标识符。

我能在一个模板中使用多个数据源吗?

目前不支持。每个模板支持一个数据源。在单次 API 响应中获取您需要的所有数据。如果您需要多个数据源,请分享您的用例

数据源是否适用于推送通知或短信?

否。数据源目前仅适用于通过 Journeys 发送的电子邮件消息。计划支持其他渠道——分享您的用例以帮助确定优先级。

如果我的 API 在消息发送时宕机会怎样?

OneSignal 将跳过任何数据源调用失败的收件人。消息不会发送给该收件人,也不会插入任何回退值。请在计划发送期间监控您的 API 正常运行时间和错误率。

相关页面

Liquid 语法

OneSignal 消息中 Liquid 模板的完整参考。

Journeys

构建触发数据源电子邮件的自动化消息工作流程。

自定义事件

触发 Journeys 并传递事件属性以用于数据源 URL。

消息个性化

所有个性化方法的概述——标签、Liquid、动态内容和数据源。