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. 좌측 메뉴 단축 URL > 딥링크 > 앱 관리 클릭
  3. 앱 목록에서 해당 앱 행의 API 키(열쇠 아이콘) 버튼 클릭 → App ID(숫자)와 API Key(UUID 형식)를 복사

아직 앱이 없다면: 앱 관리 → 새 앱 추가에서 플랫폼(웹사이트는 웹 앱)과 앱 이름을 입력해 먼저 생성하세요.

필요한 애드온 (구독 & 결제 > 구독 관리)

  • 사용자 여정 분석 — 세션 생성·이벤트 추적 (Step 1~2, 5)
  • 모바일 딥링크 — 앱 등록(웹 앱 포함), 퍼널·전환 기록 (Step 3~4)
SDK API 요청이 전송될 도메인입니다. 커스텀 도메인이 있다면 해당 도메인을 입력하세요.
💡 Base URL이란? SDK가 데이터를 전송할 서버 주소입니다.
• 기본 도메인: https://fplink.net
• 커스텀 도메인 사용 시: 콘솔에서 연결한 자체 도메인 (예: https://link.your-brand.com)
⚠️ 콘솔 주소(console.fingerpush.link)가 아니라 단축 URL 서비스 도메인을 입력하세요.
1
SDK 초기화
SDK를 로드하고 세션을 생성합니다

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

HTML + JavaScript

            

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

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

tracker.trackEvent(이벤트명, 데이터)로 사용자 행동을 추적합니다. 실행 결과는 콘솔 → 데이터 분석 → 이벤트 로그에서 확인할 수 있습니다. 이벤트 전송은 결과를 기다리지 않는 방식이라, 실패 여부는 브라우저 개발자 도구 Console의 [FPLinkTracker] 로그로 확인하세요.

JavaScript

            

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

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

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

💡 알아두세요
• 퍼널·전환 기록은 모바일 딥링크 애드온이 있어야 저장됩니다. 없으면 버튼을 눌렀을 때 HTTP 403 오류가 표시됩니다.
• ① 링크 클릭은 실제 연동에서는 단축 URL을 거칠 때 서버가 자동 기록하므로 코드가 필요 없습니다. 이 데모에서는 흐름을 보여주기 위해 직접 보냅니다.
• 콘텐츠 조회·액션 수행은 목표에 맞는 행동이 없으면 호출하지 않아도 됩니다(콘솔에서 "건너뜀"으로 표시).
🌐 웹 앱 퍼널 — 앱 설치 관련 단계가 생략되어
① 링크 클릭 → ② 페이지 도달 → ③ 콘텐츠 조회 → ④ 액션 수행 → ⑤ 목표 달성 5단계로 추적됩니다.
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 — 복사 후 브라우저에서 실행

            
💡 하이브리드 앱이라면: platform을 생략하면 SDK가 ① 앱이 localStorage에 기록한 세션의 platform 값, ② 네이티브 브릿지(Android window.FPLink, iOS webkit.messageHandlers.FPLink) 등록 여부 순으로 판단하고, 둘 다 없으면 'web'으로 봅니다. User-Agent는 보지 않습니다. 명시적으로 지정하면 그 값이 항상 우선 적용됩니다.
📱
하이브리드 앱 네이티브 설정
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에 전달해야 합니다. 아래 코드는 웹 페이지에서 SDK를 var tracker = new FPLinkTracker(...)처럼 전역 변수 tracker로 만든 경우입니다. 다른 이름(예: fplinkTracker)을 쓴다면 window.tracker를 그 이름으로 바꾸세요.

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 연동) 네이티브에 브릿지를 등록하세요. 웹 코드는 추가할 필요가 없습니다 — SDK가 퍼널 메서드(trackGoal 등) 호출 후 서버 결과와 함께 자동으로 알립니다.

