Skip to content
SourceLoop
How attribution works

How SourceLoop classifies marketing channels

How SourceLoop classifies a visit as Paid Search, Organic, Paid Social, Email, Referral, or Direct, the signals it reads, and how to override them.

On this page
  1. The default channels
  2. The order SourceLoop reads signals
  3. How each signal is detected
  4. Paid click IDs
  5. UTM parameters
  6. Referring domain
  7. Direct fallback
  8. Custom channel rules
  9. How channel attribution propagates
  10. What’s next

A channel in SourceLoop is the highest-level marketing source bucket: Paid Search, Organic Search, Paid Social, Organic Social, Email, Referral, Direct, and a few others. Every visitor session, conversion, and dollar of revenue rolls up to a channel before it rolls up to anything more detailed (source, medium, campaign). Understanding how SourceLoop decides which channel a visit belongs to is the difference between trusting your dashboard and quietly second-guessing it.

This article covers the default channels, the signals SourceLoop reads, the order it reads them in, and where the common edge cases land.

The default channels

SourceLoop ships with a curated channel grouping that mostly mirrors Google Analytics 4’s standard channels, with a few additions and one philosophical difference (click IDs take priority over referrers, which narrows the Direct bucket).

ChannelWhat lands here
Paid SearchClicks on paid search ads, Google Ads, Microsoft Ads, Yahoo, DuckDuckGo. Detected by gclid, msclkid, gbraid, wbraid on the URL, or utm_medium=cpc / ppc / paidsearch
Organic SearchUnpaid clicks from search engines. Detected by referring domain (google.com, bing.com, duckduckgo.com, etc.) with no paid click ID present
Paid SocialClicks on paid ads on social platforms, Meta (Facebook + Instagram), LinkedIn, TikTok, Pinterest, Reddit, X. Detected by fbclid, li_fat_id, ttclid, epik, rdt_cid, or utm_medium=paidsocial / cpc + utm_source=facebook/linkedin/tiktok/etc.
Organic SocialUnpaid clicks from social platforms. Detected by referring domain (facebook.com, linkedin.com, twitter.com, reddit.com, youtube.com, etc.) without a paid click ID, or utm_medium=social
EmailDetected by utm_medium=email / newsletter or a referring domain from a webmail provider (gmail.com, outlook.com, yahoo.com mail)
ReferralDetected by any external referring domain that’s not a search engine, social platform, or email client. A blog post linking to you, a docs site, a community wiki, etc.
DisplayDetected by utm_medium=display / banner / cpm or a known display ad network
AffiliateDetected by utm_medium=affiliate / partner
SMSDetected by utm_medium=sms
PushDetected by utm_medium=push / notification
AudioDetected by utm_medium=audio / podcast
Paid ShoppingDetected by Google / Microsoft shopping ad click IDs or utm_medium=cpc + utm_source=google_shopping
Organic ShoppingDetected by utm_medium=organic_shopping or referrals from shopping comparison sites
DirectFallback. No referrer, no UTMs, no click IDs. Bookmarks, typed URLs, in-app browser opens, iOS apps that strip the referrer, etc.

The order SourceLoop reads signals

When a visitor lands on your site, SourceLoop walks through these signals in order. The first one that produces a confident answer wins:

  1. Paid click IDsgclid, msclkid, fbclid, li_fat_id, ttclid, epik, rdt_cid, gbraid, wbraid. These are the strongest signal. A gclid on the URL means Google Ads, full stop, even if the referrer is missing and the UTMs are absent.
  2. utm_medium + utm_source — explicit UTM tagging. utm_medium=cpc&utm_source=google → Paid Search.
  3. Referring domain — matched against a curated list of search engines, social platforms, email clients, shopping sites, and known referrers. referrer=google.com&no UTMs&no click ID → Organic Search.
  4. Direct fallback — when none of the above produce a hit. No referrer, no UTMs, no click IDs.

