단축URL 플러그인 가이드

fplink-shorturl-plugin.js를 파트너 사이트에 추가하면 스크립트 한 줄로 단축 URL 생성 기능을 즉시 사용할 수 있습니다. HTML 속성 기반으로 다양한 UI 패턴을 지원하며, JavaScript API로 세밀한 제어도 가능합니다.

사전 준비플러그인 신청 승인 필요
플러그인 SDK를 사용하려면 콘솔의 단축 URL 플러그인 메뉴에서 서비스 신청 후 관리자 승인을 받아야 합니다. 승인 후 발급된 CLIENT IDdata-client-id에 입력하세요.

설치

사이트의 </body> 태그 바로 앞에 아래 스크립트 태그를 추가하세요.

HTML
<script src="https://fplink.net/sdk/v1/fplink-shorturl-plugin.js"
        data-client-id="YOUR_CLIENT_ID"></script>

스크립트가 로드되면 window.FPLink 객체가 전역으로 사용 가능해집니다.

커스텀 도메인 연동

생성되는 단축 URL의 도메인을 서비스 기본 도메인 대신 브랜드 전용 도메인으로 변경할 수 있습니다. 두 가지 방법을 지원하며 목적에 따라 선택하세요.

방법 ① — fplink.net 서브도메인

핑거푸시링크 콘솔에서 커스텀 도메인으로 brand.fplink.net 형태의 서브도메인을 신청·승인받은 뒤, 스크립트 src를 해당 도메인으로 변경하세요. 스크립트 로드 도메인이 API 베이스로 자동 적용되어 단축 URL도 동일 도메인으로 생성됩니다.

HTML — 서브도메인에서 스크립트 로드
<!-- brand.fplink.net 에서 스크립트를 로드하면 단축 URL도 brand.fplink.net 도메인 사용 -->
<script src="https://brand.fplink.net/sdk/v1/fplink-shorturl-plugin.js"
        data-client-id="YOUR_CLIENT_ID"></script>
자동 적용추가 설정 불필요
SDK는 스크립트 src URL의 origin을 API 베이스로 자동 인식합니다. 스크립트만 교체하면 별도 코드 변경 없이 브랜드 도메인 단축 URL이 생성됩니다.

방법 ② — data-short-domain 속성

스크립트 로드 도메인과 단축 URL 도메인을 분리하고 싶은 경우, data-short-domain 속성으로 단축 URL 전용 도메인을 직접 지정하세요. 외부 CDN에서 스크립트를 로드하면서 단축 URL은 브랜드 도메인으로 생성하는 경우에 유용합니다.

HTML — data-short-domain 속성 사용
<!-- fplink.net 기본 도메인에서 스크립트를 로드하되 단축 URL은 brand.fplink.net 사용 -->
<script src="https://fplink.net/sdk/v1/fplink-shorturl-plugin.js"
        data-client-id="YOUR_CLIENT_ID"
        data-short-domain="brand.fplink.net"></script>
사전 조건콘솔에서 도메인 등록 필요
어떤 방법을 사용하든 콘솔 → 커스텀 도메인 메뉴에서 해당 도메인을 먼저 등록·승인받아야 합니다.
외부 도메인(예: go.myshop.com)은 DNS A 레코드 설정 + SSL 프로비저닝 승인이 추가로 필요합니다.

UI 패턴 (HTML 속성)

data-fplink 속성 하나로 원하는 UI 컴포넌트를 즉시 삽입할 수 있습니다.

인라인 위젯 inline

URL 입력창과 단축 버튼, 결과 표시 영역이 포함된 완성형 위젯을 삽입합니다.

HTML
<!-- 기본 -->
<div data-fplink="inline"></div>

<!-- 커스터마이징: 플레이스홀더와 버튼 라벨 변경 -->
<div data-fplink="inline"
     data-placeholder="상품 URL을 입력하세요"
     data-label="🔗 단축하기"></div>
