Channels

Every anonymous visit and every first touch gets one channel: a coarse answer to “where did this come from?”. Vevee derives it on the server from three inputs: utm_source, utm_medium and the referrer host. A channel sent by your app is ignored, so the grouping is the same for every app.

There are seven channels:

ChannelMeaning
paidAds you pay for.
emailNewsletters and email clients.
aiAI assistants and AI search (ChatGPT, Perplexity, Gemini, Claude, Copilot).
organic_searchUnpaid search engine results.
socialSocial networks, unpaid.
referralAny other site, or tags that match no rule above.
directNo referrer and no tags.

The channel appears as the channel visit field (Traffic page, visit splits) and as the first_channel person property (person splits). See Cookieless traffic attribution and Funnel splits.

How the inputs are normalized

  • All three values are trimmed and lower-cased. Empty values count as missing.
  • The referrer host loses a port and any leading www., m., l. or lm., repeatedly. So m.facebook.com, l.facebook.com and www.facebook.com all read as facebook.com.
  • A utm_source matches a known site by its full name (chatgpt.com) or by the name without its last label (chatgpt, facebook). One-letter names such as x and t are not matched this way.

The rules, in order

The first rule that matches wins.

  • utm_medium is one of cpc, ppc, paid, paid_social, display, ads; or
  • the referrer host is googleadservices.com or doubleclick.net; or
  • utm_source is adwords or google_ads.

2. email

  • utm_medium is email; or
  • the referrer host is mail.google.com, outlook.live.com, outlook.office.com, mail.yahoo.com or mail.proton.me.

3. ai

  • The referrer host is chatgpt.com, chat.openai.com, perplexity.ai, gemini.google.com, claude.ai or copilot.microsoft.com; or
  • utm_source matches one of those sites (for example chatgpt.com or perplexity).
  • The referrer host is google with any country domain (google.com, google.it, google.co.uk), bing.com, duckduckgo.com, search.brave.com, com.google.android.googlequicksearchbox, or any yahoo or ecosia domain including subdomains (search.yahoo.com); or
  • utm_source is google, bing, duckduckgo, yahoo or ecosia, or matches one of the search hosts above.

5. social

  • utm_medium is social; or
  • the referrer host is facebook.com, instagram.com, t.co, x.com, twitter.com, tiktok.com, youtube.com, linkedin.com, lnkd.in, reddit.com, out.reddit.com, threads.net, or any pinterest domain; or
  • utm_source matches one of those sites (facebook, linkedin, reddit), or is one of the aliases fb, ig, instagram, an, msg, meta, tt, tiktok, pinterest.

6. referral

Anything left with a referrer host, a utm_source or a utm_medium. An unknown site, or tags that match none of the rules above.

7. direct

No referrer host and no UTM tags at all.

Examples

Landing URL tagsReferrer hostChannel
utm_source=facebook&utm_medium=paid_social(any)paid
utm_source=facebook(none)social
utm_source=facebook&utm_medium=paid-social(none)social (the hyphen is not a paid medium)
(none)l.instagram.comsocial
utm_source=chatgpt.com(none)ai
(none)www.google.co.ukorganic_search
utm_source=newsletter&utm_medium=email(none)email
(none)news.ycombinator.comreferral
utm_campaign=launch only(none)direct (campaign is not an input)
(none)(none)direct
!
Tag your ads with a paid medium. A paid campaign tagged only with utm_source=facebook is grouped as social. Add utm_medium=cpc, paid or paid_social (exactly, with an underscore) so it lands under paid. The campaign name itself stays available as utm_campaign on the Traffic page and in splits.

Where the channel is computed

  • Anonymous events on /api/v1-13/capture: from the visit fields carried in properties. See capture().
  • First touch: once, when identify() runs with isSignup: true. Stored as first_channel and never recomputed.