Maxonomy 페이지로 이동 배포 반영 2026.07.06
i

해당 가이드는 솔루션 도입 과정에서 가장 많이 활용하는 기능을 기준으로 함축된 내용을 제공합니다. 가이드에서 제공되지 않은 기능은 Braze 공식 문서를 통해 확인 부탁드립니다.

데이터 전송 프로세스

Braze에서의 데이터 전송 프로세스는 Native 영역은 일반적인 태깅을 통한 SDK 전송이 진행됩니다.

Hybrid 영역은 앱/웹 분기처리 및 인터페이스를 통해 Webview 데이터를 Native 영역으로 전달하여 전송합니다.

Hybrid 영역에서 별도 분기처리가 되지 않을 경우, Braze 솔루션 활용 간 기능 제한 및 이슈가 발생될 수 있습니다.

!
중요 — 하이브리드 미처리 시 크리티컬 이슈
  1. Data Point 이슈 — Session 이벤트 중복 발생. SDK 자동 수집 Session이 분기 없이 중복 집계될 수 있습니다.
  2. APP 내 서비스 이슈 — WEB 인앱 메시지가 하이브리드 영역에 노출되거나, 인앱 메시지가 동시 노출되어 비정상 화면이 발생할 수 있습니다.
  3. PUSH 캠페인 활용 제한 — 전송이 모두 WEB 기반이면 APP 푸시 캠페인 활용이 불가합니다.

해당 사항 외에도 다양한 이슈가 발생될 수 있습니다.

Native APP 및 Hybrid Web 데이터 전송 프로세스 — 개발을 통한 태깅, 인터페이스 코드 구현
Native APP: SDK → 개발을 통한 태깅 → Braze / Hybrid Web: 인터페이스 코드 구현 → Native SDK → 개발을 통한 태깅 → Braze

SDK 설치

SDK는 npm, yarn, CDN 방식으로 설치할 수 있습니다.

대시보드에서 API Key 확인

Braze 대시보드 Manage Settings → WEB 앱 등록 후 API KeySDK Endpoint를 확인합니다.

Braze Manage Settings — WEB API Key 확인 화면
Manage Settings — WEB 앱 등록 · API Key · SDK Endpoint 확인

SDK 최신 설치 링크: braze-web-sdk — loading-snippet.js

CDN 연동 방식

  • CDN 스니펫을 통해 Braze SDK를 로드합니다.
  • 연동 시 API_KEYbaseUrl(SDK Endpoint)를 설정합니다. (Braze 대시보드에서 발급)
  • 대시보드: Manage Settings+ Add App에서 WEB 앱을 등록합니다.

CDN 스니펫은 공식 저장소의 loading-snippet.js 전문을 사용하세요. 아래는 구조 참고용으로, 실제 연동 시 최신 스니펫 URL·버전을 반영해 주세요.

<script type="text/javascript">
  // loading-snippet.js 전문 (공식 GitHub 참고)
  // … Braze SDK 로더 …
  y.src = 'https://js.appboycdn.com/web-sdk/5.9/braze.min.js';
</script>
i
설치 직후

스크립트 로드 후 초기화 섹션의 braze.initialize()를 호출하세요.

초기화

braze.initialize(apiKey, options)로 SDK를 활성화한 뒤, 인앱 메시지 자동 표시·세션 시작 순서로 호출합니다.

braze.initialize('YOUR-API-KEY-HERE', {
  baseUrl: 'YOUR-SDK-ENDPOINT-HERE'
});

// 인앱 메시지 자동 표시 (Soft Prompt 사용 시 제거 — 참고 사항)
braze.automaticallyShowInAppMessages();

// Braze 세션 시작 (데이터 포인트 수집)
braze.openSession();

baseUrl은 대시보드에 표시된 SDK Endpoint 값입니다. API Key와 Endpoint는 앱(WEB) 단위로 발급됩니다.

External ID

Braze에 연동하면 SDK 초기화 시 anonymous device ID가 생성됩니다. 로그인 시점에는 고객사 고유 식별자를 External ID로 설정합니다.