속성기본값설명
data-placeholderURL을 입력하세요입력창 플레이스홀더
data-label🔗 단축 URL버튼 라벨

단축 버튼 shorten

기존 입력창과 연결하여 버튼 클릭 시 URL을 단축하고 결과를 지정한 필드에 채웁니다.

HTML
<input id="originUrl" type="url" placeholder="원본 URL">
<button data-fplink="shorten"
        data-input="#originUrl"
        data-output="#resultUrl">단축</button>
<input id="resultUrl" type="text" readonly>
속성필수설명
data-inputURL을 읽어올 input 셀렉터
data-output결과를 표시할 input 셀렉터. 생략 시 클립보드에만 복사됩니다.

원클릭 복사 버튼 copy

클릭 한 번으로 URL을 단축하여 클립보드에 복사합니다.

HTML
<!-- data-url 지정: 해당 URL을 단축 후 복사 -->
<button data-fplink="copy"
        data-url="https://example.com/product/123">링크 복사</button>

<!-- data-url 생략: 현재 페이지 URL을 단축 후 복사 -->
<button data-fplink="copy">이 페이지 공유하기</button>

클릭 시 단축 URL과 공유 옵션을 드롭다운 메뉴로 표시합니다.

HTML
<button data-fplink="dropdown"
        data-url="https://example.com/product/123">단축 URL</button>
속성필수설명
data-url단축할 URL

폼 자동 변환 form

폼 제출 시 지정한 URL 필드를 자동으로 단축 URL로 변환하여 제출합니다.

HTML
<form data-fplink="form"
      data-fplink-field="#longUrl"
      action="/save"
      method="post">
    <input id="longUrl" type="url" name="url" placeholder="https://example.com">
    <button type="submit">저장</button>
</form>

자동 변환 스코프 data-fplink-scope="auto"

컨테이너 내 <a> 링크에 마우스를 올리면 href가 자동으로 단축 URL로 교체됩니다. 한번 단축된 링크는 캐싱되어 재요청 없이 재사용됩니다.

HTML
<div data-fplink-scope="auto">
    <a href="https://www.fingerpush.com">이 링크는 클릭 시 자동 단축됩니다</a>
    <a href="https://www.fingerpush.link">이 링크도 마찬가지입니다</a>
</div>

플로팅 위젯 data-fplink-float

스크립트 태그에 data-fplink-float 속성을 추가하면 화면 우하단에 원형 단축 URL 버튼이 자동으로 활성화됩니다. 버튼 클릭 시 URL 단축 · 캠페인 생성 · 고급 입력 · 서비스 정보 메뉴가 표시됩니다.

HTML
<!-- script 태그에 data-fplink-float 추가로 원형 버튼 자동 활성화 -->
<script src="https://fplink.net/sdk/v1/fplink-shorturl-plugin.js"
        data-client-id="YOUR_CLIENT_ID"
        data-fplink-float></script>
메뉴 구성버튼 클릭 시 표시되는 항목
  • URL 단축 — 현재 페이지 URL을 단축 후 클립보드에 복사
  • 캠페인 생성 — 현재 페이지 캠페인 단축 URL 생성 후 복사
  • 고급 — URL / 캠페인 직접 입력 모달
  • 핑거푸시링크 정보 — 서비스 사용 현황 조회

스플릿 버튼 드롭다운 splitbutton

URL 입력창과 스플릿 버튼을 결합한 위젯입니다. 좌측 버튼으로 현재 선택된 동작을 즉시 실행하고, 우측 버튼으로 URL 생성 · 캠페인 생성 · 서비스 정보 중 원하는 동작을 선택할 수 있습니다.

HTML
<div data-fplink="splitbutton"></div>

통계 조회 위젯 stats