This order matters because it lets click IDs and explicit UTMs rescue traffic that would otherwise look Direct or Referral. For example: a visitor clicks a Google Ad on iOS Safari (which strips the referrer for privacy). Without click IDs, the visit would be Direct. With the gclid on the URL, SourceLoop confidently classifies it as Paid Search.

How each signal is detected

Click IDSet byChannel
gclidGoogle Ads (auto-tagging on)Paid Search (or Paid Shopping for product-listing ads)
gbraid, wbraidGoogle Ads (iOS, app campaigns)Paid Search
msclkidMicrosoft AdsPaid Search
fbclidMeta (Facebook + Instagram) adsPaid Social
li_fat_idLinkedIn adsPaid Social
ttclidTikTok adsPaid Social
epikPinterest adsPaid Social
rdt_cidReddit adsPaid Social

Click IDs are appended to the landing URL by the ad platform’s auto-tagging feature, which is on by default in most accounts. If you’ve turned it off, none of these click IDs will appear, falling back to UTM parameters or referrer matching.

See Click IDs explained for the full reference per platform.

UTM parameters

The standard five UTM parameters (utm_source, utm_medium, utm_campaign, utm_content, utm_term) feed channel classification through utm_medium plus utm_source. The medium typically determines the channel; the source determines the exact ad platform within it.

utm_medium valueChannel
cpc, ppc, paidsearchPaid Search
paidsocial, cpm + social platform sourcePaid Social
socialOrganic Social
email, newsletterEmail
display, banner, cpmDisplay
affiliate, partnerAffiliate
referralReferral
smsSMS
push, notificationPush
audio, podcastAudio
organicOrganic Search (when source matches a search engine)

See UTM best practices for tagging conventions that play well with this default mapping.

Referring domain

When no click ID and no UTMs are present, SourceLoop matches the document.referrer against a curated lookup table:

Referrer domain exampleChannel
google.com, bing.com, duckduckgo.com, yahoo.comOrganic Search
facebook.com, instagram.com, linkedin.com, twitter.com, x.com, tiktok.com, youtube.com, reddit.comOrganic Social
gmail.com, outlook.com, mail.yahoo.comEmail
pinterest.com (organic), pinterest.ca, pinterest.co.ukOrganic Social
Any other external domainReferral

The lookup table is curated by the SourceLoop team and updated as new search engines and social platforms appear.

Direct fallback

Direct catches everything the above three signals miss: bookmarks, typed URLs, <a rel="noreferrer"> clicks, iOS app webviews (Instagram, TikTok, Facebook, X in-app browsers all strip the referrer by default), enterprise VPN proxies that strip referrers, and ad blockers that strip query strings.

A high share of Direct traffic is one of the strongest signals that your paid campaigns aren’t tagged thoroughly enough, see the first FAQ for the common causes.

Custom channel rules

You can override the defaults with custom channel rules:

  • Promote a sourceutm_source=newsletter → custom “Newsletter” channel instead of generic Email
  • Split a channel — Paid Social → “Meta Ads”, “LinkedIn Ads”, “TikTok Ads” as separate channels
  • Bucket referrerspinterest.com referrals → custom “Pinterest” channel separate from Organic Social
  • Match by landing page — visits to /partners/... → “Partner Program” channel

Rules are evaluated before the defaults; first match wins. Set them at Setup -> Channel rules in your workspace (rollout in progress; if you don’t see it yet, contact [email protected] for early access).

How channel attribution propagates

Once a visit is classified into a channel, the value persists across:

  • Every conversion that visitor produces, form, meeting, chat, payment, both first-touch and last-touch
  • Every report that groups by channel (Traffic dashboard, Content dashboard, Funnels, Contacts Hub filters)
  • Every CRM contact created from the visitor, written into the channel field of HubSpot / Salesforce / Pipedrive
  • Every outgoing webhook that fires when the lead is captured or updated

