DEV Community

Cover image for MMP raw export 컬럼 사전 — Appsflyer, Adjust, Branch가 주는 진짜 데이터
HyunSeok Jeong
HyunSeok Jeong

Posted on • Originally published at blog.trysitely.com

MMP raw export 컬럼 사전 — Appsflyer, Adjust, Branch가 주는 진짜 데이터

앱 광고 운영자라면 MMP raw export는 매일 만나는 데이터입니다. 그런데 정작 컬럼이 100개가 넘어가는 그 CSV에서 무엇이 진짜 신뢰할 컬럼이고, 무엇이 보조 정보이고, 무엇이 NULL이 많은지를 한 곳에서 정리한 글은 의외로 드물어요. 이 글은 Appsflyer·Adjust·Branch 세 MMP의 raw export 컬럼을 한 표로 정리하고, 각 컬럼이 마케터의 의사결정에서 어떤 의미를 갖는지를 함께 풉니다. 이 글 하나 옆에 두고 raw 데이터 보면 80%의 질문이 끝납니다.

왜 raw export를 직접 봐야 하나

MMP UI 대시보드는 굉장히 잘 만들어졌습니다. 캠페인별 install·revenue·ROAS가 알아서 그려져요. 그런데 운영자가 다음 단계로 가려면 raw export를 직접 만져야 하는 순간이 옵니다.

  • "UI ROAS와 BI ROAS가 다르다, 어디서 깨졌나"
  • "MMM에 넣을 채널별 install·revenue 일자별 데이터"
  • "사내 CDP와 MMP 데이터를 user-level로 매칭"
  • "incrementality 분석을 위한 raw event 추출"
  • "View-through와 click-through를 분리해서 보고"

이 모든 분석의 1번 입력이 MMP raw export입니다. UI는 가공된 요약이라서 원하는 단위·정의로 못 자릅니다.

Appsflyer·Adjust·Branch raw export 컬럼 매핑 인포그래픽
세 MMP의 컬럼은 이름이 다르지만 같은 의미. media_source·campaign·attribution flag·reinstall·postback 5개 그룹으로 매핑하면 한 번에 보인다.

5초 요약 — 세 MMP의 컬럼 매핑 표

의미 Appsflyer Adjust Branch
매체 이름 media_source network_name last_attributed_touch_data_tilde_channel
캠페인 campaign campaign_name ..._tilde_campaign
광고 그룹 adset / af_adset adgroup_name ..._tilde_ad_set_name
소재 af_ad creative_name ..._tilde_ad_name
install 시각 install_time installed_at last_attributed_touch_data_plus_timestamp
클릭 시각 click_time click_time last_attributed_touch_data_plus_click_timestamp
사용자 ID appsflyer_id + customer_user_id adid + user_id branch_id + developer_identity
디바이스 ID idfa/idfv/gaid idfa/gps_adid idfa/google_advertising_id
매출 revenue revenue_usd last_attributed_touch_data_plus_revenue
attribution 종류 af_status(Organic/Non-Organic) tracker last_attributed_touch_type
Reattribution is_retargeting + reattribution_status is_reattributed last_cta_view_timestamp
첫 설치인가 is_first_session is_first_session (이벤트 type)

이 표 한 장으로 MMP 간 데이터 매핑 SQL의 90%가 결정됩니다.

Appsflyer 핵심 컬럼

Appsflyer가 글로벌 1위 MMP인 만큼 raw export 컬럼이 가장 풍부하고, 또 많아서 헷갈립니다. 자주 쓰는 컬럼 그룹을 분류해볼게요.

매체·캠페인 식별

  • media_source — 매체 (예: facebook_int, googleadwords_int, organic)
  • campaign / campaign_id — 캠페인
  • adset / adset_id — 광고 그룹
  • af_ad / af_ad_id — 소재
  • af_channel — 매체가 지정한 채널
  • af_keywords — 검색 광고의 키워드

Attribution 결과

  • af_status — Organic / Non-Organic. 가장 중요한 분류 컬럼
  • attribution_type — click_through / view_through / impression
  • match_type — referrer / probabilistic / id_matching
  • is_primary_attribution — 같은 install의 multiple touch 중 1차 attribution 여부

