Braze 입문 3편 — Developer Guide · Identity · 데이터 모델 깊이

2026-05-17Braze 입문에서 운영까지

Braze 입문 3편. Developer Guide 의 큰 그림 — 4 섹션 지도 (Getting Started · Platform Integration · Features · Analytics & REST API), SDK 데이터 흐름, Identity Management 깊이 (External ID 선택의 보안 함정 · changeUser 4 동작 · Anonymous merging · User Alias), 데이터 모델 4 단위 깊이 (Custom Attribute · Event · Purchase · Session), 절대 금지 패턴 (shared default · logout changeUser), 권장 학습 경로 5 단계까지 풀어쓴 학습 노트.

📚 Braze 입문에서 운영까지 · 3편 — Developer Guide · Identity · 데이터 모델 깊이

이 글은 Braze 입문에서 운영까지 시리즈 3편이에요. 1편 의 큰 그림 · 2편 의 5분 통합 다음 — Developer Guide 자체의 구조 + Identity · 데이터 모델의 깊이.

이번 글의 위치

2편이 코드 박는 5분 이었다면, 3편은 그 코드가 진짜 운영에 들어가기 전 짚어둘 자리. 특히 Identity 설계External ID 한 줄 결정6개월 후 모든 분석의 기반. 처음에 잘못 박으면 나중에 마이그레이션 비용 폭증.

Developer Guide 4 큰 섹션 — 어디서 무엇을 찾나

Developers can find everything they need to know about the Braze SDK 가 Developer Guide 의 목적. — 공식 docs

SDK (Software Development Kit, 앱에 박는 통합 라이브러리) 통합 문서는 네 큰 자리로 나뉘어요.

섹션 무엇
1. Getting Started SDK 개요 · 통합 아키텍처 · 입문 흐름
2. Platform-Specific Integration Web · Android · Swift 등 각 플랫폼
3. Features & Functionality Push · In-app · Content Card · Feature Flag
4. Analytics & REST API 사용자 추적 · API 메시징

→ 처음 시작 = 1 → 2 → 3 → 4 순서. 각 섹션이 역할별로 가는 자리 가 달라요.

권장 학습 경로 5 단계

1. SDK Overview — 플랫폼 아키텍처 이해
   ↓
2. Integration Overview — 시스템 전체상 파악
   ↓
3. Featured Integration 선택 — Web · Android · Swift 중 우리 stack
   ↓
4. Initial SDK Setup — 5분 통합 (2편)
   ↓
5. 필요 기능 모듈 — Push · In-app · Content Card · Feature Flag

2편4 단계 까지였다면, 3편은 1·2 단계를 다시 + 5 단계의 깊이 안내.

SDK 의 데이터 흐름

Braze SDK 가 내부적으로 무엇을 하는지 의 그림:

[사용자 앱/웹]
   ↓ (SDK API 호출)
   logCustomEvent · setCustomAttribute · logPurchase · changeUser
   ↓
[SDK 내부 buffer]
   - 메모리 + 로컬 저장
   - background queue
   ↓ (주기적 sync · 또는 force flush)
[Braze Server]
   - 사용자 프로필 update
   - 이벤트 저장
   - segment 평가
   - 캠페인·Canvas trigger 검사
   ↓ (메시지 발송 결정 시)
[사용자 앱/웹]
   - push 수신
   - in-app message 표시
   - content card 추가

여기서 짚어둘 함정 — SDK 호출이 즉시 server 전송 아님. Buffer + background sync 구조라, 마지막 호출 후 사용자가 앱 종료일부 데이터 손실 가능. flushData() 같은 명시 호출 또는 Server-side REST API 안전망이 그래서 필요해요 (2편 패턴 5).

Identity Management — Braze 운영의 처음이자 끝

여기가 Developer Guide 의 가장 중요한 자리. 2편 External ID 설계 의 깊이 풀이.

External ID 의 의미

External ID 없이는 Braze 가 anonymous ID 할당 → API 기능 제한. — 공식 docs

External ID (외부 시스템 사용자 식별자) = 우리 시스템과 Braze 의 연결 키. 이게 없으면 API 호출이 anonymous user (익명 사용자) lookup 으로 제한되고, 모바일과 웹의 같은 사용자가 분리 인식돼 cross-device tracking 도 끊겨요. 거기에 segment 정확도가 떨어지고 나중에 마이그레이션도 까다로워집니다.

로그인 즉시 External ID 박기 가 운영의 기본.

