Skip to content

fix(analytics): 랜딩 이벤트 측정 및 중복 전송 수정 - #168

Merged
minbros merged 1 commit into
mainfrom
hotfix/landing-analytics
Sep 11, 2026
Merged

minbros merged 1 commit into
mainfrom
hotfix/landing-analytics

Conversation

@minbros

@minbros minbros commented Sep 11, 2026

Copy link
Copy Markdown
Member

변경 내용

QA 미완료 INCONCLUSIVE — validation-pending Draft 전용이며 제품 완료가 아닙니다. 병합·production 배포 승인은 없습니다. 기존 Vercel 자동화의 비production Preview 생성이 관찰되었으나 acceptance가 아닙니다.

  • 랜딩 CTA 클릭과 섹션 노출을 기존 GA/Amplitude 공통 래퍼로 측정합니다.
  • GA 초기화 대기열을 GA에만 flush하여 이미 전달한 Amplitude 이벤트의 재전송을 방지합니다.

변경 이유

  • 랜딩의 이용 흐름을 일관된 이벤트 계약으로 측정하고, 동의·방문 기준과 각 sink의 1회 전달 동작을 함께 보장하기 위한 변경입니다.
  • 이미 검토된 불가분의 랜딩 분석 계약 및 sink 중복 방지 변경을 단일 publication snapshot 커밋으로 보존합니다.

테스트

아래 결과는 원본 t_27159e19/run449 실제 로그를 재사용합니다. 승인된 diff와 바이트 및 SHA256 일치를 확인했으며 이번 publication에서는 새 테스트나 브라우저 QA를 수행하지 않았습니다.

  • npm run lint — 원본 PASS, exit 0; 기존 <img> 경고 2개.
  • npm test — 원본 PASS, exit 0; 98개 파일, 501개 테스트.
  • npm run build — bare 실행은 API_BASE_URL 누락으로 FAIL, exit 1. 합성 loopback 값을 지정한 빌드만 원본 PASS, exit 0이며 실제 서비스 통합 검증이 아닙니다.
  • 그 외 수동 검증: Hermes 브라우저 QA 미완료 INCONCLUSIVE.
  • npx tsc --noEmit — 원본 PASS, exit 0.
  • publication 검증 — 커밋 parent, 승인된 15개 경로 및 전체 postimage 일치, tracked/untracked clean, git diff --check HEAD^ HEADgit diff --check exit 0.
  • 데스크톱 1440×900: 전체 7개 섹션, 연속 1초 dwell, 키보드, granted 상태 CTA, 동의 전환 및 navigation 검증.
  • 모바일 390×844: 전체 7개 섹션, 연속 1초 dwell, 키보드, granted 상태 CTA, 동의 전환 및 navigation 검증.
  • 원격 GA/Amplitude 수신 확인: 로컬 mock/sink 호출은 원격 수신 증거가 아닙니다.
  • GA 관리자 EVENT 측정기준 기존 등록 재확인 및 필요 시 별도 등록. 이번 작업에서는 등록하지 않았으며 key event 승격도 하지 않습니다.
이벤트 계약, 검증 한계 및 인계 상세

이벤트는 cta_click, section_view 두 가지이며 page_type=landing을 사용합니다. page_version은 추가하지 않습니다. 기존 정규화된 page_path, page_location을 재사용합니다.

CTA 위치 cta_id cta_position 이동
헤더 로그인 login header /login
Hero 여행 시작하기 start_trip hero /login
마지막 여행 시작하기 start_trip final /login

섹션 ID는 hero, problem, solution, features, devices, travel_steps, final_cta입니다. 헤더/푸터와 개별 카드는 제외합니다.

문서 foreground 및 granted 동의 상태에서 세로 가시 영역이 0.5 × min(section 높이, viewport 높이) 이상으로 연속 1000ms 유지되면 방문당 섹션별 한 번 집계합니다. 기준 미달, background, 동의 철회 시 진행 시간을 초기화합니다. pending/denied 시간은 저장하거나 소급 전송하지 않습니다. pathname 이탈 후 복귀 또는 새로고침은 새 방문이며 query/hash 변경, remount, StrictMode, 재스크롤은 같은 방문의 중복 집계를 만들지 않습니다. GA 대기열 flush는 GA에만 전달하므로 Amplitude replay를 방지합니다.