중요: 로그인 식별자는 고객사 보안 정책에 맞게 설정하며, 국내 보안 정책상 일방향 암호화 적재를 권장합니다.

braze.changeUser('고객사 고유 식별자');

Event

  • Braze SDK를 통해 Custom Event를 전송합니다.
  • 이벤트명만 전송하거나, 이벤트 속성(Object)을 함께 전달할 수 있습니다.
  • 이벤트명·속성명은 텍소노미 기획 문서와 동일하게 유지하세요.

이벤트명만 전송

braze.logCustomEvent('이벤트명');

이벤트 속성 포함

braze.logCustomEvent('이벤트명', {
  '이벤트 속성명': '값',                        // String
  '이벤트 속성명': false,                       // Boolean
  '이벤트 속성명': 42,                          // Number
  '이벤트 속성명': new Date(),                  // Date
  '이벤트 속성명': ['any', 'array', 'here'],    // Array
  '이벤트 속성명': { deeply: ['nested', 'json'] } // Object
});

즉시 전송 (Flush)

Braze SDK는 배치성으로 전송되기 때문에 민감성 데이터는 requestImmediateDataFlush()를 호출해 실시간으로 전송되도록 구성합니다.

braze.requestImmediateDataFlush();

Standard Attribute

Braze가 미리 정의한 사용자 속성입니다. 이름, 성별, 전화번호, 생년월일 등 braze.getUser() 메서드로 설정합니다.

Attribute는 Standard AttributeCustom Attribute로 구분됩니다.

이름 설정

braze.getUser().setFirstName('이름');

성별 설정

braze.getUser().setGender(braze.User.Genders.FEMALE);

전화번호 설정

braze.getUser().setPhoneNumber('+821012345678');

전화번호는 국가번호 형식(예: +821012345678)으로 업로드해야 합니다. 010 등 로컬 형식은 사용하지 마세요.

생년월일 설정

braze.getUser().setDateOfBirth(2000, 12, 25);

즉시 전송 (Flush)

Braze SDK는 배치성으로 전송되기 때문에 민감성 데이터는 requestImmediateDataFlush()를 호출해 실시간으로 전송되도록 구성합니다.

braze.requestImmediateDataFlush();

Custom Attribute

고객사가 정의하는 사용자 속성입니다. String, Number, Boolean, Date, Array 등 타입별로 설정 방법이 다릅니다.

String · Number · Boolean 등

braze.getUser().setCustomUserAttribute(
  '속성 키',
  '속성 값'
);

Date (ISO-8601)

Date 형태 속성에 년·월·일만 전달하면 문자열로 인식될 수 있습니다. Braze에는 ISO-8601 형식(예: 2013-07-16T19:20:30+09:00)으로 업데이트하세요.

braze.getUser().setCustomUserAttribute(
  '속성 키',
  '2013-07-16T19:20:30+09:00'
);

Array

고객 이력 정보(예: 검색·구매 이력)를 활용한 개인화 코드 목적으로 사용됩니다. 이러한 이력 정보가 DB에 없는 값이라면 Add/Remove 함수만 사용하여 이력 정보를 최신화하도록 구성합니다.

// 전체 배열 설정
braze.getUser().setCustomUserAttribute('속성 키', ['값1', '값2']);

// 배열에 추가
braze.getUser().addToCustomAttributeArray('속성 키', '추가 값');

// 배열에서 제거
braze.getUser().removeFromCustomAttributeArray('속성 키', '제거 값');

속성 삭제 (null)

braze.getUser().setCustomUserAttribute('속성 키', null);

즉시 전송 (Flush)

Braze SDK는 배치성으로 전송되기 때문에 민감성 데이터는 requestImmediateDataFlush()를 호출해 실시간으로 전송되도록 구성합니다.

braze.requestImmediateDataFlush();

Purchase

Purchase event (Legacy)

!
중요 — 신규 고객사에는 Purchase event(레거시) 사용을 안내하지 마세요.

Braze 공식 문서 기준으로 레거시 Purchase event는 maintenance mode로 전환되었고, 신규 기능은 eCommerce Recommended Event 기반으로 제공됩니다. 신규 고객사는 eCommerce Recommended Event 사용을 권장합니다.

  • 구매 이벤트는 logPurchase로 전송합니다.
  • 상품 ID, 가격, 통화, 수량을 지정할 수 있으며, 추가 속성은 Purchase Property로 전달합니다.

