From 8d4adfd7f1026eb495275545b782220ff688227e Mon Sep 17 00:00:00 2001 From: ttipo Date: Tue, 6 Oct 2026 13:14:22 +0900 Subject: [PATCH] =?UTF-8?q?feat(imweb):=20=EC=97=85=EC=B2=B4=20=EB=A7=81?= =?UTF-8?q?=ED=81=AC=EB=A1=9C=20=EB=93=A4=EC=96=B4=EC=98=A4=EB=A9=B4=20?= =?UTF-8?q?=EC=8B=A0=EC=B2=AD=20=EB=95=8C=20=EC=9C=A0=EC=9E=85=EC=9D=84=20?= =?UTF-8?q?=EA=B7=B8=20=EC=97=85=EC=B2=B4=EB=A1=9C=20=EB=B0=94=EA=BF=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 광고로 가입한 회원이 업체 링크로 다시 와서 신청해도, 보관 중인 첫 경로(광고)가 남아 신청 때 유입이 광고로 잡혔다. 업체 칸(업체 실적)은 그 업체라 한 줄 안에서 유입과 업체가 어긋났다. 업체 단축 링크가 붙인 UTM(utm_medium=partner)으로 들어오면 첫 경로를 그 업체로 덮어쓴다. 여러 업체를 거치면 마지막 업체 — 업체 실적의 마지막 클릭 규칙과 같다. 화면의 유입 기준은 그대로 하나만 둔다. Co-Authored-By: Claude Opus 5.5 --- backend/src/shared/utils/partner-link.ts | 5 ++++- imweb/README.md | 9 ++++++++- imweb/imweb-header-top.html | 10 +++++++++- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/backend/src/shared/utils/partner-link.ts b/backend/src/shared/utils/partner-link.ts index 3f16c2c..27396cb 100644 --- a/backend/src/shared/utils/partner-link.ts +++ b/backend/src/shared/utils/partner-link.ts @@ -86,7 +86,10 @@ export function buildEntryUrl(siteUrl: string, code: string): string { /** UTM 파라미터 접두어 — imweb-header-top.html 의 UTM 스크립트가 읽는다 */ const UTM_PARAM_PREFIX = 'utm_'; -/** 업체 링크로 온 방문의 매체 값 */ +/** + * 업체 링크로 온 방문의 매체 값. + * imweb-header-top.html 의 PARTNER_MEDIUM 과 같아야 한다 — 이 값이면 UTM 스크립트가 최초유입을 업체로 덮어쓴다 + */ export const PARTNER_UTM_MEDIUM = 'partner'; /** diff --git a/imweb/README.md b/imweb/README.md index 38bb4b3..1a9553e 100644 --- a/imweb/README.md +++ b/imweb/README.md @@ -99,6 +99,9 @@ docker exec -u root moneyguide-backend rm /tmp/members-1.xls | 가입 경로 | 그 회원이 가입할 때 기록된 경로 (가입 후 채워진 값은 제외) | naver | 다른 기기에서 신청하면 신청 때 유입은 direct 로 남는다. +- **업체 링크는 첫 경로보다 우선한다** — 업체 링크(`utm_medium=partner`)로 들어오면 보관 중인 첫 경로를 + 그 업체로 바꾼다. 예) 어제 광고로 들어와 가입 → 오늘 업체 링크로 신청: 가입 경로 광고, 신청 때 유입 업체. + 여러 업체 링크를 거치면 마지막 업체가 남는다 (업체 실적의 마지막 클릭 규칙과 같다) - 백엔드는 아임웹에 실제로 있는 회원인지 확인하고(동기화 전 신규 가입자는 아임웹 API 로 직접 확인), 회원·상품당 한 건만 남긴다. 이름·연락처는 브라우저 값이 아니라 아임웹 회원 정보를 쓴다 - 오픈카톡 버튼 클릭은 `POST /api/applications/{id}/kakao-clicks` 로 처음 한 번만 남는다 @@ -145,7 +148,11 @@ docker exec -u root moneyguide-backend rm /tmp/members-1.xls - **구매 수**: 결제완료 주문만 센다. 전액 환불되거나 해당 상품 품목이 모두 취소·반품되면 빠진다. 금액은 관리하지 않는다 - **링크는 지우지 않고 중지**한다 — 중지해도 상품 페이지로 이동은 되지만 클릭·실적은 쌓이지 않는다. 링크가 있는 업체는 삭제할 수 없다 (실적 기록 보존) -- 업체 링크로 온 방문은 UTM 스크립트가 업체 UTM 으로 기록하므로, 신청 때 유입·가입 경로 집계에도 업체 이름이 나온다 +- 업체 링크로 온 방문은 UTM 스크립트가 업체 UTM 으로 기록하므로, 신청 때 유입·가입 경로 집계에도 업체 이름이 나온다. + 먼저 광고 등으로 들어와 첫 경로가 남아 있어도 업체로 덮어쓴다 (Header Code v1.2) + - 단, 관리자가 이동 주소에 직접 UTM 을 넣은 링크는 `utm_medium=partner` 가 아니므로 덮어쓰지 않는다 + - 업체 실적은 **그 상품의** 링크만 세지만 유입은 상품을 가리지 않는다 — + A 상품 업체 링크로 들어와 B 상품을 신청하면 신청 때 유입은 업체, 업체 칸은 비어 있다 - 이동 주소는 아임웹 사이트(www 유무 무관) 안만 허용한다 — 단축 링크가 피싱에 쓰이지 않게. 사이트 주소는 `IMWEB_SITE_URL`, 비우면 `IMWEB_ADMIN_PAGE_URL` 의 origin - 한계 diff --git a/imweb/imweb-header-top.html b/imweb/imweb-header-top.html index 7d6375f..7d96044 100644 --- a/imweb/imweb-header-top.html +++ b/imweb/imweb-header-top.html @@ -28,7 +28,8 @@