Hermes가 확인한 최신 t_0ad194b3/run451 done 인계(report131/comment337)에서는 데스크톱·모바일의 rAF 정지와 wheel 응답 실패가 제품 코드 없는 최소 loopback 문서에서도 재현되어 원래 랜딩 코드에만 국한되지 않음을 확인했습니다. 일반 foreground/viewport 변경으로는 지속적인 복구에 실패했으며 런타임·설정 변경은 없었습니다. 정확한 Chrome/런타임 원인은 여전히 미상이며 실제 앱/base A/B 비교는 수행하지 않았습니다. 원본 제품 QA는 계속 INCONCLUSIVE로 제품 정확성의 증거가 아니며, 원본 t_27159e19는 계속 blocked입니다. t_0ad194b3 독립 조사는 done 상태이며 이 PR publication의 의존성이 아닙니다.

관리자 이벤트 파라미터 표시명 범위
page_type Page type EVENT
section_id Section ID EVENT
cta_id CTA ID EVENT
cta_position CTA position EVENT

원본 합성 빌드 명령(실제 서비스 자격 증명 아님):

env NEXT_TELEMETRY_DISABLED=1 API_BASE_URL=http://127.0.0.1:9 NEXT_PUBLIC_API_BASE_URL=http://127.0.0.1:9 NEXT_PUBLIC_GOOGLE_CLIENT_ID=local-build-only NEXT_PUBLIC_GOOGLE_REDIRECT_URI=http://127.0.0.1:9/auth/callback NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=local-build-only NEXT_PUBLIC_GA_MEASUREMENT_ID= NEXT_PUBLIC_AMPLITUDE_API_KEY= npm run build

원본 검증 기준은 78a4c9031508df0a3f62e224076b6c3ca6acde3f 위의 승인된 변경이며 patch SHA256은 510c64a16bfcd5aa431a86668463cac35d5f1165f839a5632756534e29dd0262입니다. publication 커밋은 96d44eb541416a948565ff70de3ede6bfe5a7650입니다.

Hermes가 전달한 최신 fetched main 2a38ba37b315bdd016dcf7d3e8233bbfeb9316b2에는 이미지 변경 #167이 포함되어 LandingHero.tsx, LandingDesignSections.tsx 경로가 겹칩니다. Hermes는 게시된 PR #168을 독립 GET으로 확인했습니다: open, draft=true, base main (2a38ba37b315bdd016dcf7d3e8233bbfeb9316b2), head hotfix/landing-analytics (96d44eb541416a948565ff70de3ede6bfe5a7650), 15개 파일·445 additions·17 deletions, mergeable=true, mergeable_state=clean. 관찰 시점의 GitHub 충돌 없음 상태이며, rebase/merge는 하지 않았습니다. 기존 테스트는 최신 main과 결합된 상태를 검증하지 않으며 이 readback은 결합 상태 테스트·브라우저 acceptance 또는 병합 승인이 아닙니다.

Hermes의 checks readback: CodeRabbit은 Draft라 리뷰를 건너뛰었으며 pass로 보고되었습니다(코드 리뷰 완료가 아님). notify pass, Vercel pass(배포 완료), Vercel Preview Comments pass입니다. 정확한 head SHA의 deployments GET 결과는 ID 6391116065, environment Preview, production_environment=false입니다. PR publication 시 기존 Vercel 자동화가 비production Preview를 생성했습니다. Preview 런타임과 analytics 수신은 검증하지 않았으며 이 자동화 결과는 QA PASS가 아닙니다.

Codex는 로컬 커밋과 payload만 준비했으며, 승인된 hotfix 브랜치의 일반 push 및 main 대상 Draft PR publication은 Hermes가 수행했습니다. 병합·production 배포 승인은 없으며, 우리는 수동 배포 명령 실행, main 병합, production 배포를 수행하지 않았습니다. 위 자동 Preview는 기존 Vercel 자동화의 결과입니다. 이번 Codex payload 수정에서 시작한 런타임 리소스 없음: runtime_cleanup=N/A.

Summary by CodeRabbit

  • 새 기능

    • 랜딩 페이지의 주요 CTA 클릭을 위치와 유형별로 분석할 수 있습니다.
    • 랜딩 페이지의 7개 주요 섹션 노출을 자동으로 측정합니다.
    • GA와 Amplitude에서 랜딩 페이지 이벤트를 일관되게 확인할 수 있습니다.
    • 분석 동의 상태를 반영해 이벤트를 안전하게 처리하며, 중복 전송을 방지합니다.
  • 문서

    • 랜딩 페이지 이벤트와 CTA·섹션 측정 기준, 검증 방법을 문서화했습니다.

