콘텐츠로 건너뛰기

이커머스 이벤트 기록

타입이 지정된 이벤트 클래스와 logEcommerceEvent를 사용하여 Braze Android, Swift 및 Web SDK를 통해 이커머스 권장 이벤트를 기록하는 방법을 알아봅니다. 이벤트 속성정보 스키마, 플랫폼 기능 및 수집 유효성 검사에 대한 자세한 내용은 권장 이벤트 및 이벤트 유효성 검사 및 문제 해결을 참조하세요.

이벤트 스키마

여섯 가지 이커머스 권장 이벤트는 모든 플랫폼에서 동일한 주문 수준 스키마를 사용합니다. 각 이벤트 페이로드를 구성할 때 다음 속성정보 표를 참고하세요. 전체 유효성 검사 동작과 REST API 예시가 포함된 표준 스키마는 권장 이벤트를 참조하세요. 세분화, Canvas 템플릿, 보고 등의 플랫폼 기능은 이커머스 이벤트 사용 방법을 참조하세요.

사용자가 제품 상세 페이지를 조회할 때 트리거합니다.

이벤트 속성정보

속성정보 이름 데이터 유형 필수 설명
product_id 문자열 예 고유 제품 식별자(예: SKU 또는 품목 ID)입니다.
product_name 문자열 예 제품 표시 이름입니다.
variant_id 문자열 예 제품 배리언트 식별자(예: shirt_medium_blue)입니다.
image_url 문자열 아니요 제품 이미지 URL입니다.
product_url 문자열 아니요 자세한 정보를 확인할 수 있는 제품 페이지 URL입니다.
price 플로트 예 조회 시점의 배리언트 단가입니다.
currency 문자열 예 세 글자로 된 ISO 4217 코드(예: USD 또는 EUR)입니다.
source 문자열 예 이벤트가 발생한 소스(예: web, ios 또는 android)입니다.
type 문자열 배열 아니요 재입고 및 가격 인하 알림에 Braze 카탈로그 트리거 기능을 사용하려면 필요합니다. 허용되는 값: "price_drop", "back_in_stock".
catalog_name 문자열 아니요 이 이벤트로 생성된 재입고 또는 가격 인하 구독이 속하는 카탈로그입니다. 생략하면 워크스페이스의 대체 카탈로그가 사용됩니다. 최상위 속성정보여야 하며, metadata 내부에 중첩된 catalog_name은 무시됩니다.
metadata 객체 아니요 유연한 키-값 페어(예: category 또는 brand)입니다.

사용자의 장바구니 내용이 변경될 때마다 트리거합니다. 전체 장바구니 교체(action을 생략하거나 replace로 설정) 또는 증분 업데이트(add 또는 remove)를 사용하세요.

이벤트 속성정보

속성정보 데이터 유형 필수 설명
cart_id 문자열 예 장바구니의 고유 식별자입니다. 사용자의 장바구니 매핑을 위해 장바구니, 결제, 주문 이벤트 전반에서 공유됩니다. 결제 또는 주문 완료 후 재사용 규칙은 결제 또는 주문 후 장바구니 ID를 참조하세요.
action 문자열 아니요 add(수량 증가 또는 품목 추가), remove(수량 감소, 0이 되면 품목 제거) 또는 replace(전체 장바구니 교체, action을 생략한 것과 동일)입니다.
total_value 플로트 조건부 action이 생략되었거나 replace인 경우 필수이며, 장바구니 합계로 저장됩니다. action이 add 또는 remove인 경우 선택 사항입니다.

action이 add 또는 remove인 경우 이 값은 장바구니에 저장되지 않으며 이전에 저장된 합계를 지우지 않습니다. 장바구니가 add 또는 remove로만 업데이트되면 total_value가 저장되지 않으며, {% shopping_cart %} 태그는 각 제품의 price에 quantity를 곱한 값을 합산합니다.
subtotal_value 플로트 아니요 장바구니 소계(할인 후, 세금/배송비 전)입니다. 장바구니에 저장되지 않으며 {% shopping_cart %} Liquid 태그로 사용할 수 없습니다.
tax 플로트 아니요 장바구니에 적용된 총 세금입니다. 장바구니에 저장되지 않으며 {% shopping_cart %} Liquid 태그로 사용할 수 없습니다.
shipping 플로트 아니요 장바구니의 총 배송비입니다. 장바구니에 저장되지 않으며 {% shopping_cart %} Liquid 태그로 사용할 수 없습니다.
currency 문자열 예 세 글자로 된 ISO 4217 코드입니다.
products 배열 예 이번 업데이트의 품목입니다. 제품 속성정보 표를 참조하세요.
source 문자열 예 이벤트가 발생한 소스입니다.
metadata 객체 아니요 추가 이벤트 수준 데이터를 위한 유연한 키-값 페어입니다.

제품 속성정보 (products[])

속성정보 데이터 유형 필수 설명
product_id 문자열 예 고유 제품 식별자입니다.
product_name 문자열 예 제품 표시 이름입니다.
variant_id 문자열 예 배리언트 식별자입니다.
image_url 문자열 아니요 제품 이미지 URL입니다.
product_url 문자열 아니요 제품 페이지 URL입니다.
quantity 정수 예 전체 교체의 경우 이 품목의 장바구니 내 수량입니다. add 또는 remove의 경우 추가하거나 제거할 수량입니다.
price 플로트 예 배리언트 단가입니다.
metadata 객체 아니요 유연한 키-값 페어(예: color 또는 size)입니다.

사용자가 결제 흐름을 시작할 때 트리거합니다.

이벤트 속성정보

