Braze 입문 4편. Features & Functionality 4 기능 깊이 — Push (APNs · FCM · Web Push 차이 · rich · silent · deep link · permission 시점), In-app Message (trigger · template · 우선순위 · frequency capping), Content Card (inbox 패턴 · 4 종류 · refresh), Feature Flag (Statsig 와 차이 · Canvas 통합 · 무료/유료 한도). 채널별 선택 가이드 + 함정 + 운영 패턴까지 풀어쓴 학습 노트.
이 글은 Braze 입문에서 운영까지 시리즈 4편이에요. 1편 큰 그림 · 2편 5분 통합 · 3편 Identity·데이터 모델 다음 — 실제 메시지 전달의 4 기능 깊이.
이번 글의 범위
1편의 6 채널 중 개발자 손이 가장 많이 가는 4 자리:
- Push Notification — APNs · FCM · Web Push 의 차이
- In-app Message — 앱 안 모달의 trigger · template
- Content Card — 인박스 패턴
- Feature Flag — Braze 안의 dedicated 도구
각 기능의 공식 구조 + 운영 함정 + Statsig 등 대안과 비교. 분량은 크지만 우리 stack 의 채널에 해당하는 부분만 읽어도 OK.
4 기능의 위치 — 채널별 분기
| 기능 | 사용자 위치 | 핵심 강점 | 약점 |
|---|---|---|---|
| Push | 모든 환경 (앱 · 브라우저) | 즉시 · 광범위 | 권한 거부율 · spam 피로 |
| In-app Message | 앱 사용 중 | 사용자 active 상태 · 풍부 UI | 비활성 사용자 못 만남 |
| Content Card | 앱 안 inbox · 영구 | 지속 노출 · 비긴급 | 사용자가 inbox 안 열면 X |
| Feature Flag | 코드 분기 | 즉시 ON/OFF · 코드 없이 | 메시지 자체 X |
→ 상황별 함께 사용. 긴급 = Push, 사용 중 안내 = In-app, 지속 노출 = Content Card, 코드 동작 변경 = Feature Flag.
Push Notifications — 깊이
Push 의 3 환경 차이
| 환경 | 시스템 | 인증 |
|---|---|---|
| iOS | APNs (Apple Push Notification service) | Auth key (.p8) 또는 Certificate (.p12) |
| Android | FCM (Firebase Cloud Messaging) | Server Key (legacy) 또는 Service Account |
| Web | Service Worker + Web Push API | VAPID key |
여기서 시험 함정이 하나 있어요 — 각 환경 인증 방식이 완전히 다름. 한 채널 작동해도 다른 채널 별도 셋업 필요. Web Push 만 빼먹어서 웹 사용자에게 아무 메시지 안 가는 경우 흔함.
VAPID(Voluntary Application Server Identification) = 웹 푸시 서버 신원 확인 키 규격.
Push 의 Payload 구조
Braze 가 환경별 표준 payload 자동 변환. 운영자는 console 에서 콘텐츠만 작성하면 system-specific format 은 Braze 가 처리.
기본 구성:
Title: "여름 세일 시작!"
Body: "{{ ${first_name} | default: '회원님' }}님, 30% 할인"
Image: (선택, rich push)
Deep Link: myapp://sale/2026-summer
Action Buttons: ["지금 보기", "나중에"]
Rich Push — 이미지 · 비디오 · GIF
iOS: Notification Service Extension 활용
Android: BigPictureStyle · BigTextStyle
Web: image URL in service worker payload
효과 — 일반 텍스트 push 대비 engagement 30~50% ↑ (산업 평균). 단 큰 이미지 = 네트워크 사용량 + iOS 의 expiration 같은 함정.
Silent Push — 사용자 모르게
iOS: aps.content-available = 1
Android: data-only message (no notification field)
용도 — 백그라운드 데이터 sync, 위치 업데이트, cache invalidation 같은 비표시 작업.
한계 — iOS 는 silent push throttling (시스템이 빈도 제한). 과도하게 사용 X.
Action Buttons — 인터랙티브 push
"새 메시지 도착"
[답장] [무시] [읽음 표시]
각 버튼 클릭 = deep link 또는 API call. 사용자가 앱 안 열어도 행동 가능.
Deep Link
myapp://product/12345
myapp://chat/conversation/abc
https://example.com/article/567
push 탭 시 특정 화면 직접 진입. 일반 push 가 그냥 앱 열기 라면 deep link 는 목적 화면 진입 → conversion ↑.
Universal Link (iOS) · App Link (Android) 활용 — 앱 미설치 사용자 는 웹 fallback.
Permission 시점 — 3편 Soft Prompt 재강조
3편의 패턴 3 그대로 — 앱 시작 즉시 요청 X. Soft Prompt → 가치 인식 → OS Prompt 의 3 단계.
거부율 50% → 20% 의 차이는 6개월 후 retention 에 큰 영향.
Push 의 자주 만나는 사고
사고: iOS 인증 만료
원인 — APNs Certificate (.p12) 가 연 1회 만료. 안 갱신 = 모든 iOS push 실패.
해결 — Auth Key (.p8) 사용 — 무기한 유효. 또는 만료 모니터링.
사고: Android Legacy Server Key 종료
원인 — Google 이 Legacy FCM API + Server Key 를 2024년 6월 종료. Service Account 마이그레이션 안 한 회사 = push 끊김.
해결 — FCM v1 API + Service Account JSON 마이그레이션. Braze console 에서 새 credentials 등록.
사고: Web Push HTTPS 필수
원인 — HTTP 사이트 에서 Web Push 시도 → 작동 X.
해결 — HTTPS 필수 + Service Worker 의 적절한 scope.
사고: Token rotation 누락
원인 — 사용자가 앱 재설치 후 token 변경 → 오래된 token 으로 발송 = 실패.
해결 — 3편의 token 등록 hook 매번 호출. invalid token 자동 cleanup.
In-app Messages — 깊이
In-app vs Push
| 항목 | Push | In-app Message |
|---|---|---|
| 위치 | OS 알림 · 앱 외부 | 앱 안 모달 |
| 권한 필요 | OS 권한 | X (앱 사용 중 자동) |
| 사용자 상태 | active/inactive 모두 | active 만 |
| UI 풍부도 | 제한적 | 매우 풍부 (이미지 · 비디오 · 버튼) |
| 즉시성 | 도착 즉시 | 다음 trigger 시 |
→ In-app 은 사용자가 이미 앱에 있는 시점 의 메시지. 이미 engagement 있는 상태 라 click-through rate 높음.
Trigger 종류
In-app message 는 특정 trigger 에 노출:
| Trigger | 의미 |
|---|---|
| Custom Event | 특정 event 발생 시 (예: product_viewed 5번째) |
| Session Start | 앱 진입 시 |
| Purchase | 결제 완료 시 |
| Specific Screen | 특정 화면 진입 시 (수동 trigger) |
Display 시점 + 우선순위
여러 in-app message 가 동시 발생 조건 만족 시:
사용자가 'product_viewed' event 박음
↓
Trigger 1: 신상품 안내 (우선순위 높음)
Trigger 2: 카트 회복 (우선순위 중)
Trigger 3: 회원 등급 안내 (우선순위 낮음)
↓
→ 우선순위 1 만 표시
→ 또는 1·2 표시 후 dismiss 시 3
우선순위 설계 = 메시지 피로 회피. 모든 메시지 동시 = 사용자 quit.
Template 종류
| Template | 표시 방식 |
|---|---|
| Modal | 화면 가운데 dialog (가장 흔함) |
| Slideup | 화면 아래 슬라이드 (자연스러움) |
| Fullscreen | 전체 화면 takeover (강한 메시지) |
| Custom HTML | 자유 디자인 (template 한계 초과 시) |
대부분 = Modal 또는 Slideup. Fullscreen 은 첫 onboarding 같은 중요한 메시지만 — 남용 시 사용자 짜증.
Click Action
각 in-app message 의 primary CTA (Call To Action) 는 네 갈래로 나뉩니다 — Deep Link 는 특정 화면 이동, URL 은 외부 브라우저, Custom Action 은 앱 안 함수 호출, Dismiss Only 는 단순 닫기.
CTA(Call To Action) = 사용자가 누를 핵심 행동 버튼.
Frequency Capping — 피로 방지
"같은 사용자에게:
- 하루 최대 in-app message 3개
- 같은 메시지 = 한 번만
- 캠페인 종료 후 N일 안 = 표시 X"
Frequency Capping = 마케팅 운영의 기본 안전선. 캠페인 자체 설정 + 사용자 단위 설정 모두.
Custom HTML — 자유 디자인
Template 한계 초과 시 full HTML + CSS + JS 직접:
<!DOCTYPE html>
<html>
<head><style>...</style></head>
<body>
<div class="modal">
<h1>{{ ${first_name} }}님 환영합니다</h1>
<button onclick="appboyBridge.logClick(); window.close();">시작</button>
</div>
</body>
</html>
appboyBridge (legacy 이름) = Braze 가 iframe 안 HTML 에 주입하는 JS API. event 로깅 · 액션 트리거 가능.
In-app 의 자주 만나는 사고
사고: 메시지 안 표시
원인 — App 의 display 시점이 안 됨 (SDK 가 trigger 받고도 표시 못 함).
해결 — foreground 상태에서 display 활성 확인 + Braze SDK 의 setInAppMessageManagerDelegate 같은 설정.
사고: 너무 많은 in-app 표시
원인 — Frequency capping 미설정.
해결 — 캠페인별 + 사용자 단위 frequency cap.
사고: Custom HTML 의 보안
원인 — Custom HTML 안 <script> 가 사용자 데이터 접근.
해결 — Custom HTML 은 iframe sandboxed. 민감 데이터 접근 X.
Content Cards — 인박스 패턴
Content Card 의 의미
1편의 5 핵심 개념 의 5번째 — 앱 안 inbox 메시지.
Push 와의 차이 — Push 는 밀어내는 메시지로 도착 즉시 사라지지만, Content Card 는 영구 노출 이라 사용자가 dismiss 할 때까지 자리에 머무릅니다.
대표 사용처는 이번 주 신상품 안내, VIP 등급 도달 축하 + 혜택, 친구 초대 캠페인, 비긴급 알림 같은 자리예요.
Card 4 종류
| 종류 | 설명 |
|---|---|
| Classic | 텍스트 + 작은 아이콘 |
| Captioned Image | 큰 이미지 + 캡션 |
| Banner | 가로 banner 형식 |
| Control Card | 비표시 (A/B 실험의 control group) |
Control Card 의 의미 — Content Card 켰을 때 효과 측정 의 control. card 안 본 사용자 와 card 본 사용자 비교.
Click · Dismiss Tracking
// SDK 가 자동 추적
braze.getContentCards(); // 현재 card 목록
braze.logContentCardClick(card); // 클릭 시
braze.logContentCardDismissal(card); // dismiss 시
braze.logContentCardImpression(card); // 표시 시
→ funnel 분석 자동. 어떤 card 가 어느 정도 engagement 인지.
Refresh 동작
// 명시 refresh
braze.requestContentCardsRefresh();
// 자동 — session start 시 + N 분마다
Cache 전략 — 메모리·로컬 저장에 최신 card 캐싱 하고, 연결 없을 때도 로컬 card 를 표시한 뒤, refresh 시점에 새 card 와 동기화합니다.
Custom View — UI 자유
Braze 가 기본 card 표시 UI 제공 — 단 우리 앱 디자인 시스템에 안 맞으면 custom view:
// Web 예시
const cards = braze.getContentCards();
const renderedHtml = cards.map(card => `
<div class="our-card">
<img src="${card.imageUrl}">
<h3>${card.title}</h3>
<p>${card.description}</p>
<button onclick="braze.logContentCardClick(${card.id})">
${card.linkText}
</button>
</div>
`).join("");
Braze 의 card data + 우리 디자인 조합.
Content Card 의 자주 만나는 사고
사고: Card 의 sync 늦음
원인 — Refresh 자동 빈도 부족.
해결 — 세션 시작 시 + 사용자 inbox 진입 시 requestContentCardsRefresh() 명시 호출.
사고: Dismiss 추적 누락
원인 — Custom view 에서 logContentCardDismissal 호출 안 함.
해결 — 모든 click · dismiss · impression 추적. funnel 분석의 기반.
Feature Flag — Braze 안의 dedicated 도구
Statsig 시리즈 3편 의 Feature Flag 와 비슷한 도구 인데 Braze 안. 두 도구 비교 가 자연스러운 질문.
Braze Feature Flag 의 핵심
코드 배포 · 앱 스토어 업데이트 없이 기능을 remote 로 enable/disable. — 공식 docs
const flag = braze.getFeatureFlag("flag_id");
if (flag.enabled) {
// 새 기능
}
// Properties (string · boolean · number)
const colorScheme = flag.getStringProperty("theme", "default");
const isEnabled = flag.getBooleanProperty("show_banner", false);
Use Case 5종
다섯 갈래 활용처는 이렇게 정리됩니다. Gradual Rollouts 는 10% → 50% → 100% 점진 활성이고, Remote Configuration 은 앱 update 없이 promotional content 제어. A/B Testing 으로 variant 별 conversion 측정, Message Coordination 은 Canvas Feature Flag step 으로 기능 출시 + 마케팅 캠페인 동기, 마지막 Segmentation 은 flag 받은 사용자 segment.
Plan 한도
| Plan | Active Flags | Experiments |
|---|---|---|
| Free | 10 | 1 |
| Paid | 110 | 100 |
SDK 최소 버전 — Swift 5.9.0+ · Web 4.6.0+ · Android 24.2.0+.
Statsig vs Braze Feature Flag — 차이
| 항목 | Statsig | Braze Feature Flag |
|---|---|---|
| dedicated 도구 | ✓ | X (Braze 의 sub feature) |
| 무료 한도 | 200만 event/월 | 10 flag · 1 experiment |
| 통계 도구 | CUPED · Stratified · Sequential | 기본 A/B |
| Warehouse Native | ✓ | X |
| Canvas 통합 | X | ✓ (가장 큰 차별) |
| Product Analytics 통합 | ✓ (자체 6 차트) | △ (Braze 의 일반 분석) |
| Segment 통합 | X (Statsig 안) | ✓ (Braze segment 와 자연) |
CUPED(Controlled-experiment Using Pre-Experiment Data) = 실험 전 데이터로 분산을 줄이는 통계 기법. Warehouse Native = 데이터 웨어하우스 위에서 직접 실험을 돌리는 구조.
선택 가이드
Braze Feature Flag 권장 — 이미 Braze 운영 중 인 데다 간단한 flag 만 필요하거나, Canvas 와 통합 해서 flag 켰을 때 마케팅이 동시에 가는 그림이거나, Braze segment 와 결합 해서 쓰고 싶을 때.
Statsig (또는 다른 dedicated) 권장 — 복잡한 실험 + 통계 도구가 필요하거나, Warehouse Native + dbt 통합이 중요하거나, 수십 ~ 수백 개 flag 를 굴려야 하거나, cross-team 으로 마케팅 외 product · engineering 모두 쓸 때.
dbt(data build tool) = SQL 기반 데이터 변환·모델링 프레임워크.
대부분 큰 회사 = 둘 다 사용. Statsig = 제품 실험 · 일반 flag, Braze = 마케팅 캠페인 연동 flag.
채널 선택 가이드 — 실전 결정
시나리오별 추천
신상품 출시 → 마케팅 캠페인:
- Push (관심 사용자에게 즉시)
- Email (상세 정보 + 모든 사용자)
- Content Card (앱 안 지속 노출)
신규 사용자 onboarding:
- In-app (사용 중 가이드)
- Push (재방문 유도)
- Email (상세 안내)
결제 후 follow-up:
- SMS (즉시 영수증)
- Email (상세)
- In-app (다음 방문 시 추천)
비활성 사용자 win-back:
- Push (재방문 유도)
- Email (할인 쿠폰)
- SMS (마지막 수단)
긴급 알림 (서비스 장애 등):
- Push (즉시)
- In-app (다음 진입 시)
- SMS (정말 긴급)
채널 선택 원칙
네 가지 축으로 정리됩니다. 긴급도 는 SMS · Push > In-app > Content Card > Email 순, 콘텐츠 양 은 Email > In-app > Content Card > Push > SMS 순으로 줄어듭니다. 사용자 상태 면에서는 In-app 이 활성 사용자, Push 가 모두를 커버하고, 지속 노출 은 Content Card 가 길게 가는 반면 Push 는 짧게 끝나요.
자주 만나는 사고 — 4 기능 통틀어
사고 1: 채널 권한 잘못
원인 — Email 옵트인 사용자에게 SMS 발송.
해결 — channel 별 subscription state 따로 추적 + 발송 시 자동 필터.
사고 2: Frequency Cap 안 설정
원인 — 한 사용자에게 하루 push 10개 → 즉시 unsubscribe.
해결 — 사용자 단위 + 캠페인 단위 cap. 일반적 = 일 push 3개 한도.
사고 3: Deep Link 깨짐
원인 — App 의 deep link handler 가 지원 안 하는 path.
해결 — 가능한 모든 deep link 의 fallback 화면 정의 (home 으로 redirect).
사고 4: Push permission 거부 후 회복 X
원인 — 한 번 거부 = 영구 거부 (OS 기본).
해결 — Soft Prompt 권장. 거부 후 앱 안 안내 — "설정에서 알림 활성화하세요".
사고 5: In-app message vs Push 중복
원인 — 사용자가 앱 사용 중 push 받음 → 동시에 in-app message → 메시지 폭격.
해결 — foreground push 표시 X 옵션. 또는 in-app 만 (서버에서 사용자 active 여부 확인).
사고 6: Content Card 의 cache 부정확
원인 — 오래된 card 가 영원히 inbox 남음.
해결 — Card 의 expiration 설정 + 정기 refresh.
사고 7: Feature Flag 의 default value
원인 — getFeatureFlag("flag_id") 가 network 실패 시 default 안전성 X.
해결 — default 안전한 동작 (예: 신기능 OFF) + 명시적 default.
사고 8: Multi-channel 동시 발송
원인 — Email + Push + SMS 동시 → 사용자 3 채널 메시지 동시 도착 → 짜증.
해결 — channel 우선순위 정의. fallback 패턴 (예: push 안 도달 시 email).
운영 권장 패턴
Pattern 1: Channel Subscription Helper
// 사용자가 채널별 동의 관리
function updateChannelPreferences(user: User, prefs: ChannelPrefs) {
braze.getUser().setEmailNotificationSubscriptionType(
prefs.email ? "opted_in" : "unsubscribed"
);
braze.getUser().setPushNotificationSubscriptionType(
prefs.push ? "opted_in" : "unsubscribed"
);
// Subscription Group (SMS · marketing email 등)
for (const [groupId, isSubscribed] of Object.entries(prefs.groups)) {
braze.getUser().setSubscriptionGroupSubscriptionState(
groupId,
isSubscribed ? "subscribed" : "unsubscribed"
);
}
}
Pattern 2: Soft Push Prompt + Tracking
async function askForPushPermission(trigger: string) {
// 1. Soft prompt 표시
const userAgreed = await showSoftPromptModal({
title: "주문 진행 상황을 알려드릴까요?",
body: "배송 · 할인 · 한정 상품 알림",
trigger: trigger // "first_purchase" · "signup" 등
});
braze.logCustomEvent("push_soft_prompt_shown", { trigger });
if (userAgreed) {
braze.logCustomEvent("push_soft_prompt_agreed", { trigger });
// 2. OS prompt
await braze.requestPushPermission();
} else {
braze.logCustomEvent("push_soft_prompt_dismissed", { trigger });
}
}
Pattern 3: In-app 우선순위 + Frequency Cap
in_app_messages:
- id: "vip_upgrade_celebration"
trigger: custom_event "tier_upgraded"
priority: 100
frequency_cap: "once_per_user"
- id: "cart_recovery"
trigger: session_start (with abandoned cart)
priority: 80
frequency_cap: "1 per day"
- id: "new_feature_announcement"
trigger: session_start
priority: 50
frequency_cap: "1 per 3 days"
높은 우선순위 = 자주 표시되는 중요한 메시지. 낮은 = 부수적 안내.
Pattern 4: Content Card 자동 cleanup
// 매일 정기 작업 (server-side)
async function cleanupExpiredCards() {
// expired card 자동 dismiss
const cards = await braze.getAllContentCards();
const expired = cards.filter(c => c.expiresAt < new Date());
for (const card of expired) {
await braze.dismissContentCard(card.id);
}
}
오래된 card = inbox 의 노이즈. expiration + cleanup.
Pattern 5: Feature Flag 안전한 사용
function isFeatureEnabled(flagId: string, defaultValue: boolean = false): boolean {
try {
const flag = braze.getFeatureFlag(flagId);
// Braze 가 flag 못 가져온 경우 = default
if (!flag || flag.enabled === undefined) {
return defaultValue;
}
return flag.enabled;
} catch (e) {
// SDK error = safe default
console.error("Feature flag error:", e);
return defaultValue;
}
}
// 사용
if (isFeatureEnabled("new_checkout_flow", false)) {
showNewCheckout();
} else {
showOldCheckout();
}
Default 안전한 동작 — 신기능은 기본 OFF, kill switch 는 기본 ON.
Pattern 6: Multi-channel 안 폭격
# 사용자 한 명에게 한 캠페인 = 한 채널만
campaign_strategy:
- try: push (만약 권한 있음)
- fallback: in-app (다음 세션)
- fallback: email (push · in-app 다 실패)
- SMS: 만 *critical urgent* 만 (별도 룰)
3 채널 동시 = 사용자 quit. cascade fallback 이 표준.
시험 직전 한 번 더 — Features 4 종 함정 압축 노트
- 4 기능 = Push · In-app · Content Card · Feature Flag
- 채널별 위치 = 모든 환경 / 앱 사용 중 / 앱 inbox / 코드 분기
Push
- 3 환경 = iOS APNs · Android FCM · Web Push (Service Worker + VAPID)
- 각 환경 별도 인증 필요
- iOS = Auth Key (.p8 권장, 무기한) vs Certificate (.p12 연 만료)
- Android = FCM v1 + Service Account JSON (Legacy Server Key 종료)
- Web = HTTPS 필수
- Rich Push = image · video · GIF (engagement 30~50% ↑)
- Silent Push =
aps.content-available = 1(iOS) · data-only (Android), throttling 주의 - Action Buttons = 인터랙티브 push
- Deep Link = 목적 화면 직접 진입 (Universal Link · App Link)
- 권한 = Soft Prompt + 가치 인식 → OS Prompt 3 단계 (거부율 50%→20%)
- 함정 — iOS 인증 만료, FCM Legacy 종료, Web HTTPS, token rotation 누락
In-app Message
- 앱 사용 중 모달 — 권한 X · click rate 높음
- Trigger 종류 = Custom Event · Session Start · Purchase · Specific Screen
- 우선순위 + Frequency Capping (피로 회피)
- Template = Modal · Slideup · Fullscreen · Custom HTML
- Modal/Slideup 흔함, Fullscreen 남용 X
- Click Action = Deep Link · URL · Custom Action · Dismiss
- Custom HTML = iframe sandboxed (보안)
- 함정 — display 시점 안 맞음, frequency cap 누락, push 와 중복
Content Card
- 앱 안 inbox · 영구 노출 (사용자 dismiss 까지)
- 4 종류 = Classic · Captioned Image · Banner · Control (A/B 비표시)
- Click · Dismiss · Impression 자동 추적
- Refresh 자동 + 명시
requestContentCardsRefresh() - Cache 전략 = 로컬 + 오프라인 표시
- Custom view 가능 (Braze data + 우리 UI)
- 함정 — sync 늦음, dismiss 추적 누락, expiration 미설정
Feature Flag
- Braze 안의 dedicated 도구
getFeatureFlag("id")+.enabled·.getStringProperty()등- Use Case 5종 = Gradual Rollout · Remote Config · A/B · Message Coordination · Segmentation
- Plan 한도 = Free 10 flag · 1 experiment / Paid 110 flag · 100 experiment
- SDK 최소 = Swift 5.9 · Web 4.6 · Android 24.2
- vs Statsig — Statsig 강 = dedicated · 통계 · Warehouse Native, Braze 강 = Canvas 통합 · segment
- 큰 회사 = 둘 다 사용 (Statsig=실험, Braze=마케팅 연동)
4 기능 통틀어 함정
- 채널 권한 잘못 (subscription state 추적)
- Frequency cap 미설정 (사용자 폭격)
- Deep link fallback 누락
- Push permission 거부 후 회복 X (앱 안 설정 안내)
- In-app + Push 중복 (foreground 표시 X)
- Content Card cache 무한
- Feature Flag default 안전성
- Multi-channel 동시 발송 (cascade fallback 권장)
채널 선택 원칙
- 긴급도 = SMS · Push > In-app > Content Card > Email
- 콘텐츠 양 = Email > In-app > Content Card > Push > SMS
- 사용자 상태 = In-app (active) vs Push (모두)
- 지속 = Content Card vs 짧은 Push
운영 패턴
- Channel Subscription Helper (channel 별 동의 관리)
- Soft Push Prompt + Tracking
- In-app 우선순위 + frequency cap
- Content Card 자동 cleanup
- Feature Flag 안전한 default
- Multi-channel cascade fallback
공식 문서: Braze Feature Flags · Developer Guide Home 에서 원문을 확인할 수 있어요.
시리즈 다른 편 (앞뒤 글 모음)
이전 글:
- 1편 — Customer Engagement Platform · 5 핵심 개념
- 2편 — SDK 통합 · REST API · 첫 캠페인 30분
- 3편 — Developer Guide · Identity · 데이터 모델 깊이
다음 글: