Skip to main content

Overview

Dub provides comprehensive analytics to help you understand how your links are performing. Track clicks, leads, sales, and conversions across multiple dimensions including geography, devices, browsers, referrers, and more.

Analytics Events

Dub tracks four types of events:

Clicks

Every time someone clicks on your short link. This is the default event type.

Leads

When a user completes a lead event (e.g., signs up, submits a form).

Sales

When a conversion results in a sale or purchase.

Conversions

When a lead converts to a customer or completes a desired action.

Viewing Analytics

Dashboard Analytics

1

Navigate to Analytics

Click “Analytics” in the sidebar to view your workspace analytics.
2

Select Time Range

Choose a time range from the presets (24h, 7d, 30d, 90d, all time) or set custom dates.
3

Apply Filters

Filter by links, domains, tags, folders, countries, devices, and more.
4

View Metrics

Analyze your data through charts, time series, and breakdowns by dimension.
View analytics for a specific link:
  1. Go to the Links page
  2. Click on any link to open the link editor
  3. Click the “Analytics” tab
  4. View detailed metrics for that specific link

Analytics Dimensions

Geographic Analytics

Breakdown clicks by location:
View analytics by 2-letter ISO 3166-1 country codes.
// API Example: Get clicks by country
const analytics = await fetch(
  '/api/analytics?event=clicks&groupBy=countries&interval=30d'
);

Device Analytics

Understand what devices your users are on:
// API Example: Get analytics by device type
const analytics = await fetch(
  '/api/analytics?event=clicks&groupBy=devices&interval=7d'
);

// Returns: Desktop, Mobile, Tablet
Device targeting allows you to redirect users to device-specific URLs based on this data.

Browser Analytics

Track which browsers your users prefer:
// API Example: Get analytics by browser
const analytics = await fetch(
  '/api/analytics?event=clicks&groupBy=browsers&interval=30d'
);

// Returns: Chrome, Firefox, Safari, Edge, etc.

Operating System

View breakdown by operating system:
// API Example: Get analytics by OS
const analytics = await fetch(
  '/api/analytics?event=clicks&groupBy=os&interval=30d'
);

// Returns: Windows, Mac, iOS, Android, Linux, etc.

Referrer Analytics

See where your traffic is coming from:
// Get top referring domains
const analytics = await fetch(
  '/api/analytics?event=clicks&groupBy=referers'
);

// Returns: google.com, twitter.com, facebook.com, etc.

UTM Analytics

Track campaign performance with UTM parameters:
// Example: Filter by UTM parameters
const analytics = await fetch(
  '/api/analytics?event=clicks&utm_source=twitter&utm_campaign=summer_sale'
);

// Group by UTM source
const bySource = await fetch(
  '/api/analytics?event=clicks&groupBy=utm_sources'
);

// Group by UTM medium
const byMedium = await fetch(
  '/api/analytics?event=clicks&groupBy=utm_mediums'
);

// Group by UTM campaign
const byCampaign = await fetch(
  '/api/analytics?event=clicks&groupBy=utm_campaigns'
);

Trigger Analytics

Understand how users are accessing your links:
// API Example: Get analytics by trigger type
const analytics = await fetch(
  '/api/analytics?event=clicks&groupBy=triggers'
);

// Returns breakdown by:
// - link: Direct link clicks
// - qr: QR code scans
// - pageview: Page views (for analytics dashboards)
QR code scans are automatically tracked when users scan QR codes generated by Dub.

Advanced Filtering

Filter by Multiple Values

Use comma-separated values to filter by multiple items:
// Example: Filter by multiple countries
const analytics = await fetch(
  '/api/analytics?event=clicks&country=US,GB,CA'
);

// Filter by multiple link IDs
const linkAnalytics = await fetch(
  '/api/analytics?event=clicks&linkId=link_123,link_456,link_789'
);

Exclusion Filters

Exclude specific values using the - prefix:
// Example: Exclude specific country
const analytics = await fetch(
  '/api/analytics?event=clicks&country=-US'
);

// Exclude multiple countries
const filtered = await fetch(
  '/api/analytics?event=clicks&country=-US,-GB,-CA'
);

// Exclude spam referrers
const cleanReferrers = await fetch(
  '/api/analytics?event=clicks&referer=-spam.com,-bot.net'
);
// Filter by domain
const domainAnalytics = await fetch(
  '/api/analytics?event=clicks&domain=dub.sh'
);