changeUser() 의 4 동작 — 시험 함정 자리

changeUser(externalId) 호출 시 4 시나리오 별 동작 이 다름:

시나리오 동작
같은 ID 로 다시 호출 세션 영향 없음 (idempotent)
다른 ID 로 변경 현재 세션 종료 + 새 세션 시작
Anonymous → 새 ID anonymous 프로필 데이터 merge
Anonymous → 기존 ID 데이터 merge 안 됨 ⚠️

정말 중요한 자리 — Anonymous → 기존 ID 는 merge 안 됨. 이미 존재하는 useranonymous 활동 을 붙이려는 시도가 기본 동작 으로는 안 됨. 별도 Identity Merge API 또는 User Alias (사용자 별칭, 부가 식별자) 활용.

Anonymous → 새 ID merge — 표준 흐름

// 1. 사용자 가입 전 — anonymous 상태
// Braze 가 자동 anonymous ID 부여 (changeUser 호출 X)

// 2. anonymous 행동 추적
braze.logCustomEvent("landing_viewed", { ... });
braze.logCustomEvent("product_viewed", { ... });

// 3. 가입 완료 시점
const newUserId = await api.signup({ ... });

// 4. ★ changeUser 호출 — anonymous 프로필이 newUserId 로 merge
braze.changeUser(newUserId);
// → 이전 landing_viewed · product_viewed 가 newUserId 에 속함

핵심anonymous → 새 ID merge자연스럽게 작동 하는 가장 흔한 패턴. 가입 funnel 의 모든 이전 행동 보존.

Anonymous → 기존 ID 의 함정

// 시나리오: 이미 가입한 사용자가 로그아웃 후 다시 로그인
// 1. 로그아웃 시 — 일부 사람이 잘못 박음
braze.changeUser("anonymous-temp");  // ✗ 잘못

// 2. 다시 anonymous 상태로 행동
braze.logCustomEvent("...", { ... });

// 3. 다시 로그인
braze.changeUser(existingUserId);
// → 단계 2의 행동이 existingUserId 에 merge 안 됨 (사라짐)

절대 금지: 로그아웃 시 changeUser 호출. 기본 동작이 anonymous merge 를 지원 안 함.

Best Practice — External ID 선택

UUID 형식 (128-bit random) 또는 기존 ID 해시 사용. — 공식 docs

좋은 후보:

후보 이유
UUID v4 (Universally Unique Identifier, 128-bit 무작위 식별자) 충돌 거의 0 · 추측 불가
기존 ID 의 SHA-256 hash (256-bit 단방향 해시) 안정 + 비공개
DB 의 user.id (BIGINT) (64-bit 정수 PK) 익숙 · 단 추측 가능 위험

나쁜 후보 — 보안 취약 :

Sequential integer (1, 2, 3 처럼 순차 정수) 는 추측이 너무 쉬워서 다른 사용자 profile 노출로 이어질 수 있고, Email 이나 Phone 은 사용자가 언제든 바꿀 수 있고, Session ID 는 접속할 때마다 다른 값이라 안정 식별자로 못 써요.

여기서 짚어둘 자리 하나 — 추측 가능 ID 의 보안 위험. 만약 External ID 가 sequential 1, 2, 3, ... 인데 API key 가 노출되면, 공격자가 모든 사용자 profile 조회 가능. UUID 또는 hash 가 security by obscurity 가 아니라 enumeration 공격 회피 (순차 추측으로 전체 데이터 긁기 차단).

User Alias — anonymous 의 부가 식별

// Anonymous 사용자에게 alias 부여 (External ID 없이)
braze.getUser().addAlias("device-fingerprint-xyz", "anonymous_device");

// 또는 legacy 시스템 ID
braze.getUser().addAlias("legacy-12345", "legacy_system");

Alias 의 두 구성 — name (값) + label (네임스페이스).

대표 사용 자리는 anonymous 상태에서 API 로 targeting 할 때, legacy 시스템 ID 마이그레이션 할 때, CRM (Customer Relationship Management, 고객 관계 관리) contact ID 매핑할 때, 외부 마케팅 도구 식별자 연결할 때 정도.

절대 금지 패턴 2종

금지 1: Shared default ID

// ✗ 절대 금지
braze.changeUser("default-user");

왜 위험공유 디바이스 (가족 공용 태블릿 · 매장 키오스크) 에서 여러 사람 활동한 ID 로 통합 → re-engagement (재참여 캠페인) 시 엉뚱한 사람에게 메시지.

