# Channel taxonomy — sources and mediums

> How Ordinary maps raw UTM values to canonical channel names so reports consolidate variant spellings, and how to customize the mapping.

Source: https://help.tryordinary.com/concepts/channel-taxonomy

---

A channel taxonomy is a rule book that turns messy UTM values from
the real world into clean, consistent labels in your reports.

## The problem

Marketers (and agencies, and influencers, and Meta's auto-UTM
generator, and your own past self a year ago) don't agree on how to
tag URLs. Real examples from a single merchant's attribution data:

- `utm_source=facebook`
- `utm_source=Facebook`
- `utm_source=fb`
- `utm_source=meta`
- `utm_source=facebook_ads`
- `utm_source=FB`
- `utm_source=facebook_paid`

All are the same thing. Without consolidation, your UTM breakdown
shows 7 separate rows and each looks smaller than the real Facebook
spend.

## What Ordinary does

Every UTM value gets resolved through a 3-step lookup:

1. **Per-org overrides** — your customized mappings (highest priority).
2. **Global defaults** — seed mappings that apply to every org (cover
   common aliases like `fb → facebook`, `ig → instagram`).
3. **Fallback to raw lowercased value** — if no rule matches, the raw
   value is used as-is, lowercased.

The resolved value is a **canonical** name. Reports group by the
canonical name, so all Facebook variants collapse into one row.

## Global defaults

Ordinary ships with a seed set covering the usual aliases. Examples:

- Source: `fb`, `facebook_ads`, `meta` → `facebook`
- Source: `ig`, `insta` → `instagram`
- Source: `yt` → `youtube`
- Medium: `cpc`, `ppc` → `paid`
- Medium: `em`, `e-mail` → `email`

These are read-only from your side. If you need a different canonical
on any of them, add a per-org override that wins.

## Per-org overrides

Add on **Settings → Channel Taxonomy**. Starter and higher only.


Fields:

- **Alias** — the raw UTM value you want to rewrite (case-insensitive).
- **Kind** — source or medium.
- **Canonical** — what it should become in reports.

Examples:

- Alias `tiktok_paid`, kind `source`, canonical `tiktok` — collapses
  your paid TikTok variants.
- Alias `influencer_X`, kind `source`, canonical `influencer` —
  groups all your influencer campaigns under one source.
- Alias `newsletter`, kind `medium`, canonical `email` — so
  "newsletter" and "email" don't split into separate rows.

## When mappings apply

- **New events immediately** — the pixel's processing pipeline reads
  the taxonomy on ingest. Any new event with a mapped alias is
  written with the canonical value.
- **Historical events** — unaffected. Past events keep their raw
  values in the underlying database. Reports that aggregate use the
  live taxonomy for future reads, so historical rows with mapped
  aliases DO collapse into their canonical in reports.

That last point matters: if you add an override tomorrow for
`fb → facebook`, every historical row where `utm_source=fb` will
consolidate under "facebook" in reports starting immediately. No
backfill needed.

## The "direct" and "unknown" buckets

- Rows with no `utm_source` at all fall under **direct/none** — usually
  direct URL visits, email clients that strip tracking, or customers
  reopening a browser tab.
- Rows where the source resolves to an empty string or "null" are
  lumped into **unknown**. Usually a tagging accident.

Both are visible in the attribution report so you can size how much
of your traffic isn't attributable to a source.

## Related articles

- [Custom channel taxonomy](https://help.tryordinary.com/integrations/custom-channel-taxonomy) —
  step-by-step walkthrough for setting up your overrides.
- [Attribution reports](https://help.tryordinary.com/features/attribution) — where the
  resolved channels show up.
