# 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.

Source: https://sourceloop.ai/help/channel-definitions/
Updated: 2026-05-29

---

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).

| Channel | What lands here |
|---|---|
| **Paid Search** | Clicks 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 Search** | Unpaid clicks from search engines. Detected by referring domain (google.com, bing.com, duckduckgo.com, etc.) with no paid click ID present |
| **Paid Social** | Clicks 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 Social** | Unpaid 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` |
| **Email** | Detected by `utm_medium=email / newsletter` or a referring domain from a webmail provider (gmail.com, outlook.com, yahoo.com mail) |
| **Referral** | Detected 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. |
| **Display** | Detected by `utm_medium=display / banner / cpm` or a known display ad network |
| **Affiliate** | Detected by `utm_medium=affiliate / partner` |
| **SMS** | Detected by `utm_medium=sms` |
| **Push** | Detected by `utm_medium=push / notification` |
| **Audio** | Detected by `utm_medium=audio / podcast` |
| **Paid Shopping** | Detected by Google / Microsoft shopping ad click IDs or `utm_medium=cpc + utm_source=google_shopping` |
| **Organic Shopping** | Detected by `utm_medium=organic_shopping` or referrals from shopping comparison sites |
| **Direct** | Fallback. 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 IDs** — `gclid`, `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

### Paid click IDs

| Click ID | Set by | Channel |
|---|---|---|
| `gclid` | Google Ads (auto-tagging on) | Paid Search (or Paid Shopping for product-listing ads) |
| `gbraid`, `wbraid` | Google Ads (iOS, app campaigns) | Paid Search |
| `msclkid` | Microsoft Ads | Paid Search |
| `fbclid` | Meta (Facebook + Instagram) ads | Paid Social |
| `li_fat_id` | LinkedIn ads | Paid Social |
| `ttclid` | TikTok ads | Paid Social |
| `epik` | Pinterest ads | Paid Social |
| `rdt_cid` | Reddit ads | Paid 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](/help/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` value | Channel |
|---|---|
| `cpc`, `ppc`, `paidsearch` | Paid Search |
| `paidsocial`, `cpm + social platform source` | Paid Social |
| `social` | Organic Social |
| `email`, `newsletter` | Email |
| `display`, `banner`, `cpm` | Display |
| `affiliate`, `partner` | Affiliate |
| `referral` | Referral |
| `sms` | SMS |
| `push`, `notification` | Push |
| `audio`, `podcast` | Audio |
| `organic` | Organic Search (when source matches a search engine) |

See [UTM best practices](/help/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 example | Channel |
|---|---|
| google.com, bing.com, duckduckgo.com, yahoo.com | Organic Search |
| facebook.com, instagram.com, linkedin.com, twitter.com, x.com, tiktok.com, youtube.com, reddit.com | Organic Social |
| gmail.com, outlook.com, mail.yahoo.com | Email |
| pinterest.com (organic), pinterest.ca, pinterest.co.uk | Organic Social |
| Any other external domain | Referral |

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 source** — `utm_source=newsletter` → custom "Newsletter" channel instead of generic Email
- **Split a channel** — Paid Social → "Meta Ads", "LinkedIn Ads", "TikTok Ads" as separate channels
- **Bucket referrers** — `pinterest.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 hello@sourceloop.ai 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

- **Understand the click IDs that drive paid-channel detection:** [Click IDs explained](/help/click-ids-explained/).
- **Tag your campaigns so they classify correctly:** [UTM best practices](/help/utm-best-practices/).
- **Diagnose why a specific visit shows up as Direct:** [Why is my source showing as Direct?]() (companion troubleshooting article).
- **See the channels in action on the dashboard:** [Traffic dashboard](/help/traffic-dashboard/).

## Frequently Asked Questions

### 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.

### 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.

### 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.

### 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.

### 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.

### 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.

### 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.