속성정보 데이터 유형 필수 설명
checkout_id 문자열 예 결제 세션의 고유 식별자입니다.
cart_id 문자열 아니요 장바구니 식별자입니다. 사용자의 장바구니 매핑을 위해 장바구니, 결제, 주문 이벤트 전반에서 공유됩니다.
total_value 플로트 예 결제의 총 금액입니다.
subtotal_value 플로트 아니요 소계(할인 후, 세금/배송비 전)입니다.
tax 플로트 아니요 결제에 적용된 총 세금입니다.
shipping 플로트 아니요 총 배송비입니다.
currency 문자열 예 세 글자로 된 ISO 4217 코드입니다.
products 배열 예 결제 중인 품목입니다. 제품 속성정보 표를 참조하세요.
source 문자열 예 이벤트가 발생한 소스입니다.
metadata 객체 아니요 유연한 키-값 페어입니다. 인식되는 하위 속성정보: checkout_url(문자열).

제품 속성정보 (products[])

속성정보 데이터 유형 필수 설명
product_id 문자열 예 고유 제품 식별자입니다.
product_name 문자열 예 제품 표시 이름입니다.
variant_id 문자열 예 배리언트 식별자입니다.
image_url 문자열 아니요 제품 이미지 URL입니다.
product_url 문자열 아니요 제품 페이지 URL입니다.
quantity 정수 예 장바구니에 담긴 수량입니다.
price 플로트 예 배리언트 단가입니다.
metadata 객체 아니요 유연한 키-값 페어(예: color 또는 size)입니다.

주문이 성공적으로 완료되거나 결제가 확인될 때 트리거합니다.

이벤트 속성정보

속성정보 데이터 유형 필수 설명
order_id 문자열 예 주문의 고유 식별자입니다.
cart_id 문자열 아니요 장바구니 식별자입니다. 사용자의 장바구니 매핑을 위해 장바구니, 결제, 주문 이벤트 전반에서 공유됩니다.
total_value 플로트 예 주문의 총 금액입니다.
subtotal_value 플로트 아니요 소계(할인 후, 세금/배송비 전)입니다.
tax 플로트 아니요 주문에 적용된 총 세금입니다.
shipping 플로트 아니요 총 배송비입니다.
currency 문자열 예 세 글자로 된 ISO 4217 코드입니다.
total_discounts 플로트 아니요 주문에 적용된 총 할인 금액입니다.
discounts 배열 아니요 적용된 할인의 상세 목록입니다. 각 할인 객체는 code(문자열), amount(플로트), type(문자열)을 지원합니다.
products 배열 예 주문에 포함된 품목입니다. 제품 속성정보 표를 참조하세요.
source 문자열 예 이벤트가 발생한 소스입니다.
metadata 객체 아니요 유연한 키-값 페어입니다. 인식되는 하위 속성정보: order_status_url(문자열).

제품 속성정보 (products[])

속성정보 데이터 유형 필수 설명
product_id 문자열 예 고유 제품 식별자입니다.
product_name 문자열 예 제품 표시 이름입니다.
variant_id 문자열 예 배리언트 식별자입니다.
image_url 문자열 아니요 제품 이미지 URL입니다.
product_url 문자열 아니요 제품 페이지 URL입니다.
quantity 정수 예 주문 수량입니다.
price 플로트 예 배리언트 단가입니다.
metadata 객체 아니요 유연한 키-값 페어(예: color 또는 size)입니다.

주문이 취소될 때 트리거합니다.

이벤트 속성정보

속성정보 데이터 유형 필수 설명
order_id 문자열 예 주문의 고유 식별자입니다.
total_value 플로트 예 취소되는 주문의 총 금액입니다. 절대 금액(0 이상)을 전송하세요. 차감은 Braze에서 처리합니다.
subtotal_value 플로트 아니요 소계(할인 후, 세금/배송비 전)입니다.
tax 플로트 아니요 주문에 적용된 총 세금입니다.
shipping 플로트 아니요 총 배송비입니다.
currency 문자열 예 세 글자로 된 ISO 4217 코드입니다.
total_discounts 플로트 아니요 주문에 적용된 총 할인 금액입니다.
discounts 배열 아니요 적용된 할인의 상세 목록입니다.
cancel_reason 문자열 예 주문이 취소된 사유입니다.
products 배열 예 취소된 주문의 품목입니다. 제품 속성정보 표를 참조하세요.
source 문자열 예 이벤트가 발생한 소스입니다.
metadata 객체 아니요 유연한 키-값 페어입니다. 인식되는 하위 속성정보: order_status_url(문자열).

제품 속성정보 (products[])

속성정보 데이터 유형 필수 설명
product_id 문자열 예 고유 제품 식별자입니다.
product_name 문자열 예 제품 표시 이름입니다.
variant_id 문자열 예 배리언트 식별자입니다.
image_url 문자열 아니요 제품 이미지 URL입니다.
product_url 문자열 아니요 제품 페이지 URL입니다.
quantity 정수 예 주문 수량입니다.
price 플로트 예 배리언트 단가입니다.
metadata 객체 아니요 유연한 키-값 페어(예: color 또는 size)입니다.

전체 또는 부분 환불이 발생할 때 트리거합니다. 부분 환불의 경우 total_value를 원래 주문 합계가 아닌 환불 금액으로만 설정하세요.

이벤트 속성정보

속성정보 데이터 유형 필수 설명
order_id 문자열 예 원래 주문의 고유 식별자입니다.
total_value 플로트 예 환불의 총 금액입니다. 절대 금액(0 이상)을 전송하세요. 매출 조정은 Braze에서 처리합니다.
currency 문자열 예 세 글자로 된 ISO 4217 코드입니다.
total_discounts 플로트 아니요 원래 적용된 총 할인 금액입니다.
discounts 배열 아니요 할인의 상세 목록입니다.
products 배열 예 환불되는 품목입니다. 제품 속성정보 표를 참조하세요.
source 문자열 예 이벤트가 발생한 소스입니다.
metadata 객체 아니요 유연한 키-값 페어입니다. 인식되는 하위 속성정보: order_status_url(문자열).