금지 2: Logout 시 changeUser

// ✗ 절대 금지
function onLogout() {
    braze.changeUser(null);    // 또는 다른 default ID
}

왜 위험 — 같은 디바이스의 다음 anonymous 활동이전 사용자 profile 에 잘못 누적. 또는 anonymous 활동 손실.

올바른 logout별도 처리 없음. SDK 가 알아서 처리. 다음 changeUser 호출 시 자연스럽게 전환.

데이터 모델 4 단위 — 깊이 풀이

2편 에서 본 4 단위의 각 모델 별 깊이.

1. Custom Attributes — 사용자 상태

// Set (덮어쓰기)
braze.getUser().setCustomAttribute("tier", "premium");
braze.getUser().setCustomAttribute("signup_year", 2025);
braze.getUser().setCustomAttribute("is_verified", true);

// Increment (누적 카운터)
braze.getUser().incrementCustomUserAttribute("total_logins", 1);
braze.getUser().incrementCustomUserAttribute("total_spent", 50000);

// Array — push/remove
braze.getUser().addToCustomAttributeArray("favorite_categories", "shoes");
braze.getUser().removeFromCustomAttributeArray("favorite_categories", "books");

// Set Array (전체 교체)
braze.getUser().setCustomAttribute("tags", ["vip", "early_adopter"]);

Attribute 의 4 type — String 은 text 값, Number 는 integer 와 float, Boolean 은 true/false, Array 는 동질 요소 list.

Attribute 의 핵심 함정 — Cardinality

Cardinality (한 필드가 가질 수 있는 서로 다른 값의 개수) 가 통제돼야 하는 자리.

✓ tier: "free" / "premium" / "enterprise"    (3 값)
✓ country: "KR" / "JP" / "US" / ...           (~200 값)
✓ language: "ko" / "en" / "ja"                (~10 값)

✗ signup_timestamp: 매 사용자 unique          (cardinality = users 수)
✗ session_id: 매번 다름                       (cardinality 무한)
✗ ip_address: 사용자별 다름                    (high cardinality)

5편 Statsig cardinality 와 동일 원칙. 분류 가능한 카테고리만 attribute. 고유 값은 event property 또는 별도 시스템.

Attribute 의 set 시점 — 일관성

// 좋은 패턴 — 사용자 factory 함수
function syncUserToBraze(user: User) {
    braze.changeUser(user.id);
    braze.getUser().setEmail(user.email);
    braze.getUser().setCountry(user.country);
    braze.getUser().setLanguage(user.language);
    braze.getUser().setCustomAttribute("tier", user.tier);
    braze.getUser().setCustomAttribute("signup_year", user.signupYear);
    // ... 모든 핵심 attribute 동시 sync
}

시점 — 로그인 시 full sync, 사용자 정보 변경 시 (예: tier 업그레이드), 첫 결제 후 LTV (Lifetime Value, 고객 생애 가치) 관련 자리. 매 화면 전환마다 set 은 X — 불필요 sync.

2. Custom Events — 사용자 행동

braze.logCustomEvent("product_viewed", {
    product_id: "P-123",
    category: "shoes",
    price: 50000,
    in_stock: true
});

braze.logCustomEvent("search_performed", {
    query: "summer dress",
    results_count: 47
});

Event 의 특성 — timestamp 자동 부여 (서버 측 또는 SDK 시각), append-only (한번 박힌 event 는 수정 안 됨), 같은 event 가 여러 번 박혀도 모두 누적 보존, properties 는 JSON object (string · number · boolean · array).

Event 의 Naming Convention

✓ 동사_명사 + snake_case
  product_viewed
  cart_added
  checkout_started
  signup_completed
  notification_dismissed

✗ 일관성 없음
  ProductViewed (camelCase 혼용)
  view (너무 일반)
  product_view (시제 모호)

5편 Statsig event 설계 의 원칙 그대로.

Property cardinality

✓ category: "shoes" / "books" / "electronics"  (분류 가능)
✓ payment_method: "card" / "kakao_pay" / ...    (5~10 값)

✗ product_id: 수만 종                            (high cardinality)
✗ user_id: 사용자별 unique                      (Event 의 user 는 이미 외부)

한도

대부분 SDK = event 당 properties 수 한도 + property 값 크기 한도. 보통 event 당 properties 64개 + 값 255자 정도. 큰 콘텐츠는 URL · ID 만 박고 외부 lookup.

3. Purchases — 결제 별도 모델