// Filter by tag
const tagAnalytics = await fetch(
  '/api/analytics?event=clicks&tagId=tag_123'
);

// Filter by folder
const folderAnalytics = await fetch(
  '/api/analytics?event=clicks&folderId=folder_456'
);

// Filter by external ID
const externalAnalytics = await fetch(
  '/api/analytics?event=clicks&externalId=ext_campaign_001'
);

// Filter by tenant ID (multi-tenancy)
const tenantAnalytics = await fetch(
  '/api/analytics?event=clicks&tenantId=tenant_acme'
);

Time Series Analytics

View analytics over time with different granularities:
// Example: Get daily time series for the last 30 days
const timeseries = await fetch(
  '/api/analytics?event=clicks&groupBy=timeseries&interval=30d'
);

// Custom date range with specific granularity
const custom = await fetch(
  '/api/analytics?' +
  'event=clicks&' +
  'groupBy=timeseries&' +
  'start=2024-01-01&' +
  'end=2024-01-31&' +
  'granularity=day&' +
  'timezone=America/New_York'
);
Supported granularities:
  • minute - Minute-by-minute data
  • hour - Hourly aggregation
  • day - Daily aggregation (default)
  • month - Monthly aggregation
Specify timezone using IANA time zone codes (e.g., America/New_York) to align data with your local time.
View your best-performing links:
// Example: Get top links by clicks
const topLinks = await fetch(
  '/api/analytics?event=clicks&groupBy=top_links&interval=30d'
);

// Get top destination URLs
const topUrls = await fetch(
  '/api/analytics?event=clicks&groupBy=top_urls&interval=30d'
);

// Get top folders
const topFolders = await fetch(
  '/api/analytics?event=clicks&groupBy=top_folders&interval=30d'
);

// Get top tags
const topTags = await fetch(
  '/api/analytics?event=clicks&groupBy=top_link_tags&interval=30d'
);

Sales Analytics

Track revenue and sales performance:
// Example: Get total sales and revenue
const sales = await fetch(
  '/api/analytics?event=sales&groupBy=count&interval=30d'
);

// Filter by sale type (new vs recurring)
const newSales = await fetch(
  '/api/analytics?event=sales&saleType=new&interval=30d'
);

const recurringSales = await fetch(
  '/api/analytics?event=sales&saleType=recurring&interval=30d'
);

// Get sales by partner (for affiliate programs)
const partnerSales = await fetch(
  '/api/analytics?event=sales&groupBy=partners&interval=30d'
);
Sales analytics require conversion tracking to be enabled on your links.

Customer Analytics

Analyze customer-level data:
// Example: Filter analytics by customer
const customerAnalytics = await fetch(
  '/api/analytics?event=sales&customerId=cus_123&interval=all'
);

// Get analytics for a specific customer across all links
const customerActivity = await fetch(
  '/api/analytics?event=clicks&customerId=cus_123'
);

Public Analytics

Share analytics publicly for specific links:
1

Enable Public Stats

Open the link editor and toggle “Public Stats” on.
2

Share Analytics URL

Share the public analytics URL: https://dub.co/stats/{domain}/{key}
3

View Public Dashboard

Anyone with the URL can view click analytics without authentication.
// API Example: Enable public stats
const link = await fetch('/api/links/link_123', {
  method: 'PATCH',
  body: JSON.stringify({ publicStats: true })
});
Public analytics only show click data. Revenue and conversion data remain private.

Exporting Analytics

Export your analytics data:
  1. Navigate to Analytics
  2. Apply desired filters
  3. Click “Export” in the top right
  4. Choose CSV or JSON format
  5. Download your data

Real-Time Analytics

Analytics are updated in real-time:
  • Click events are processed within seconds
  • Dashboard auto-refreshes every 30 seconds
  • API responses reflect the latest data
  • No delays or batch processing

Analytics Retention

Dub stores analytics data indefinitely:
  • All click events are retained forever
  • Historical data remains accessible
  • No data expiration based on plan
  • Query any time range from your founding date
The minimum start date for analytics is (Dub’s founding date).

API Reference

For detailed API documentation:

Best Practices

Use Appropriate Granularity

Choose time granularity based on your date range - use hours for short periods, days for weeks/months

Filter Strategically

Apply filters to focus on specific segments and avoid overwhelming data sets

Track UTM Consistently

Use consistent UTM naming conventions across campaigns for accurate tracking

Monitor Real-Time

Use real-time analytics to quickly identify and respond to traffic spikes or issues

Build docs developers (and LLMs) love