제품 속성정보 (products[])

속성정보 데이터 유형 필수 설명
product_id 문자열 예 고유 제품 식별자입니다.
product_name 문자열 예 제품 표시 이름입니다.
variant_id 문자열 예 배리언트 식별자입니다.
image_url 문자열 아니요 제품 이미지 URL입니다.
product_url 문자열 아니요 제품 페이지 URL입니다.
quantity 정수 예 환불 수량입니다.
price 플로트 예 배리언트 단가입니다.
metadata 객체 아니요 유연한 키-값 페어(예: color 또는 size)입니다.

Android

Android SDK 42.3.0+는 타입이 지정된 이커머스 이벤트 클래스를 제공합니다. 이 클래스는 생성 시 클라이언트 측 유효성 검사를 수행하고, Braze.logEcommerceEvent를 호출하면 자동으로 snake_case 직렬화를 적용합니다.

Android 클래스 이벤트 이름 참고
ProductViewedEvent ecommerce.product_viewed 제품 필드를 properties의 최상위 수준으로 평탄화합니다(products 배열 없음). 카탈로그 재입고 및 가격 인하 트리거를 위한 선택 사항인 type(43.0.0+) 및 catalogName 매개변수를 지원합니다. 이전 버전에서는 logCustomEvent 또는 REST API를 사용하여 해당 속성정보를 전송하세요.
CartUpdatedEvent ecommerce.cart_updated action 속성정보에 CartUpdatedAction(ADD, REMOVE, REPLACE)을 사용합니다.
CheckoutStartedEvent ecommerce.checkout_started  
OrderPlacedEvent ecommerce.order_placed 선택 사항인 cartId, totalDiscounts, discounts를 지원합니다.

공유 빌딩 블록

  • EcommerceProduct: 장바구니, 결제 및 주문 이벤트의 라인 항목입니다.
    • 필수: productId, productName, variantId, price, quantity(음수가 아닌 Long)
    • 선택 사항: imageUrl, productUrl, metadata
  • BrazeProperties: 이벤트 수준 또는 제품 수준의 metadata입니다. 키는 255자 이하의 비어 있지 않은 문자열이어야 하며 앞에 달러 기호($)가 올 수 없습니다.

클라이언트 측 유효성 검사

잘못된 페이로드는 이벤트 클래스를 생성할 때 IllegalArgumentException을 발생시키므로 이벤트가 대기줄에 추가되지 않습니다. 일반적인 규칙:

필드 또는 규칙 유효성 검사
문자열 ID 및 이름(product_id, product_name, variant_id, cart_id, checkout_id, order_id, source, 선택 사항 URL) 비어 있지 않으며 최대 255자
price, total_value, total_discounts 0 이상이어야 합니다
currency 유효한 ISO 4217 코드(SDK에서 공백 제거 후 대문자로 변환)
products(장바구니, 결제, 주문 이벤트) 최소 하나의 EcommerceProduct
quantity(제품당) 음수가 아닌 정수

전송 시 직렬화된 속성정보가 SDK 크기 제한을 초과하면 logEcommerceEvent는 오류를 기록하고 이벤트를 전송하지 않습니다.

코드 예제

import com.braze.Braze
import com.braze.models.outgoing.BrazeProperties
import com.braze.models.recommended.ecommerce.ProductViewedEvent

val metadata = BrazeProperties()
  .addProperty("category", "Apparel")

val productViewedEvent = ProductViewedEvent(
  productId = "PROD101",
  productName = "Silk Scarf",
  variantId = "SCARF_RED_SILK",
  price = 150.00,
  currency = "EUR",
  source = "https://braze-fashion.eu",
  imageUrl = "https://braze-fashion.eu/images/scarf_red.jpg",
  productUrl = "https://braze-fashion.eu/products/scarf",
  metadata = metadata,
  type = listOf("price_drop", "back_in_stock"),
  catalogName = "scarves",
)

Braze.getInstance(context).logEcommerceEvent(productViewedEvent)

CartUpdatedAction을 사용하여 action을 설정합니다:

값 와이어 값 설명
CartUpdatedAction.ADD add 수량을 늘리거나 라인을 추가합니다.
CartUpdatedAction.REMOVE remove 수량을 줄이고, 0이 되면 라인을 제거합니다.
CartUpdatedAction.REPLACE replace 전체 장바구니를 교체합니다(기본값).
import com.braze.Braze
import com.braze.models.recommended.ecommerce.CartUpdatedAction
import com.braze.models.recommended.ecommerce.CartUpdatedEvent
import com.braze.models.recommended.ecommerce.EcommerceProduct

val product = EcommerceProduct(
  productId = "SKU-RUN-4821",
  productName = "Ultraboost Running Shoe",
  variantId = "UB-BLK-11",
  price = 189.99,
  quantity = 1,
)

val cartUpdatedEvent = CartUpdatedEvent(
  cartId = "cart_abc123",
  currency = "USD",
  source = "android",
  totalValue = 189.99,
  products = listOf(product),
  action = CartUpdatedAction.ADD,
)

Braze.getInstance(context).logEcommerceEvent(cartUpdatedEvent)
import com.braze.Braze
import com.braze.models.outgoing.BrazeProperties
import com.braze.models.recommended.ecommerce.CheckoutStartedEvent
import com.braze.models.recommended.ecommerce.EcommerceProduct

val products = listOf(
  EcommerceProduct(
    productId = "SKU-RUN-4821",
    productName = "Ultraboost Running Shoe",
    variantId = "UB-BLK-11",
    price = 189.99,
    quantity = 1,
  ),
)

