앱 광고 운영자라면 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는 가공된 요약이라서 원하는 단위·정의로 못 자릅니다.

세 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와 매칭할 때 어느 키를 쓸지 표준화가 필요합니다.
-
customer_user_id(Appsflyer) /user_id(Adjust) /developer_identity(Branch) — 광고주가 박은 사내 ID. 가장 강함. -
idfa/gaid— 디바이스 ID. ATT 거부면 NULL. -
appsflyer_id/adid/branch_id— MMP device ID. 약하지만 유일. -
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)