generated from ttipo/project-base
feat(imweb): 주문완료 화면에서 구매 때 유입 전송·관리자 화면에 표시
- Header Code '구매 때 유입 전송': /shop_payment_complete 에서 order_no·유입·업체 클릭 ID 를 POST /api/order-inflows 로 한 번 보낸다 (같은 탭 새로고침 때는 다시 보내지 않는다) - 결제 페이지(/shop_payment*)에서는 리퍼러를 유입으로 기록하지 않는다 (v1.3) — 결제창에서 돌아올 때 pay.kakao.com 이 '카카오 소셜', pay.naver.com 이 '네이버 검색' 유입으로 잡혀 구매 때 유입을 가릴 수 있었다 - 관리자 화면: 유입 기준을 '신청·구매 때 유입'으로, 구매 행·상세 패널에 구매 때 유입, 업체 실적 상세의 비회원 구매는 주문자 이름으로 보여준다 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,8 +28,9 @@
|
||||
</script>
|
||||
|
||||
<!-- ============================================================
|
||||
[자본주의가이드] UTM 기반 회원가입 유입경로 자동추적 v1.2
|
||||
[자본주의가이드] UTM 기반 회원가입 유입경로 자동추적 v1.3
|
||||
v1.2: 업체 링크(utm_medium=partner) 방문은 보관 중인 최초유입을 덮어쓴다
|
||||
v1.3: 결제 페이지(/shop_payment*)에서는 결제창 리퍼러를 유입으로 기록하지 않는다
|
||||
설치 위치: 아임웹 관리자 > 환경설정 > SEO(검색엔진최적화)
|
||||
> 고급 > 공통 코드 삽입 > "Header Code"
|
||||
대상 필드: 회원가입 사용자 정의 항목 "유입경로(필수)" = join_form_64454
|
||||
@@ -160,11 +161,14 @@
|
||||
[/(^|\.)(tistory|brunch|velog|medium)\./i, 'blog', 'referral']
|
||||
];
|
||||
|
||||
/* 인증·가입 관련 페이지.
|
||||
/* 인증·가입·결제 관련 페이지.
|
||||
카카오/네이버 소셜 로그인은 외부 인증 도메인을 왕복하는데, 돌아올 때의
|
||||
리퍼러(kauth.kakao.com 등)를 새 유입으로 오해하면 원래 유입원이 가려진다.
|
||||
결제도 같다 — 결제창(카카오페이 pay.kakao.com, 네이버페이 pay.naver.com, 카드사 등)에서
|
||||
주문완료(/shop_payment_complete)로 돌아올 때의 리퍼러가 '카카오 소셜'·'네이버 검색'
|
||||
유입으로 잡혀 구매 때 유입을 가린다.
|
||||
이 경로들에서는 URL에 UTM이 직접 있을 때만 기록한다. */
|
||||
var AUTH_PATH = /^\/(oauth|site_join|login|logout|member|social|join)/i;
|
||||
var AUTH_PATH = /^\/(oauth|site_join|login|logout|member|social|join|shop_payment)/i;
|
||||
|
||||
/* 소셜 로그인 인증 도메인.
|
||||
위 AUTH_PATH는 '인증 페이지에 있을 때'를 막지만, 인증을 마치고
|
||||
@@ -656,4 +660,59 @@
|
||||
window.setTimeout(poll, POLL_MS);
|
||||
})();
|
||||
})();
|
||||
</script>
|
||||
|
||||
<!-- ============================================================
|
||||
[자본주의가이드] 구매 때 유입 전송 v1.0
|
||||
위 두 스크립트(MG_UTM · MG_PARTNER) 뒤에 있어야 한다.
|
||||
|
||||
주문완료 화면(/shop_payment_complete?order_no=주문번호)에서 주문번호와
|
||||
그 순간의 유입정보(MG_UTM.peek().value), 업체 링크 클릭 ID(MG_PARTNER.refs())를
|
||||
서버에 한 번 보낸다.
|
||||
→ 서버가 아임웹 주문 동기화(1시간마다) 때 같은 주문번호의 구매에 붙인다.
|
||||
구매 때 유입이 남고, 비회원 구매도 업체 링크 실적으로 잡힌다.
|
||||
무통장입금은 입금이 확인돼 구매로 잡힐 때 붙는다.
|
||||
같은 주문번호는 서버가 처음 값만 남기므로 새로고침해도 안전하다.
|
||||
============================================================ -->
|
||||
<script>
|
||||
(function () {
|
||||
'use strict';
|
||||
|
||||
var API_BASE = 'https://moneyguide.wandergo.net/api'; // 위 업체 링크 추적과 같은 값
|
||||
var COMPLETE_PATH = /^\/shop_payment_complete\/?$/; // 아임웹 주문완료 페이지
|
||||
var ORDER_PARAM = 'order_no'; // 아임웹 API 의 orderNo 와 같은 값
|
||||
var ORDER_NO_PATTERN = /^\d{1,30}$/; // 백엔드 ORDER_NO_PATTERN 과 같아야 한다
|
||||
var INFLOW_MAX = 1000;
|
||||
var K_SENT = 'mg_order_sent'; // 이 탭에서 이미 보낸 주문번호 (새로고침 때 다시 보내지 않게)
|
||||
|
||||
function ssGet(k) { try { return sessionStorage.getItem(k); } catch (e) { return null; } }
|
||||
function ssSet(k, v) { try { sessionStorage.setItem(k, v); } catch (e) { } }
|
||||
|
||||
try {
|
||||
if (!COMPLETE_PATH.test(location.pathname)) return;
|
||||
var orderNo = new URLSearchParams(location.search).get(ORDER_PARAM);
|
||||
if (!orderNo || !ORDER_NO_PATTERN.test(orderNo)) return;
|
||||
if (typeof window.fetch !== 'function' || ssGet(K_SENT) === orderNo) return;
|
||||
|
||||
var body = { orderNo: orderNo };
|
||||
try {
|
||||
var peeked = window.MG_UTM && window.MG_UTM.peek();
|
||||
var value = peeked && peeked.value;
|
||||
if (typeof value === 'string' && value) body.inflow = value.slice(0, INFLOW_MAX);
|
||||
} catch (e) { }
|
||||
try {
|
||||
var refs = window.MG_PARTNER && window.MG_PARTNER.refs();
|
||||
if (refs && refs.length) body.partnerRefs = refs;
|
||||
} catch (e) { }
|
||||
|
||||
window.fetch(API_BASE + '/order-inflows', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
credentials: 'omit',
|
||||
body: JSON.stringify(body)
|
||||
}).then(function (res) {
|
||||
if (res.ok) ssSet(K_SENT, orderNo); // 실패하면 새로고침 때 다시 보낸다
|
||||
}).catch(function () { });
|
||||
} catch (e) { }
|
||||
})();
|
||||
</script>
|
||||
Reference in New Issue
Block a user