@adstage/web-sdk 2.6.1 → 2.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/index.cjs.js +595 -60
- package/dist/index.d.ts +73 -23
- package/dist/index.esm.js +592 -61
- package/dist/index.standalone.js +592 -61
- package/dist/index.umd.js +4791 -0
- package/package.json +4 -2
- package/src/constants/endpoints.ts +0 -2
- package/src/events/global-events.ts +72 -0
- package/src/example/events/README.md +125 -0
- package/src/example/events/javascript/index-esm.html +159 -0
- package/src/example/events/javascript/index.html +151 -0
- package/src/example/events/nextjs/README.md +54 -0
- package/src/example/events/nextjs/next.config.js +8 -0
- package/src/example/events/nextjs/package.json +16 -0
- package/src/example/events/nextjs/pages/_app.js +15 -0
- package/src/example/events/nextjs/pages/index.js +139 -0
- package/src/example/events/react/.env +0 -0
- package/src/example/events/react/README.md +57 -0
- package/src/example/events/react/package.json +27 -0
- package/src/example/events/react/public/index.html +11 -0
- package/src/example/events/react/src/App.js +162 -0
- package/src/example/events/react/src/index.js +6 -0
- package/src/index.ts +3 -0
- package/src/managers/device-info-collector.ts +9 -4
- package/src/managers/events/event-device-collector.ts +106 -0
- package/src/managers/events/event-session-manager.ts +183 -0
- package/src/managers/events/event-user-collector.ts +166 -0
- package/src/modules/events/events-module.ts +118 -40
- package/src/types/config.ts +3 -0
- package/src/utils/config-utils.ts +69 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adstage/web-sdk",
|
|
3
|
-
"version": "2.6.
|
|
3
|
+
"version": "2.6.3",
|
|
4
4
|
"description": "AdStage Web SDK - Production-ready marketing platform SDK with React Provider support for seamless integration",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.cjs.js",
|
|
@@ -11,7 +11,9 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.esm.js",
|
|
13
13
|
"require": "./dist/index.cjs.js"
|
|
14
|
-
}
|
|
14
|
+
},
|
|
15
|
+
"./standalone": "./dist/index.standalone.js",
|
|
16
|
+
"./umd": "./dist/index.umd.js"
|
|
15
17
|
},
|
|
16
18
|
"files": [
|
|
17
19
|
"dist",
|
|
@@ -33,7 +33,6 @@ export const API_PATHS = {
|
|
|
33
33
|
/** 이벤트 관련 */
|
|
34
34
|
events: {
|
|
35
35
|
track: '/events/track',
|
|
36
|
-
batch: '/events/batch'
|
|
37
36
|
}
|
|
38
37
|
} as const;
|
|
39
38
|
|
|
@@ -77,7 +76,6 @@ export class EndpointBuilder {
|
|
|
77
76
|
*/
|
|
78
77
|
events = {
|
|
79
78
|
track: () => `${this.baseUrl}${API_PATHS.events.track}`,
|
|
80
|
-
batch: () => `${this.baseUrl}${API_PATHS.events.batch}`
|
|
81
79
|
};
|
|
82
80
|
|
|
83
81
|
/**
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AdStage SDK - 전역 이벤트 함수들
|
|
3
|
+
* Firebase Analytics와 유사한 간단한 API 제공
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import AdStage from '../core/adstage';
|
|
7
|
+
import type { EventProperties, PageData } from '../modules/events/events-module';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* 이벤트 추적 (메인 함수)
|
|
11
|
+
* @param eventName 이벤트 이름
|
|
12
|
+
* @param properties 이벤트 속성
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* track('purchase', {
|
|
16
|
+
* transaction_id: 'T123',
|
|
17
|
+
* value: 99.99,
|
|
18
|
+
* currency: 'USD'
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
export function track(eventName: string, properties?: EventProperties): Promise<void> {
|
|
22
|
+
if (!AdStage.isReady()) {
|
|
23
|
+
console.warn('AdStage not initialized. Call AdStage.init() first.');
|
|
24
|
+
return Promise.resolve();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
return AdStage.events.track(eventName, properties);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* 페이지 뷰 추적
|
|
32
|
+
* @param pageData 페이지 정보
|
|
33
|
+
*
|
|
34
|
+
* @example
|
|
35
|
+
* pageView({ page: '/products', title: 'Products Page' });
|
|
36
|
+
*/
|
|
37
|
+
export function pageView(pageData?: PageData): Promise<void> {
|
|
38
|
+
if (!AdStage.isReady()) {
|
|
39
|
+
console.warn('AdStage not initialized. Call AdStage.init() first.');
|
|
40
|
+
return Promise.resolve();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return AdStage.events.pageView(pageData);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* 사용자 ID 설정
|
|
48
|
+
* @param userId 사용자 ID
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* setUserId('user123');
|
|
52
|
+
*/
|
|
53
|
+
export function setUserId(userId: string): void {
|
|
54
|
+
if (!AdStage.isReady()) {
|
|
55
|
+
console.warn('AdStage not initialized. Call AdStage.init() first.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
AdStage.events.setUserId(userId);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* 현재 사용자 ID 반환
|
|
64
|
+
*/
|
|
65
|
+
export function getUserId(): string | undefined {
|
|
66
|
+
if (!AdStage.isReady()) {
|
|
67
|
+
console.warn('AdStage not initialized. Call AdStage.init() first.');
|
|
68
|
+
return undefined;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
return AdStage.events.getUserId();
|
|
72
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
# AdStage SDK - 이벤트 추적 예시
|
|
2
|
+
|
|
3
|
+
EventLogGenerator의 파라미터를 참고하여 만든 간단한 이벤트 추적 예시들입니다.
|
|
4
|
+
|
|
5
|
+
## 📁 폴더 구조
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
events/
|
|
9
|
+
├── javascript/ # Vanilla JS 예시
|
|
10
|
+
├── react/ # React 예시
|
|
11
|
+
└── nextjs/ # Next.js 예시
|
|
12
|
+
```
|
|
13
|
+
|
|
14
|
+
## 🚀 실행 방법
|
|
15
|
+
|
|
16
|
+
### JavaScript (Vanilla JS)
|
|
17
|
+
```bash
|
|
18
|
+
# 브라우저에서 직접 열기 (NPM CDN 사용)
|
|
19
|
+
open javascript/index.html
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### React
|
|
23
|
+
```bash
|
|
24
|
+
cd react
|
|
25
|
+
npm install # @adstage/web-sdk@^2.6.1 설치됨
|
|
26
|
+
npm start
|
|
27
|
+
# http://localhost:3000
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
### Next.js
|
|
31
|
+
```bash
|
|
32
|
+
cd nextjs
|
|
33
|
+
npm install # @adstage/web-sdk@^2.6.1 설치됨
|
|
34
|
+
npm run dev
|
|
35
|
+
# http://localhost:3000
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 📊 구현된 이벤트 타입
|
|
39
|
+
|
|
40
|
+
### JavaScript 예시
|
|
41
|
+
- `purchase` - 구매 이벤트
|
|
42
|
+
- `signup_complete` - 회원가입 이벤트
|
|
43
|
+
- `page_view` - 페이지뷰 이벤트
|
|
44
|
+
|
|
45
|
+
### React 예시
|
|
46
|
+
- `purchase` - 구매 이벤트
|
|
47
|
+
- `signup_complete` - 회원가입 이벤트
|
|
48
|
+
- `view_item` - 상품조회 이벤트
|
|
49
|
+
|
|
50
|
+
### Next.js 예시
|
|
51
|
+
- `add_to_cart` - 장바구니 추가 이벤트
|
|
52
|
+
- `first_open` - 앱 설치 이벤트
|
|
53
|
+
- `search` - 검색 이벤트
|
|
54
|
+
|
|
55
|
+
## 🎯 공통 특징
|
|
56
|
+
|
|
57
|
+
- **흰 바탕에 간단한 버튼 3개**
|
|
58
|
+
- **각 버튼마다 다른 이벤트 전송**
|
|
59
|
+
- **EventLogGenerator 파라미터 구조 참고**
|
|
60
|
+
- **실시간 결과 표시**
|
|
61
|
+
- **자동 페이지뷰 추적**
|
|
62
|
+
|
|
63
|
+
## 📋 이벤트 파라미터 예시
|
|
64
|
+
|
|
65
|
+
모든 예시는 EventLogGenerator에서 사용하는 실제 파라미터 구조를 따릅니다:
|
|
66
|
+
|
|
67
|
+
```javascript
|
|
68
|
+
// 구매 이벤트
|
|
69
|
+
{
|
|
70
|
+
transaction_id: "tx_1725123456789",
|
|
71
|
+
value: 99000,
|
|
72
|
+
currency: "KRW",
|
|
73
|
+
payment_method: "card",
|
|
74
|
+
items: 2,
|
|
75
|
+
category: "electronics",
|
|
76
|
+
brand: "Samsung"
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// 회원가입 이벤트
|
|
80
|
+
{
|
|
81
|
+
user_id: "user_1725123456789",
|
|
82
|
+
signup_method: "email",
|
|
83
|
+
email_verified: true,
|
|
84
|
+
time_to_complete: 120,
|
|
85
|
+
form_version: "v2",
|
|
86
|
+
utm_source: "google_ads",
|
|
87
|
+
utm_medium: "cpc"
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
// 페이지뷰 이벤트
|
|
91
|
+
{
|
|
92
|
+
page: "/",
|
|
93
|
+
title: "Home Page",
|
|
94
|
+
referrer: "direct",
|
|
95
|
+
utm_source: "organic"
|
|
96
|
+
}
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## 🔧 SDK 설정
|
|
100
|
+
|
|
101
|
+
모든 예시에서 동일한 SDK 설정을 사용합니다:
|
|
102
|
+
|
|
103
|
+
```javascript
|
|
104
|
+
AdStage.init({
|
|
105
|
+
apiKey: '7dfddcfda637fbb73225bac3731688b80b90675942fe9f2057a88e2379aba2a4',
|
|
106
|
+
debug: true,
|
|
107
|
+
appVersion: '1.2.3' // 각 플랫폼별로 다른 버전
|
|
108
|
+
});
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
## 📦 SDK 로드 방법
|
|
112
|
+
|
|
113
|
+
### JavaScript (CDN)
|
|
114
|
+
```html
|
|
115
|
+
<script src="https://unpkg.com/@adstage/web-sdk@latest/dist/index.standalone.js"></script>
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
### React/Next.js (NPM)
|
|
119
|
+
```json
|
|
120
|
+
{
|
|
121
|
+
"dependencies": {
|
|
122
|
+
"@adstage/web-sdk": "^2.6.1"
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
```
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>AdStage SDK - 이벤트 추적 예시 (ESM)</title>
|
|
5
|
+
<style>
|
|
6
|
+
body {
|
|
7
|
+
font-family: Arial, sans-serif;
|
|
8
|
+
padding: 20px;
|
|
9
|
+
background-color: white;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
button {
|
|
13
|
+
padding: 12px 24px;
|
|
14
|
+
margin: 10px;
|
|
15
|
+
font-size: 16px;
|
|
16
|
+
border: 1px solid #ccc;
|
|
17
|
+
border-radius: 4px;
|
|
18
|
+
background-color: #f8f9fa;
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
button:hover {
|
|
23
|
+
background-color: #e9ecef;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
button:active {
|
|
27
|
+
background-color: #dee2e6;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.result {
|
|
31
|
+
margin-top: 20px;
|
|
32
|
+
padding: 15px;
|
|
33
|
+
border: 1px solid #ddd;
|
|
34
|
+
border-radius: 4px;
|
|
35
|
+
background-color: #f8f9fa;
|
|
36
|
+
white-space: pre-wrap;
|
|
37
|
+
font-family: monospace;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.note {
|
|
41
|
+
background: #e3f2fd;
|
|
42
|
+
padding: 15px;
|
|
43
|
+
border-left: 4px solid #2196f3;
|
|
44
|
+
margin: 20px 0;
|
|
45
|
+
}
|
|
46
|
+
</style>
|
|
47
|
+
</head>
|
|
48
|
+
<body>
|
|
49
|
+
<h1>AdStage SDK - 이벤트 추적 예시 (ESM 방식)</h1>
|
|
50
|
+
|
|
51
|
+
<div class="note">
|
|
52
|
+
<strong>📋 ESM 방식:</strong><br>
|
|
53
|
+
• ES Module을 지원하는 모던 브라우저에서 사용<br>
|
|
54
|
+
• 번들러 없이 직접 import 가능<br>
|
|
55
|
+
• Tree-shaking 최적화 지원
|
|
56
|
+
</div>
|
|
57
|
+
|
|
58
|
+
<div>
|
|
59
|
+
<button id="purchaseBtn">구매 이벤트 전송</button>
|
|
60
|
+
<button id="signupBtn">회원가입 이벤트 전송</button>
|
|
61
|
+
<button id="pageViewBtn">페이지뷰 이벤트 전송</button>
|
|
62
|
+
</div>
|
|
63
|
+
|
|
64
|
+
<div id="result" class="result">이벤트 결과가 여기에 표시됩니다.</div>
|
|
65
|
+
|
|
66
|
+
<!-- ESM 방식: ES Module import -->
|
|
67
|
+
<script type="module">
|
|
68
|
+
// ESM 방식으로 SDK import
|
|
69
|
+
import { AdStage, track } from 'https://unpkg.com/@adstage/web-sdk@2.6.2/dist/index.standalone.js';
|
|
70
|
+
|
|
71
|
+
// SDK 초기화
|
|
72
|
+
AdStage.init({
|
|
73
|
+
apiKey: 'c06e2bc7c7244e111d90e530227274898de66ac9f3b5dbeae10e7615c1c616de',
|
|
74
|
+
debug: true,
|
|
75
|
+
baseUrl: 'https://beta-api.adstage.app',
|
|
76
|
+
appVersion: '1.2.3',
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
// 결과 표시 함수
|
|
80
|
+
function showResult(message) {
|
|
81
|
+
document.getElementById('result').textContent = message;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// 구매 이벤트
|
|
85
|
+
async function trackPurchase() {
|
|
86
|
+
try {
|
|
87
|
+
showResult('구매 이벤트 전송 중...');
|
|
88
|
+
|
|
89
|
+
await track('purchase', {
|
|
90
|
+
currency: 'KRW',
|
|
91
|
+
value: 29900,
|
|
92
|
+
item_id: 'premium_plan_001',
|
|
93
|
+
item_name: '프리미엄 플랜',
|
|
94
|
+
item_category: 'subscription',
|
|
95
|
+
quantity: 1,
|
|
96
|
+
payment_type: 'credit_card',
|
|
97
|
+
transaction_id: 'txn_' + Date.now()
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
showResult('✅ 구매 이벤트가 성공적으로 전송되었습니다!');
|
|
101
|
+
} catch (error) {
|
|
102
|
+
showResult('❌ 구매 이벤트 전송 실패: ' + error.message);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
// 회원가입 이벤트
|
|
107
|
+
async function trackSignup() {
|
|
108
|
+
try {
|
|
109
|
+
showResult('회원가입 이벤트 전송 중...');
|
|
110
|
+
|
|
111
|
+
await track('sign_up', {
|
|
112
|
+
method: 'email',
|
|
113
|
+
user_type: 'advertiser',
|
|
114
|
+
signup_source: 'landing_page',
|
|
115
|
+
utm_source: 'google',
|
|
116
|
+
utm_medium: 'cpc',
|
|
117
|
+
utm_campaign: 'brand_keywords'
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
showResult('✅ 회원가입 이벤트가 성공적으로 전송되었습니다!');
|
|
121
|
+
} catch (error) {
|
|
122
|
+
showResult('❌ 회원가입 이벤트 전송 실패: ' + error.message);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// 페이지뷰 이벤트
|
|
127
|
+
async function trackPageView() {
|
|
128
|
+
try {
|
|
129
|
+
showResult('페이지뷰 이벤트 전송 중...');
|
|
130
|
+
|
|
131
|
+
await track('page_view', {
|
|
132
|
+
page_title: document.title,
|
|
133
|
+
page_location: window.location.href,
|
|
134
|
+
page_referrer: document.referrer || '직접 접속',
|
|
135
|
+
content_group1: 'example',
|
|
136
|
+
content_group2: 'events',
|
|
137
|
+
session_id: 'sess_' + Date.now()
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
showResult('✅ 페이지뷰 이벤트가 성공적으로 전송되었습니다!');
|
|
141
|
+
} catch (error) {
|
|
142
|
+
showResult('❌ 페이지뷰 이벤트 전송 실패: ' + error.message);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// 이벤트 리스너 등록
|
|
147
|
+
document.getElementById('purchaseBtn').addEventListener('click', trackPurchase);
|
|
148
|
+
document.getElementById('signupBtn').addEventListener('click', trackSignup);
|
|
149
|
+
document.getElementById('pageViewBtn').addEventListener('click', trackPageView);
|
|
150
|
+
|
|
151
|
+
// 페이지 로드 시 자동으로 페이지뷰 이벤트 전송
|
|
152
|
+
window.addEventListener('load', () => {
|
|
153
|
+
setTimeout(() => {
|
|
154
|
+
trackPageView();
|
|
155
|
+
}, 1000);
|
|
156
|
+
});
|
|
157
|
+
</script>
|
|
158
|
+
</body>
|
|
159
|
+
</html>
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html>
|
|
3
|
+
<head>
|
|
4
|
+
<title>AdStage SDK - 이벤트 추적 예시</title>
|
|
5
|
+
<style>
|
|
6
|
+
body {
|
|
7
|
+
font-family: Arial, sans-serif;
|
|
8
|
+
padding: 20px;
|
|
9
|
+
background-color: white;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
button {
|
|
13
|
+
padding: 12px 24px;
|
|
14
|
+
margin: 10px;
|
|
15
|
+
font-size: 16px;
|
|
16
|
+
border: 1px solid #ccc;
|
|
17
|
+
border-radius: 4px;
|
|
18
|
+
background-color: #f8f9fa;
|
|
19
|
+
cursor: pointer;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
button:hover {
|
|
23
|
+
background-color: #e9ecef;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
button:active {
|
|
27
|
+
background-color: #dee2e6;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.result {
|
|
31
|
+
margin-top: 20px;
|
|
32
|
+
padding: 15px;
|
|
33
|
+
border: 1px solid #ddd;
|
|
34
|
+
border-radius: 4px;
|
|
35
|
+
background-color: #f8f9fa;
|
|
36
|
+
white-space: pre-wrap;
|
|
37
|
+
font-family: monospace;
|
|
38
|
+
}
|
|
39
|
+
</style>
|
|
40
|
+
</head>
|
|
41
|
+
<body>
|
|
42
|
+
<h1>AdStage SDK - 이벤트 추적 예시</h1>
|
|
43
|
+
|
|
44
|
+
<div>
|
|
45
|
+
<button onclick="trackPurchase()">구매 이벤트 전송</button>
|
|
46
|
+
<button onclick="trackSignup()">회원가입 이벤트 전송</button>
|
|
47
|
+
<button onclick="trackPageView()">페이지뷰 이벤트 전송</button>
|
|
48
|
+
</div>
|
|
49
|
+
|
|
50
|
+
<div id="result" class="result">이벤트 결과가 여기에 표시됩니다.</div>
|
|
51
|
+
|
|
52
|
+
<!-- AdStage SDK - UMD 방식 (브라우저 호환성을 위한 UMD 포맷) -->
|
|
53
|
+
<script src="https://unpkg.com/@adstage/web-sdk@2.6.2/dist/index.umd.js"></script>
|
|
54
|
+
<script>
|
|
55
|
+
// SDK 초기화
|
|
56
|
+
AdStage.init({
|
|
57
|
+
apiKey: 'c06e2bc7c7244e111d90e530227274898de66ac9f3b5dbeae10e7615c1c616de',
|
|
58
|
+
debug: true,
|
|
59
|
+
baseUrl: 'https://beta-api.adstage.app',
|
|
60
|
+
appVersion: '1.2.3',
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
// 사용자 ID 설정
|
|
64
|
+
AdStage.events.setUserId('gunny1234');
|
|
65
|
+
|
|
66
|
+
// 사용자 속성 설정
|
|
67
|
+
AdStage.events.setUserProperties({
|
|
68
|
+
age: '28',
|
|
69
|
+
city: 'Seoul',
|
|
70
|
+
gender: 'male',
|
|
71
|
+
country: 'KR',
|
|
72
|
+
occupation: 'developer',
|
|
73
|
+
interests: ['technology', 'gaming', 'travel']
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
function showResult(eventName, params, success = true) {
|
|
77
|
+
const result = document.getElementById('result');
|
|
78
|
+
const timestamp = new Date().toLocaleString();
|
|
79
|
+
result.textContent = `[${timestamp}] ${eventName} 이벤트 ${success ? '전송됨' : '실패'}\n\n파라미터:\n${JSON.stringify(params, null, 2)}`;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 구매 이벤트
|
|
83
|
+
function trackPurchase() {
|
|
84
|
+
const params = {
|
|
85
|
+
transaction_id: `tx_${Date.now()}`,
|
|
86
|
+
value: 99000,
|
|
87
|
+
currency: 'KRW',
|
|
88
|
+
payment_method: 'card',
|
|
89
|
+
items: 2,
|
|
90
|
+
category: 'electronics',
|
|
91
|
+
brand: 'Samsung'
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
try {
|
|
95
|
+
AdStage.events.track('purchase', params);
|
|
96
|
+
showResult('purchase', params);
|
|
97
|
+
} catch (error) {
|
|
98
|
+
showResult('purchase', params, false);
|
|
99
|
+
console.error('Purchase event failed:', error);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// 회원가입 이벤트
|
|
104
|
+
function trackSignup() {
|
|
105
|
+
const params = {
|
|
106
|
+
user_id: `user_${Date.now()}`,
|
|
107
|
+
signup_method: 'email',
|
|
108
|
+
email_verified: true,
|
|
109
|
+
time_to_complete: 120,
|
|
110
|
+
form_version: 'v2',
|
|
111
|
+
utm_source: 'google_ads',
|
|
112
|
+
utm_medium: 'cpc'
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
try {
|
|
116
|
+
AdStage.events.track('signup_complete', params);
|
|
117
|
+
showResult('signup_complete', params);
|
|
118
|
+
} catch (error) {
|
|
119
|
+
showResult('signup_complete', params, false);
|
|
120
|
+
console.error('Signup event failed:', error);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// 페이지뷰 이벤트
|
|
125
|
+
function trackPageView() {
|
|
126
|
+
const params = {
|
|
127
|
+
page: window.location.pathname,
|
|
128
|
+
title: document.title,
|
|
129
|
+
referrer: document.referrer || 'direct',
|
|
130
|
+
utm_source: 'organic',
|
|
131
|
+
user_engagement: Math.floor(Math.random() * 300) + 30
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
AdStage.events.pageView(params);
|
|
136
|
+
showResult('page_view', params);
|
|
137
|
+
} catch (error) {
|
|
138
|
+
showResult('page_view', params, false);
|
|
139
|
+
console.error('PageView event failed:', error);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// 페이지 로드 시 자동 페이지뷰 추적
|
|
144
|
+
window.addEventListener('load', () => {
|
|
145
|
+
setTimeout(() => {
|
|
146
|
+
trackPageView();
|
|
147
|
+
}, 1000);
|
|
148
|
+
});
|
|
149
|
+
</script>
|
|
150
|
+
</body>
|
|
151
|
+
</html>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# AdStage SDK - Next.js 이벤트 추적 예시
|
|
2
|
+
|
|
3
|
+
## 설치 및 실행
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
cd /Users/gunny/Documents/workspace/adstage/sdk/src/example/events/nextjs
|
|
7
|
+
npm install # @adstage/web-sdk@^2.6.1 설치됨
|
|
8
|
+
npm run dev
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
서버: http://localhost:3000
|
|
12
|
+
|
|
13
|
+
## 기능
|
|
14
|
+
|
|
15
|
+
- 장바구니 추가 이벤트
|
|
16
|
+
- 앱 설치 이벤트
|
|
17
|
+
- 검색 이벤트
|
|
18
|
+
- 자동 페이지뷰 추적
|
|
19
|
+
|
|
20
|
+
## 이벤트 파라미터 예시
|
|
21
|
+
|
|
22
|
+
### 장바구니 추가 (add_to_cart)
|
|
23
|
+
```javascript
|
|
24
|
+
{
|
|
25
|
+
item_id: "prod_1234",
|
|
26
|
+
quantity: 2,
|
|
27
|
+
cart_value: 125000,
|
|
28
|
+
category: "home",
|
|
29
|
+
brand: "IKEA",
|
|
30
|
+
source: "product_page"
|
|
31
|
+
}
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### 앱 설치 (first_open)
|
|
35
|
+
```javascript
|
|
36
|
+
{
|
|
37
|
+
install_source: "google_play",
|
|
38
|
+
campaign: "summer_2024",
|
|
39
|
+
days_since_click: 3,
|
|
40
|
+
organic: false,
|
|
41
|
+
referrer: "google_ads"
|
|
42
|
+
}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### 검색 (search)
|
|
46
|
+
```javascript
|
|
47
|
+
{
|
|
48
|
+
search_term: "iPhone",
|
|
49
|
+
results_count: 42,
|
|
50
|
+
category: "electronics",
|
|
51
|
+
filters_applied: true,
|
|
52
|
+
sort_by: "price"
|
|
53
|
+
}
|
|
54
|
+
```
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "adstage-events-nextjs-example",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"private": true,
|
|
5
|
+
"scripts": {
|
|
6
|
+
"dev": "next dev",
|
|
7
|
+
"build": "next build",
|
|
8
|
+
"start": "next start"
|
|
9
|
+
},
|
|
10
|
+
"dependencies": {
|
|
11
|
+
"@adstage/web-sdk": "^2.6.1",
|
|
12
|
+
"next": "14.0.0",
|
|
13
|
+
"react": "^18.2.0",
|
|
14
|
+
"react-dom": "^18.2.0"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { AdStageProvider } from '@adstage/web-sdk';
|
|
2
|
+
|
|
3
|
+
export default function App({ Component, pageProps }) {
|
|
4
|
+
return (
|
|
5
|
+
<AdStageProvider
|
|
6
|
+
config={{
|
|
7
|
+
apiKey: '7dfddcfda637fbb73225bac3731688b80b90675942fe9f2057a88e2379aba2a4',
|
|
8
|
+
debug: true,
|
|
9
|
+
appVersion: '3.0.1'
|
|
10
|
+
}}
|
|
11
|
+
>
|
|
12
|
+
<Component {...pageProps} />
|
|
13
|
+
</AdStageProvider>
|
|
14
|
+
);
|
|
15
|
+
}
|