val checkoutStartedEvent = CheckoutStartedEvent(
  checkoutId = "chk_88291",
  currency = "USD",
  source = "android",
  totalValue = 234.96,
  products = products,
  cartId = "cart_abc123",
  metadata = BrazeProperties().addProperty("checkout_url", "https://www.example.com/checkout/chk_88291"),
)

Braze.getInstance(context).logEcommerceEvent(checkoutStartedEvent)
import com.braze.Braze
import com.braze.models.outgoing.BrazeProperties
import com.braze.models.recommended.ecommerce.EcommerceProduct
import com.braze.models.recommended.ecommerce.OrderPlacedEvent

val products = listOf(
  EcommerceProduct(
    productId = "SKU-RUN-4821",
    productName = "Ultraboost Running Shoe",
    variantId = "UB-BLK-11",
    price = 189.99,
    quantity = 1,
  ),
)

val orderPlacedEvent = OrderPlacedEvent(
  orderId = "ord_77821",
  currency = "USD",
  source = "android",
  totalValue = 224.96,
  products = products,
  cartId = "cart_abc123",
  totalDiscounts = 10.0,
  discounts = listOf(
    mapOf("code" to "SPRING10", "amount" to 10.0, "type" to "percentage"),
  ),
  metadata = BrazeProperties().addProperty("order_status_url", "https://www.example.com/orders/ord_77821/status"),
)

Braze.getInstance(context).logEcommerceEvent(orderPlacedEvent)

Braze는 이 이벤트에 대한 타입이 지정된 SDK 클래스를 제공하지 않습니다. ecommerce.order_cancelled 이벤트 스키마와 일치하는 페이로드로 logCustomEvent를 사용하세요.

import com.braze.Braze
import com.braze.models.outgoing.BrazeProperties
import org.json.JSONArray
import org.json.JSONObject

val properties = BrazeProperties(
  JSONObject()
    .put("order_id", "ord_77821")
    .put("total_value", 224.96)
    .put("currency", "USD")
    .put("cancel_reason", "customer_request")
    .put("source", "android")
    .put(
      "products",
      JSONArray().put(
        JSONObject()
          .put("product_id", "SKU-RUN-4821")
          .put("product_name", "Ultraboost Running Shoe")
          .put("variant_id", "UB-BLK-11")
          .put("quantity", 1)
          .put("price", 189.99),
      ),
    ),
)

Braze.getInstance(context).logCustomEvent("ecommerce.order_cancelled", properties)

Braze는 이 이벤트에 대한 타입이 지정된 SDK 클래스를 제공하지 않습니다. ecommerce.order_refunded 이벤트 스키마와 일치하는 페이로드로 logCustomEvent를 사용하세요.

import com.braze.Braze
import com.braze.models.outgoing.BrazeProperties
import org.json.JSONArray
import org.json.JSONObject

val properties = BrazeProperties(
  JSONObject()
    .put("order_id", "ord_77821")
    .put("total_value", 189.99)
    .put("currency", "USD")
    .put("source", "android")
    .put(
      "products",
      JSONArray().put(
        JSONObject()
          .put("product_id", "SKU-RUN-4821")
          .put("product_name", "Ultraboost Running Shoe")
          .put("variant_id", "UB-BLK-11")
          .put("quantity", 1)
          .put("price", 189.99),
      ),
    ),
)

Braze.getInstance(context).logCustomEvent("ecommerce.order_refunded", properties)
import com.braze.Braze;
import com.braze.models.outgoing.BrazeProperties;
import com.braze.models.recommended.ecommerce.ProductViewedEvent;

BrazeProperties metadata = new BrazeProperties()
    .addProperty("category", "Apparel");

ProductViewedEvent productViewedEvent = new ProductViewedEvent(
    /* productId */ "PROD101",
    /* productName */ "Silk Scarf",
    /* variantId */ "SCARF_RED_SILK",
    /* price */ 150.00,
    /* currency */ "EUR",
    /* source */ "https://braze-fashion.eu",
    /* imageUrl */ "https://braze-fashion.eu/images/scarf_red.jpg",
    /* productUrl */ "https://braze-fashion.eu/products/scarf",
    /* metadata */ metadata,
    /* type */ Arrays.asList("price_drop", "back_in_stock"),
    /* catalogName */ "scarves"
);

Braze.getInstance(context).logEcommerceEvent(productViewedEvent);

CartUpdatedAction을 사용하여 action을 설정합니다:

값 와이어 값 설명
CartUpdatedAction.ADD add 수량을 늘리거나 라인을 추가합니다.
CartUpdatedAction.REMOVE remove 수량을 줄이고, 0이 되면 라인을 제거합니다.
CartUpdatedAction.REPLACE replace 전체 장바구니를 교체합니다(기본값).
import com.braze.Braze;
import com.braze.models.recommended.ecommerce.CartUpdatedAction;
import com.braze.models.recommended.ecommerce.CartUpdatedEvent;
import com.braze.models.recommended.ecommerce.EcommerceProduct;
import java.util.Collections;

EcommerceProduct product = new EcommerceProduct(
    /* productId */ "SKU-RUN-4821",
    /* productName */ "Ultraboost Running Shoe",
    /* variantId */ "UB-BLK-11",
    /* price */ 189.99,
    /* quantity */ 1
);

CartUpdatedEvent cartUpdatedEvent = new CartUpdatedEvent(
    /* cartId */ "cart_abc123",
    /* currency */ "USD",
    /* source */ "android",
    /* totalValue */ 189.99,
    /* products */ Collections.singletonList(product),
    /* metadata */ null,
    /* action */ CartUpdatedAction.ADD
);

