Channel Classification
How traffic sources are automatically classified into marketing channels
Channel Classification
Atribu automatically classifies every visit into a marketing channel based on UTM parameters, referrer URL, and click IDs. This classification drives the Traffic Sources breakdown in your dashboard and the channel dimension in API responses.
Default channels
Paid Social
Meta, TikTok, and other social ads detected by click IDs or paid UTM parameters
Organic Social
Unpaid traffic from social platforms like Facebook, Instagram, X, LinkedIn
Paid Search
Google Ads, Microsoft Ads, and other search ads detected by click IDs or paid UTMs
Organic Search
Unpaid search engine traffic from Google, Bing, Yahoo, DuckDuckGo
Traffic from email campaigns identified by utm_medium
Referral
Inbound traffic from other websites (not search or social)
Direct
No referrer, no UTMs, no click IDs -- typed URL or bookmark
Display
Banner and display ad traffic identified by utm_medium
Affiliate
Affiliate partner traffic identified by utm_medium
Classification rules
| Channel | Detection logic |
|---|---|
| Paid Social | fbclid or ttclid present, OR utm_medium contains paid, cpc, or ppc with a social source |
| Organic Social | Referrer from a social platform (facebook.com, instagram.com, twitter.com, linkedin.com, etc.) without paid indicators |
| Paid Search | gclid or msclkid present, OR utm_medium is cpc/ppc with a search engine source |
| Organic Search | Referrer from a search engine (google, bing, yahoo, duckduckgo, baidu, etc.) |
utm_medium is email | |
| Referral | Has a referrer that is not a known search engine or social platform |
| Direct | No referrer, no UTM parameters, no click IDs |
| Display | utm_medium is display, banner, or cpm |
| Affiliate | utm_medium is affiliate |
Classification priority
Click IDs take precedence over UTM parameters. If a visit has fbclid in the URL, it is classified as Paid Social regardless of what utm_medium says. This prevents misclassification when UTM tags are missing or incorrect.
Click ID detection
Click IDs are automatically appended to URLs by ad platforms. Atribu detects them to identify paid traffic even when UTM parameters are missing.
| Click ID | Platform | Channel |
|---|---|---|
fbclid | Meta (Facebook / Instagram) | Paid Social |
gclid | Google Ads | Paid Search |
msclkid | Microsoft Advertising (Bing) | Paid Search |
ttclid | TikTok Ads | Paid Social |
Always use UTMs alongside click IDs
Click IDs identify the platform but not the specific campaign. For full attribution down to the ad level, always include utm_campaign, utm_source, utm_medium, and utm_content in your ad URLs.
Using channels in the API
Channel breakdown
Get visitor and revenue distribution across all channels:
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
"https://www.atribu.app/api/v1/breakdowns?date_from=2026-03-01&date_to=2026-03-25&dimensions=channel"const response = await fetch(
"https://www.atribu.app/api/v1/breakdowns?date_from=2026-03-01&date_to=2026-03-25&dimensions=channel",
{
headers: {
Authorization: "Bearer atb_live_YOUR_KEY",
},
}
);
const data = await response.json();import requests
resp = requests.get(
"https://www.atribu.app/api/v1/breakdowns",
headers={"Authorization": "Bearer atb_live_YOUR_KEY"},
params={
"date_from": "2026-03-01",
"date_to": "2026-03-25",
"dimensions": "channel",
},
)
data = resp.json(){
"data": {
"channel": [
{ "value": "Paid Social", "visitors": 3200, "sessions": 4100, "pageviews": 9800, "bounce_rate": 38.2 },
{ "value": "Organic Search", "visitors": 2800, "sessions": 3400, "pageviews": 8200, "bounce_rate": 45.1 },
{ "value": "Direct", "visitors": 1500, "sessions": 1800, "pageviews": 4200, "bounce_rate": 52.3 }
]
}
}Filtering by channel
Filter any endpoint to a specific channel using the filter[channel] parameter:
curl -H "Authorization: Bearer atb_live_YOUR_KEY" \
"https://www.atribu.app/api/v1/overview?date_from=2026-03-01&date_to=2026-03-25&filter[channel]=is:Paid+Social"const response = await fetch(
"https://www.atribu.app/api/v1/overview?" + new URLSearchParams({
date_from: "2026-03-01",
date_to: "2026-03-25",
"filter[channel]": "is:Paid Social",
}),
{
headers: {
Authorization: "Bearer atb_live_YOUR_KEY",
},
}
);
const data = await response.json();import requests
resp = requests.get(
"https://www.atribu.app/api/v1/overview",
headers={"Authorization": "Bearer atb_live_YOUR_KEY"},
params={
"date_from": "2026-03-01",
"date_to": "2026-03-25",
"filter[channel]": "is:Paid Social",
},
)
data = resp.json()Filter syntax
Channel filters use the is: prefix followed by the exact channel name. Channel names are case-sensitive. Use + or %20 for spaces in URLs.