1 Foundation · 1-2

인앱 이벤트 택소노미 설계서

비즈니스 핵심 퍼널을 단일 진실 원천(SSOT)으로 정의하는 이벤트 스펙. 매체 최적화 시그널, 코호트 분석, LTV 검증의 기반이 되며, 이름·파라미터·발화 시점 3요소가 모두 표준화된다.

담당 · Growth + Product 명명 규칙 · snake_case Tier-1 이벤트 12
핵심 요약

본 택소노미는 퍼널 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 NameFunnel StageTriggerRequired ParamsTierSource
session_startLifecycle앱 포그라운드 진입platform, app_version, network_typeTier-1auto
sign_upAcquisition회원가입 완료method(email|kakao|apple), user_gradeTier-1manual
loginLifecycle기존 사용자 로그인method, days_since_last_loginTier-2manual
onboarding_completeActivation온보딩 마지막 스텝 종료duration_sec, skipped(bool)Tier-1manual
product_viewFunnel상품 상세 조회product_id, category, price, currencyTier-2manual
add_to_cartFunnel장바구니 추가product_id, quantity, priceTier-1manual
begin_checkoutFunnel결제 화면 진입cart_value, item_countTier-1manual
purchaseRevenue결제 완료 (트랜잭션)transaction_id, revenue, currency, payment_methodTier-1manual
subscribeRevenue구독 시작 (Trial 포함)plan_id, trial(bool), revenueTier-1manual
refundRevenue환불 처리transaction_id, refund_amountTier-2server
shareEngagement외부 공유 액션channel(km|fb|link), content_typeTier-3manual
push_openRe-engagement푸시 알림 진입campaign_id, segmentTier-2manual

§3표준 파라미터 스펙

ParameterTypeExampleRequiredDescription
transaction_idstringtx_20260525_a91b3Yes (purchase)결제 트랜잭션 유니크 식별자. 중복 송신 차단 키
revenuedecimal(10,2)29900.00Yes (purchase)VAT 포함 매출. 음수는 환불 시에만 허용
currencystring(3)KRWYes (purchase)ISO 4217 통화 코드
product_idstringsku_88421Yes (commerce)내부 SKU. 카탈로그 매칭 키
categorystringouterwearNoL1 카테고리. 슬래시 구분으로 L2까지 표기 가능
quantityinteger2Yes (cart)수량. 1 이상 정수
pricedecimal(10,2)14950.00Yes (cart)단가. revenue = price × quantity
payment_methodstringcard_visaYes (purchase)card_* / kakaopay / naverpay / applepay / googlepay
user_gradestringvipNoguest / new / regular / vip 4단계
screenstringhome_mainNo발화 시점 화면명. 스크린명은 별도 사전 관리

§4참조 페이로드

모든 클라이언트 SDK는 아래 JSON 구조로 직렬화한 후 Adjust SDK의 ADJEvent / AdjustEvent에 매핑한다. 서버 사이드 송신 시 동일 페이로드를 S2S endpoint로 전달한다.

Event Payload · purchase
{
        "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)

TaxonomyMapper.kt
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트러블슈팅 / 함정

!
revenue가 매체 대시보드에서 항상 0으로 보고된다

1) setRevenue 호출 전에 currency가 누락. 2) Adjust 대시보드에서 해당 event_token이 Revenue Event로 체크되지 않음. 3) 클라이언트 통화와 매체 reporting currency 불일치 시 FX 변환 누락. 매체별 reporting currency를 단일 KRW 또는 USD로 통일 권장.

!
중복 purchase 이벤트로 ROAS가 부풀려진다

StoreKit/Play Billing의 결제 콜백이 retry되며 동일 트랜잭션을 다회 송신하는 패턴. transaction_id를 Adjust orderId에 강제 매핑하고 SDK 레벨 dedup에 위임. 또한 서버 검증(Receipt Validation) 완료 후에만 클라이언트가 이벤트를 발화하도록 시점을 강제.

!
UAC tCPA 캠페인이 학습 단계에서 빠져나가지 못한다

Tier-1 이벤트 발화량이 주당 30건 미만이면 머신러닝이 수렴하지 않음. 발화량이 부족하면 conversion 정의를 purchaseadd_to_cart 또는 begin_checkout 등 상위 퍼널 이벤트로 일시 변경하여 학습량 확보 후 재전환.

i
PII가 파라미터에 포함되었다

이메일/전화번호가 product_id에 섞이거나, search_keyword에 자유 입력값이 들어가는 케이스. 출시 전 Adjust raw export에서 정규식(@, 010, +) 필터로 1차 스캔. 적발 시 즉시 해당 파라미터를 hash 처리 또는 제거하고 매체사 데이터 삭제 요청 절차 가동.