Braze.getInstance(context).logEcommerceEvent(cartUpdatedEvent);
import com.braze.Braze;
import com.braze.models.outgoing.BrazeProperties;
import com.braze.models.recommended.ecommerce.CheckoutStartedEvent;
import com.braze.models.recommended.ecommerce.EcommerceProduct;
import java.util.Collections;

EcommerceProduct product = new EcommerceProduct(
    /* productId */ "SKU-RUN-4821",
    /* productName */ "Ultraboost Running Shoe",
    /* variantId */ "UB-BLK-11",
    /* price */ 189.99,
    /* quantity */ 1
);

BrazeProperties metadata = new BrazeProperties()
    .addProperty("checkout_url", "https://www.example.com/checkout/chk_88291");

CheckoutStartedEvent checkoutStartedEvent = new CheckoutStartedEvent(
    /* checkoutId */ "chk_88291",
    /* currency */ "USD",
    /* source */ "android",
    /* totalValue */ 234.96,
    /* products */ Collections.singletonList(product),
    /* cartId */ "cart_abc123",
    /* metadata */ metadata
);

Braze.getInstance(context).logEcommerceEvent(checkoutStartedEvent);
import com.braze.Braze;
import com.braze.models.outgoing.BrazeProperties;
import com.braze.models.recommended.ecommerce.EcommerceProduct;
import com.braze.models.recommended.ecommerce.OrderPlacedEvent;
import java.util.Collections;

EcommerceProduct product = new EcommerceProduct(
    /* productId */ "SKU-RUN-4821",
    /* productName */ "Ultraboost Running Shoe",
    /* variantId */ "UB-BLK-11",
    /* price */ 189.99,
    /* quantity */ 1
);

BrazeProperties metadata = new BrazeProperties()
    .addProperty("order_status_url", "https://www.example.com/orders/ord_77821/status");

OrderPlacedEvent orderPlacedEvent = new OrderPlacedEvent(
    /* orderId */ "ord_77821",
    /* currency */ "USD",
    /* source */ "android",
    /* totalValue */ 224.96,
    /* products */ Collections.singletonList(product),
    /* cartId */ "cart_abc123",
    /* totalDiscounts */ 10.0,
    /* discounts */ null,
    /* metadata */ metadata
);

Braze.getInstance(context).logEcommerceEvent(orderPlacedEvent);

Braze는 이 이벤트에 대한 타입이 지정된 SDK 클래스를 제공하지 않습니다. ecommerce.order_cancelled 이벤트 스키마와 일치하는 페이로드로 logCustomEvent를 사용하세요.

import com.braze.Braze;
import com.braze.models.outgoing.BrazeProperties;
import org.json.JSONArray;
import org.json.JSONObject;

Braze.getInstance(context).logCustomEvent(
    "ecommerce.order_cancelled",
    new BrazeProperties(new JSONObject()
        .put("order_id", "ord_77821")
        .put("total_value", 224.96)
        .put("currency", "USD")
        .put("cancel_reason", "customer_request")
        .put("source", "android")
        .put("products", new JSONArray()
            .put(new JSONObject()
                .put("product_id", "SKU-RUN-4821")
                .put("product_name", "Ultraboost Running Shoe")
                .put("variant_id", "UB-BLK-11")
                .put("quantity", 1)
                .put("price", 189.99)))));

Braze는 이 이벤트에 대한 타입이 지정된 SDK 클래스를 제공하지 않습니다. ecommerce.order_refunded 이벤트 스키마와 일치하는 페이로드로 logCustomEvent를 사용하세요.

import com.braze.Braze;
import com.braze.models.outgoing.BrazeProperties;
import org.json.JSONArray;
import org.json.JSONObject;

Braze.getInstance(context).logCustomEvent(
    "ecommerce.order_refunded",
    new BrazeProperties(new JSONObject()
        .put("order_id", "ord_77821")
        .put("total_value", 189.99)
        .put("currency", "USD")
        .put("source", "android")
        .put("products", new JSONArray()
            .put(new JSONObject()
                .put("product_id", "SKU-RUN-4821")
                .put("product_name", "Ultraboost Running Shoe")
                .put("variant_id", "UB-BLK-11")
                .put("quantity", 1)
                .put("price", 189.99)))));

iOS

Swift SDK는 타입이 지정된 이커머스 이벤트 클래스(ProductViewedEvent, CartUpdatedEvent, CheckoutStartedEvent, OrderPlacedEvent)를 제공하며, 이 클래스로 이벤트를 빌드하여 logEcommerceEvent에 전달합니다. 장바구니, 결제 및 주문 이벤트의 제품에는 ProductLineItem을 사용합니다. 각 이니셜라이저는 오류를 발생시킬 수 있으므로(throwing) try?로 래핑하고, 생성에 성공한 경우에만 이벤트를 기록합니다. 이 기능은 Swift SDK 버전 15.0.0 이상에서 사용할 수 있습니다.

ecommerce.order_cancelled 및 ecommerce.order_refunded는 타입이 지정된 Swift SDK 클래스로 제공되지 않습니다. logCustomEvent를 사용하여 기록하세요.

코드 예제

