SilentChat

Visitor cohorts — which source converts?

Last updated: September 9, 2026

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_source from 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 that Google and google end up in the same cohort.
  • Referrer Domain: from the Referer header, without www. prefix and without port, lowercase. google.com and www.google.com are 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 newsletter with google
  • If newsletter converts 5× better: increase newsletter frequency, reallocate ad budget

Are mobile visitors converting worse?

  • Filter: Device → Compare mobile with desktop
  • 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.

Visitor cohorts — which source converts? — Help Center — SilentChat | SilentChat