기본 구매

braze.logPurchase('product_id', price, 'USD', quantity);
// productId: String
// currency: 기본 USD (KRW는 별도 Braze 설정 확인)
// price: Number
// quantity: Number

구매 속성 포함

var purchaseProperties = {};
purchaseProperties['속성명'] = '값';
braze.logPurchase('product_id', price, 'USD', quantity, purchaseProperties);

Push

WEB 푸시는 사이트 루트에 service-worker.js를 두고, Braze Service Worker 스크립트를 import 합니다.

service-worker.js (Website root)

self.importScripts('https://js.appboycdn.com/web-sdk/5.7/service-worker.js');

self.importScripts를 사용하는 경우 Service Worker 파일은 반드시 사이트 루트에 위치해야 합니다.

푸시 권한 요청

braze.requestPushPermission();
i
Soft Prompt

인앱 메시지로 푸시 권한을 유도하는 경우 Soft Prompt 섹션을 참고하고, automaticallyShowInAppMessages() 호출 여부를 조정하세요.

In-App Message

Braze 인앱 메시지는 Modal, Slide, Full, Custom HTML, Simple Survey 등 유형이 있으며, 기본 z-index는 10600입니다.

Custom HTML 설정을 제외한 아래 초기화 옵션(z-index, 명시적 닫기 등)은 필수가 아닌 옵션입니다. 서비스 UI에 맞게 선택 적용하세요.

z-index 조정

braze.initialize('YOUR-API-KEY', {
  baseUrl: 'YOUR-API-ENDPOINT',
  inAppMessageZIndex: 12000
});

명시적 닫기 필요

braze.initialize('YOUR-API-KEY', {
  baseUrl: 'YOUR-API-ENDPOINT',
  requireExplicitInAppMessageDismissal: true
});

Custom HTML (사용자 JavaScript 허용)

braze.initialize('YOUR-API-KEY', {
  baseUrl: 'YOUR-API-ENDPOINT',
  allowUserSuppliedJavascript: true
});

하이브리드

WebView에서는 네이티브 브릿지로 Custom Event·Custom Attribute를 전달합니다. User-Agent에 BrazeAndroid / BrazeiOS 문자열이 포함된 경우 네이티브 SDK로 위임합니다.

아래 코드는 고객사 이해를 돕기 위한 예시입니다. 자체적으로 사용 중인 인터페이스 코드를 활용해 운영하셔도 됩니다.

WebView — Custom Event (예시)

function sendEventToNative(eventName, interfaceData) {
  try {
    interfaceData['EventName'] = eventName;
    var userAgent = navigator.userAgent;
    if (userAgent.indexOf('BrazeAndroid') > -1) {
      NativeBridge.trackingEvent(interfaceData);
    } else if (userAgent.indexOf('BrazeiOS') > -1) {
      webkit.messageHandlers.NativeCallback.postMessage(interfaceData);
    }
  } catch (e) {
    console.log('Hybrid Error : ' + e);
  }
}

하이브리드 연동 시 WebView에서 WEB SDK로 직접 이벤트를 보내지 않고, 위와 같이 네이티브 브릿지로 APP 채널에 전달합니다.

WebView — Custom Attribute (예시)

function sendAttrToNative(customObject) {
  try {
    var userAgent = navigator.userAgent;
    if (userAgent.indexOf('BrazeAndroid') > -1) {
      NativeBridge.trackingAttr(customObject);
    } else if (userAgent.indexOf('BrazeiOS') > -1) {
      customObject['EventName'] = 'customAttribute';
      webkit.messageHandlers.NativeCallback.postMessage(customObject);
    }
  } catch (e) {
    console.log('Hybrid Error : ' + e);
  }
}

var dataObject = {
  memberage: '19',
  membergender: 'F',
  membership: 'FRIENDS'
};
sendAttrToNative(dataObject);

최종 반영 예시 코드