A channel set on the first session sticks as the first-touch channel. A channel set on the converting session is the last-touch channel. These are independent and most leads end up with different values for each (e.g., first-touch: Paid Search; last-touch: Direct).

What’s next

Frequently asked questions

  1. Why does so much of my paid traffic show as Direct?

    Three usual reasons. (1) Your campaign URLs aren't tagged with UTM parameters and the click ID was stripped (iOS Safari with strict tracking prevention, browser extensions, or a redirect chain that drops query strings). (2) The visitor came back later through a bookmark / typing your URL after first seeing the ad. (3) The ad platform's auto-tagging is disabled and you haven't added manual UTMs. The fix is always to tag every paid link with UTM parameters in addition to relying on click IDs.

  2. What's the difference between Paid Search and Organic Search?

    Paid Search means the visitor clicked a paid ad on a search engine (Google Ads, Microsoft Ads, etc.), detected by a click ID (gclid, msclkid) on the landing URL or by `utm_medium=cpc`. Organic Search means the visitor clicked an unpaid result on the same search engines, detected by the referrer domain and the absence of any paid click ID. Both flow from the same engines but answer different marketing questions.

  3. I added utm_source=facebook and utm_medium=cpc but it still shows as Direct. Why?

    The UTMs are read on the landing session only. If the visitor came directly, then visited again later through a tagged link in a new session, the new session captures the UTMs but the first one stays Direct. If you mean a single landing session is still showing Direct, double-check the URL the visitor actually arrived on (some redirect chains drop query strings); open the page with `?sl_debug=1` to see what the tracker recorded.

  4. Can I create custom channels?

    Yes, custom channel rules let you override the defaults. For example, you can map `utm_source=newsletter` to a custom channel called "Email Marketing" instead of the default Email bucket, or split Paid Social into separate "Meta Ads" and "LinkedIn Ads" channels. See custom channel rules for the setup.

  5. Does SourceLoop's channel definition match Google Analytics 4's?

    Mostly yes, the defaults follow GA4's standard channel grouping (Paid Search, Organic Search, Paid Social, Organic Social, Email, Referral, Direct, Display, Affiliate, Audio, SMS, Push). The differences are (1) SourceLoop adds Paid Shopping and Organic Shopping for ecommerce, (2) SourceLoop uses click IDs as a stronger signal than referrers (a referrer-less click on a gclid still resolves to Paid Search), and (3) SourceLoop's Direct bucket is narrower because click IDs can rescue visits that GA4 would flag as Direct.

  6. How is the channel decision made, in what order?

    Click IDs first (highest confidence), then UTM parameters (utm_medium + utm_source), then the referring domain (matched against a curated list), then Direct as the fallback. The first signal that produces a confident classification wins; later signals don't override earlier ones in the same session.

  7. Why does my Reddit / Twitter / YouTube visit show as Referral instead of Organic Social?

    Because the referrer crossed into your site without a UTM tag or platform click ID. Without those signals, SourceLoop classifies by referrer domain, and Reddit / Twitter / YouTube referrals land in the broad Organic Social bucket by default. The fix is to tag any links you control (your own social posts, your channel description, your community bio) with `utm_medium=social` so the visit lands in Organic Social explicitly. Untagged shares from other people will continue to land as Organic Social automatically based on the referring domain.

Track every conversion to its true source

Capture and send full attribution data from every signup, lead, booking, and sale to your CRM and ad platforms, so you know exactly what's driving revenue.

Without SourceLoop

Untagged

Kayden Floyd

kayden@abc.com

  • SourceUnknown
  • MediumUnknown
  • CampaignUnknown
  • Landing pageUnknown
Journey
No touchpoints captured

With SourceLoop

Auto-tagged

Kayden Floyd

kayden@abc.com · Acme Co.

  • Channel Paid Social
  • CampaignFree_demo
  • Landing page/pricing
Journey
Synced to HubSpot Google Ads Meta