# GA4 channel rules for manually tagged traffic

Checked on 2026-10-17 against Google's default channel group page (https://support.google.com/analytics/answer/9756891). Google says the definitions are not case-sensitive and cannot be edited. Re-read the live page before stating a rule; Google reviews the source lists and channels over time (the AI Assistant channel arrived on 13 May 2026, the Source Group dimension on 11 June 2026).

## The rules that decide manual traffic

Paraphrased from the live page. "Paid pattern" means the medium matches this regex:

```text
^(.*cp.*|ppc|retargeting|paid.*)$
```

- Direct: source exactly `(direct)` and medium `(not set)` or `(none)`.
- Cross-network: campaign name contains `cross-network`.
- Paid Shopping: source on the shopping list, or campaign name matches `^(.*(([^a-df-z]|^)shop|shopping).*)$`, with the paid pattern.
- Paid Search: source on the search list, with the paid pattern.
- Paid Social: source on the social list, with the paid pattern.
- Paid Video: source on the video list, with the paid pattern.
- Display: medium is one of `display`, `banner`, `expandable`, `interstitial`, `cpm`.
- Paid Other: the paid pattern.
- Organic Shopping: source on the shopping list, or the shopping campaign regex above.
- Organic Social: source on the social list, or medium one of `social`, `social-network`, `social-media`, `sm`, `social network`, `social media`.
- Organic Video: source on the video list, or medium matches `^(.*video.*)$`.
- Organic Search: source on the search list, or medium exactly `organic`.
- AI Assistant: medium exactly `ai-assistant`, or a referrer on Google's assistant list, in which case GA4 sets the medium to `ai-assistant` and the campaign to `(ai-assistant)`. Google does not publish the full assistant list.
- Referral: medium one of `referral`, `app`, `link`.
- Email: source or medium `= email|e-mail|e_mail|e mail`.
- Affiliates: medium `= affiliate`.
- Audio: medium `audio`.
- SMS: source or medium `sms`.
- Mobile Push Notifications: medium ends with `push`, or contains `mobile` or `notification`, or source is `firebase`.
- Unassigned: the page says only that it applies when no other channel rule matches.

The Email and Affiliates rules are written with `=` and pipes. The page does not say whether that is an exact list or an unanchored regex, so test any value that only contains `email` (`email_digest`), and do not use `affiliates`.

## Google Ads and other Google platforms