연동 완료 시 <head> 또는 공통 스크립트에 반영하는 예시 패턴입니다.

PC · Mobile WEB

<script type="text/javascript">
  // loading-snippet.js 로드 후
  braze.initialize('YOUR-API-KEY', {
    baseUrl: 'YOUR-SDK-ENDPOINT',
    allowUserSuppliedJavascript: true
  });
  braze.automaticallyShowInAppMessages();
  if (로그인 여부) {
    braze.changeUser('고객사 고유 식별자');
  }
  braze.requestPushPermission();
  braze.openSession();
</script>

WebView (하이브리드)

if (WEB 환경) {
  // 위 WEB 초기화
} else if (App WebView) {
  sendEventToNative('Braze APP 이벤트', eventProperty);
  sendAttrToNative(dataObject);
}

중요: 이벤트명·속성명·Attribute 키/값은 텍소노미 기획 문서 명세로 교체해 주세요.

태깅 예시

실제 서비스 태깅 시 참고할 수 있는 호출 순서 예시입니다.

로그인 완료 — Custom Event

if (로그인 여부) {
  braze.changeUser('고객사 고유 식별자');
}
braze.logCustomEvent('로그인 완료', {
  event_name: '로그인 완료',
  event_time: '2024-07-04T13:00:00',
  loginyn: true,
  platform: 'Mobile WEB'
});
braze.requestImmediateDataFlush();

검색 — Custom Event & Custom Attribute

if (로그인 여부) {
  braze.changeUser('고객사 고유 식별자');
}
braze.getUser().addToCustomAttributeArray(
  'searchkeyword_url',
  'id_1710805494/url_REV$lang=EN$site=KO$tripType=~'
);
braze.getUser().addToCustomAttributeArray(
  'searchkeyword',
  'id_1710805494/biztype_REV/항공권_국제 ~'
);
braze.logCustomEvent('검색', {
  event_name: '검색',
  event_time: '2024-07-04T13:00:00',
  loginyn: true,
  platform: 'Mobile WEB',
  biztype: 'REV',
  airtype: '국제',
  arrive: 'YVR',
  search_url: 'id_1710805494/url_REV$l ~',
  jourenytype: '왕복',
  startlocation: 'ICN',
  startdate: '2024-12-11T15:00:00',
  enddate: '2024-12-21T11:00:00'
});
braze.requestImmediateDataFlush();

Soft Prompt

사용자 경험을 위해 브라우저 기본 푸시 팝업 대신 인앱 메시지로 권한을 요청할 수 있습니다. Soft Prompt를 사용할 때는 automaticallyShowInAppMessages() 호출을 제거하거나, subscribeToInAppMessage에서 직접 표시 여부를 제어합니다.

braze.subscribeToInAppMessage(function (inAppMessage) {
  if (inAppMessage instanceof braze.InAppMessage) {
    const keyValuePairs = inAppMessage.extras || {};
    if (keyValuePairs['softprompt'] === 'true') {
      if (
        braze.isPushSupported() === false ||
        braze.isPushPermissionGranted() ||
        braze.isPushBlocked()
      ) {
        return;
      }
      if (inAppMessage.buttons[0]) {
        inAppMessage.buttons[0].subscribeToClickedEvent(function () {
          braze.requestPushPermission(
            function () { /* 허용 */ },
            function () { /* 거부 */ }
          );
        });
      }
    }
  }
  braze.showInAppMessage(inAppMessage);
});

인앱 메시지 캠페인의 extrassoftprompt: true를 설정해 Soft Prompt용 메시지를 구분합니다.

연동 체크리스트

  • 대시보드 WEB 앱 등록 · API Key · SDK Endpoint 확인
  • CDN 스니펫(최신 버전) · braze.initialize · openSession
  • 로그인 시 changeUser(External ID) 호출
  • Custom Event / Standard·Custom Attribute / eCommerce Recommended Event 텍소노미 반영
  • 루트 service-worker.js · requestPushPermission (또는 Soft Prompt)
  • 하이브리드 WebView — WEB SDK 이중 초기화 없이 네이티브 브릿지(인터페이스 코드) 사용
  • 대시보드 User Search · Custom Event 수신 확인