단축 URL 전체(https://fpl.fingerpush.link/abc123) 또는 단축 코드(abc123)를 입력하면 총 클릭 수와 최근 7일 추이를 막대 차트로 표시합니다.

HTML
<div data-fplink="stats"></div>

JavaScript API

고급 사용자 전용 — 클릭하여 펼치기

FPLink.shorten(url)

URL을 단축하여 Promise로 반환합니다.

JavaScript
const shortUrl = await FPLink.shorten('https://example.com/very/long/url');
console.log(shortUrl); // https://fpl.fingerpush.link/abc123

FPLink.shortenCampaign(url, opts)

UTM 파라미터가 포함된 캠페인 URL을 생성합니다.

JavaScript
FPLink.shortenCampaign('https://example.com/product', {
    campaignName: '2026 스프링 세일',
    utmSource:    'kakao',
    utmMedium:    'cpm',
    utmCampaign:  'spring_sale'
}).then(shortUrl => console.log('캠페인 URL:', shortUrl));

FPLink.batch(urls, opts?)

여러 URL을 병렬로 단축합니다. concurrency 옵션으로 동시 요청 수를 제한할 수 있습니다.

JavaScript
const urls = [
    'https://example.com/page1',
    'https://example.com/page2',
    'https://example.com/page3',
];

// concurrency 기본값 3
const results = await FPLink.batch(urls);
// results: [{ url, shortUrl, success: true }, ...]
// 실패한 항목: { url, shortUrl: null, success: false, error: '메시지' }

// 동시 요청 수 제한
const results2 = await FPLink.batch(urls, { concurrency: 1 });

FPLink.openWidget(opts?)

화면 우하단에 플로팅 단축 URL 위젯 버튼을 표시합니다.

JavaScript
// 기본 (우하단 플로팅)
FPLink.openWidget();

// 위치 변경 (좌하단)
FPLink.openWidget({ position: 'bottom-left' });
옵션설명
position'bottom-right' (기본) / 'bottom-left'버튼 표시 위치

FPLink.addMenu(key, label, fn)

드롭다운 버튼의 커스텀 공유 메뉴를 추가합니다. fn(shortUrl)이 호출됩니다.

JavaScript
// 카카오톡 공유 메뉴 추가
FPLink.addMenu('kakao', '💬 카카오톡 공유', function(shortUrl) {
    Kakao.Share.sendDefault({ objectType: 'feed', content: { webUrl: shortUrl } });
});

// 클립보드 복사 메뉴 추가
FPLink.addMenu('copy', '📋 클립보드 복사', function(shortUrl) {
    navigator.clipboard.writeText(shortUrl);
});

// 메뉴 제거
FPLink.removeMenu('kakao');

FPLink.setUser(info)

SPA(Single Page Application)에서 로그인 후 사용자 정보를 SDK에 주입합니다.

JavaScript
fetch('/api/me').then(r => r.json()).then(user => {
    FPLink.setUser({
        fpUserId: user.id,
        email:    user.email,
        name:     user.name
    });
});

FPLink.getInfo()

현재 클라이언트의 플러그인 설정 정보를 조회합니다.

JavaScript
const info = await FPLink.getInfo();
console.log(info); // { clientId, siteName, status, ... }

콜백

JavaScript
// 단축 성공 콜백
FPLink.onSuccess = function(shortUrl) {
    document.getElementById('shareLink').value = shortUrl;
};

// 캠페인 단축 성공 콜백
FPLink.onCampaignSuccess = function(shortUrl, campaignId) {
    console.log('캠페인 URL:', shortUrl, '캠페인 ID:', campaignId);
};

DOM 이벤트

SDK는 단축 성공/실패 시 CustomEvent를 발행합니다. document.addEventListener로 어디서든 수신할 수 있습니다.

JavaScript
// 단축 성공 이벤트
document.addEventListener('fplink:shortened', (e) => {
    const { shortUrl, originalUrl, type } = e.detail;
    // type: 'shorten' | 'campaign' | 'copy' | 'form' | 'scope'
    console.log('[FPLink] 단축됨:', shortUrl, '← 원본:', originalUrl, '/ 타입:', type);

    // 예: Google Analytics에 이벤트 전송
    // gtag('event', 'url_shortened', { short_url: shortUrl, type });
});

// 오류 이벤트
document.addEventListener('fplink:error', (e) => {
    console.error('[FPLink] 오류:', e.detail.message);
});
이벤트명detail 필드설명
fplink:shortenedshortUrl, originalUrl, type단축 성공 시 발행
fplink:errormessage단축 실패 시 발행

사용 예제 모음

자주 사용되는 패턴별 예제입니다. 샘플 화면에서 UI를 확인하고 코드를 그대로 복사해 적용하세요.

TYPE 1 · 인라인 위젯 data-fplink="inline"

<div> 하나만 추가하면 URL 입력창 · 단축 버튼 · 결과 복사까지 자동으로 생성됩니다. 가장 빠르게 적용 가능한 방법입니다.

Sample UI
HTML
<!-- </body> 앞에 스크립트 삽입 -->
<script src="https://fplink.net/sdk/v1/fplink-shorturl-plugin.js"
        data-client-id="YOUR_CLIENT_ID"></script>

<!-- div 한 줄이면 끝 -->
<div data-fplink="inline"
     data-placeholder="단축할 URL을 입력하세요"
     data-label="단축하기"
     data-color="#2563eb"></div>
속성기본값설명
data-placeholderURL을 입력하세요입력창 플레이스홀더
data-label🔗 단축 URL버튼 라벨
data-color#0ea5e9버튼 배경색 (HEX)

TYPE 2 · 버튼 연결 data-fplink="shorten"

기존 <input><button>에 HTML 속성만 추가하여 연결합니다. JS 코드 없이 기존 UI를 유지하면서 단축 기능을 붙일 수 있습니다.

Sample UI
HTML
<input id="urlInput" type="url" placeholder="https://example.com/very-long-url">

<button data-fplink="shorten"
        data-input="#urlInput"
        data-output="#resultBox">
    🔗 단축 URL 생성
</button>

<input id="resultBox" type="text" readonly placeholder="단축 URL이 여기에 표시됩니다">
속성필수설명
data-inputURL을 읽어올 input 셀렉터 (예: #urlInput)
data-output결과를 표시할 input 셀렉터. 생략 시 클립보드에만 복사

TYPE 9 · 기본 캠페인 생성 FPLink.shortenCampaign()

URL + 캠페인명을 입력하면 UTM 파라미터가 자동으로 추가된 캠페인 단축 URL(/c/{alias})을 생성합니다. URL 쿼터가 아닌 캠페인 쿼터를 소비합니다.

Sample UI
HTML
<input id="campUrl"  type="url"  placeholder="https://example.com/event">
<input id="campName" type="text" placeholder="캠페인명">
<input id="campSrc"  type="text" placeholder="UTM Source">
<input id="campMed"  type="text" placeholder="UTM Medium">
<button onclick="doCreateCampaign()">📊 캠페인 생성</button>
<input id="campResult" type="text" readonly>
JavaScript
async function doCreateCampaign() {
    const shortUrl = await FPLink.shortenCampaign(
        document.getElementById('campUrl').value,
        {
            campaignName: document.getElementById('campName').value,
            utmSource:    document.getElementById('campSrc').value,
            utmMedium:    document.getElementById('campMed').value,
        }
    );
    document.getElementById('campResult').value = shortUrl;
}
옵션필수설명
campaignName캠페인 이름 (콘솔에 표시)
utmSourceUTM Source (예: kakao, google)
utmMediumUTM Medium (예: cpm, cpc, email)
utmContentUTM Content (예: banner_top)

TYPE 10 · 스플릿 버튼 드롭다운

URL 입력창과 스플릿 버튼을 결합한 패턴입니다. 좌측 버튼으로 현재 선택된 동작을 즉시 실행하고, 우측 ▾ 버튼으로 URL 생성 · 캠페인 생성 · 서비스 정보 중 원하는 동작을 선택할 수 있습니다.

Sample UI
🔗 URL 생성
📊 캠페인 생성
ℹ️ 핑거푸시링크 정보
HTML
<input id="ddUrlInput" type="url" placeholder="https://example.com">

<div style="position:relative;display:inline-flex;">
    <!-- 좌측: 현재 선택된 동작 실행 -->
    <button id="ddMainBtn" onclick="doDdAction()"
            style="border-radius:8px 0 0 8px;border-right:1px solid rgba(255,255,255,.3);">
        🔗 URL 생성
    </button>
    <!-- 우측: 드롭다운 열기 -->
    <button onclick="toggleDdMenu(event)" style="border-radius:0 8px 8px 0;">▾</button>

    <div id="ddMenu" style="display:none;position:absolute;top:calc(100% + 4px);right:0;
         background:#fff;border:1.5px solid #e2e8f0;border-radius:10px;
         box-shadow:0 6px 20px rgba(0,0,0,.12);min-width:180px;z-index:200;overflow:hidden;">
        <button onclick="selectDdAction('url')">🔗 URL 생성</button>
        <button onclick="selectDdAction('campaign')">📊 캠페인 생성</button>
        <button onclick="selectDdAction('info')">ℹ️ 핑거푸시링크 정보</button>
    </div>
</div>

<!-- 캠페인 생성 선택 시 추가 입력 -->
<div id="ddCampFields" style="display:none;margin-top:10px;">
    <input id="ddCampName" type="text" placeholder="캠페인명 (선택사항)">
</div>
<div id="ddResult"></div>
JavaScript
let _ddCurrentAction = 'url'; // 현재 선택된 동작

function toggleDdMenu(e) {
    e.stopPropagation();
    const m = document.getElementById('ddMenu');
    m.style.display = m.style.display === 'none' ? 'block' : 'none';
}

function selectDdAction(action) {
    _ddCurrentAction = action;
    const labels = { url: '🔗 URL 생성', campaign: '📊 캠페인 생성', info: 'ℹ️ 서비스 정보' };
    document.getElementById('ddMainBtn').textContent = labels[action];
    document.getElementById('ddMenu').style.display = 'none';
    document.getElementById('ddCampFields').style.display = action === 'campaign' ? 'block' : 'none';
}

async function doDdAction() {
    const url    = document.getElementById('ddUrlInput').value.trim();
    const result = document.getElementById('ddResult');

    if (_ddCurrentAction === 'url') {
        const shortUrl = await FPLink.shorten(url);
        result.innerHTML = '<input type="text" value="' + shortUrl + '" readonly>';

    } else if (_ddCurrentAction === 'campaign') {
        const name = document.getElementById('ddCampName').value.trim();
        const shortUrl = await FPLink.shortenCampaign(url, { campaignName: name || '캠페인' });
        result.innerHTML = '<input type="text" value="' + shortUrl + '" readonly>';

    } else if (_ddCurrentAction === 'info') {
        const info = await FPLink.getInfo();
        result.textContent = JSON.stringify(info, null, 2);
    }
}

// 외부 클릭 시 드롭다운 닫기
document.addEventListener('click', () => {
    document.getElementById('ddMenu').style.display = 'none';
});

TYPE 11 · 통계 보기 FPLink.getStats(code, type)

단축 URL 코드 또는 캠페인 별칭(alias)의 총 클릭 수와 최근 7일 클릭 추이를 조회합니다.
두 번째 인자 type으로 URL 통계캠페인 통계를 구분합니다.

시그니처
FPLink.getStats(code: string, type?: 'url' | 'campaign'): Promise<StatsResult>
//  code  — 단축 코드 또는 캠페인 alias. 전체 URL을 넘겨도 자동으로 코드를 추출합니다.
//  type  — 'url' (기본값) 또는 'campaign'
//          단, URL에 /c/ 경로가 포함된 경우 type을 생략해도 자동으로 캠페인으로 처리됩니다.
//          예) FPLink.getStats('https://fpl.fingerpush.link/c/summer2026')  → 캠페인 자동 감지

① URL 통계 type: 'url'

단축 URL 코드를 전달합니다. type을 생략하면 URL 통계가 기본으로 조회됩니다.

Sample UI
총 클릭 수 42
최근 7일 클릭 추이
3
05-09
7
05-10
5
05-11
05-12
12
05-13
10
05-14
5
05-15
JavaScript · URL 통계
// type 생략 시 'url'이 기본값
const data = await FPLink.getStats('huNsKR');
// 전체 URL을 넘겨도 동작합니다
// const data = await FPLink.getStats('https://fpl.fingerpush.link/huNsKR');

console.log(data.shortCode);    // 'huNsKR'
console.log(data.totalClicks);  // 42
console.log(data.title);        // 'Summer Landing Page'
console.log(data.dailyClicks);  // { '2026-05-09': 3, '2026-05-10': 7, ... }
HTML · URL 통계 간단 예제
<button id="url-stats-btn">📈 URL 통계 보기</button>
<p id="url-stats-out"></p>

<script>
document.getElementById('url-stats-btn').addEventListener('click', async () => {
  const out = document.getElementById('url-stats-out');
  const data = await FPLink.getStats('huNsKR');          // type 생략 = 'url'
  out.textContent = `총 클릭 수: ${data.totalClicks}회`;
});
</script>

② 캠페인 통계 type: 'campaign'

캠페인 별칭(alias)을 전달하고 두 번째 인자에 'campaign'을 지정합니다.
alias는 콘솔 > 캠페인 목록에서 확인할 수 있습니다.

Sample UI
총 클릭 수 315
최근 7일 클릭 추이
30
05-09
58
05-10
40
05-11
22
05-12
76
05-13
60
05-14
29
05-15
JavaScript · 캠페인 통계
// 두 번째 인자에 'campaign' 지정
const data = await FPLink.getStats('summer2026', 'campaign');

console.log(data.alias);        // 'summer2026'
console.log(data.totalClicks);  // 315
console.log(data.name);         // '2026 여름 프로모션'
console.log(data.dailyClicks);  // { '2026-05-09': 30, '2026-05-10': 58, ... }
HTML · 캠페인 통계 간단 예제
<button id="camp-stats-btn">📊 캠페인 통계 보기</button>
<p id="camp-stats-out"></p>

<script>
document.getElementById('camp-stats-btn').addEventListener('click', async () => {
  const out = document.getElementById('camp-stats-out');
  try {
    const data = await FPLink.getStats('summer2026', 'campaign');
    out.textContent = `캠페인 클릭 수: ${data.totalClicks}회`;
  } catch (e) {
    out.textContent = '❌ ' + e.message;
  }
});
</script>
응답 필드타입URL캠페인설명
totalClicksnumber전체 기간 총 클릭 수
dailyClicksobject날짜(YYYY-MM-DD) → 클릭 수 맵 (최근 7일)
originalUrlstring원본 URL
createdAtstring생성 일시 (ISO 8601)
shortCodestring단축 코드
titlestringURL 제목
aliasstring캠페인 별칭
namestring캠페인 이름

트러블슈팅

오류CORS 오류 발생
SDK가 로드된 도메인이 콘솔의 허용 도메인 목록에 등록되어 있는지 확인하세요. 포트 번호가 다르면 별도 도메인으로 등록해야 합니다 (예: https://example.com:3000).
오류FPLink is not defined
스크립트 태그가 </body> 앞에 위치하는지 확인하세요. 또는 DOMContentLoaded 이벤트 이후에 FPLink API를 호출하세요.
오류401 Unauthorized
data-client-id에 올바른 CLIENT ID가 입력되었는지 확인하세요. 콘솔 > 단축 URL 플러그인 메뉴에서 CLIENT ID를 확인할 수 있습니다.
TIPSPA(React, Vue 등) 사용 시
동적으로 추가된 요소는 자동으로 감지됩니다 (MutationObserver 사용). 로그인 후에는 FPLink.setUser()를 호출하여 사용자 정보를 주입하세요.