- Auto-tagged Google Ads traffic is classified from platform data, not from UTMs. Checked on 2026-10-17: campaign type Search, Hotel or Travel is Paid Search; Display is Display; Video is Paid Video; Shopping is Paid Shopping; Performance Max, Demand Gen, App, Smart and Local are Cross-network. The page says ad network type decides most traffic and that GBRAID traffic is evaluated by campaign type.
- When both tagging methods are present, GA4 uses the auto-tagged values for source, medium and the other classification dimensions; only manual ad content and manual term take the UTM values (https://support.google.com/analytics/answer/11242870).
- When the GCLID or DCLID cannot be used as intended and any UTM is on the URL, GA4 derives every cross-channel traffic source value from the UTMs alone. A full `google / cpc` set then puts those clicks in Paid Search whatever the campaign type. A partial set produces `(not set)` values.
- DV360, CM360 and SA360 follow the same pattern; read the live page for their rules.

## What the page does not say

- It does not document the order in which rules are evaluated or which rule wins when two match.
- The source lists. The rules describe them as regex lists of sites and link a downloadable spreadsheet ("GA4 default-channel-group sources and categories"). The file served on 2026-10-17 was last modified in February 2023 and holds four categories: search, social, shopping and video. The live classifier may differ from it.
- Sources found in that file on 2026-10-17: social includes `facebook`, `fb`, `facebook.com`, `m.facebook.com`, `l.facebook.com`, `instagram`, `ig`, `instagram.com`, `l.instagram.com`, `linkedin`, `linkedin.com`, `lnkd.in`, `messenger`, `whatsapp`, `pinterest`, `reddit`, `snapchat`, `tiktok`, `twitter`, `t.co`, `quora`; search includes `google`, `bing`, `duckduckgo`; video includes `youtube`, `youtube.com`. Not found: `li`, `meta`, `msg`, `an`, `x`, `x.com`, `threads`, `chatgpt`, `chatgpt.com`, `perplexity`. Predictions for sources not in the file are predictions from the 2023 file; confirm each with a test visit.

## How to predict a pair

1. Google Ads, DV360, CM360 or SA360 with auto-tagging: platform data decides while the click ID is usable. If the links also carry manual UTMs, record the fallback channel those UTMs produce as well.
2. List every rule the pair satisfies: the source lists (search, social, video, shopping), the paid pattern, each medium rule (display mediums, `email`, `sms`, `audio`, `affiliate`, `referral` mediums, `ai-assistant`, push rules, `organic`, social mediums, the `video` regex), the source rules for `email`, `sms` and `firebase`, and the campaign name rules (`cross-network`, the shopping regex).
3. A source on a list with a paid-pattern medium and no other medium rule: the matching paid channel (Paid Search, Paid Social, Paid Video, Paid Shopping). This is the case those rules exist for.
4. A paid-pattern medium with a source on no list and no other medium rule: Paid Other.
5. Every satisfied rule points to the same channel (`linkedin / social`): that channel.
6. The satisfied rules point to two or more channels (`linkedin / email`, `youtube / referral`, `facebook / affiliate`, `cpm` with any source, `paid_video` with a source off the video list, a campaign named `cross-network` on a social pair): record `test required` and no channel. Change a value so only one channel's rules match. If no value can change, run one controlled test visit before launch and store the observed channel in `allowed-pairs.csv` `test_result`.
7. Nothing matched: Unassigned.
8. Record the result in `allowed-pairs.csv` and the registry's `expected_channel`, then prove it with one test visit per new pair.

## Traps found in practice

- Paid traffic reading as organic. `linkedin / social`, `facebook / social_paid`, `instagram / sponsored` and `facebook / boost` all land in Organic Social because the source is on the social list and the medium does not match the paid pattern. LinkedIn's own Marketing API sample sets `utm_medium` to `social`; do not copy it for paid campaigns.
- Short codes. `li / paid_social` and `meta / cpc` are predicted Paid Other from the 2023 file because the source is not on the social list; confirm with a test visit. Google's own Meta connector page uses `Meta` and `paid` as an illustration; check how that pair classifies before copying it.
- Accidental paid. Any medium containing `cp` is paid: `cpa`, `cpl`, `ecpm`, `cpv`. Fine when intended, surprising when someone uses `cpa` for an affiliate.
- Accidental push or video. `mobile_banner`, `app_notification` and `in_app_push` match the Mobile Push rule; `video_ad` without the paid pattern matches Organic Video.
- Mediums that fall to Unassigned when the source is on none of Google's lists: `newsletter`, `e_newsletter`, `partner`, `partnership`, `qr`, `print`, `event`, `offline`, `ai`, `ai_assistant`, `chatgpt`, `influencer`, `podcast`. `affiliates` is untested and may join them.
- Campaign names. `2026_11_shop_relaunch` or `eshop_promo` can trigger the shopping rules. Keep `shop` out of non-shopping campaign names, or test the pair.
- Email or SMS by source. A source of `email` or `sms` satisfies those rules whatever the medium says. Do not use them as sources; use the publication or program.

## Source platform and source group

- The Source platform dimension is derived by GA4 from source and medium (https://support.google.com/analytics/answer/17041930). Paid media for this purpose: anything containing `cp`, exactly `ppc` or `retargeting`, starting with `paid`, or exactly `display` or `appremarketing`. Non-paid traffic is `Unlabeled`. Paid sources map to labels such as `Meta Ads` (facebook, meta, fb, messenger, instagram, ig, whatsapp), `LinkedIn Ads`, `Microsoft Advertising` (bing, microsoft), `TikTok Ads`, `Reddit Ads`, `Pinterest Ads`; `gemini`, `openai` and `perplexity` map to `Other Ads`.
- Your `utm_source_platform` value appears in Session manual source platform (`sessionManualSourcePlatform` in the Data API, `manual_source_platform` in the BigQuery export). The Data API notes that `Manual` in Session source platform may change to `(not set)` for UTM traffic.
- Note the mismatch: `meta / paid_social` gets Source platform `Meta Ads` but is predicted Paid Other in the default channel group. Use `facebook`.
- The Source Group field (11 June 2026) consolidates source variants such as Facebook and Instagram spellings, and Source platform was aligned to it. Check where it appears in the property before relying on it, and do not assume it changes the default channel rules.

## Custom channel groups

Use one when GA4 has no rule for a channel you run (offline and QR), or to reclassify history from values that clearly identify the channel. Never use one to hide missing source data.

- Limits checked on 2026-10-17 (https://support.google.com/analytics/answer/13051316): 2 custom groups on a standard property, 5 on 360, up to 50 channels each.
- Path: Admin, Data display, Channel groups, then Create new channel group (or copy the default). Needs Editor or above on the property.
- Traffic goes to the first channel it matches, so order matters. Put narrow channels such as Offline first, before any rule on the social or search source lists can catch them.
- Conditions can use campaign ID, campaign name, default channel group, manual ad content, medium, source and source platform.
- A custom group applies to past data in reports. Setting a custom group as the primary channel group changes the primary dimension from that point forward only.
- Keep the default group available for comparison, keep an explicit unknown bucket, and log the group's purpose and rule order in `decisions.md`.

Offline channel example for a custom group:

```text
Channel name: Offline
Condition: Medium exactly matches offline
Position: first
```
