FingerPush Link SDK 따라하기

5분 만에 웹사이트 · 하이브리드 앱에 SDK를 연동하세요

📦 fplink-tracker.js v1
0
1
2
3
4
5
0
API 키 입력
콘솔에서 발급받은 App ID와 API Key를 입력하세요
📌 App ID · API Key 확인 경로
  1. 콘솔(console.fingerpush.link)에 로그인
  2. 좌측 메뉴에서 앱 관리 클릭
  3. 등록된 앱 이름을 클릭하여 앱 상세 진입
  4. 우측의 API 키 버튼 클릭 → App ID(숫자)와 API Key(ak_live_...)를 복사

아직 앱이 없다면: 앱 관리 → 새 앱 등록에서 먼저 생성하세요.

SDK API 요청이 전송될 도메인입니다. 커스텀 도메인이 있다면 해당 도메인을 입력하세요.
💡 Base URL이란? SDK가 데이터를 전송할 서버 주소입니다.
• 기본 도메인: https://fplink.net
• 커스텀 도메인 사용 시: https://your-custom.fplink.net 또는 연결한 자체 도메인
• 로컬 개발: http://localhost:8082
⚠️ 콘솔 주소(console.fingerpush.link)가 아니라 단축 URL 서비스 도메인을 입력하세요.
1
SDK 초기화
SDK를 로드하고 세션을 생성합니다

아래 코드를 HTML <body> 하단에 넣으면 SDK가 자동으로 세션을 생성하고, 페이지뷰를 추적합니다.

HTML + JavaScript

            

👆 위 코드를 이해했으면, 아래 버튼으로 실제 SDK를 초기화해보세요.

2
이벤트 추적
사용자 행동을 이벤트로 기록합니다

tracker.trackEvent(이벤트명, 데이터)로 사용자 행동을 추적합니다. 실행 결과는 콘솔 → 사용자 여정 분석에서 확인할 수 있습니다.

JavaScript

            

👆 아래 버튼을 클릭해서 각 이벤트를 직접 보내보세요.

3
퍼널 추적
링크 클릭 → 목표 달성까지의 전환 경로를 추적합니다

사용자가 단축 URL을 클릭한 후 최종 목표에 도달하기까지의 전환 경로를 추적합니다. 각 단계를 순서대로 클릭해보세요.

📱 모바일 앱 퍼널 — 링크 클릭부터 앱 설치, 딥링크 도달, 목표 달성까지
① 링크 클릭 → ② 스토어 방문 → ③ 앱 설치 → ④ 앱 열기 → ⑤ 콘텐츠 확인 → ⑥ 액션 수행 → ⑦ 딥링크 도달 → ⑧ 목표 달성 8단계로 추적됩니다.
JavaScript

            

퍼널 단계: 순서대로 클릭해보세요 👇

4
구매 · 가입 전환 추적
편의 메서드로 전환 목표를 간편하게 기록합니다

trackPurchase(), trackSignup() 등의 편의 메서드로 전환 이벤트를 한 줄로 보낼 수 있습니다.

📌 메서드 선택 가이드
trackPurchase(금액, 통화) 구매/매출 추적 (통화 코드 포함)
trackPurchase(29900, 'KRW')
trackGoal(목표타입, 수치, 통화?) 범용 전환 추적 (통화 선택 가능)
trackGoal('subscription', 9900, 'KRW')
trackSignup() 회원가입 완료 (편의 메서드)
trackConversion(전환명, 값, 통화?) 커스텀 전환 (통화 선택 가능)
trackConversion('donation', 5000, 'KRW')

💡 구매/매출이면 trackPurchase, 그 외 전환이면 trackGoal을 사용하세요.

💡 전환 추적 vs 이벤트 추적 — 목적이 다릅니다
전환 추적
세션의 최종 결과
trackPurchase(), trackGoal(), trackSignup()
"이 세션이 구매/전환으로 이어졌는가"를 기록합니다.
→ 콘솔의 사용자 여정 분석 · 대시보드 매출에서 확인
이벤트 추적
사용자 행동 로그
trackEvent()
"사용자가 어떤 행동을 했는가"를 기록합니다.
→ 콘솔의 이벤트 로그에서 확인

📌 같은 "구매"라도 전환 여부를 추적하려면 trackPurchase, 행동 로그를 남기려면 trackEvent를 사용하세요. 목적에 맞는 메서드를 선택하면 됩니다.

JavaScript

            
5
사용자 연결
로그인한 사용자 ID를 세션에 연결합니다

로그인 후 tracker.linkUser(userId)를 호출하면 비로그인 세션과 로그인 사용자를 연결합니다. 이를 통해 비로그인 → 로그인 전후의 사용자 여정을 통합 분석할 수 있습니다.

JavaScript

            
📋
복사해서 쓰는 전체 코드
버튼으로 각 SDK 기능을 바로 실행할 수 있는 완성 HTML

아래 코드를 복사해서 .html 파일로 저장하면, 브라우저에서 바로 열어 각 버튼을 클릭하여 SDK 기능을 테스트할 수 있습니다.

HTML — 복사 후 브라우저에서 실행

            
💡 하이브리드 앱이라면: SDK가 User-Agent를 분석하여 platform을 자동 감지합니다 (WebView → 'android' 또는 'ios'). 생략해도 되지만, 명시적으로 지정하면 해당 값이 우선 적용됩니다.
📱
하이브리드 앱 네이티브 설정
WebView 앱이라면 네이티브 쪽에서 아래 설정이 필요합니다

✅ 필수 — WebView 설정 (2줄이면 끝)

SDK는 localStorage에 세션을 저장합니다. WebView에서 JavaScript와 DOM Storage를 반드시 활성화하세요.

Kotlin — Android WebView
webView.settings.javaScriptEnabled = true    // JS 필수
webView.settings.domStorageEnabled = true   // localStorage 필수 (세션 저장)
Swift — iOS WKWebView
// WKWebView는 JavaScript, localStorage 모두 기본 활성
// .default() dataStore를 사용하면 별도 설정 없이 동작합니다
let config = WKWebViewConfiguration()
config.websiteDataStore = .default()
let webView = WKWebView(frame: view.bounds, configuration: config)
💡 이것만 하면 SDK는 웹과 동일하게 동작합니다. 이벤트 추적, 퍼널, 전환, 사용자 연결 — 모두 WebView 안의 JS 코드로 처리됩니다.

⚡ 선택 — 딥링크로 앱이 열릴 때 세션 연속

단축 URL 클릭 → 앱 열기 시 세션을 이어받으려면 네이티브에서 URL 파라미터를 WebView에 전달해야 합니다.

Kotlin — Android onNewIntent
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)
        }
    }
}
Swift — iOS Universal Link 처리
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)
    }
}
🔄 refreshSession() — 핵심 포인트
localStorage.setItem()만으로는 SDK 메모리의 세션 ID가 갱신되지 않습니다. 반드시 tracker.refreshSession('새_세션_ID')를 호출하여 SDK가 새 세션을 인식하도록 하세요.

사용법:
tracker.refreshSession('세션ID') — 지정된 세션 ID로 즉시 갱신
tracker.refreshSession() — localStorage에서 최신 세션 ID를 읽어 갱신

urlId / campaignId 자동 갱신:
localStorage에 urlId 또는 campaignId가 포함되면 refreshSession() 호출 시 함께 갱신됩니다. 두 값은 상호 배타적이며 (URL 클릭 → urlId, 캠페인 클릭 → campaignId), 서버 리다이렉트 URL에 fplink_url_id 또는 fplink_cid로 자동 포함됩니다.

SDK는 storage 이벤트도 감지하므로, 다른 탭이나 네이티브에서 localStorage가 변경되면 자동으로 세션이 갱신됩니다.

⚡ 선택 — 딥링크 수신 등록

앱 링크 / 유니버설 링크를 수신하려면 각 플랫폼에 도메인을 등록해야 합니다.

XML — AndroidManifest.xml
<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>
iOS — Xcode Associated Domains
// Xcode → Signing & Capabilities → + Associated Domains
// 아래 도메인을 추가하세요:

applinks:fplink.net
applinks:your-custom.fplink.net   // 커스텀 도메인 사용 시

💬 선택 — JS ↔ Native 브릿지

웹에서 목표 달성 시 네이티브에도 알리고 싶다면 (예: Firebase Analytics, 푸시 토큰 전달) 브릿지를 추가할 수 있습니다.

JavaScript — WebView 내 코드
// 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 / 캠페인 연동 세션 추적
단축 URL이나 캠페인 URL을 통해 들어온 사용자의 여정을 자동으로 추적합니다

🚀 자동 연동 — 추가 코드 없음

사용자가 단축 URL(fplink.net/abc) 또는 캠페인 URL(fplink.net/c/summer-sale)을 클릭하면, 서버가 자동으로 fplink_sid를 생성하고 리다이렉트 URL에 포함합니다. SDK는 이를 감지하여 세션 ID를 자동으로 연결합니다.

흐름도 — URL 클릭 → 세션 연결
// 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을 통해 진입한 사용자는 해당 캠페인에 자동으로 연결됩니다. 콘솔의 캠페인 상세 → 사용자 여정 분석에서 확인할 수 있습니다.

캠페인 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');
// → 콘솔: 캠페인 상세 → 사용자 여정 분석에서 확인

⚡ 선택 — urlId / campaignId 수동 지정

단축 URL을 거치지 않고 직접 SDK를 사용하는 경우, urlIdcampaignId를 수동으로 전달할 수 있습니다.

JavaScript — 수동 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로 진입한 세션의 이벤트/전환 타임라인
캠페인별 세션 캠페인 상세 → 사용자 여정 분석 이 캠페인으로 진입한 모든 세션 통합 분석
전체 세션 대시보드 세션 분석 메뉴 플랫폼별 세션 수, 전환율, 평균 세션 시간