시간

  • install_time — 첫 설치 시각 (가장 중요)
  • event_time — 이 이벤트 시각
  • attributed_touch_time — 마지막 어트리뷰션 터치 시각
  • click_time — 마지막 클릭 시각

식별자

  • appsflyer_id — MMP가 만드는 device-level ID
  • customer_user_id — 광고주가 박는 사용자 ID (CDP 매칭용)
  • idfa / idfv / gaid — 디바이스 광고 ID
  • idfv — iOS는 ATT 동의 안 받으면 idfa는 NULL, idfv만 채워짐

매출과 이벤트

  • event_name — purchase, level_up, tutorial_complete 등 SDK가 보낸 이벤트
  • event_value — 이벤트 페이로드 JSON
  • revenue — 매출 (자사 통화)
  • revenue_in_selected_currency — 보고서 환산 통화의 매출

📌 Organic의 진짜 의미

af_status = Organic은 "어느 매체에도 attribution이 안 됐다"는 의미입니다. 진짜 organic 검색이 아니라 attribution 실패 + dark traffic까지 다 포함이에요. iOS ATT 거부로 attribution이 안 잡힌 광고 트래픽도 여기로 들어옵니다. 그래서 ATT 비율이 떨어지면 Organic이 비현실적으로 늘어 보여요.

Adjust 핵심 컬럼

Adjust는 Appsflyer 대비 컬럼이 좀 더 깔끔하고 표준 OpenAPI 친화적입니다. 자주 쓰는 컬럼:

  • tracker — Adjust가 만든 deeplink 트래커 ID
  • network_name / campaign_name / adgroup_name / creative_name — 매체 계층
  • installed_at — 첫 설치 시각
  • click_time — 마지막 클릭 시각
  • impression_time — 마지막 view 시각 (view-through 시)
  • adid — Adjust device ID
  • idfa / idfv / gps_adid
  • user_id — 광고주가 박는 사용자 ID
  • revenue_usd — USD 변환된 매출
  • currency — 원본 통화
  • is_first_session — 첫 설치/재설치 여부
  • is_reattributed — reattribution 여부
  • engagement_type — click / impression / install

Adjust의 강점은 tracker 한 컬럼만 봐도 캠페인 전체 계층(매체·캠페인·광고그룹·소재)을 다 풀어낼 수 있다는 점입니다. 단일 키로 모든 매핑을 할 수 있어 SQL이 깔끔해요.

Branch 핵심 컬럼

Branch는 deeplink·attribution을 한 번에 다루는 회사라 컬럼 이름이 길고 nested합니다. 그런데 그만큼 한 이벤트의 attribution 맥락 전체가 한 row에 들어있어요.

  • last_attributed_touch_data_tilde_channel — 매체
  • last_attributed_touch_data_tilde_campaign — 캠페인
  • last_attributed_touch_data_tilde_ad_set_name — 광고 그룹
  • last_attributed_touch_data_tilde_ad_name — 소재
  • last_attributed_touch_data_plus_timestamp — 마지막 touch 시각
  • last_attributed_touch_data_plus_click_timestamp — 마지막 클릭 시각
  • last_attributed_touch_type — click / impression / referrer
  • last_attributed_touch_data_plus_revenue — 매출
  • branch_id — Branch device ID
  • developer_identity — 광고주 박은 사용자 ID
  • last_cta_view_timestamp — 마지막 CTA view 시각

Branch는 단일 row 안에 first touch / last touch 정보가 다 들어있어 multi-touch attribution을 한 SQL로 짤 수 있다는 게 강점입니다.

SKAdNetwork postback 컬럼

iOS 14.5 이후 attribution은 SKAdNetwork(SKAN) 기반 conversion value postback이 표준이 됐습니다. MMP raw에 추가로 들어오는 컬럼들이에요.

컬럼 의미 Appsflyer Adjust Branch
Conversion value conversion_value (0~63) conversion_value conversion_value
Redownload redownload redownload redownload
App version source_app_id source_app app_version
Postback 시각 event_time (postback 도착 시각) postback_at postback_received_at