braze.logPurchase(
    "product_id",
    50000,
    "KRW",
    1,
    {
        category: "shoes",
        discount_applied: true,
        campaign_source: "email-2026-summer"
    }
);

왜 별도 모델인가Purchase 가 LTV · ARPU (Average Revenue Per User, 사용자당 평균 매출) · 결제 기반 segment 의 표준 자리.

Custom Event "purchase" 로 박으면:
  - LTV 자동 계산 X
  - "Top 10% 결제 사용자" segment 자동 X
  - revenue dashboard 자동 X

Purchase 별도 모델:
  - LTV · ARPU · cohort revenue 자동
  - 결제 기반 segment 풍부
  - 환불 처리 가능

Purchase 의 시점

// 결제 완료 직후
async function onCheckoutCompleted(order) {
    for (const item of order.items) {
        braze.logPurchase(
            item.productId,
            item.price,
            order.currency,
            item.quantity,
            {
                category: item.category,
                order_id: order.id,
                payment_method: order.paymentMethod
            }
        );
    }

    // Server side 동시 (안전망)
    await api.post("/braze/sync-purchase", { orderId: order.id });
}

Server side 동시 추적 권장 — Client 가 앱 종료 · 네트워크 끊김 으로 Braze sync 실패 가능. Server REST API 가 결제 정확성 보장.

4. Sessions — 자동 추적

SDK 가 session 자동 관리. — 일반 SDK 통합 패턴

Session 정의 — 사용자가 앱 active 상태 시작에서 종료까지. 기본 비활성 30초 후 자동 session 종료 (SDK 설정 가능). Web 은 page 진입에서 30분 무활동 시 종료.

SDK 가 자동 박는 데이터:

  • session_started event
  • session_ended event
  • session duration
  • 마지막 active 시각

코드 없이도 자동. 분석 dashboard 에서 session 통계 자동.

Session 의 활용

Segment "최근 active 사용자":
  - Last Used App: within 7 days
  - Sessions in last 30 days: > 3

세션 기반 segment 가 retention 분석·re-engagement 캠페인 의 표준.

SDK 의 background sync · push token · 권한

Background Sync

SDK 호출 → buffer
   ↓
주기적 sync (예: 30초마다 또는 background)
   ↓
Braze Server

기본 자동. flushData() 호출로 즉시 sync 강제 가능 (앱 종료 직전 권장).

Push Token 등록

iOS — APNs (Apple Push Notification service) token 등록:

func application(
    _ application: UIApplication,
    didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data
) {
    AppDelegate.braze?.notifications.register(deviceToken: deviceToken)
}

Android — FCM (Firebase Cloud Messaging) token:

class MyFirebaseMessagingService : FirebaseMessagingService() {
    override fun onNewToken(token: String) {
        Braze.getInstance(applicationContext).registeredPushToken = token
    }
}

Web — Service Worker + Web Push API:

braze.requestPushPermission((isPushSubscribed) => {
    console.log("Push subscribed:", isPushSubscribed);
});

권한 요청 시점

여기 또 큰 함정 — 앱 시작 즉시 push 권한 요청 = 큰 실수. 사용자가 왜 받아야 하는지 모르고 거부 → 영구히 (또는 OS 설정 변경 전까지) 알림 X.

좋은 권한 요청 패턴:

  1. Soft prompt 먼저 — 자체 UI 로 "알림으로 좋은 정보 보낼게요" 동의 확인
  2. 사용자가 가치 느낀 후 — 첫 결제 · 첫 follow · 첫 가입 완료 등 후
  3. 그 다음 OS prompt — OS 의 표준 권한 다이얼로그

거부율 50% → 20% 까지 떨어뜨릴 수 있는 표준 운영 패턴.

자주 만나는 사고 — Identity · 데이터 모델

사고 1: Sequential ID 의 enumeration 공격

원인 — External ID = user.id (BIGINT 1, 2, 3, ...) + API key 노출.

해결 — UUID v4 또는 SHA-256 hash. 또는 최소 API key rotation.

사고 2: Anonymous → 기존 ID merge 가정

원인 — 로그인 후 이전 anonymous 활동자동 merge 가정.

해결anonymous 가 완전 신규 user 인 경우만 merge. 기존 user 재로그인 = 별도 Identity Merge API 필요.

사고 3: Logout 시 changeUser 호출

원인깨끗한 상태 만들려고 logout 시 changeUser(null).

해결절대 X. SDK 가 자연스럽게 처리. 다음 로그인 시 changeUser(newId) 만.