- CTA 클릭과 섹션 노출 측정 계약 적용
- 동의·방문 기준 집계 및 GA 대기열의 Amplitude 중복 전송 방지
@vercel

vercel Bot commented Sep 11, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
frontend-server Ready Ready Preview Sep 11, 2026 10:21am UTC

Request Review

@coderabbitai

coderabbitai Bot commented Sep 11, 2026

Copy link
Copy Markdown

Review Change StackReview Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Advanced

Run ID: 436112dd-a193-46f5-9196-3c8736a4610b

📥 Commits

Reviewing files that changed from the base of the PR and between 2a38ba3 and 96d44eb.

📒 Files selected for processing (15)
  • docs/analytics/landing-events.md
  • src/app/_components/LandingActionLink.tsx
  • src/app/_components/LandingAnalytics.test.tsx
  • src/app/_components/LandingDesignSections.tsx
  • src/app/_components/LandingFinalCta.tsx
  • src/app/_components/LandingHeader.tsx
  • src/app/_components/LandingHero.tsx
  • src/components/analytics/LandingSectionTracker.test.tsx
  • src/components/analytics/LandingSectionTracker.tsx
  • src/lib/analytics/client-queue.test.ts
  • src/lib/analytics/client.ts
  • src/lib/analytics/landing-delivery.test.ts
  • src/lib/analytics/track.test.ts
  • src/lib/analytics/track.ts
  • src/providers/root-providers.tsx

📝 Walkthrough

Walkthrough

랜딩 페이지에 cta_clicksection_view 분석 이벤트를 추가했다. CTA 클릭, 섹션 가시 시간, 동의 상태, pathname 변경, GA 큐 중복 전송을 처리한다. 관련 컴포넌트와 통합 테스트도 추가했다.

Changes

랜딩 분석 이벤트

Layer / File(s) Summary
이벤트 계약과 CTA 연결
src/lib/analytics/track.ts, src/app/_components/LandingActionLink.tsx, src/app/_components/LandingHeader.tsx, src/app/_components/LandingHero.tsx, src/app/_components/LandingFinalCta.tsx, src/app/_components/LandingDesignSections.tsx, docs/analytics/landing-events.md, src/app/_components/LandingAnalytics.test.tsx
cta_clicksection_view 이벤트 타입을 추가했다. CTA는 일반 클릭과 중간 버튼 동작을 처리한다. 랜딩 섹션 7개에 식별자를 추가했다. 클릭 payload와 렌더링 결과를 검증한다.
섹션 노출 추적과 전역 연결
src/components/analytics/LandingSectionTracker.tsx, src/providers/root-providers.tsx, src/components/analytics/LandingSectionTracker.test.tsx
섹션이 50% 이상 보이는 상태를 1000ms 유지하면 section_view를 한 번 전송한다. 스크롤, 리사이즈, 레이아웃 변화, 문서 가시성, 동의 상태, pathname 변경을 처리한다. 추적기를 루트 프로바이더에 연결했다.
Amplitude 및 GA 전송 큐
src/lib/analytics/client.ts, src/lib/analytics/client-queue.test.ts, src/lib/analytics/landing-delivery.test.ts
초기 이벤트는 Amplitude에 전달하고, 대기 이벤트는 GA에만 전달한다. 반복적인 GA 초기화를 중복 전송 없이 처리한다. 동의 철회 시 GA 대기 이벤트를 폐기한다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Change: Feature

Sequence Diagram(s)

sequenceDiagram
  participant LandingPage
  participant LandingSectionTracker
  participant trackAnalyticsEvent
  participant Amplitude
  participant GoogleAnalytics
  LandingPage->>LandingSectionTracker: 랜딩 섹션 렌더링
  LandingSectionTracker->>trackAnalyticsEvent: 1000ms 노출 후 section_view 전송
  trackAnalyticsEvent->>Amplitude: 이벤트 최초 전달
  trackAnalyticsEvent->>GoogleAnalytics: 동의 및 초기화 후 이벤트 전달
Loading

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

토끼가 CTA를 톡 눌렀네
귀를 세우고 섹션을 살폈네
천 밀리초 햇살 아래
이벤트가 한 번 기록되고
GA 큐도 겹치지 않게
깡충, 분석 길이 열렸네

Comment @coderabbitai help to get the list of available commands.

@sonarqubecloud

Copy link
Copy Markdown

@minbros
minbros marked this pull request as ready for review September 11, 2026 10:32
@minbros
minbros merged commit c061fe3 into main Sep 11, 2026
4 of 5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant