5분 만에 웹사이트 · 하이브리드 앱에 SDK를 연동하세요
console.fingerpush.link)에 로그인숫자)와 API Key(ak_live_...)를 복사아직 앱이 없다면: 앱 관리 → 새 앱 등록에서 먼저 생성하세요.
https://fplink.nethttps://your-custom.fplink.net 또는 연결한 자체 도메인http://localhost:8082console.fingerpush.link)가 아니라 단축 URL 서비스 도메인을 입력하세요.
아래 코드를 HTML <body> 하단에 넣으면 SDK가 자동으로
세션을 생성하고, 페이지뷰를 추적합니다.
👆 위 코드를 이해했으면, 아래 버튼으로 실제 SDK를 초기화해보세요.
tracker.trackEvent(이벤트명, 데이터)로 사용자 행동을 추적합니다.
실행 결과는 콘솔 → 사용자 여정 분석에서 확인할 수 있습니다.
👆 아래 버튼을 클릭해서 각 이벤트를 직접 보내보세요.
사용자가 단축 URL을 클릭한 후 최종 목표에 도달하기까지의 전환 경로를 추적합니다. 각 단계를 순서대로 클릭해보세요.
퍼널 단계: 순서대로 클릭해보세요 👇
trackPurchase(), trackSignup() 등의 편의 메서드로
전환 이벤트를 한 줄로 보낼 수 있습니다.
| trackPurchase(금액, 통화) | 구매/매출 추적 (통화 코드 포함)trackPurchase(29900, 'KRW') |
| trackGoal(목표타입, 수치, 통화?) | 범용 전환 추적 (통화 선택 가능)trackGoal('subscription', 9900, 'KRW') |
| trackSignup() | 회원가입 완료 (편의 메서드) |
| trackConversion(전환명, 값, 통화?) | 커스텀 전환 (통화 선택 가능)trackConversion('donation', 5000, 'KRW') |
💡 구매/매출이면 trackPurchase, 그 외 전환이면 trackGoal을 사용하세요.
|
전환 추적 세션의 최종 결과 |
trackPurchase(), trackGoal(), trackSignup()"이 세션이 구매/전환으로 이어졌는가"를 기록합니다. → 콘솔의 사용자 여정 분석 · 대시보드 매출에서 확인 |
|
이벤트 추적 사용자 행동 로그 |
trackEvent()"사용자가 어떤 행동을 했는가"를 기록합니다. → 콘솔의 이벤트 로그에서 확인 |
📌 같은 "구매"라도 전환 여부를 추적하려면 trackPurchase,
행동 로그를 남기려면 trackEvent를 사용하세요. 목적에 맞는 메서드를 선택하면 됩니다.
로그인 후 tracker.linkUser(userId)를 호출하면
비로그인 세션과 로그인 사용자를 연결합니다.
이를 통해 비로그인 → 로그인 전후의 사용자 여정을 통합 분석할 수 있습니다.
아래 코드를 복사해서 .html 파일로 저장하면, 브라우저에서 바로 열어 각 버튼을 클릭하여 SDK 기능을 테스트할 수 있습니다.
platform을 자동 감지합니다 (WebView → 'android' 또는 'ios').
생략해도 되지만, 명시적으로 지정하면 해당 값이 우선 적용됩니다.
SDK는 localStorage에 세션을 저장합니다. WebView에서 JavaScript와 DOM Storage를 반드시 활성화하세요.
webView.settings.javaScriptEnabled = true // JS 필수 webView.settings.domStorageEnabled = true // localStorage 필수 (세션 저장)
// WKWebView는 JavaScript, localStorage 모두 기본 활성 // .default() dataStore를 사용하면 별도 설정 없이 동작합니다 let config = WKWebViewConfiguration() config.websiteDataStore = .default() let webView = WKWebView(frame: view.bounds, configuration: config)
단축 URL 클릭 → 앱 열기 시 세션을 이어받으려면 네이티브에서 URL 파라미터를 WebView에 전달해야 합니다.
override fun onNewIntent(intent: Intent?) { super.onNewIntent(intent) intent?.data?.let { uri -> val sessionId = uri.getQueryParameter("fplink_sid") val goalType = uri.getQueryParameter("fplink_goal_type") val urlId = uri.getQueryParameter("fplink_url_id") val campaignId = uri.getQueryParameter("fplink_cid") if (sessionId != null) { webView.evaluateJavascript(""" localStorage.setItem('fplink_session_id', JSON.stringify({ sessionId: '$sessionId', expiresAt: new Date(Date.now() + 30*24*60*60*1000).toISOString(), platform: 'android', source: 'deeplink', urlId: ${urlId ?: "null"}, campaignId: ${campaignId ?: "null"} })); // SDK 메모리의 세션 ID도 즉시 갱신 if(window.tracker) window.tracker.refreshSession('$sessionId'); ${if (goalType != null) "if(window.tracker) tracker.setGoalType('$goalType');" else ""} """.trimIndent(), null) } } }
func handleUniversalLink(_ url: URL) { let components = URLComponents(url: url, resolvingAgainstBaseURL: false) let sessionId = components?.queryItems?.first(where: { $0.name == "fplink_sid" })?.value let goalType = components?.queryItems?.first(where: { $0.name == "fplink_goal_type" })?.value let urlId = components?.queryItems?.first(where: { $0.name == "fplink_url_id" })?.value let campaignId = components?.queryItems?.first(where: { $0.name == "fplink_cid" })?.value if let sid = sessionId { let urlIdJs = urlId ?? "null" let cidJs = campaignId ?? "null" let script = """ localStorage.setItem('fplink_session_id', JSON.stringify({ sessionId: '\(sid)', expiresAt: new Date(Date.now() + 30*24*60*60*1000).toISOString(), platform: 'ios', source: 'universal_link', urlId: \(urlIdJs), campaignId: \(cidJs) })); // SDK 메모리의 세션 ID도 즉시 갱신 if(window.tracker) window.tracker.refreshSession('\(sid)'); \(goalType.map { "if(window.tracker) tracker.setGoalType('\($0)');" } ?? "") """ webView.evaluateJavaScript(script, completionHandler: nil) } }
localStorage.setItem()만으로는 SDK 메모리의 세션 ID가 갱신되지 않습니다.
반드시 tracker.refreshSession('새_세션_ID')를 호출하여 SDK가 새 세션을 인식하도록 하세요.tracker.refreshSession('세션ID') — 지정된 세션 ID로 즉시 갱신tracker.refreshSession() — localStorage에서 최신 세션 ID를 읽어 갱신urlId 또는 campaignId가 포함되면 refreshSession() 호출 시 함께 갱신됩니다.
두 값은 상호 배타적이며 (URL 클릭 → urlId, 캠페인 클릭 → campaignId), 서버 리다이렉트 URL에 fplink_url_id 또는 fplink_cid로 자동 포함됩니다.storage 이벤트도 감지하므로, 다른 탭이나 네이티브에서 localStorage가 변경되면 자동으로 세션이 갱신됩니다.
앱 링크 / 유니버설 링크를 수신하려면 각 플랫폼에 도메인을 등록해야 합니다.
<activity android:name=".MainActivity" android:exported="true" android:launchMode="singleTask"> <!-- 앱 링크 (단축 URL 클릭 시 앱 열기) --> <intent-filter android:autoVerify="true"> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:scheme="https" android:host="fplink.net" /> </intent-filter> </activity>
// Xcode → Signing & Capabilities → + Associated Domains // 아래 도메인을 추가하세요: applinks:fplink.net applinks:your-custom.fplink.net // 커스텀 도메인 사용 시
웹에서 목표 달성 시 네이티브에도 알리고 싶다면 (예: Firebase Analytics, 푸시 토큰 전달) 브릿지를 추가할 수 있습니다.
// Android 브릿지 (addJavascriptInterface로 등록) if (window.FPLink) { window.FPLink.onGoalCompleted('purchase', 29900); } // iOS 브릿지 (WKScriptMessageHandler로 등록) if (window.webkit && window.webkit.messageHandlers.FPLink) { window.webkit.messageHandlers.FPLink.postMessage({ action: 'goalCompleted', goalType: 'purchase', goalValue: 29900 }); }
| 시나리오 | 네이티브 작업 |
|---|---|
| 웹 분석만 (이벤트/퍼널/전환) | WebView 설정 2줄만 하면 끝 |
| 딥링크로 앱 열기 + 세션 연속 | 딥링크 수신 코드 + Manifest / Associated Domains |
| 네이티브 연동 (FCM, 결제 등) | JS ↔ Native 브릿지 추가 |
사용자가 단축 URL(fplink.net/abc) 또는 캠페인 URL(fplink.net/c/summer-sale)을 클릭하면,
서버가 자동으로 fplink_sid를 생성하고 리다이렉트 URL에 포함합니다.
SDK는 이를 감지하여 세션 ID를 자동으로 연결합니다.
// 1. 콘솔에서 단축 URL 생성 // URL ID: 123, 단축 URL: fplink.net/abc // 원본: https://shop.example.com/shoes // 2. 사용자가 fplink.net/abc 클릭 // → 서버: fplink_sid=UUID 생성 + fplink_url_id=123 추가 // → 리다이렉트: https://shop.example.com/shoes?fplink_sid=xxx&fplink_url_id=123 // 3. SDK가 URL에서 fplink_sid + fplink_url_id 자동 감지 → 세션 + URL 연결 var tracker = new FPLinkTracker({ baseUrl: 'https://fplink.net', apiKey: 'YOUR_API_KEY', appId: 42, platform: 'web' }); // → SDK init()이 fplink_sid를 자동 감지하고 서버에 세션 등록 // 4. 이후 모든 이벤트/퍼널/전환이 URL ID 123에 귀속 tracker.trackEvent('product_view', { productId: 'P-001' }); tracker.trackGoal('purchase', 29900, 'KRW');
캠페인 URL을 통해 진입한 사용자는 해당 캠페인에 자동으로 연결됩니다. 콘솔의 캠페인 상세 → 사용자 여정 분석에서 확인할 수 있습니다.
// 캠페인 URL: fplink.net/c/summer-sale (캠페인 ID: 456) // 사용자 클릭 → fplink_sid + fplink_cid=456 자동 연결 // SDK 코드는 동일 — 추가 설정 불필요! var tracker = new FPLinkTracker({ baseUrl: 'https://fplink.net', apiKey: 'YOUR_API_KEY', appId: 42, platform: 'web' }); // 이벤트/전환이 캠페인 456에 자동 귀속 tracker.trackPurchase(29900, 'KRW'); // → 콘솔: 캠페인 상세 → 사용자 여정 분석에서 확인
단축 URL을 거치지 않고 직접 SDK를 사용하는 경우, urlId와 campaignId를 수동으로 전달할 수 있습니다.
// 퍼널 이벤트에 urlId, campaignId 직접 지정 tracker.trackFunnelEvent('CLICKED', { urlId: 123, campaignId: 456 }); // 이후 퍼널 이벤트에서는 인스턴스에 저장된 값 자동 사용 tracker.trackFunnelEvent('APP_OPENED'); tracker.trackGoal('purchase', 29900, 'KRW'); // → urlId: 123, campaignId: 456 자동 포함
| 확인 위치 | 경로 | 내용 |
|---|---|---|
| URL별 세션 | URL 상세 → 사용자 여정 분석 | 이 URL로 진입한 세션의 이벤트/전환 타임라인 |
| 캠페인별 세션 | 캠페인 상세 → 사용자 여정 분석 | 이 캠페인으로 진입한 모든 세션 통합 분석 |
| 전체 세션 대시보드 | 세션 분석 메뉴 | 플랫폼별 세션 수, 전환율, 평균 세션 시간 |