사고 4: Shared default ID

원인 — 모든 anonymous 에게 같은 default ID 부여 → 데이터 통합.

해결 — anonymous 는 Braze 가 자동 부여 (changeUser 호출 X) + 필요 시 device-specific Alias.

사고 5: Attribute cardinality 폭증

원인signup_timestamp 같은 unique 값 attribute.

해결 — 분류 가능한 값만 attribute. 고유 값 = event property 또는 외부 시스템.

사고 6: Purchase 를 Custom Event 로

원인logCustomEvent("purchase", {amount: 50000}).

해결Purchase 는 항상 logPurchase. LTV 자동 분석.

사고 7: 앱 시작 즉시 push permission

원인requestPushPermission() 을 app launch 시점에 호출 → 큰 거부율.

해결 — Soft prompt → 가치 인식 → OS prompt 의 3 단계.

사고 8: SDK sync 안 됨

원인changeUser 호출 후 즉시 앱 종료 → buffer 데이터 손실.

해결결제 같은 critical event = Server side 동시 추적. 또는 flushData() 명시 호출.

사고 9: User Alias 와 External ID 혼동

원인 — Alias 만 박고 External ID 안 박음 → API 일부 기능 제한.

해결가능하면 External ID. Alias 는 부가 식별.

운영 권장 패턴

Pattern 1: Identity 결정 — 가입 시점

// 가입 완료 시 (회원가입 직후)
async function onSignupCompleted(userInput) {
    const newUser = await api.signup(userInput);

    // External ID = UUID v4 (서버에서 생성)
    const externalId = newUser.id;  // 또는 별도 UUID

    // Braze 에 사용자 연결 (anonymous 활동 merge)
    braze.changeUser(externalId);

    // 초기 attribute sync
    braze.getUser().setEmail(newUser.email);
    braze.getUser().setFirstName(newUser.firstName);
    braze.getUser().setCountry(newUser.country);
    braze.getUser().setLanguage(newUser.language);
    braze.getUser().setCustomAttribute("signup_year", new Date().getFullYear());
    braze.getUser().setCustomAttribute("tier", "free");

    // signup event
    braze.logCustomEvent("signup_completed", {
        source: userInput.source,
        referrer: userInput.referrer
    });
}

가입의 모든 데이터 가 한 함수에. 일관성.

Pattern 2: 재로그인 시 sync

// 이미 가입한 사용자 로그인
async function onLoginCompleted(user) {
    braze.changeUser(user.id);

    // 변경됐을 수 있는 attribute 만 sync
    braze.getUser().setEmail(user.email);
    braze.getUser().setCustomAttribute("tier", user.tier);
    braze.getUser().setCustomAttribute("last_login_date",
        new Date().toISOString());

    braze.openSession();
}

매 로그인 시 핵심 attribute 동기화 — Braze 의 데이터 최신성.

Pattern 3: Soft Push Permission

// 사용자가 *첫 결제* 같은 가치 인식 후
function showSoftPushPrompt() {
    // 자체 UI 모달
    showModal({
        title: "주문 진행 상황을 알려드릴까요?",
        body: "배송 · 할인 · 한정 상품 알림을 푸시로 받아 보세요",
        primary: {
            label: "네, 알림 받을게요",
            onClick: () => braze.requestPushPermission()
        },
        secondary: {
            label: "나중에",
            onClick: () => trackEvent("push_soft_dismissed")
        }
    });
}

거부율 50% → 20% 까지 개선.

Pattern 4: Server-side 안전망 (결제)

# Server: 결제 완료 webhook 처리
@app.post("/webhooks/order-completed")
async def on_order_completed(order: Order):
    # 1. 결제 처리
    await process_order(order)

    # 2. Braze 에 Purchase 동시 추적 (Client 가 누락해도 안전)
    for item in order.items:
        await braze_client.post("/users/track", json={
            "purchases": [{
                "external_id": order.user_id,
                "product_id": item.product_id,
                "currency": "KRW",
                "price": item.price,
                "quantity": item.quantity,
                "time": order.completed_at.isoformat()
            }]
        })

2편Client + Server 동시 추적 의 백엔드 코드.

Pattern 5: User Alias 활용 — Legacy 마이그레이션

