메인 콘텐츠로 건너뛰기
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를 호출할 수 있습니다.
예를 들어, 보상 엔드포인트는 다음과 같이 형식화될 수 있습니다. 여기서 데이터 태그를 사용하여 (OneSignal에 저장된) 외부 ID를 삽입하여 해당 사용자의 보상 데이터를 가져옵니다:
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 구성 예시

사용하기 전에 피드를 테스트하는 것이 좋습니다. 테스트 구독을 사용하여 테스트하므로 테스트 구독 속성이 API에서 실제 결과를 반환하는지 확인하세요. 마지막으로 새 Data Feed를 활성화하여 사용할 준비를 하세요.

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 미만으로 유지하는 것이 좋습니다.
현재 제한 사항:
  • 템플릿당 하나의 Data Feed. 향후 이 제한을 늘릴 예정입니다. 이것이 필요하다면 여기에서 짧은 설문조사를 작성하세요.
  • 메시지당 Data Feed당 하나의 API 호출. 한 번의 호출로 필요한 모든 것을 가져옵니다.
  • Journeys만 해당. 아직 다른 전송 방법에는 사용할 수 없습니다. 이것이 필요하다면 여기에서 짧은 설문조사를 작성하세요.
  • 연쇄 호출 없음. 한 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 블록 요소를 사용하세요.

사용자 지정 이벤트 속성

이전 장바구니 포기 예제를 계속하여 처음에 해당 특정 장바구니를 가져오는 방법을 어떻게 알 수 있을까요? 한 가지 방법은 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에 진입한 다음 이메일을 보내는 노드에 도달합니다. 해당 이메일 템플릿은 cart Data Feed로 설정되어 있으며 URL은 다음과 같이 특정 장바구니의 내용을 검색하도록 설정됩니다:
https://acme.com/carts/{{ journey.event.cart_abandoned.data.cart_id }}
따라서 이 특정 이벤트가 수집되고 Journey를 트리거하면:
  1. 98765cart_id 값이 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에 필요한 식별자를 가지고 있는지 확인