SKAN 데이터는 다음 두 가지 특성이 있어 raw 처리할 때 주의가 필요해요.

  • 24~48시간 지연 후 도착 (lag)
  • 일정 수 이하의 install은 privacy threshold로 NULL (k-anonymity)
  • conversion value 6비트(0~63)에 자사 정의한 의미 매핑이 필요 (compressed value)

깊은 SKAN 다루는 skan-postback-decoding·ios-att-skadnetwork-aem에서 더 자세히 정리했으니 SKAN 운영하시면 같이 보시면 좋습니다.

Reinstall·Reattribution 컬럼이 가장 헷갈리는 자리

같은 user가 앱을 지웠다가 다시 설치하면 그건 새 install인가, 재설치인가. 이걸 어떻게 카운팅하느냐에 따라 ROAS가 달라집니다.

MMP의 룰:

  • 첫 설치 후 24시간 이내 재설치 → reinstall (is_first_session=true, is_reattributed=false)
  • 첫 설치 후 24시간 이상 후 재설치 → reattribution (is_first_session=false, is_reattributed=true)
  • 둘 다 새 install로 매체에 attribution은 됨

마케터 시선에서는 이걸 분리해서 봐야 해요.

  • is_first_session=true AND is_reattributed=false → 진짜 신규
  • is_reattributed=true → 재유입 (재마케팅 효과)

이걸 안 나누면 reattribution이 신규로 잡혀 ROAS가 부풀려져 보입니다.

⚠️ iOS는 reinstall 판정이 더 어렵다

iOS는 IDFA가 없으면 같은 사람의 재설치를 못 식별할 수 있어요. 그래서 Appsflyer·Adjust의 iOS reattribution 컬럼은 신뢰도가 낮습니다. iOS reattribution KPI는 보조 지표로만 보세요.

환경 노이즈를 거르는 필터

raw export에는 자주 보이는 노이즈가 몇 가지 있습니다. 다음 필터를 기본으로 적용하고 분석을 시작하면 시간이 절약돼요.

  • attribution_type IS NOT NULL — attribution 실패 row 제외
  • media_source <> 'organic' — 광고 분석 시 organic 제외
  • is_first_session = true — 신규 설치만 본다면
  • app_version >= '최신 버전' — 구버전 데이터의 가짜 attribution 제외
  • event_time BETWEEN install_time AND install_time + INTERVAL '30 days' — 이상치 제외

사내 CDP와 매칭하는 키 우선순위

MMP 데이터를 사내 CDP·DW와 매칭할 때 어느 키를 쓸지 표준화가 필요합니다.

  1. customer_user_id (Appsflyer) / user_id (Adjust) / developer_identity (Branch) — 광고주가 박은 사내 ID. 가장 강함.
  2. idfa / gaid — 디바이스 ID. ATT 거부면 NULL.
  3. appsflyer_id / adid / branch_id — MMP device ID. 약하지만 유일.
  4. idfv — iOS 앱별 ID. 한 앱 안에서만 유효.

CDP를 운영한다면 사내 user_id를 MMP SDK 초기화 때 즉시 박는 게 표준입니다. 이걸 빠뜨리면 attribution은 잡혀도 CDP 매칭이 안 돼서 한 단계 더 분석을 할 수 없어요.

{/* TODO_HUNY: 매드업 운영에서 실제로 Appsflyer·Adjust·Branch 중 어느 MMP를 주로 다루셨고, 위 컬럼 중 가장 자주 보시는 컬럼·가장 자주 깨지는 컬럼이 있다면 한두 단락 추가. Amplitude·Mixpanel 같은 product analytics와 MMP 데이터 매칭 케이스도 좋은 후속이 될 듯합니다. */}

마치며

MMP raw export는 컬럼이 많지만 분류 매핑 한 번 해두면 SQL 짜는 게 단순해집니다. 위 표를 옆에 두고 새 분석을 시작할 때마다 컬럼 매핑 먼저 정리하시면 됩니다.

다음 글에서는 매체 자체 raw data — Meta·Google·TikTok·Naver export의 진짜 컬럼들 raw-data-meta-google-tiktok-naver로 이어집니다.

참고

Top comments (0)