if let productViewedEvent = try? Braze.Ecommerce.ProductViewedEvent(
    productId: "4111176",
    productName: "Torchie runners",
    variantId: "4111176700",
    imageUrl: "https://braze-apparel.com/images/products/large/torchie-runners.jpg",
    productUrl: "https://braze-apparel.com/footwear-categories/sneakers/braze-orange-torchie-runners/",
    price: 85,
    currency: "GBP",
    source: "https://braze-apparel.com/",
    metadata: [
        "color": "ORANGE",
        "size": "6",
        "brand": "Braze"
    ],
    type: ["price_drop", "back_in_stock"],
    catalogName: "footwear"
) {
    AppDelegate.braze?.logEcommerceEvent(productViewedEvent)
}
if let productLine = try? Braze.Ecommerce.ProductLineItem(
    productId: "8266836345064",
    productName: "Classic T-Shirt",
    variantId: "44610569208040",
    imageUrl: "https://braze-apparel.com/images/tshirt-blue-medium.jpg",
    productUrl: "https://braze-apparel.com/products/classic-tshirt?variant=44610569208040",
    quantity: 2,
    price: 99.99,
    metadata: [
        "sku": "TSH-BLU-M",
        "color": "BLUE",
        "size": "Medium",
        "brand": "Braze"
    ]
), let cartUpdatedEvent = try? Braze.Ecommerce.CartUpdatedEvent(
    cartId: "cart_12345",
    totalValue: 199.98,
    currency: "USD",
    products: [productLine],
    source: "https://braze-apparel.com",
    metadata: [:]
) {
    AppDelegate.braze?.logEcommerceEvent(cartUpdatedEvent)
}
if let productLine = try? Braze.Ecommerce.ProductLineItem(
    productId: "632910392",
    productName: "Wireless Headphones",
    variantId: "808950810",
    quantity: 1,
    price: 199.98,
    metadata: [
        "sku": "WH-BLK-PRO",
        "color": "Black",
        "brand": "BrazeAudio"
    ]
), let checkoutStartedEvent = try? Braze.Ecommerce.CheckoutStartedEvent(
    checkoutId: "checkout_abc123",
    cartId: "cart_12345",
    totalValue: 199.98,
    currency: "USD",
    products: [productLine],
    source: "https://braze-audio.com",
    metadata: [
        "checkout_url": "https://checkout.braze-audio.com/abc123"
    ]
) {
    AppDelegate.braze?.logEcommerceEvent(checkoutStartedEvent)
}
if let productLine = try? Braze.Ecommerce.ProductLineItem(
    productId: "632910392",
    productName: "Wireless Headphones",
    variantId: "808950810",
    quantity: 1,
    price: 199.98,
    metadata: [
        "sku": "WH-BLK-PRO",
        "color": "Black",
        "brand": "BrazeAudio"
    ]
), let orderPlacedEvent = try? Braze.Ecommerce.OrderPlacedEvent(
    orderId: "order_67890",
    cartId: "cart_12345",
    totalValue: 189.98,
    currency: "USD",
    totalDiscounts: 10.00,
    discounts: [.structured(code: "SAVE10", amount: 10.00, type: "fixed")],
    products: [productLine],
    source: "https://braze-audio.com",
    metadata: [
        "order_status_url": "https://braze-audio.com/orders/67890/status",
        "order_number": "ORD-2024-001234",
        "tags": ["electronics", "audio"],
        "referring_site": "https://www.e-referrals.com",
        "payment_gateway_names": ["tap2pay", "dotcash"]
    ]
) {
    AppDelegate.braze?.logEcommerceEvent(orderPlacedEvent)
}

Braze는 이 이벤트에 대해 타입이 지정된 SDK 클래스를 제공하지 않습니다. ecommerce.order_cancelled 이벤트 스키마와 일치하는 페이로드로 logCustomEvent를 사용하세요.

let discounts: [[String: Any]] = [
    [
        "code": "SAVE10",
        "amount": 10.00
    ]
]

let products: [[String: Any]] = [
    [
        "product_id": "632910392",
        "product_name": "Wireless Headphones",
        "variant_id": "808950810",
        "quantity": 1,
        "price": 199.98,
        "metadata": [
            "sku": "WH-BLK-PRO",
            "color": "Black",
            "brand": "BrazeAudio"
        ]
    ]
]

let properties: [String: Any] = [
    "order_id": "order_67890",
    "cancel_reason": "customer changed mind",
    "total_value": 189.98,
    "subtotal_value": 169.98,
    "tax": 14.40,
    "shipping": 5.60,
    "currency": "USD",
    "total_discounts": 10.00,
    "discounts": discounts,
    "products": products,
    "source": "https://braze-audio.com",
    "metadata": [
        "order_status_url": "https://braze-audio.com/orders/67890/status",
        "order_number": "ORD-2024-001234",
        "tags": ["cancelled", "customer_request"]
    ]
]

AppDelegate.braze?.logCustomEvent(name: "ecommerce.order_cancelled", properties: properties)

Braze는 이 이벤트에 대해 타입이 지정된 SDK 클래스를 제공하지 않습니다. ecommerce.order_refunded 이벤트 스키마와 일치하는 페이로드로 logCustomEvent를 사용하세요.

let discounts: [[String: Any]] = [
    [
        "code": "SAVE5",
        "amount": 5.00
    ]
]

let products: [[String: Any]] = [
    [
        "product_id": "632910392",
        "product_name": "Wireless Headphones",
        "variant_id": "808950810",
        "quantity": 1,
        "price": 99.99,
        "metadata": [
            "sku": "WH-BLK-PRO",
            "color": "Black",
            "brand": "BrazeAudio"
        ]
    ]
]

let properties: [String: Any] = [
    "order_id": "order_67890",
    "total_value": 99.99,
    "currency": "USD",
    "total_discounts": 5.00,
    "discounts": discounts,
    "products": products,
    "source": "https://braze-audio.com",
    "metadata": [
        "order_status_url": "https://braze-audio.com/orders/67890/status",
        "order_note": "Customer requested refund due to defective item",
        "order_number": "ORD-2024-001234",
        "tags": ["refund", "defective"]
    ]
]

AppDelegate.braze?.logCustomEvent(name: "ecommerce.order_refunded", properties: properties)

웹

