From 55705f1e4f1d5e81a67c878695f88458865563a5 Mon Sep 17 00:00:00 2001 From: ehdnd_mac Date: Thu, 6 Nov 2025 12:08:36 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix(app):=20=EB=8B=A4=EC=9D=8C=20=EC=B6=9C?= =?UTF-8?q?=EC=8B=9C=20=EB=B2=84=EC=A0=84=EC=9D=84=20=EC=9C=84=ED=95=9C=20?= =?UTF-8?q?=EB=B0=9C=EA=B2=AC=20=ED=95=AD=EB=AA=A9=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20-=20=EC=95=B1=EC=97=90=EC=84=9C=20?= =?UTF-8?q?=EB=8D=94=20=EB=84=93=EC=9D=80=20=ED=99=94=EB=A9=B4=EC=9A=A9?= =?UTF-8?q?=EC=9C=BC=EB=A1=9C=20=EC=A7=80=EC=9B=90=20=EC=A4=91=EB=8B=A8?= =?UTF-8?q?=EB=90=9C=20API=20=EB=98=90=EB=8A=94=20=ED=8C=8C=EB=9D=BC?= =?UTF-8?q?=EB=AF=B8=ED=84=B0=EB=A5=BC=20=EC=82=AC=EC=9A=A9=ED=95=A9?= =?UTF-8?q?=EB=8B=88=EB=8B=A4=20-=2016KB=20=EB=84=A4=EC=9D=B4=ED=8B=B0?= =?UTF-8?q?=EB=B8=8C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=EB=9F=AC=EB=A6=AC=20?= =?UTF-8?q?=EC=A0=95=EB=A0=AC=EB=A1=9C=20=EC=95=B1=20=EC=9E=AC=EC=BB=B4?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- android/app/build.gradle.kts | 11 ++++++++++- .../kotlin/com/clustudy/clustudy/MainActivity.kt | 13 +++++++++++++ android/app/src/main/res/values-night/styles.xml | 4 ++++ android/app/src/main/res/values/styles.xml | 4 ++++ 4 files changed, 31 insertions(+), 1 deletion(-) diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index e0b90122..c534f640 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -24,7 +24,8 @@ val hasReleaseKeystore = if (keystorePropertiesFile.exists()) { android { namespace = "com.clustudy.clustudy" compileSdk = flutter.compileSdkVersion - ndkVersion = "29.0.13599879" + // Target the latest stable NDK with 16 KB page support (Android 15 requirement). + ndkVersion = "29.0.14206865" compileOptions { sourceCompatibility = JavaVersion.VERSION_11 @@ -45,6 +46,13 @@ android { versionName = flutter.versionName } + packaging { + // Keep JNI libs uncompressed so Play can align them for 16 KB page sizes. + jniLibs { + useLegacyPackaging = false + } + } + signingConfigs { if (hasReleaseKeystore) { create("release") { @@ -76,4 +84,5 @@ flutter { dependencies { implementation("com.android.installreferrer:installreferrer:2.2") + implementation("androidx.core:core-ktx:1.13.1") } diff --git a/android/app/src/main/kotlin/com/clustudy/clustudy/MainActivity.kt b/android/app/src/main/kotlin/com/clustudy/clustudy/MainActivity.kt index 4c0f74aa..e5253f85 100644 --- a/android/app/src/main/kotlin/com/clustudy/clustudy/MainActivity.kt +++ b/android/app/src/main/kotlin/com/clustudy/clustudy/MainActivity.kt @@ -2,6 +2,10 @@ package com.clustudy.clustudy import android.os.Handler import android.os.Looper +import android.os.Bundle +import androidx.core.view.ViewCompat +import androidx.core.view.WindowCompat +import androidx.core.view.WindowInsetsControllerCompat import com.android.installreferrer.api.InstallReferrerClient import com.android.installreferrer.api.InstallReferrerStateListener import io.flutter.embedding.android.FlutterActivity @@ -15,6 +19,15 @@ private const val INSTALL_REFERRER_CHANNEL = class MainActivity : FlutterActivity() { private val mainHandler = Handler(Looper.getMainLooper()) + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + WindowCompat.setDecorFitsSystemWindows(window, false) + ViewCompat.getWindowInsetsController(window.decorView)?.let { controller -> + controller.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_BARS_BY_SWIPE + } + } + override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) diff --git a/android/app/src/main/res/values-night/styles.xml b/android/app/src/main/res/values-night/styles.xml index 06952be7..edd19a88 100644 --- a/android/app/src/main/res/values-night/styles.xml +++ b/android/app/src/main/res/values-night/styles.xml @@ -14,5 +14,9 @@ This Theme is only used starting with V2 of Flutter's Android embedding. --> diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml index cb1ef880..257ab871 100644 --- a/android/app/src/main/res/values/styles.xml +++ b/android/app/src/main/res/values/styles.xml @@ -14,5 +14,9 @@ This Theme is only used starting with V2 of Flutter's Android embedding. --> From 91a9bac517246fe3b24b8618b497ae4cc35e2de7 Mon Sep 17 00:00:00 2001 From: ehdnd_mac Date: Thu, 6 Nov 2025 12:29:43 +0900 Subject: [PATCH 2/5] =?UTF-8?q?/=E1=90=A0=20=E1=B5=95=20=CB=95=20=E1=B5=95?= =?UTF-8?q?=E3=83=9E:=20v1.0.4+5=20=EC=95=B1=20=EB=B9=8C=EB=93=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pubspec.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pubspec.yaml b/pubspec.yaml index f11e8e23..f949a737 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -21,7 +21,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # - 마이너(x.1.x): 호환성 유지하면서 의미 있는 기능 추가나 UX 개선이 있을 때. 기존 사용 흐름은 유지되지만 “새 기능”이라 말할 수 있는 수준 # - 패치(x.x.1): 버그 수정, 안정화, 성능 조정처럼 기존 기능을 깨지 않고 다듬을 때. 핫픽스 # - 빌드 번호(+n): 같은 앱 버전을 여러 번 스토어에 제출할 때 -version: 1.0.3+4 +version: 1.0.4+5 environment: sdk: ^3.8.1 From 1f6929b4a6717786c101cfa69e462554b712c7b8 Mon Sep 17 00:00:00 2001 From: ehdnd_mac Date: Fri, 7 Nov 2025 19:24:14 +0900 Subject: [PATCH 3/5] =?UTF-8?q?docs:=20LEGAL=20=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 구글 플레이스토어에서 이 파일 확인중 --- LEGAL.md | 47 ----------------------------------------------- 1 file changed, 47 deletions(-) diff --git a/LEGAL.md b/LEGAL.md index 058819c1..45f86e33 100644 --- a/LEGAL.md +++ b/LEGAL.md @@ -379,50 +379,3 @@ GitHub Issues: https://github.com/tryCatchPing/it-contest/issues Developer: tryCatchPing ``` - ---- - -## ✅ 다음 단계 - -1. **내용 검토 및 수정** - - - `[PLACEHOLDER]` 부분을 실제 날짜로 교체 - - 관할 법원 명시 (서울중앙지방법원 등) - - 필요시 법률 전문가와 상담 - -2. **앱에 적용** - - - 최종 버전을 `legal_text_dialog.dart`의 상수에 복사 - - 한국어 버전을 기본으로 사용 (영어 버전은 추후 국제화 시 사용) - -3. **웹사이트 호스팅 (선택사항)** - - - GitHub Pages나 다른 호스팅 서비스에 업로드 - - URL을 앱스토어 제출 시 제공 - -4. **앱스토어 제출 시** - - App Store: App Privacy 섹션에서 "Data Not Collected" 선택 - - Google Play: Data Safety 섹션에서 "No data collected" 명시 - - 개인정보 처리방침 URL 제공 (선택사항, 앱 내 표시로 충분) - ---- - -## 📝 주요 특징 - -### 개인정보 보호 정책 하이라이트 - -- ✅ 완전한 오프라인 앱임을 명시 -- ✅ 외부 서버 없음을 강조 -- ✅ 제3자 공유 없음을 명확히 -- ✅ 사용자 권리 명시 - -### 이용약관 하이라이트 - -- ✅ 명확한 서비스 범위 -- ✅ 라이선스 제한 명시 -- ✅ 책임 제한 조항 -- ✅ 오픈소스 라이선스 준수 - ---- - -**참고**: 본 템플릿은 일반적인 가이드라인이며, 실제 법적 효력을 위해서는 전문 법률 자문을 받으시기 바랍니다. From 31d5abc96e7a6ab74cabe8f685be97929dfe7145 Mon Sep 17 00:00:00 2001 From: ehdnd_mac Date: Fri, 7 Nov 2025 19:24:56 +0900 Subject: [PATCH 4/5] =?UTF-8?q?chore(docs):=20firebase=20analytics?= =?UTF-8?q?=EB=A5=BC=20=EC=9C=84=ED=95=9C=20=EC=B1=84=EB=84=90=20=EB=B3=84?= =?UTF-8?q?=20=EC=84=A4=EC=B9=98=20=EA=B2=BD=EB=A1=9C=20=ED=8C=90=EB=8B=A8?= =?UTF-8?q?=EC=9A=A9=20=EB=A7=81=ED=81=AC=20=EC=83=9D=EC=84=B1=20=EA=B0=80?= =?UTF-8?q?=EC=9D=B4=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 지연된 딥링크 정상 동작 및 테스트 완료 --- docs/install_attribution_guide.md | 450 ++++++++++++++++++++++++++++++ 1 file changed, 450 insertions(+) create mode 100644 docs/install_attribution_guide.md diff --git a/docs/install_attribution_guide.md b/docs/install_attribution_guide.md new file mode 100644 index 00000000..c8558e0f --- /dev/null +++ b/docs/install_attribution_guide.md @@ -0,0 +1,450 @@ +# 앱 설치 경로 추적 가이드 + +## 빠른 참조 + +**기본 링크**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share +``` + +**마케팅 파라미터 추가 예시** (인스타그램): + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dinstagram%26utm_medium%3Dsocial%26utm_campaign%3Dlaunch_event +``` + +**지원 파라미터**: + +- UTM: `utm_source`, `utm_medium`, `utm_campaign`, `utm_content` +- 커스텀: `source`, `medium`, `campaign`, `content` + +**Firebase Analytics 자동 기록**: + +- User Properties: `install_source`, `install_medium`, `install_campaign` +- Event: `install_attribution` + +--- + +## 개요 + +Google Play Store의 Install Referrer API를 통해 앱 설치 경로를 추적하고, Firebase Analytics에 기록하는 시스템입니다. + +--- + +## 파라미터 종류 + +### 1. UTM 파라미터 (표준 마케팅 파라미터) + +UTM(Urchin Tracking Module)은 웹/앱 마케팅에서 표준으로 사용하는 파라미터입니다. + +#### `utm_source` (필수) + +- **의미**: 설치가 발생한 출처/채널 +- **예시**: + - `instagram` - 인스타그램 + - `naver_blog` - 네이버 블로그 + - 'everytime' - 에브리타임 + - `google_search` - 구글 검색 + - `youtube` - 유튜브 + - `partner_app` - 제휴 앱 + +#### `utm_medium` (권장) + +- **의미**: 마케팅 매체/방식 +- **예시**: + - `social` - 소셜 미디어 + - `email` - 이메일 + - `community` - 커뮤니티 + - `banner` - 배너 광고 + - `video` - 동영상 + - `organic` - 자연 유입 + +#### `utm_campaign` (권장) + +- **의미**: 특정 캠페인/이벤트 이름 +- **예시**: + - `launch_event` - 런칭 이벤트 + - `q1_2025` - 2025년 1분기 캠페인 + - `summer_sale` - 여름 세일 + - `influencer_collab` - 인플루언서 협업 + +#### `utm_content` (선택) + +- **의미**: 동일한 캠페인 내에서 구체적인 콘텐츠 구분 +- **예시**: + - `banner_top` - 상단 배너 + - `banner_bottom` - 하단 배너 + - `video_intro` - 인트로 영상 + - `post_promotion` - 프로모션 포스트 + +### 2. 커스텀 파라미터 (대체 파라미터) + +UTM 파라미터를 사용하지 않을 때 사용할 수 있는 대체 파라미터입니다. + +#### `source` + +- **의미**: `utm_source`와 동일 (출처) +- **사용 시점**: UTM을 사용하지 않을 때 + +#### `medium` + +- **의미**: `utm_medium`과 동일 (매체) +- **사용 시점**: UTM을 사용하지 않을 때 + +#### `campaign` + +- **의미**: `utm_campaign`과 동일 (캠페인) +- **사용 시점**: UTM을 사용하지 않을 때 + +#### `content` + +- **의미**: `utm_content`와 동일 (콘텐츠) +- **사용 시점**: UTM을 사용하지 않을 때 + +--- + +## Firebase Analytics 프로퍼티 + +코드에서 자동으로 Firebase Analytics에 설정되는 User Properties입니다. + +### `install_source` + +- **의미**: 설치 출처 +- **값**: `utm_source` 또는 `source` 파라미터 값 +- **용도**: 사용자 세그먼트 분석, 채널별 성과 비교 +- **예시**: `instagram`, `naver_blog`, `google_search` + +### `install_medium` + +- **의미**: 설치 매체 +- **값**: `utm_medium` 또는 `medium` 파라미터 값 +- **용도**: 매체별 효과 분석 +- **예시**: `social`, `email`, `banner` + +### `install_campaign` + +- **의미**: 설치 캠페인 +- **값**: `utm_campaign` 또는 `campaign` 파라미터 값 +- **용도**: 캠페인별 성과 추적 +- **예시**: `launch_event`, `q1_2025`, `summer_sale` + +--- + +## 파라미터 우선순위 + +코드에서 파라미터를 읽을 때의 우선순위: + +```dart +// InstallAttributionPayload 클래스에서 +String? get source => parameters['utm_source'] ?? parameters['source']; +String? get medium => parameters['utm_medium'] ?? parameters['medium']; +String? get campaign => parameters['utm_campaign'] ?? parameters['campaign']; +String? get content => parameters['utm_content'] ?? parameters['content']; +``` + +**규칙**: UTM 파라미터가 있으면 우선 사용, 없으면 커스텀 파라미터 사용 + +--- + +## 기본 링크 + +**실제 Google Play Store 링크**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share +``` + +이 링크에 `referrer` 파라미터를 추가하여 마케팅 추적을 할 수 있습니다. + +--- + +## 사용 예시 + +### 예시 1: UTM 파라미터 사용 (권장) + +**기본 링크에 `referrer` 파라미터 추가**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dinstagram%26utm_medium%3Dsocial%26utm_campaign%3Dlaunch_event +``` + +**파라미터**: + +- `utm_source=instagram` +- `utm_medium=social` +- `utm_campaign=launch_event` + +**Firebase Analytics에 기록되는 값**: + +- User Property `install_source`: `instagram` +- User Property `install_medium`: `social` +- User Property `install_campaign`: `launch_event` +- Event `install_attribution`의 파라미터: 모든 UTM 파라미터 포함 + +### 예시 2: 커스텀 파라미터 사용 + +**기본 링크에 `referrer` 파라미터 추가**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=source%3Dpartner_app%26campaign%3Dq1_2025 +``` + +**파라미터**: + +- `source=partner_app` +- `campaign=q1_2025` + +**Firebase Analytics에 기록되는 값**: + +- User Property `install_source`: `partner_app` +- User Property `install_campaign`: `q1_2025` +- User Property `install_medium`: 설정되지 않음 (없음) +- Event `install_attribution`의 파라미터: `source`, `campaign` 포함 + +### 예시 3: UTM과 커스텀 혼합 (UTM 우선) + +**기본 링크에 `referrer` 파라미터 추가**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dnaver_blog%26source%3Dfallback%26utm_campaign%3Dlaunch_event +``` + +**파라미터**: + +- `utm_source=naver_blog` +- `source=fallback` (무시됨) +- `utm_campaign=launch_event` + +**Firebase Analytics에 기록되는 값**: + +- User Property `install_source`: `naver_blog` (UTM 우선) +- User Property `install_campaign`: `launch_event` + +--- + +## Clustudy 실제 마케팅 채널별 설정 가이드 + +### 케이스 1: 네이버 블로그 공식 블로그 (직접 글 작성) + +**권장 파라미터**: + +- `utm_source=naver_blog` - 네이버 블로그 출처 명시 +- `utm_medium=blog` - 블로그 매체 +- `utm_campaign={포스트_제목_또는_시기}` - 특정 포스트나 시기 구분 +- `utm_content={포스트_날짜_또는_주제}` (선택) - 같은 캠페인 내에서 구체적 구분 + +**예시 1: 런칭 포스트**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dnaver_blog%26utm_medium%3Dblog%26utm_campaign%3Dlaunch_post +``` + +**예시 2: 기능 소개 포스트 (날짜별 구분)**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dnaver_blog%26utm_medium%3Dblog%26utm_campaign%3Dfeature_intro%26utm_content%3D251107 +``` + +**Firebase Analytics 분석**: + +- `install_source`: `naver_blog`로 네이버 블로그에서 온 설치 추적 +- `install_medium`: `blog`로 블로그 매체 효과 측정 +- `install_campaign`: 포스트별 성과 비교 가능 + +--- + +### 케이스 2: 에브리타임 대학교 커뮤니티 (홍보글 작성) + +**권장 파라미터**: + +- `utm_source=everytime` - 에브리타임 출처 명시 +- `utm_medium=community` - 커뮤니티 매체 +- `utm_campaign={대학교명_또는_이벤트명}` - 대학교별 또는 이벤트별 구분 +- `utm_content={게시판_또는_날짜}` (선택) - 게시판별 구분 + +**예시 1: 숭실대학교 홍보**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Deverytime%26utm_medium%3Dcommunity%26utm_campaign%3Dsoongsil_promotion +``` + +**예시 2: 연세대학교 + 특정 게시판**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Deverytime%26utm_medium%3Dcommunity%26utm_campaign%3Dyonsei_promotion%26utm_content%3Dfree_board +``` + +**Firebase Analytics 분석**: + +- `install_source`: `everytime`로 에브리타임에서 온 설치 추적 +- `install_medium`: `community`로 커뮤니티 매체 효과 측정 +- `install_campaign`: 대학교별 또는 이벤트별 성과 비교 가능 + +--- + +### 케이스 3: 인스타그램 공식 계정 (직접 글 작성) + +**권장 파라미터**: + +- `utm_source=instagram` - 인스타그램 출처 명시 +- `utm_medium=social` - 소셜 미디어 매체 +- `utm_campaign={포스트_주제_또는_시기}` - 포스트 주제나 시기 구분 +- `utm_content={포스트_타입}` (선택) - 피드/스토리/릴스 등 구분 + +**예시 1: 기능 소개 포스트**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dinstagram%26utm_medium%3Dsocial%26utm_campaign%3Dfeature_intro +``` + +**예시 2: 릴스 콘텐츠**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dinstagram%26utm_medium%3Dsocial%26utm_campaign%3Dq1_2025%26utm_content%3Dreels +``` + +**예시 3: 스토리**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dinstagram%26utm_medium%3Dsocial%26utm_campaign%3Ddaily_update%26utm_content%3Dstory +``` + +**Firebase Analytics 분석**: + +- `install_source`: `instagram`로 인스타그램에서 온 설치 추적 +- `install_medium`: `social`로 소셜 미디어 매체 효과 측정 +- `install_campaign`: 포스트 주제별 성과 비교 가능 +- `utm_content`: 포스트 타입별(피드/스토리/릴스) 효과 비교 가능 + +--- + +## 일반적인 사용 시나리오 (참고) + +### 시나리오 1: 네이버 블로그 배너 광고 + +**파라미터**: + +- `utm_source=naver_blog` +- `utm_medium=banner` +- `utm_campaign=summer_sale` +- `utm_content=banner_top` + +**완성된 링크**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dnaver_blog%26utm_medium%3Dbanner%26utm_campaign%3Dsummer_sale%26utm_content%3Dbanner_top +``` + +### 시나리오 2: 유튜브 동영상 설명란 + +**파라미터**: + +- `utm_source=youtube` +- `utm_medium=video` +- `utm_campaign=tutorial_series` +- `utm_content=episode_1` + +**완성된 링크**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=utm_source%3Dyoutube%26utm_medium%3Dvideo%26utm_campaign%3Dtutorial_series%26utm_content%3Depisode_1 +``` + +### 시나리오 3: 제휴 앱 (UTM 없이) + +**파라미터**: + +- `source=partner_app` +- `campaign=q1_partnership` + +**완성된 링크**: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer=source%3Dpartner_app%26campaign%3Dq1_partnership +``` + +--- + +## Firebase Analytics에서 확인 방법 + +### Events 탭 + +- 이벤트명: `install_attribution` +- 파라미터: 모든 UTM/커스텀 파라미터가 포함됨 + +### User Properties 탭 + +- `install_source`: 설치 출처 +- `install_medium`: 설치 매체 +- `install_campaign`: 설치 캠페인 + +### 활용 방법 + +1. **채널별 설치 수**: `install_source`로 그룹화 +2. **매체별 효과**: `install_medium`으로 분석 +3. **캠페인 성과**: `install_campaign`으로 추적 +4. **세그먼트 분석**: User Properties를 조합하여 사용자 세그먼트 생성 + +--- + +## 링크 생성 팁 + +### URL 인코딩 방법 + +`referrer` 파라미터 값은 반드시 URL 인코딩해야 합니다. + +**인코딩 전**: + +``` +utm_source=instagram&utm_medium=social&utm_campaign=launch_event +``` + +**인코딩 후**: + +``` +utm_source%3Dinstagram%26utm_medium%3Dsocial%26utm_campaign%3Dlaunch_event +``` + +**인코딩 규칙**: + +- `=` → `%3D` +- `&` → `%26` +- 공백 → `%20` (필요한 경우) + +### 온라인 도구 활용 + +- [URL Encoder/Decoder](https://www.urlencoder.org/) +- [Google URL Builder](https://ga-dev-tools.google/campaign-url-builder/) (UTM 파라미터 전용) + +### 링크 구조 + +기본 구조: + +``` +https://play.google.com/store/apps/details?id=com.clustudy.clustudy&pcampaignid=web_share&referrer={인코딩된_파라미터} +``` + +--- + +## 주의사항 + +1. **URL 인코딩 필수**: `referrer` 파라미터 값은 반드시 URL 인코딩해야 함 +2. **앱 재설치 필요**: 테스트 시 앱을 완전히 삭제 후 재설치해야 함 +3. **첫 실행 시에만**: Install Referrer는 앱 설치 후 첫 실행 시에만 사용 가능 +4. **UTM 우선**: UTM과 커스텀 파라미터가 동시에 있으면 UTM이 우선됨 +5. **기존 파라미터 유지**: `pcampaignid=web_share` 같은 기존 파라미터는 그대로 유지하고 `referrer`만 추가 + +--- + +## 요약 + +| 항목 | UTM 파라미터 | 커스텀 파라미터 | Firebase User Property | +| ------------- | -------------------------- | ------------------ | ---------------------------------- | +| **의미** | 표준 마케팅 파라미터 | UTM 대체 파라미터 | 사용자 속성 (영구 저장) | +| **예시** | `utm_source`, `utm_medium` | `source`, `medium` | `install_source`, `install_medium` | +| **용도** | 마케팅 추적 표준 | 간단한 추적 | 사용자 세그먼트 분석 | +| **우선순위** | 높음 | 낮음 | - | +| **저장 위치** | Event 파라미터 | Event 파라미터 | User Property | + +**권장**: UTM 파라미터 사용을 권장합니다. 표준이므로 다른 도구와의 호환성이 좋고, 마케팅 분석이 용이합니다. From c1195a69b734cca277e163271db261dfbd8dfc32 Mon Sep 17 00:00:00 2001 From: ehdnd_mac Date: Fri, 7 Nov 2025 19:25:33 +0900 Subject: [PATCH 5/5] =?UTF-8?q?chore(docs):=20=EC=9B=90=EC=8A=A4=ED=86=A0?= =?UTF-8?q?=EC=96=B4=20=EC=9A=A9=20=EA=B7=B8=EB=9E=98=ED=94=BD=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...220\354\212\244\355\206\240\354\226\264.png" | Bin 0 -> 38121 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 "docs/screenshots/\354\233\220\354\212\244\355\206\240\354\226\264.png" diff --git "a/docs/screenshots/\354\233\220\354\212\244\355\206\240\354\226\264.png" "b/docs/screenshots/\354\233\220\354\212\244\355\206\240\354\226\264.png" new file mode 100644 index 0000000000000000000000000000000000000000..bc9a8909e97eaff11cd6241f3a4e6109f105c0ea GIT binary patch literal 38121 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 a^Pc(4^aR%HbHBh3