인앱 이벤트 택소노미 설계서
비즈니스 핵심 퍼널을 단일 진실 원천(SSOT)으로 정의하는 이벤트 스펙. 매체 최적화 시그널, 코호트 분석, LTV 검증의 기반이 되며, 이름·파라미터·발화 시점 3요소가 모두 표준화된다.
본 택소노미는 퍼널 7단(Install → Activate → Convert → Retain → Refer → Monetize → Reactivate)을 12개의 Tier-1 이벤트로 압축한다. 모든 이벤트는 snake_case 명명, 영문 소문자, 동사+명사 또는 명사+상태 구조를 강제한다. Tier-1은 매체 최적화 시그널(UAC/AAP/ASA tCPA) 및 SKAN Conversion Value 매핑의 입력값으로 사용되며, 임의 변경 시 캠페인 러닝 데이터를 폐기하고 재학습이 필요하다.
§1명명 원칙
- snake_case 강제:
addToCart(X) →add_to_cart(O). Camel/Pascal/Kebab 혼용 금지 - 동사+명사 또는 명사+상태:
view_product대신product_view(GA4 표준 정합) - 예약 이벤트명 회피:
session_start,first_open,in_app_purchase등 Adjust/Firebase 예약어는 자체 정의 불가. Adjust의in_app_purchase는 자동 매핑되도록purchase이벤트로 매출 송신 - 최대 길이 40자, 파라미터 키 25자, 값 100자 이내
- PII 절대 금지: email, phone, name, address, device_token 직접 송신 금지. 필요한 경우 hash(SHA-256) + salt 후 전송
- currency는 ISO 4217 3자리 (KRW, USD, JPY). revenue는 단일 통화로 정규화하지 말고 currency 파라미터를 항상 동반
§2이벤트 마스터 목록
컬럼 헤더를 클릭하면 정렬됩니다. Tier-1은 매체 최적화 신호로 사용되는 핵심 이벤트입니다.
| Event Name | Funnel Stage | Trigger | Required Params | Tier | Source |
|---|---|---|---|---|---|
| session_start | Lifecycle | 앱 포그라운드 진입 | platform, app_version, network_type | Tier-1 | auto |
| sign_up | Acquisition | 회원가입 완료 | method(email|kakao|apple), user_grade | Tier-1 | manual |
| login | Lifecycle | 기존 사용자 로그인 | method, days_since_last_login | Tier-2 | manual |
| onboarding_complete | Activation | 온보딩 마지막 스텝 종료 | duration_sec, skipped(bool) | Tier-1 | manual |
| product_view | Funnel | 상품 상세 조회 | product_id, category, price, currency | Tier-2 | manual |
| add_to_cart | Funnel | 장바구니 추가 | product_id, quantity, price | Tier-1 | manual |
| begin_checkout | Funnel | 결제 화면 진입 | cart_value, item_count | Tier-1 | manual |
| purchase | Revenue | 결제 완료 (트랜잭션) | transaction_id, revenue, currency, payment_method | Tier-1 | manual |
| subscribe | Revenue | 구독 시작 (Trial 포함) | plan_id, trial(bool), revenue | Tier-1 | manual |
| refund | Revenue | 환불 처리 | transaction_id, refund_amount | Tier-2 | server |
| share | Engagement | 외부 공유 액션 | channel(km|fb|link), content_type | Tier-3 | manual |
| push_open | Re-engagement | 푸시 알림 진입 | campaign_id, segment | Tier-2 | manual |
§3표준 파라미터 스펙
| Parameter | Type | Example | Required | Description |
|---|---|---|---|---|
| transaction_id | string | tx_20260525_a91b3 | Yes (purchase) | 결제 트랜잭션 유니크 식별자. 중복 송신 차단 키 |
| revenue | decimal(10,2) | 29900.00 | Yes (purchase) | VAT 포함 매출. 음수는 환불 시에만 허용 |
| currency | string(3) | KRW | Yes (purchase) | ISO 4217 통화 코드 |
| product_id | string | sku_88421 | Yes (commerce) | 내부 SKU. 카탈로그 매칭 키 |
| category | string | outerwear | No | L1 카테고리. 슬래시 구분으로 L2까지 표기 가능 |
| quantity | integer | 2 | Yes (cart) | 수량. 1 이상 정수 |
| price | decimal(10,2) | 14950.00 | Yes (cart) | 단가. revenue = price × quantity |
| payment_method | string | card_visa | Yes (purchase) | card_* / kakaopay / naverpay / applepay / googlepay |
| user_grade | string | vip | No | guest / new / regular / vip 4단계 |
| screen | string | home_main | No | 발화 시점 화면명. 스크린명은 별도 사전 관리 |
§4참조 페이로드
모든 클라이언트 SDK는 아래 JSON 구조로 직렬화한 후 Adjust SDK의 ADJEvent / AdjustEvent에 매핑한다. 서버 사이드 송신 시 동일 페이로드를 S2S endpoint로 전달한다.
{
"event_token": "p4q7zx",
"event_name": "purchase",
"timestamp_ms": 1779360000000,
"user": {
"user_id_hashed": "sha256:8a7d...e1c2",
"user_grade": "regular",
"is_logged_in": true
},
"params": {
"transaction_id": "tx_20260525_a91b3",
"revenue": 29900.00,
"currency": "KRW",
"payment_method": "kakaopay",
"item_count": 2,
"products": [
{ "product_id": "sku_88421", "category": "outerwear", "price": 14950.00, "quantity": 2 }
],
"screen": "checkout_complete"
},
"context": {
"platform": "android",
"app_version": "4.12.0",
"network_type": "wifi",
"ab_variant": "ckt_v3_B"
}
}
4.1 Adjust 매핑 (Kotlin)
fun trackPurchase(tx: Transaction) {
val event = AdjustEvent("p4q7zx").apply {
setRevenue(tx.revenue, tx.currency)
setOrderId(tx.id) class="c">// dedup key
addCallbackParameter("payment_method", tx.method)
addCallbackParameter("item_count", tx.items.size.toString())
addPartnerParameter("ab_variant", tx.abVariant)
}
Adjust.trackEvent(event)
}
§5버전 관리 및 거버넌스
- v{major}.{minor} 형식. Tier-1 이벤트 추가/삭제는 major, 파라미터 추가는 minor
- Deprecation 정책: 60일 dual-write 기간 유지 후 구 이벤트 송신 중단. 매체 최적화 모델은 신 이벤트로 재학습 필요
- 변경 요청은 Notion DB의 Taxonomy Change Request 템플릿으로만 접수. Growth Lead + Data Eng + iOS/Android Lead 3자 승인
§6트러블슈팅 / 함정
1) setRevenue 호출 전에 currency가 누락. 2) Adjust 대시보드에서 해당 event_token이 Revenue Event로 체크되지 않음. 3) 클라이언트 통화와 매체 reporting currency 불일치 시 FX 변환 누락. 매체별 reporting currency를 단일 KRW 또는 USD로 통일 권장.
StoreKit/Play Billing의 결제 콜백이 retry되며 동일 트랜잭션을 다회 송신하는 패턴. transaction_id를 Adjust orderId에 강제 매핑하고 SDK 레벨 dedup에 위임. 또한 서버 검증(Receipt Validation) 완료 후에만 클라이언트가 이벤트를 발화하도록 시점을 강제.
Tier-1 이벤트 발화량이 주당 30건 미만이면 머신러닝이 수렴하지 않음. 발화량이 부족하면 conversion 정의를 purchase → add_to_cart 또는 begin_checkout 등 상위 퍼널 이벤트로 일시 변경하여 학습량 확보 후 재전환.
이메일/전화번호가 product_id에 섞이거나, search_keyword에 자유 입력값이 들어가는 케이스. 출시 전 Adjust raw export에서 정규식(@, 010, +) 필터로 1차 스캔. 적발 시 즉시 해당 파라미터를 hash 처리 또는 제거하고 매체사 데이터 삭제 요청 절차 가동.