앱이 웹뷰에 세션·식별자를 밀어 넣는다면 onReady(READY)를 함께 받으세요 — 웹 SDK 초기화가 끝난 시점과 백그라운드에서 돌아온 시점에 옵니다. 이 신호를 기다리지 않고 주입하면 스크립트가 아직 없어 조용히 사라집니다. 자세한 규격은 공개 문서 "Web SDK API > 웹뷰 준비 완료 신호(READY)" 에 있습니다.

SDK가 네이티브로 보내는 형태
// Android — addJavascriptInterface(obj, "FPLink") 로 등록한 객체의 메서드를 JSON 문자열 1개로 호출
//   onClicked, onStoreVisited, onAppInstalled, onAppOpened, onDeepLinkResolved,
//   onContentViewed, onActionTaken, onGoalCompleted, onSessionChanged, onReady
//   (없는 메서드는 onFunnelEvent(stage, json) 으로 대신 호출 — READY 는 제외)
window.FPLink.onGoalCompleted('{"event":"GOAL_COMPLETED","goalType":"purchase","goalValue":29900,"serverSuccess":true,...}');

// iOS — WKScriptMessageHandler 이름 "FPLink" 로 객체 1개 전달
window.webkit.messageHandlers.FPLink.postMessage({
    event: 'GOAL_COMPLETED', goalType: 'purchase', goalValue: 29900, serverSuccess: true, ...
});
Kotlin — Android 수신 예시
class FPLinkBridge {
    @JavascriptInterface
    fun onGoalCompleted(json: String) {
        val data = JSONObject(json)
        // data.optString("goalType"), data.optDouble("goalValue"), data.optBoolean("serverSuccess")
    }
}
webView.addJavascriptInterface(FPLinkBridge(), "FPLink")

📌 요약: 언제 무엇이 필요한가

시나리오 네이티브 작업
웹 분석만 (이벤트/퍼널/전환) 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을 통해 진입한 사용자는 해당 캠페인에 자동으로 연결됩니다. 콘솔의 캠페인 목록 → 행의 사용자 여정 분석 버튼(iOS/Android 앱이 연결된 캠페인) 또는 데이터 분석 → 사용자 여정 분석에서 확인할 수 있습니다.

캠페인 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을 거치지 않고 들어온 방문을 특정 URL/캠페인에 귀속시키려면 두 가지 방법이 있습니다. 둘 중 하나만 지정하세요 (URL 클릭 → urlId, 캠페인 클릭 → campaignId).

JavaScript — 수동 urlId/campaignId 지정
// 방법 1: 페이지 주소에 파라미터를 붙여 들어오게 하기 (권장)
//   https://shop.example.com/shoes?fplink_url_id=123   (캠페인이면 ?fplink_cid=456)
//   → SDK가 초기화 시 읽어 저장하고, 이후 모든 이벤트/퍼널/전환에 자동 포함 (귀속 기간 기본 7일)

// 방법 2: 호출마다 옵션으로 지정 — 옵션 값은 그 호출에만 실리고 저장되지 않습니다
tracker.trackFunnelEvent('DEEP_LINK_RESOLVED', { urlId: 123 });
tracker.trackFunnelEvent('GOAL_COMPLETED', {
    urlId: 123, goalType: 'purchase', goalValue: 29900, goalCurrency: 'KRW'
});

📈 콘솔에서 확인하기

확인 위치 경로 내용
URL별 세션 단축 URL 목록 → 행의 사용자 여정 분석 버튼 (iOS/Android 앱이 연결된 URL) 이 URL로 진입한 세션의 이벤트/전환 타임라인
캠페인별 세션 캠페인 목록 → 행의 사용자 여정 분석 버튼 (iOS/Android 앱이 연결된 캠페인) 이 캠페인으로 진입한 모든 세션 통합 분석
앱 전체 세션 (웹 앱 포함) 데이터 분석 → 행동 분석 → 사용자 여정 분석 (앱 선택) 세션 목록·타임라인, 플랫폼 분포, 크로스 플랫폼 전환