Analytics
Track signups, traffic, referrals, and UTM sources over time.
Traffic Analytics
Get daily breakdowns of views, signups, and referrals for any time range.
API: GET /waitlists/{waitlist_id}/analytics
| Parameter | Type | Default | Description |
|---|---|---|---|
range |
string | 30d |
Time range: 7d, 30d, or 90d |
The range parameter controls how many days of data to return. It queries daily analytics records going back from today by the specified number of days: 7 days, 30 days, or 90 days.
Response:
{
"waitlist_id": "a1b2c3d4",
"range": "30d",
"views_by_day": {
"2025-03-01": 150,
"2025-03-02": 220,
"2025-03-03": 180
},
"signups_by_day": {
"2025-03-01": 32,
"2025-03-02": 45,
"2025-03-03": 38
},
"referral_signups_by_day": {
"2025-03-01": 8,
"2025-03-02": 12,
"2025-03-03": 10
},
"conversion_rate_by_day": {
"2025-03-01": 21.3,
"2025-03-02": 20.5,
"2025-03-03": 21.1
},
"top_referrers": [
{
"email": "jane@example.com",
"first_name": "Jane",
"referral_count": 24
}
]
}
Tracked Metrics
Each day’s data is stored as a single record. Each record tracks three counters:
| Field | Description |
|---|---|
signups |
Number of new signups created that day |
referral_signups |
Number of signups that came through a referral link that day |
views |
Number of times the signup form was loaded that day (counted via config endpoint hits) |
These daily records are what the analytics endpoint queries and aggregates into the response.
Response Fields
| Metric | Description |
|---|---|
| views_by_day | Daily view counts — each time a signup form loads (via the /public/waitlists/{id}/config endpoint), the view counter for that day is incremented |
| signups_by_day | Daily signup counts — incremented each time a new signup is created |
| referral_signups_by_day | Daily referral signup counts — incremented when a signup comes through a referral link |
| conversion_rate_by_day | Calculated as (signups / views) * 100, rounded to 1 decimal place. If views is 0 for a given day, the conversion rate is 0 |
| top_referrers | An array of the top 10 referrers for this waitlist, each with email, first_name, and referral_count, sorted by highest referral count. Only visible to authenticated waitlist owners |
UTM Analytics
See where your signups are coming from with UTM breakdowns.
API: GET /waitlists/{waitlist_id}/analytics/utm
Response:
{
"waitlist_id": "a1b2c3d4",
"by_source": [
{ "value": "twitter", "count": 245 },
{ "value": "producthunt", "count": 180 },
{ "value": "google", "count": 95 }
],
"by_medium": [
{ "value": "social", "count": 320 },
{ "value": "email", "count": 150 },
{ "value": "cpc", "count": 50 }
],
"by_campaign": [
{ "value": "launch-week", "count": 400 },
{ "value": "beta-invite", "count": 120 }
]
}
Each breakdown is sorted by count (highest first).
How UTM Data Is Stored
UTM data is stored in separate counter records. Each unique UTM value gets its own record:
| Counter Type | Description |
|---|---|
utm_source |
Counter for each unique utm_source value (e.g. twitter) |
utm_medium |
Counter for each unique utm_medium value (e.g. social) |
utm_campaign |
Counter for each unique utm_campaign value (e.g. launch-week) |
Each counter is atomically incremented on every signup that includes that UTM parameter value. These are the counters that the UTM analytics endpoint queries and returns.
utm_source, utm_medium, and utm_campaign are aggregated into counters and included in the UTM analytics endpoint. The utm_term and utm_content parameters are stored with each individual signup record but are NOT aggregated into counters. You can still see utm_term and utm_content values per-signup via the list signups endpoint.
UTM Parameters
The following UTM parameters are tracked automatically when included in the signup URL:
| Parameter | Purpose | Example |
|---|---|---|
utm_source |
Where the traffic comes from | twitter, newsletter, google |
utm_medium |
Marketing medium | social, email, cpc |
utm_campaign |
Campaign name | launch-week, beta-invite |
utm_term |
Paid search keywords | waitlist software |
utm_content |
Ad variation | hero-cta, sidebar-banner |
How Data Is Collected
Analytics data is collected automatically in the background during normal operations. No manual setup is needed — data collection works for all tiers from the moment your waitlist is created.
- Views are tracked every time the config endpoint (
/public/waitlists/{id}/config) is hit. This happens whenever a signup form loads on your page or in an embed widget. - Signups and referral signups are tracked during signup creation on the public signup endpoint. If the signup came through a referral link, both the
signupsandreferral_signupscounters are incremented; otherwise onlysignupsis incremented. - UTM counters are also updated during signup creation. For each signup that includes
utm_source,utm_medium, orutm_campaignvalues, the corresponding counter is atomically incremented.
All of this collection happens on public endpoints (no authentication required) and runs for all subscription tiers. The analytics view endpoints that let you query and read the data require a Pro plan.
Related
- Managing Signups — view per-signup UTM data and export to CSV
- Referral System — how referral tracking and leaderboards work