Visitor cohorts — which source converts?
The funnel from Plan #168 tells you how many visitors convert. Plan #169 tells you which visitors convert — and thus where you should best invest your marketing budget.
How to find it
Analytics → Funnel — above the normal funnel you see a line "Split by:" with four buttons:
- Off — the unfiltered funnel from #168 (default)
- UTM Source — cohorts by
utm_sourcefrom the landing URL (google, facebook, newsletter, …) - Referrer Domain — cohorts by the domain that sent the visitor (linkedin.com, hubspot.com, …)
- Device — Desktop / Mobile / Tablet
What counts as a cohort?
The cohort attributes are set once at the first widget load — when creating the visitor session.
- UTM: extracted from the query parameters of the landing URL (
?utm_source=google&utm_medium=cpc). Lowercase + truncated to 64 characters, so thatGoogleandgoogleend up in the same cohort. - Referrer Domain: from the
Refererheader, withoutwww.prefix and without port, lowercase.google.comandwww.google.comare aggregated together. - Device: from the user agent detection, normalized to the closed set
{desktop, mobile, tablet, other}.
Sessions without an attribute (entered directly, no UTM tag) end up in the cohort "(none)" — this is shown in the table but ignored in the top insights.
First-Touch Attribution
A visitor can have multiple sessions over time — today via Google, tomorrow directly. For conversions + leads, we attribute to the most recent session ≤ conversion time. This way, every marketing source gets credit for the touch that led to the lead — not the last direct session before that.
Top Insights
Up to two cards appear above the table:
- Best Conversion Rate: which cohort is currently converting best (leads ÷ pageviews).
- Biggest Gap: the best/worst difference with multiplier. Example: "google converts 12.3× better than organic — maybe time to reallocate your budget?"
Sample Gate: Insights only appear when at least two cohorts each have 50 pageviews and at least one lead. Below this threshold, the card remains empty — we'd rather show nothing than inflate the first three sessions into a headline claim.
Multiplier capped at 100×. If worst has exactly 0 leads, we omit the multiplier and write qualitatively ("significantly better") instead of nonsensically ("∞×").
GDPR
UTM, referrer domain, and device are not personal data — they describe the source and the device, not an identity. The data is deleted with the normal visitor session retention rules (see Data Retention Settings). No separate consent required, no new cookie.
Practical Examples
Is your newsletter performing better than ads?
- Filter: UTM Source → Compare
newsletterwithgoogle - If newsletter converts 5× better: increase newsletter frequency, reallocate ad budget
Are mobile visitors converting worse?
- Filter: Device → Compare
mobilewithdesktop - If mobile converts 50% worse: check widget mobile layout, simplify pre-chat form
Is LinkedIn traffic gold?
- Filter: Referrer Domain → Look at
linkedin.com - High conversion + low volume → plan LinkedIn ads test
API Reference
GET /api/v1/analytics/cohort/dims
GET /api/v1/analytics/cohort/funnel?cohort=utm_source&from=<iso>&to=<iso>
Response:
{
"funnel": {
"dimension": "utm_source",
"from": "2026-04-21T00:00:00Z",
"to": "2026-05-21T00:00:00Z",
"cohorts": [
{ "label": "google", "pageviews": 1200, "opens": 280, "messages": 80, "leads": 12, "conversion_rate": 0.01 },
{ "label": "facebook", "pageviews": 900, "opens": 110, "messages": 35, "leads": 3, "conversion_rate": 0.0033 },
{ "label": "(none)", "pageviews": 6300, "opens": 720, "messages":190, "leads": 18, "conversion_rate": 0.0029 }
],
"highlights": [
{ "kind": "best_performer", "label": "google" },
{ "kind": "biggest_gap", "label": "google", "compare_to": "facebook", "multiplier": 3.1 }
]
}
}
Date range is the same as the base funnel: maximum 1 year, default 30 days. Unknown cohort= values are rejected with ERR_INVALID_COHORT.