// 기존 legacy 시스템에서 마이그레이션
async function migrateLegacyUser(legacyUserId, newUserId) {
    // 1. 새 External ID 로 changeUser
    braze.changeUser(newUserId);

    // 2. Legacy ID 를 Alias 로 저장
    braze.getUser().addAlias(legacyUserId, "legacy_system");

    // → 이후 legacy_system + legacyUserId 로도 lookup 가능
    // → 마이그레이션 안 끝난 시스템과 호환
}

점진 마이그레이션의 표준 패턴.

Pattern 6: Anonymous 추적 정책

// 앱 진입 시 — 즉시 changeUser X
// (anonymous 상태 유지)

// 사용자 행동 추적 (anonymous)
braze.logCustomEvent("landing_viewed", { source: "google" });
braze.logCustomEvent("product_viewed", { product_id });

// 가입/로그인 시점에 changeUser
braze.changeUser(user.id);
// → 이전 anonymous 행동 자동 merge (new ID 의 경우)

anonymous 단계의 행동도 보존. 가입 funnel 의 모든 단계 분석.

시험 직전 한 번 더 — Developer Guide · Identity 함정 압축 노트

  • Developer Guide 4 섹션 = Getting Started · Platform Integration · Features · Analytics & REST API
  • 권장 학습 경로 5 단계 = SDK Overview → Integration Overview → 플랫폼 선택 → Initial Setup → 기능 모듈
  • SDK 데이터 흐름 = SDK API → buffer → background sync → Braze Server → 메시지 발송
  • 즉시 server 전송 X (buffer 지연)
  • critical event = Server REST API 안전망 + flushData()
  • External ID = 우리 시스템과 Braze 의 연결 키
  • 없으면 = anonymous · API 기능 제한 · cross-device 분리
  • changeUser() 4 동작:
  • 같은 ID = 영향 X
  • 다른 ID = 세션 종료 + 새 세션
  • Anonymous → 새 ID = merge (자연스러운 가입 흐름)
  • Anonymous → 기존 ID = merge 안 됨 ⚠️
  • External ID 선택 기준:
  • 좋음 = UUID v4 · SHA-256 hash · DB user.id (BIGINT)
  • 나쁨 = sequential int (enumeration 공격) · email/phone (변경 가능) · session_id
  • 보안 함정 — guessable ID + API key 유출 → 전체 user profile 노출
  • User Alias = name + label 의 부가 식별자
  • 사용 = anonymous targeting · legacy 마이그레이션 · CRM 매핑
  • 절대 금지 2종:
  • Shared default ID (공유 디바이스 통합)
  • Logout 시 changeUser (anonymous 활동 손실 또는 잘못 통합)
  • 데이터 모델 4 단위 = Custom Attribute · Custom Event · Purchase · Session
  • Custom Attribute = 상태 (set · increment · array)
  • 4 type = String · Number · Boolean · Array
  • cardinality 통제 = 분류 가능한 값만, 고유 값은 event property
  • sync 시점 = 로그인 · 정보 변경 · 첫 결제
  • Custom Event = 행동 (timestamp · append-only · 누적)
  • 동사_명사 + snake_case
  • properties = JSON object (cardinality 통제)
  • 한도 = event 당 properties 64 · 값 255자 정도
  • Purchase = 결제 별도 모델 (LTV · ARPU · segment 자동)
  • Custom Event 로 박으면 LTV 분석 X
  • Server side 동시 추적 권장
  • Session = SDK 자동 관리 (start · end · duration)
  • 비활성 30초 후 종료 (SDK 설정)
  • 활용 = retention segment · re-engagement
  • Background Sync = 자동 + flushData() 명시 강제
  • Push Token = iOS APNs · Android FCM · Web Service Worker
  • 권한 요청 시점:
  • 앱 시작 즉시 = 큰 실수 (50% 거부)
  • 가치 인식 후 + Soft Prompt → OS Prompt 3 단계 권장
  • 거부율 50% → 20% 개선 가능
  • 사고 — Sequential ID 보안 · Anonymous→기존 merge 가정 · Logout changeUser · Shared default · Attribute cardinality · Purchase 를 Event · 앱 시작 push permission · SDK sync 손실 · Alias vs External ID 혼동
  • 패턴 — Identity 결정 (가입 시점 sync 함수) · 재로그인 attribute sync · Soft Push Permission · Server-side 안전망 · Legacy Alias 마이그레이션 · Anonymous 추적 정책

공식 문서: Braze Developer Guide Home · Setting User IDs 에서 원문을 확인할 수 있어요.

시리즈 다른 편 (앞뒤 글 모음)

이전 글:

다음 글:

※ 이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.

답글 남기기

error: Content is protected !!