Campaign tracking governance
UTM Naming Convention Validator
Paste campaign URLs, define your team's UTM rules, and find naming drift before analytics data becomes fragmented.
Campaign URLs
Enter one complete HTTP or HTTPS URL per line.
URLs are parsed locally in your browser and are not submitted to a server.
Validation results
Failures break an explicit team rule; warnings identify naming drift that can be normalized.
https://example.com/pricing?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale_2026&utm_content=hero_banner
sourcegooglemediumcpccampaignsummer_sale_2026https://example.com/demo?utm_source=LinkedIn&utm_medium=Paid Social&utm_campaign=Summer Sale&utm_content=Hero CTA
sourceLinkedInmediumPaid SocialcampaignSummer Salehttps://example.com/demo?utm_source=linkedin&utm_medium=paid_social&utm_campaign=summer_sale&utm_content=hero_ctahttps://example.com/blog?utm_source=newsletter&utm_medium=email&utm_campaign=summer_sale_2026
sourcenewslettermediumemailcampaignsummer_sale_2026https://example.com/pricing?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale_2026&utm_content=hero_banner
sourcegooglemediumcpccampaignsummer_sale_2026UTM Naming Convention Report
Copy the audit for campaign QA or download the row-level CSV.
# UTM Naming Convention Report
- Score: 65/100
- Status: blocked
- URLs: 4
- Passed: 2
- Warnings: 1
- Failed: 1
## Rules
- Required: utm_source, utm_medium, utm_campaign
- Case: lowercase
- Separator: underscore
- Allowed sources: google, newsletter, linkedin
- Allowed mediums: cpc, email, social
- Campaign pattern: ^[a-z]+_[a-z]+_\d{4}$
## URL results
### Line 1 - pass
https://example.com/pricing?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale_2026&utm_content=hero_banner
- [x] Naming convention passed
### Line 2 - fail
https://example.com/demo?utm_source=LinkedIn&utm_medium=Paid Social&utm_campaign=Summer Sale&utm_content=Hero CTA
- [!] utm_source does not use Lowercase - utm_source; actual=LinkedIn; expected=lowercase
- [!] utm_medium does not use Lowercase - utm_medium; actual=Paid Social; expected=lowercase
- [!] utm_medium does not use the Underscore (_) separator - utm_medium; actual=Paid Social; expected=underscore
- [!] utm_campaign does not use Lowercase - utm_campaign; actual=Summer Sale; expected=lowercase
- [!] utm_campaign does not use the Underscore (_) separator - utm_campaign; actual=Summer Sale; expected=underscore
- [!] utm_content does not use Lowercase - utm_content; actual=Hero CTA; expected=lowercase
- [!] utm_content does not use the Underscore (_) separator - utm_content; actual=Hero CTA; expected=underscore
- [ ] utm_source 'LinkedIn' is not allowed - utm_source; actual=LinkedIn; expected=google, newsletter, linkedin
- [ ] utm_medium 'Paid Social' is not allowed - utm_medium; actual=Paid Social; expected=cpc, email, social
- [ ] utm_campaign does not match ^[a-z]+_[a-z]+_\d{4}$ - utm_campaign; actual=Summer Sale; expected=^[a-z]+_[a-z]+_\d{4}$
- Suggested URL: https://example.com/demo?utm_source=linkedin&utm_medium=paid_social&utm_campaign=summer_sale&utm_content=hero_cta
### Line 3 - pass
https://example.com/blog?utm_source=newsletter&utm_medium=email&utm_campaign=summer_sale_2026
- [x] Naming convention passed
### Line 4 - warn
https://example.com/pricing?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale_2026&utm_content=hero_banner
- [!] Duplicate URL; first seen on line 1 - actual=https://example.com/pricing?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale_2026&utm_content=hero_banner; expected=1