Set and govern a UTM naming system a whole team can follow: source, medium, and campaign rules tied to GA4 default channel definitions, a versioned registry of approved values with an approval and deprecation process, a builder and validator CLI that catches typos, case splits, and unregistered values before links ship, and a cleanup workflow that maps a messy campaign history to canonical values. Use when setting up UTM conventions, naming or auditing campaign links, fixing split or Unassigned GA4 traffic, approving a new source or medium, or cleaning up inconsistent historical tagging. For attribution models and incrementality, use marketing-attribution instead; this skill owns the tagging taxonomy only.
./install.sh utm-tracking-taxonomyname: utm_tracking_taxonomy description: Set and govern a UTM naming system a whole team can follow: source, medium, and campaign rules tied to GA4 default channel definitions, a versioned registry of approved values with an approval and deprecation process, a builder and validator CLI that catches typos, case splits, and unregistered values before links ship, and a cleanup workflow that maps a messy campaign history to canonical values. Use when setting up UTM conventions, naming or auditing campaign links, fixing split or Unassigned GA4 traffic, approving a new source or medium, or cleaning up inconsistent historical tagging. For attribution models and incrementality, use marketing-attribution instead; this skill owns the tagging taxonomy only.
GA4 reads UTM values exactly as they arrive. Values are case sensitive, so one channel spelled three ways becomes three report rows, and a medium GA4 does not recognise falls into Unassigned. The fix is governance, not care: a small registry of approved values, one way to build links, a validator that checks every link against the registry, and a recurring audit that maps old values and fixes them at the source. This skill sets that system up and runs it.
The closest other skill, marketing-attribution, covers which model gets credit for a conversion and folds UTM hygiene into one short reference. This skill is the layer underneath it: the taxonomy, the registry, and the checks that keep the raw values clean enough to model at all.
assets/registry-template.csv to the team's shared location and edit the rows to the team's real platforms, partners, and senders. One row per approved source and medium, each with a status, the GA4 channel it should land in, an owner, and a note when a spelling is easy to confuse. If a registry already exists, work from it and never from memory or last quarter's spreadsheet.references/taxonomy.md and settle four things as a team: the separator (hyphen or underscore), the campaign pattern (the default is yyyy-qN_objective_theme), the closed objective list inside campaign names, and the medium picks from the documented GA4 channel table. Medium is constrained by GA4; source and campaign are the team's to name once and then hold.references/governance.md: check for an existing value or an alias case first, confirm a new medium names the channel it lands in, check near-duplicates, then add the row with an owner before any link uses it. Anyone can request a value; the registry owner approves it.python3 scripts/utm_tools.py build --base <url> --source <v> --medium <v> --campaign <v> --registry <registry.csv>, adding --content, --term, --id, or --source-platform only when they apply. The builder refuses unregistered values, case errors, and bad characters, and prints the predicted GA4 default channel. Hand-built links are where splits start.python3 scripts/utm_tools.py validate <url> --registry <registry.csv>, or pass --file urls.txt for a batch from a partner, an agency, or an email tool. Fix every error before the link ships. Read the warnings too: a deprecated value or an Unassigned prediction on a live link is a decision a person should make, not a detail to wave through.references/governance.md whenever a platform changes and at least quarterly, and test one live link from each end to end.python3 scripts/utm_tools.py audit --file history.csv --registry <registry.csv> --aliases <aliases.csv>. The output maps each observed value to a canonical value with sessions and a reason. Apply the map in reporting, and fix each value at its tagging source so new sessions arrive clean. references/cleanup-worked-example.md walks a full cleanup: 19,508 sessions, sources collapsing from 9 values to 5, campaigns from 3 spellings to 1.references/governance.md with a named owner.google and Google as different sources, and UTM values end up in shared links and logs.references/taxonomy.md, and treat an Unassigned prediction as a stop sign unless the team accepts Unassigned for that traffic on purpose and records it.publisher key 2e43c913833850e6d80f939677e3de76e806d47785c0f1caaca90f9d18c98e1e
No ratings yet — be the first to rate it.