Dub.co: Link Shortener Dành Cho Developer — Tracking, Analytics và Tích Hợp API
Dub.co không chỉ là rút gọn link — đây là một platform analytics mạnh mẽ với API-first design, open source, và tích hợp hoàn hảo vào Next.js app của bạn.
Tại Sao Developer Cần Một Link Shortener "Xịn"?
Bit.ly và TinyURL thì ai cũng biết, nhưng khi bạn build product — affiliate program, referral system, UTM tracking cho marketing — bạn cần nhiều hơn một cái "rút gọn link" đơn thuần. Bạn cần analytics chi tiết, custom domains, và quan trọng nhất là API để tích hợp vào code.
Đó là lý do Dub.co trở thành công cụ yêu thích của nhiều dev. Dub là open-source, API-first, và được build bởi Steven Tey (cựu Vercel engineer) — người cũng đã tạo ra nhiều OSS tools nổi tiếng khác trong hệ sinh thái Next.js.
Dub.co Có Gì Đặc Biệt?
- Custom domains: Dùng domain của riêng bạn (e.g.,
go.yourbrand.com/promo) - Analytics realtime: Click, country, device, browser, referer — tất cả trong một dashboard
- API-first: REST API + TypeScript SDK để tạo/quản lý link từ code
- Open source: Self-host nếu muốn toàn quyền kiểm soát
- QR codes: Tự động generate QR cho mỗi link
- UTM builder: Tự động append UTM params
Tích Hợp Dub.co Vào Next.js — Thực Chiến
Giả sử bạn đang build một affiliate dashboard và muốn tự động tạo short link cho mỗi affiliate khi họ sign up. Dưới đây là cách làm với Dub TypeScript SDK:
Cài Đặt SDK
npm install dub
# hoặc
pnpm add dub
Tạo Short Link Tự Động Khi User Sign Up
// lib/dub.ts
import { Dub } from 'dub';
export const dub = new Dub({
token: process.env.DUB_API_KEY!,
});
export async function createAffiliateLink(
userId: string,
targetUrl: string
): Promise {
const link = await dub.links.create({
url: targetUrl,
domain: 'go.yoursite.com',
key: `ref-${userId}`,
utm: {
source: 'affiliate',
medium: 'referral',
campaign: userId,
},
// Tag để filter trong analytics
tagIds: ['affiliate-links'],
});
return link.shortLink;
}
Lấy Analytics Cho Một Link
// app/api/affiliate/stats/route.ts
import { dub } from '@/lib/dub';
import { auth } from '@/lib/auth';
export async function GET(req: Request) {
const session = await auth();
if (!session) return new Response('Unauthorized', { status: 401 });
const { searchParams } = new URL(req.url);
const linkId = searchParams.get('linkId')!;
const [clicks, countries] = await Promise.all([
dub.analytics.retrieve({
linkId,
event: 'clicks',
interval: '30d',
}),
dub.analytics.retrieve({
linkId,
event: 'clicks',
groupBy: 'country',
interval: '30d',
}),
]);
return Response.json({ clicks, countries });
}
Use Case Thực Tế: Tracking Link Cho Newsletter
Nhiều dev viết newsletter và muốn biết link nào được click nhiều nhất trong email. Thay vì dùng Mailchimp tracking (thường bị block bởi email clients), bạn có thể dùng Dub để wrap mọi link trong email:
// scripts/wrap-newsletter-links.ts
import { dub } from './lib/dub';
const newsletterLinks = [
{ name: 'nextjs-blog', url: 'https://nextfuture.io.vn/blog/post-1' },
{ name: 'github-demo', url: 'https://github.com/user/demo' },
];
async function wrapLinks() {
for (const item of newsletterLinks) {
const link = await dub.links.create({
url: item.url,
key: `nl-${Date.now()}-${item.name}`,
utm: { source: 'newsletter', medium: 'email' },
});
console.log(`${item.name}: ${link.shortLink}`);
}
}
wrapLinks();
Pricing và Khi Nào Nên Dùng Dub.co
Free tier của Dub cho phép 1,000 links và 25,000 tracked clicks/tháng — đủ để bạn bắt đầu. Pro plan từ $24/tháng với unlimited links và custom domains.
Khi nào nên chọn Dub thay vì tự build? Khi bạn cần analytics ngay lập tức, không muốn maintain infrastructure, và cần TypeScript SDK xịn. Tự build một link shortener với analytics đầy đủ dễ mất 2-3 tuần dev time.
Với developer building product, Dub.co là một trong những tools tiết kiệm thời gian nhất mà bạn sẽ dùng. API sạch, docs rõ ràng, và được maintain bởi người trong hệ sinh thái Next.js — nên tích hợp rất mượt.
Admin
Dub.co
Short links & analytics for developers — track clicks, create branded links, manage affiliate URLs with ease.
Comments (0)
Sign in to comment
No comments yet. Be the first to comment!