webtracking.org
concepts

Channel grouping: how traffic gets classified

How source, medium, campaign, and referrer collapse into marketing channels — the first-match waterfall behind GA4 and Adobe, and the structural reasons the two never agree.

last verified 2026-07-11

“How much traffic came from paid social?” sounds like a data question. It is actually a classification question: raw acquisition data arrives as a messy triple of source, medium, and campaign (plus a referrer and sometimes a click ID), and a rule set collapses that mess into a short list of channels. The rule set — not the traffic — is what your channel report shows. This guide explains the inputs, the first-match waterfall that every major tool uses, and the structural reasons GA4 and Adobe will classify the same visit differently.

The inputs

For each session (or touch), the classifier sees some subset of:

  • utm_source / utm_medium / utm_campaign — declared by whoever built the link. The highest-quality signal when governed, the biggest source of garbage when not (the Campaign URL Standard exists to govern it).
  • Referrer — the page the browser says the user came from. Used to infer organic search and referral traffic when no UTMs are present; increasingly coarse, since most sites send origin-only referrers cross-site by policy.
  • Click IDsgclid and its relatives from auto-tagging. In GA4, Google Ads traffic with a gclid is classified from the linked Ads account’s campaign metadata even with no UTMs on the URL.
  • Nothing — no referrer, no parameters. This becomes direct, which is best read as “unknown,” not “typed the URL”: untagged email and dark social (messaging apps, native mobile shares) all land here.

The waterfall: first match wins

Every mainstream implementation is a prioritized rule list evaluated top-down; the first rule that matches assigns the channel and evaluation stops. Order is load-bearing. A click from Google Ads has a search-engine source and a paid medium — so Paid Search must be tested before Organic Search, or the paid rule never fires:

1. Direct         : source = "(direct)" AND medium ∈ {"(none)","(not set)"}
2. Paid Search    : source ∈ SEARCH_SET AND medium matches /^(.*cp.*|ppc|retargeting|paid.*)$/
3. Paid Social    : source ∈ SOCIAL_SET AND medium matches the same paid pattern
4. Display        : medium ∈ {"display","banner","interstitial","cpm"}
5. Organic Social : source ∈ SOCIAL_SET OR medium ∈ {"social","social-media",…}
6. Organic Search : source ∈ SEARCH_SET OR medium = "organic"
7. Email          : source = "email" OR medium ∈ {"email","newsletter",…}
8. Referral       : medium ∈ {"referral","app","link"}
9. (Unassigned)   : nothing matched

(Condensed — the full ordered rule set, including shopping, video, affiliate, SMS, and push rules, is maintained in the Channel Classification Standard.)

Two properties of the waterfall matter more than any individual rule:

  • SEARCH_SET, SOCIAL_SET, and friends are maintained lists, not logic. Whether reddit.com is social, whether a regional search engine counts as search — these are editorial decisions embedded in a lookup table, and different vendors maintain different tables.
  • (Unassigned) is a feature. A classifier that guesses hides bad tagging; one that emits (Unassigned) surfaces exactly the links your UTM governance failed to reach. Rising Unassigned is a tagging-discipline alarm, not a classifier bug.

How GA4 does it

GA4 ships a read-only default channel group implementing Google’s version of the waterfall over its own source categories, evaluated at query time — the stored data is the raw source/medium/campaign, and channels are computed when a report runs. Consequences:

  • You cannot edit the default group; you create custom channel groups, and because evaluation is query-time, a custom group applies to historical data too — reclassification is retroactive.
  • Session-scoped and event-scoped channel dimensions can differ for the same session, because the session takes its attribution from the session’s first traffic source.
  • Google Ads auto-tagging can classify traffic using campaign metadata your URLs never carried — invisible input if you only audit URLs.

How Adobe does it

Adobe Analytics has no built-in channel-group primitive. Teams implement the waterfall as Marketing Channel processing rules — an ordered, first-match rule stack configured per report suite — or as classifications on the tracking-code eVar. The decisive difference from GA4: as of mid-2026, Marketing Channel processing rules are applied at collection/processing time. The channel is stamped onto the hit as it arrives, which means:

  • Rule changes affect data going forward only. History keeps the channels assigned by the old rules; there is no retroactive reclassification in the base report suite.
  • Channel persistence is a separate concept — Adobe’s first-/last-touch channel dimensions follow their own expiration settings, entangling channel classification with attribution in a way GA4 keeps separate.
  • Two Adobe report suites (or an Adobe-versus-CJA comparison, where data views reclassify at query time) can legitimately disagree with each other.

Why GA4 and Adobe disagree

When the two tools sit on the same site, channel-level gaps are structural, not bugs:

  1. Evaluation time — query-time (GA4) versus processing-time (Adobe) means rule edits diverge the history immediately.
  2. Different rule text and order — unless someone deliberately mirrored one waterfall into the other, the regexes, orderings, and default groups differ.
  3. Different source lists — Google’s source categories versus Adobe’s hand-maintained rule conditions classify the long tail of sources differently.
  4. Auto-tagging asymmetrygclid-based enrichment flows into GA4 natively; Adobe sees only what the URL and your processing rules capture.
  5. Different attribution scope — GA4 assigns a session’s channel from its first traffic source under its sessionization rules; Adobe’s visit and channel-expiration settings draw the boundaries elsewhere.
  6. Direct handling — both treat direct as a fallback, but “last non-direct” lookbacks and channel-persistence windows differ by default.

The fix: classify once, downstream of everyone

The durable solution is to stop letting each tool be its own authority. Encode one waterfall — the Channel Classification Standard is a portable, forkable starting point — as a dbt/SQL macro in the warehouse, expose it as a single channel column, and point BI at that column. Then mirror the same rules, as closely as each tool allows, into a GA4 custom channel group and Adobe’s processing rules, and document the residual differences you cannot remove (auto-tagging enrichment, evaluation timing). Reconciliation stops being a monthly argument and becomes a documented, bounded delta.

Channel grouping is unglamorous plumbing, but it sits directly upstream of budget conversations: every attribution model distributes credit across channels as classified. If classification is inconsistent, attribution inherits the inconsistency — and no model, however sophisticated, can repair it.