단축URL 플러그인 가이드
fplink-shorturl-plugin.js를 파트너 사이트에 추가하면 스크립트 한 줄로 단축 URL 생성 기능을 즉시 사용할 수 있습니다. HTML 속성 기반으로 다양한 UI 패턴을 지원하며, JavaScript API로 세밀한 제어도 가능합니다.
data-client-id에 입력하세요.
설치
사이트의 </body> 태그 바로 앞에 아래 스크립트 태그를 추가하세요.
<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도 동일 도메인으로 생성됩니다.
<!-- 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>
src URL의 origin을 API 베이스로 자동 인식합니다.
스크립트만 교체하면 별도 코드 변경 없이 브랜드 도메인 단축 URL이 생성됩니다.
방법 ② — data-short-domain 속성
스크립트 로드 도메인과 단축 URL 도메인을 분리하고 싶은 경우, data-short-domain 속성으로 단축 URL 전용 도메인을 직접 지정하세요.
외부 CDN에서 스크립트를 로드하면서 단축 URL은 브랜드 도메인으로 생성하는 경우에 유용합니다.
<!-- 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 입력창과 단축 버튼, 결과 표시 영역이 포함된 완성형 위젯을 삽입합니다.
<!-- 기본 -->
<div data-fplink="inline"></div>
<!-- 커스터마이징: 플레이스홀더와 버튼 라벨 변경 -->
<div data-fplink="inline"
data-placeholder="상품 URL을 입력하세요"
data-label="🔗 단축하기"></div>
| 속성 | 기본값 | 설명 |
|---|---|---|
| data-placeholder | URL을 입력하세요 | 입력창 플레이스홀더 |
| data-label | 🔗 단축 URL | 버튼 라벨 |
단축 버튼 shorten
기존 입력창과 연결하여 버튼 클릭 시 URL을 단축하고 결과를 지정한 필드에 채웁니다.
<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-input | ✅ | URL을 읽어올 input 셀렉터 |
| data-output | — | 결과를 표시할 input 셀렉터. 생략 시 클립보드에만 복사됩니다. |
원클릭 복사 버튼 copy
클릭 한 번으로 URL을 단축하여 클립보드에 복사합니다.
<!-- data-url 지정: 해당 URL을 단축 후 복사 -->
<button data-fplink="copy"
data-url="https://example.com/product/123">링크 복사</button>
<!-- data-url 생략: 현재 페이지 URL을 단축 후 복사 -->
<button data-fplink="copy">이 페이지 공유하기</button>
드롭다운 버튼 dropdown
클릭 시 단축 URL과 공유 옵션을 드롭다운 메뉴로 표시합니다.
<button data-fplink="dropdown"
data-url="https://example.com/product/123">단축 URL</button>
| 속성 | 필수 | 설명 |
|---|---|---|
| data-url | ✅ | 단축할 URL |
폼 자동 변환 form
폼 제출 시 지정한 URL 필드를 자동으로 단축 URL로 변환하여 제출합니다.
<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로 교체됩니다. 한번 단축된 링크는 캐싱되어 재요청 없이 재사용됩니다.
<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 단축 · 캠페인 생성 · 고급 입력 · 서비스 정보 메뉴가 표시됩니다.
<!-- 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 생성 · 캠페인 생성 · 서비스 정보 중 원하는 동작을 선택할 수 있습니다.
<div data-fplink="splitbutton"></div>
통계 조회 위젯 stats
단축 URL 전체(https://fpl.fingerpush.link/abc123) 또는 단축 코드(abc123)를 입력하면 총 클릭 수와 최근 7일 추이를 막대 차트로 표시합니다.
<div data-fplink="stats"></div>
JavaScript API
고급 사용자 전용 — 클릭하여 펼치기
FPLink.shorten(url)
URL을 단축하여 Promise로 반환합니다.
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을 생성합니다.
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 옵션으로 동시 요청 수를 제한할 수 있습니다.
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 위젯 버튼을 표시합니다.
// 기본 (우하단 플로팅)
FPLink.openWidget();
// 위치 변경 (좌하단)
FPLink.openWidget({ position: 'bottom-left' });
| 옵션 | 값 | 설명 |
|---|---|---|
| position | 'bottom-right' (기본) / 'bottom-left' | 버튼 표시 위치 |
FPLink.addMenu(key, label, fn)
드롭다운 버튼의 커스텀 공유 메뉴를 추가합니다. fn(shortUrl)이 호출됩니다.
// 카카오톡 공유 메뉴 추가
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에 주입합니다.
fetch('/api/me').then(r => r.json()).then(user => {
FPLink.setUser({
fpUserId: user.id,
email: user.email,
name: user.name
});
});
FPLink.getInfo()
현재 클라이언트의 플러그인 설정 정보를 조회합니다.
const info = await FPLink.getInfo();
console.log(info); // { clientId, siteName, status, ... }
콜백
// 단축 성공 콜백
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로 어디서든 수신할 수 있습니다.
// 단축 성공 이벤트
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:shortened | shortUrl, originalUrl, type | 단축 성공 시 발행 |
| fplink:error | message | 단축 실패 시 발행 |
사용 예제 모음
자주 사용되는 패턴별 예제입니다. 샘플 화면에서 UI를 확인하고 코드를 그대로 복사해 적용하세요.
TYPE 1 · 인라인 위젯 data-fplink="inline"
<div> 하나만 추가하면 URL 입력창 · 단축 버튼 · 결과 복사까지 자동으로 생성됩니다. 가장 빠르게 적용 가능한 방법입니다.
<!-- </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-placeholder | URL을 입력하세요 | 입력창 플레이스홀더 |
| data-label | 🔗 단축 URL | 버튼 라벨 |
| data-color | #0ea5e9 | 버튼 배경색 (HEX) |
TYPE 2 · 버튼 연결 data-fplink="shorten"
기존 <input>과 <button>에 HTML 속성만 추가하여 연결합니다. JS 코드 없이 기존 UI를 유지하면서 단축 기능을 붙일 수 있습니다.
<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-input | ✅ | URL을 읽어올 input 셀렉터 (예: #urlInput) |
| data-output | — | 결과를 표시할 input 셀렉터. 생략 시 클립보드에만 복사 |
TYPE 9 · 기본 캠페인 생성 FPLink.shortenCampaign()
URL + 캠페인명을 입력하면 UTM 파라미터가 자동으로 추가된 캠페인 단축 URL(/c/{alias})을 생성합니다. URL 쿼터가 아닌 캠페인 쿼터를 소비합니다.
<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>
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 | ✅ | 캠페인 이름 (콘솔에 표시) |
| utmSource | — | UTM Source (예: kakao, google) |
| utmMedium | — | UTM Medium (예: cpm, cpc, email) |
| utmContent | — | UTM Content (예: banner_top) |
TYPE 10 · 스플릿 버튼 드롭다운
URL 입력창과 스플릿 버튼을 결합한 패턴입니다. 좌측 버튼으로 현재 선택된 동작을 즉시 실행하고, 우측 ▾ 버튼으로 URL 생성 · 캠페인 생성 · 서비스 정보 중 원하는 동작을 선택할 수 있습니다.
<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>
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 통계가 기본으로 조회됩니다.
// 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, ... }
<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는 콘솔 > 캠페인 목록에서 확인할 수 있습니다.
// 두 번째 인자에 '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, ... }
<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 | 캠페인 | 설명 |
|---|---|---|---|---|
| totalClicks | number | ✅ | ✅ | 전체 기간 총 클릭 수 |
| dailyClicks | object | ✅ | ✅ | 날짜(YYYY-MM-DD) → 클릭 수 맵 (최근 7일) |
| originalUrl | string | ✅ | ✅ | 원본 URL |
| createdAt | string | ✅ | ✅ | 생성 일시 (ISO 8601) |
| shortCode | string | ✅ | — | 단축 코드 |
| title | string | ✅ | — | URL 제목 |
| alias | string | — | ✅ | 캠페인 별칭 |
| name | string | — | ✅ | 캠페인 이름 |
트러블슈팅
https://example.com:3000).
</body> 앞에 위치하는지 확인하세요.
또는 DOMContentLoaded 이벤트 이후에 FPLink API를 호출하세요.
data-client-id에 올바른 CLIENT ID가 입력되었는지 확인하세요.
콘솔 > 단축 URL 플러그인 메뉴에서 CLIENT ID를 확인할 수 있습니다.