웹 SDK 6.8.0 이상에서는 이벤트 name과 properties를 사용하여 logEcommerceEvent를 호출합니다. 레거시 SDK 버전에서는 이벤트 이름과 속성정보 객체를 사용하여 logCustomEvent를 호출합니다. ecommerce.order_cancelled 및 ecommerce.order_refunded는 logCustomEvent를 사용합니다.

코드 예제

최신 SDK 버전에서는 logEcommerceEvent()를 호출합니다:

braze.logEcommerceEvent({
    "name": "ecommerce.product_viewed",
    "properties": {
        "product_id": "4111176",
        "product_name": "Torchie runners",
        "variant_id": "4111176700",
        "image_url": "https://braze-apparel.com/images/products/large/torchie-runners.jpg",
        "product_url": "https://braze-apparel.com/footwear-categories/sneakers/braze-orange-torchie-runners/",
        "price": 85,
        "currency": "GBP",
        "source": "https://braze-apparel.com/",
        "type": ["price_drop", "back_in_stock"],
        "catalog_name": "footwear",
        "metadata": {
            "color": "ORANGE",
            "size": "6",
            "brand": "Braze"
        }
    }
});

레거시 SDK 버전에서는 logCustomEvent()를 호출합니다:

braze.logCustomEvent("ecommerce.product_viewed", {
    "product_id": "4111176",
    "product_name": "Torchie runners",
    "variant_id": "4111176700",
    "image_url": "https://braze-apparel.com/images/products/large/torchie-runners.jpg",
    "product_url": "https://braze-apparel.com/footwear-categories/sneakers/braze-orange-torchie-runners/",
    "price": 85,
    "currency": "GBP",
    "source": "https://braze-apparel.com/",
    "metadata": {
        "color": "ORANGE",
        "size": "6",
        "brand": "Braze"
    }
});

최신 SDK 버전에서는 logEcommerceEvent()를 호출합니다:

braze.logEcommerceEvent({
    "name": "ecommerce.cart_updated",
    "properties": {
        "cart_id": "cart_12345",
        "currency": "USD",
        "total_value": 199.98,
        "products": [
            {
                "product_id": "8266836345064",
                "product_name": "Classic T-Shirt",
                "variant_id": "44610569208040",
                "image_url": "https://braze-apparel.com/images/tshirt-blue-medium.jpg",
                "product_url": "https://braze-apparel.com/products/classic-tshirt?variant=44610569208040",
                "quantity": 2,
                "price": 99.99,
                "metadata": {
                    "sku": "TSH-BLU-M",
                    "color": "BLUE",
                    "size": "Medium",
                    "brand": "Braze"
                }
            }
        ],
        "source": "https://braze-apparel.com",
        "metadata": {}
    }
});

레거시 SDK 버전에서는 logCustomEvent()를 호출합니다:

braze.logCustomEvent("ecommerce.cart_updated", {
    "cart_id": "cart_12345",
    "currency": "USD",
    "total_value": 199.98,
    "subtotal_value": 179.98,
    "tax": 15.00,
    "shipping": 5.00,
    "products": [
        {
            "product_id": "8266836345064",
            "product_name": "Classic T-Shirt",
            "variant_id": "44610569208040",
            "image_url": "https://braze-apparel.com/images/tshirt-blue-medium.jpg",
            "product_url": "https://braze-apparel.com/products/classic-tshirt?variant=44610569208040",
            "quantity": 2,
            "price": 99.99,
            "metadata": {
                "sku": "TSH-BLU-M",
                "color": "BLUE",
                "size": "Medium",
                "brand": "Braze"
            }
        }
    ],
    "source": "https://braze-apparel.com",
    "metadata": {}
});

최신 SDK 버전에서는 logEcommerceEvent()를 호출합니다:

braze.logEcommerceEvent({
    "name": "ecommerce.checkout_started",
    "properties": {
        "checkout_id": "checkout_abc123",
        "cart_id": "cart_12345",
        "total_value": 199.98,
        "currency": "USD",
        "products": [
            {
                "product_id": "632910392",
                "product_name": "Wireless Headphones",
                "variant_id": "808950810",
                "quantity": 1,
                "price": 199.98,
                "metadata": {
                    "sku": "WH-BLK-PRO",
                    "color": "Black",
                    "brand": "BrazeAudio"
                }
            }
        ],
        "source": "https://braze-audio.com",
        "metadata": {
            "checkout_url": "https://checkout.braze-audio.com/abc123"
        }
    }
});

레거시 SDK 버전에서는 logCustomEvent()를 호출합니다:

braze.logCustomEvent("ecommerce.checkout_started", {
    "checkout_id": "checkout_abc123",
    "cart_id": "cart_12345",
    "total_value": 199.98,
    "subtotal_value": 179.98,
    "tax": 15.00,
    "shipping": 5.00,
    "currency": "USD",
    "products": [
        {
            "product_id": "632910392",
            "product_name": "Wireless Headphones",
            "variant_id": "808950810",
            "quantity": 1,
            "price": 199.98,
            "metadata": {
                "sku": "WH-BLK-PRO",
                "color": "Black",
                "brand": "BrazeAudio"
            }
        }
    ],
    "source": "https://braze-audio.com",
    "metadata": {
        "checkout_url": "https://checkout.braze-audio.com/abc123"
    }
});

최신 SDK 버전에서는 logEcommerceEvent()를 호출합니다:

braze.logEcommerceEvent({
    "name": "ecommerce.order_placed",
    "properties": {
        "order_id": "order_67890",
        "cart_id": "cart_12345",
        "total_value": 189.98,
        "currency": "USD",
        "total_discounts": 10.00,
        "discounts": [
            {
                "code": "SAVE10",
                "amount": 10.00
            }
        ],
        "products": [
            {
                "product_id": "632910392",
                "product_name": "Wireless Headphones",
                "variant_id": "808950810",
                "quantity": 1,
                "price": 199.98,
                "metadata": {
                    "sku": "WH-BLK-PRO",
                    "color": "Black",
                    "brand": "BrazeAudio"
                }
            }
        ],
        "source": "https://braze-audio.com",
        "metadata": {
            "order_status_url": "https://braze-audio.com/orders/67890/status",
            "order_number": "ORD-2024-001234",
            "tags": ["electronics", "audio"],
            "referring_site": "https://www.e-referrals.com",
            "payment_gateway_names": ["tap2pay", "dotcash"]
        }
    }
});

레거시 SDK 버전에서는 logCustomEvent()를 호출합니다:

braze.logCustomEvent("ecommerce.order_placed", {
    "order_id": "order_67890",
    "cart_id": "cart_12345",
    "total_value": 189.98,
    "subtotal_value": 169.98,
    "tax": 14.40,
    "shipping": 5.60,
    "currency": "USD",
    "total_discounts": 10.00,
    "discounts": [
        {
            "code": "SAVE10",
            "amount": 10.00
        }
    ],
    "products": [
        {
            "product_id": "632910392",
            "product_name": "Wireless Headphones",
            "variant_id": "808950810",
            "quantity": 1,
            "price": 199.98,
            "metadata": {
                "sku": "WH-BLK-PRO",
                "color": "Black",
                "brand": "BrazeAudio"
            }
        }
    ],
    "source": "https://braze-audio.com",
    "metadata": {
        "order_status_url": "https://braze-audio.com/orders/67890/status",
        "order_number": "ORD-2024-001234",
        "tags": ["electronics", "audio"],
        "referring_site": "https://www.e-referrals.com",
        "payment_gateway_names": ["tap2pay", "dotcash"]
    }
});
braze.logCustomEvent("ecommerce.order_cancelled", {
    "order_id": "order_67890",
    "cancel_reason": "customer changed mind",
    "total_value": 189.98,
    "subtotal_value": 169.98,
    "tax": 14.40,
    "shipping": 5.60,
    "currency": "USD",
    "total_discounts": 10.00,
    "discounts": [
        {
            "code": "SAVE10",
            "amount": 10.00
        }
    ],
    "products": [
        {
            "product_id": "632910392",
            "product_name": "Wireless Headphones",
            "variant_id": "808950810",
            "quantity": 1,
            "price": 199.98,
            "metadata": {
                "sku": "WH-BLK-PRO",
                "color": "Black",
                "brand": "BrazeAudio"
            }
        }
    ],
    "source": "https://braze-audio.com",
    "metadata": {
        "order_status_url": "https://braze-audio.com/orders/67890/status",
        "order_number": "ORD-2024-001234",
        "tags": ["cancelled", "customer_request"]
    }
});
braze.logCustomEvent("ecommerce.order_refunded", {
    "order_id": "order_67890",
    "total_value": 99.99,
    "currency": "USD",
    "total_discounts": 5.00,
    "discounts": [
        {
            "code": "SAVE5",
            "amount": 5.00
        }
    ],
    "products": [
        {
            "product_id": "632910392",
            "product_name": "Wireless Headphones",
            "variant_id": "808950810",
            "quantity": 1,
            "price": 99.99,
            "metadata": {
                "sku": "WH-BLK-PRO",
                "color": "Black",
                "brand": "BrazeAudio"
            }
        }
    ],
    "source": "https://braze-audio.com",
    "metadata": {
        "order_status_url": "https://braze-audio.com/orders/67890/status",
        "order_note": "Customer requested refund due to defective item",
        "order_number": "ORD-2024-001234",
        "tags": ["refund", "defective"]
    }
});

Google Tag Manager

Google Tag Manager(GTM)를 사용하는 경우, 사이트 코드에서 logEcommerceEvent()를 호출하는 대신 Braze Actions 태그에서 Log eCommerce Event (New) 태그 유형을 사용하세요. 이 태그는 GA4 형식의 이커머스 데이터 레이어를 읽으며 ecommerce.product_viewed, ecommerce.cart_updated, ecommerce.checkout_started, ecommerce.order_placed 이벤트를 지원합니다. 이벤트 및 제품 메타데이터도 지원합니다. ecommerce.order_cancelled 또는 ecommerce.order_refunded를 기록하려면 braze.logCustomEvent()를 호출하는 Custom HTML 태그를 사용하세요.

설정 단계, 필드 매핑 및 문제 해결에 대한 자세한 내용은 GTM으로 이커머스 이벤트 기록하기를 참조하세요.

logCustomEvent를 사용한 수동 기록

권장 이벤트를 수동으로 기록하려면 정확한 이벤트 이름(예: ecommerce.product_viewed)과 수동으로 구성한 BrazeProperties 또는 JSONObject 페이로드를 사용하여 logCustomEvent를 호출합니다. SDK는 수동 호출에 대해 권장 이벤트 스키마를 유효성 검사하지 않습니다. Braze는 수집 중에 이러한 페이로드를 유효성 검사합니다:

  • 유효한 페이로드는 전체 후처리가 적용된 권장 이벤트로 처리됩니다.
  • 잘못된 페이로드(필수 필드 누락, 잘못된 유형, 추가 최상위 속성정보)는 수집 후 삭제됩니다. 실패 내역은 워크스페이스 SDK 처리 로그와 실패 요약 이메일에 표시됩니다.

앱에서 잘못된 데이터가 전송되기 전에 포착할 수 있도록 가능하면 logEcommerceEvent를 사용하세요. 일반적인 logCustomEvent 사용법은 커스텀 이벤트 기록을 참조하세요.

New Stuff!