MEASUREMENT PLAN · v2.0 핵심판
선주 모바일 GA4 측정 설계서
핵심만 남긴 판입니다. 이벤트 34개 → 10개.
“이 이벤트가 없으면 어떤 의사결정을 못 하는가”에 답이 없으면 뺐습니다.
이벤트 10개화면 7개커스텀 정의 8개공통 파라미터 4개웹뷰 53% 대응
선주 모바일 GA4 측정 설계서 (핵심판)
- v2.0 · 2026-08-19 · 이전 v1.0(이벤트 34개)에서 핵심만 남겨 10개로 축소
- 대상: 프론트 개발자(구현) · 데이터(설정) · QA(검증)
- 원칙: "이 이벤트가 없으면 어떤 의사결정을 못 하는가?"에 답이 없으면 뺀다.
1. 무엇을 왜 재는가
선주앱은 마케팅 퍼널이 아니라 공급자의 운영 도구입니다. 그래서 딱 세 가지만 봅니다.
| # | 질문 | 이 질문에 답하는 이벤트 |
|---|---|---|
| 1 | 선주가 돈을 버는 흐름이 도는가 | owner_confirm |
| 2 | 선주가 돈을 잃는 지점은 어디인가 | owner_cancel · owner_close_now |
| 3 | 신규 선주가 첫 매출까지 오는가 | owner_product_create → owner_confirm |
나머지(조황·공지·명단 열람 등)는 화면 조회수(screen_view)로 충분합니다. 이벤트로 따로 만들지 않습니다.
2. 규칙 4개
- 선주앱 커스텀 이벤트는 전부
owner_프리픽스. 표준 이벤트는 프리픽스를 못 붙이므로 user_propertyaf_app_role=owner로 구분한다. - 화면 조회는
screen_view하나로 통일한다.page_view는 쓰지 않는다. - 웹뷰(비중 53%)에 gtag/GTM을 직접 심지 않는다.
AF.track()브릿지 → 네이티브 SDK 단일 경로. 웹 스트림의 '페이지 변경 기반 이벤트'는 OFF. - 선주앱에서
purchase/booking_purchase를 절대 보내지 않는다. 손님앱과 매출이 이중 집계된다.
3. 공통 파라미터 4개 · user_property 3개
모든 이벤트에 자동으로 실립니다.
| 파라미터 | 값 예시 | 왜 필요한가 |
|---|---|---|
screen_id | OWN_HOME | 어느 화면에서 벌어진 일인지 |
view_layer | native / webview | 웹뷰 53%가 문제인지 아닌지 가르는 축 |
entry_from | tab / push / deeplink | 푸시가 실제로 선주를 부르는지 |
app_version | 2.14.0 | 배포 전후 비교 |
| user_property | 값 | 왜 필요한가 |
|---|---|---|
af_app_role | owner / captain | 손님앱과 섞이지 않게 |
owner_ship_count_band | 1 / 2_3 / 4_9 / 10p | 1척 선주와 다척 선주는 행동이 다름 |
owner_tenure_band | d0_7 / d8_30 / d31_90 / d90p | 신규 온보딩 분석의 기준축 |
선박ID·업체ID·권한·요금제·인증상태는 일단 뺐습니다. 지금 그 값으로 내릴 결정이 없습니다. 필요해지면 7장 보류 목록에서 꺼내 씁니다.
4. 화면 — screen_view (7개)
screen_view 이벤트 하나에 screen_id 파라미터만 바꿔 넣습니다.
| screen_id | 화면 |
|---|---|
OWN_HOME | 홈 (확정 대기) |
OWN_PROD_DAILY | 상품관리 · 일자별 |
OWN_PROD_MASTER | 상품관리 · 마스터 |
OWN_PROD_CREATE | 상품 등록 |
OWN_RSV_LIST | 예약자 명단 |
OWN_SETTLE | 정산관리 |
OWN_FISH | 조황관리 |
바텀시트·토스트·탭 전환에는 screen_view 를 보내지 않습니다(예약자 명단만 예외 — 체류가 길어 화면으로 취급).
5. 이벤트 10개 (전부)
| # | 이벤트 | 시점 | 파라미터 | 이걸로 무엇을 아는가 |
|---|---|---|---|---|
| 1 | owner_confirm | 예약 확정 완료 | count int · pax int · hours_since_payment number | 핵심 전환. 확정까지 몇 시간 걸리는지 |
| 2 | owner_cancel | 예약 취소 완료 | cancel_reason · count int · refund_amount number · days_to_departure int | 손실액과 사유. 기상인지 오버부킹인지 |
| 3 | owner_product_create | 상품 등록 완료 | create_type daily/master · is_first_product 1/0 | 온보딩 첫 관문 통과 |
| 4 | owner_close_now | 즉시마감 실행 | fill_rate number 0.64 | 빈 배로 나가는 비율. 마감 시점 소진율 |
| 5 | owner_seat_adjust | 남은좌석 저장 | before_seat int · after_seat int | 좌석을 늘리는지 줄이는지 |
| 6 | owner_bulk_edit | 일괄수정 저장 | date_count int · changed_fields seat,close | 일괄수정이 실제로 쓰이는지 |
| 7 | owner_manual_add | 예약자 직접 추가 | pax int | 앱 밖(전화) 예약 비중 |
| 8 | owner_call_tap | 예약자 번호 탭 → 전화 | number_type safe/direct · is_expired 1/0 | 안심번호가 실제로 작동하는지 |
| 9 | owner_settlement_excel | 정산 엑셀 다운로드 | month | 정산을 앱에서 끝내는지, 밖으로 빼는지 |
| 10 | owner_friction | 비활성 버튼 클릭 · 유효성 오류 · 권한 차단 · API 오류 | friction_type · element · error_code(선택) | 어디서 막히는지 — 이벤트 폭증 없이 전 화면 커버 |
왜 이 10개인가
- 1·2·4는 돈에 직결됩니다. 3은 온보딩, 10은 막히는 지점.
- 5·6·7·8·9는 "이 기능을 계속 유지할까 / 개선할까"를 정하는 최소 근거입니다.
- 조황 등록·공지 발송·명단 열람·탭 전환·좌석 그리드 확장 등은
screen_view로 충분해서 뺐습니다.
6. enum — cancel_reason (6종 · 기획 확정)
| 화면 표기 | 전송 값 | 손님 알림톡 |
|---|---|---|
| 오버부킹 | overbooking | "예약 착오"로 치환 |
| 물때·조황부진 | poor_catch | "조황 상황"으로 치환 |
| 최소인원 미달 | min_pax_unmet | 그대로 |
| 기상 악화 | bad_weather | 그대로 |
| 정비일 | maintenance | 그대로 |
| 휴무일 | holiday | 그대로 |
friction_type : disabled_click · validation_error · permission_denied · api_error
값에 한글 금지 — 탐색분석 정규식·BigQuery·Looker에서 깨집니다.
7. 커스텀 정의 등록 (8개)
| 표시 이름 | 범위 | 파라미터 |
|---|---|---|
| 선주_화면ID | 이벤트 | screen_id |
| 선주_렌더레이어 | 이벤트 | view_layer |
| 선주_진입경로 | 이벤트 | entry_from |
| 선주_취소사유 | 이벤트 | cancel_reason |
| 선주_마찰유형 | 이벤트 | friction_type |
| 선주_역할 | 사용자 | af_app_role |
| 선주_선박수 | 사용자 | owner_ship_count_band |
| 선주_가입경과 | 사용자 | owner_tenure_band |
맞춤 측정항목 2개: 선주_환불액(refund_amount, 통화) · 선주_확정소요시간(hours_since_payment, 표준)
주요 이벤트(전환) 표시: owner_confirm · owner_product_create 2개만.
8. GA4 콘솔 설정 (7단계)
analytics.google.com/?authuser=1→ hiseo@aboutfishing.kr 로 속성aboutfishing-product(295704822) 진입- 관리 → 데이터 스트림 → 선주앱 전용 앱 스트림 생성 (손님앱 스트림에 얹지 않는다)
- 레거시 웹뷰가 있으면 웹 스트림 추가 후 '페이지 변경 기반 이벤트' OFF
- 데이터 보관 기간 14개월로 변경 (기본 2개월)
- 맞춤 정의 → 7장의 이벤트 5개 · 사용자 3개 · 측정항목 2개 등록
- 이벤트 → 주요 이벤트 2개 표시
- DebugView 검증 (10장) → 릴리스 48시간 뒤
(other)행 발생 여부 점검
9. 구현 순서
1단계 — 토대 (이것만 되면 절반은 끝)
- Firebase SDK + 선주앱 스트림 연결
analytics/events.ts상수 파일 (이벤트명·enum 전부 상수화, 문자열 직접 입력 금지)- JS 브릿지
AF.track/AF.screen - 공통 파라미터 4개 자동 주입 · user_property 3개
screen_view7개 화면
2단계 — 돈 이벤트
owner_confirm·owner_cancel·owner_product_create·owner_close_now
3단계 — 나머지
owner_seat_adjust·owner_bulk_edit·owner_manual_add·owner_call_tap·owner_settlement_excelowner_friction— 공통 유틸로 한 번만 만들고 전 화면에서 호출
// analytics/events.ts
export const EV = {
CONFIRM : 'owner_confirm',
CANCEL : 'owner_cancel',
FRICTION: 'owner_friction',
} as const;
export const CANCEL_REASON = {
OVERBOOKING: 'overbooking',
POOR_CATCH : 'poor_catch',
MIN_PAX : 'min_pax_unmet',
BAD_WEATHER: 'bad_weather',
MAINTENANCE: 'maintenance',
HOLIDAY : 'holiday',
} as const;
10. QA 체크 5개
- 공통 파라미터 4개가 모든 이벤트에 붙는가
- 웹뷰 화면 이동 시
screen_view가 1회만 찍히는가 (2회면 향상된 측정 OFF 누락) cancel_reason이 영문 슬러그로 오는가 (한글이면 반려)- 선주앱에서
purchase/booking_purchase가 발생하지 않는가 - 파라미터에 이름·전화번호·안심번호가 섞이지 않았는가
11. 지금은 뺀 것 (보류 목록)
필요해지면 이 순서로 꺼내 씁니다. 지금 넣지 않는 이유가 각각 있습니다.
| 뺀 것 | 뺀 이유 | 다시 넣을 조건 |
|---|---|---|
| 확정/취소 시작·중단 이벤트 | 완료 이벤트와 화면 조회수로 이탈을 추정할 수 있음 | 확정 전환율이 낮게 나와 원인을 파야 할 때 |
| 조황·공지 이벤트 | screen_view 로 사용 여부는 이미 보임 | 조황 발행이 예약에 미치는 영향을 증명해야 할 때 |
| 노출 토글·판매중지·명단 탭 전환 | 운영 세부 동작이라 의사결정과 거리가 멂 | 해당 기능 개편을 검토할 때 |
| 선박ID·업체ID·권한·요금제 | 지금 그 축으로 내릴 결정이 없음 | 다척 선주 전용 기능을 만들 때 |
ui_width_bucket(320/344/360) | 레이아웃은 QA로 잡는 문제 | 폭 관련 이탈이 의심될 때 |
| 사용법 영상 진행률 | 영상 진입 UI가 아직 미확정 | 진입 UI 확정 후 |
| 첫 예약 수신 | 선주앱 액션이 아니라 클라이언트에서 측정 불가 | 서버에서 Measurement Protocol 로 쏠 때 |
부록. 관련 문서
- 기획서(Figma): 파일
KyXXpLN19n1oytwYWHImJq/ 페이지 「클로드 선주 모바일」 - 확정 디자인: 취소 모달
20575:30196·20575:30296/ 홈 결제일시20375:721 - 상세판(v1.0, 이벤트 34개): 같은 폴더의
선주앱_GA4_측정설계서_260819.md