
Utm Link Generator
- 159 installs
- 237 repo stars
- Updated July 15, 2026
- onewave-ai/claude-skills
Create consistent, campaign-tagged UTM URLs with naming conventions so launches and promos are traceable across ads, email, and social.
About
UTM link generator skill enforces disciplined campaign tagging—source, medium, content, and term—so every launch URL maps cleanly to analytics dashboards and A/B tests without broken attribution.
- Naming convention guardrails
- Source-medium-campaign fields
- Bulk link variants
- QA duplicate checks
- Analytics-ready output
Utm Link Generator by the numbers
- 159 all-time installs (skills.sh)
- +5 installs in the week ending Aug 4, 2026 (Skillselion tracking)
- Ranked #1,030 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/onewave-ai/claude-skills --skill utm-link-generatorAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 159 |
|---|---|
| repo stars | ★ 237 |
| Last updated | July 15, 2026 |
| Repository | onewave-ai/claude-skills ↗ |
What it does
Create consistent, campaign-tagged UTM URLs with naming conventions so launches and promos are traceable across ads, email, and social.
Files
UTM Link Generator
Generate UTM-tagged links under a single naming-governance system: a utm-registry.json that enforces canonical conventions, prevents duplicates and naming drift, and outputs platform-ready links for LinkedIn, email, social, and ads.
Contents
references/naming-conventions.md-- enforced rules, UTM parameter reference, canonical source/medium lists, campaign naming pattern.references/platform-variants.md-- per-platform link templates (LinkedIn, email, social, paid ads).references/registry-schema.md-- utm-registry.json structure plus validation-report and output-summary templates.references/bulk-and-registry-ops.md-- bulk generation, registry commands (audit/add/report/export), error handling, integrations, best practices.
Capabilities
1. Generate UTM-tagged URLs with validated, consistent parameters. 2. Maintain utm-registry.json tracking all links and enforcing conventions. 3. Prevent duplicates -- warn when a similar link already exists. 4. Format platform-specific variants (LinkedIn, email, social, ads). 5. Bulk-generate variants for A/B testing or multi-channel campaigns. 6. Validate -- reject malformed URLs, empty parameters, and convention violations. 7. Report -- generate campaign tracking summaries from the registry.
Workflow
1. Accept input. Collect destination URL, source, medium, campaign (all required) plus optional term, content, and target platforms. Extract these from a natural-language brief when not given explicitly. 2. Validate and normalize. Lowercase, replace spaces with hyphens, strip non-[a-z0-9-] characters, auto-correct known aliases, reject unknown source/medium values (suggest closest match), validate URL form, enforce the 50-character limit. Report corrections using the template in references/registry-schema.md. Full rules in references/naming-conventions.md. 3. Check registry for duplicates. Read utm-registry.json (create if missing). Return existing link on exact duplicates, allow-with-warning on near duplicates, block on naming conflicts (same campaign, different casing/hyphenation). 4. Generate links. Build {base_url}?utm_source=&utm_medium=&utm_campaign=[&utm_term=][&utm_content=][&utm_id=]. Append with & if the base URL already has query params, URL-encode values, and preserve existing query params and fragment. 5. Generate platform variants. Produce optimized links per requested platform using references/platform-variants.md. 6. Update registry. Append all generated links to utm-registry.json per the schema in references/registry-schema.md, refreshing stats and timestamps. 7. Output summary. Present a copy-paste-ready summary using the template in references/registry-schema.md.
For bulk runs, registry commands (audit, add source/medium, campaign report, CSV export), error handling, and integration notes, see references/bulk-and-registry-ops.md.
Bulk Generation and Registry Management
Bulk Generation Mode
For generating links across many campaigns or many URLs at once.
Input Format
Accept a table or list:
Generate UTM links for these pages:
- /pricing -- linkedin, email, twitter -- q1-2026-product-launch
- /demo -- linkedin, google-ads -- q1-2026-demo-push
- /case-studies -- email, linkedin -- q1-2026-social-proofProcessing
1. Parse each line into (URL, platforms, campaign) 2. Validate and normalize all parameters 3. Generate all variant links for each URL/platform combination 4. Deduplicate across the batch 5. Update registry with all new links 6. Output a master table
Output Format
## Bulk UTM Generation -- 3 campaigns, 8 platform variants, 24 total links
| Campaign | URL | Platform | Variant | Full Link |
|----------|-----|----------|---------|-----------|
| q1-2026-product-launch | /pricing | linkedin-organic | organic-post | [URL] |
| q1-2026-product-launch | /pricing | linkedin-paid | sponsored-post | [URL] |
| q1-2026-product-launch | /pricing | email | primary-cta | [URL] |
| ... | ... | ... | ... | ... |
Registry updated: 24 new links added.Registry Management Commands
Audit Registry
Trigger: "Audit my UTM registry"
Read utm-registry.json and report:
- Total campaigns and links
- Naming convention violations (if any crept in manually)
- Stale campaigns (older than 6 months with no new links)
- Unused sources or mediums
- Duplicate or near-duplicate links
Add Custom Source/Medium
Trigger: "Add 'partnerstack' as a UTM source"
Add the new value to the canonical list in the registry and document it.
Campaign Report
Trigger: "Show me all links for the q1-2026-product-launch campaign"
Filter the registry and display all links for that campaign, grouped by platform.
Export for Google Sheets
Trigger: "Export my UTM registry as CSV"
Generate a CSV file with columns: Campaign, URL, Source, Medium, Content, Term, Full Link, Created Date, Status.
Error Handling
| Error | Response |
|---|---|
| Invalid URL (no protocol) | Auto-prepend https:// and warn |
| Unknown source | Suggest closest canonical match, ask for confirmation |
| Unknown medium | Suggest closest canonical match, ask for confirmation |
| Campaign name too long | Suggest abbreviated version |
| Duplicate link exists | Show existing link, ask if user wants to create anyway |
| Registry file missing | Create new registry with default conventions |
| Registry file corrupted | Attempt to parse what exists, back up, create fresh |
| Base URL has existing UTMs | Strip existing UTM params, warn user, apply new ones |
Integration Notes
- Google Analytics 4: All parameters map directly to GA4 dimensions.
utm_idmaps tocampaign_id. - HubSpot: Source and medium map to HubSpot's Original Source properties.
- Salesforce: Campaign name can map to Salesforce Campaign records via integration.
- Mixpanel / Amplitude: UTM params auto-captured on page load via standard SDKs.
Best Practices Embedded in This Skill
1. One registry, one truth -- all UTM links flow through the registry. No ad-hoc link creation. 2. Convention over configuration -- canonical lists prevent naming drift before it starts. 3. Auto-correction over rejection -- when possible, fix the input rather than blocking the user. 4. Platform awareness -- different platforms need different utm_content values to distinguish placements. 5. Date-prefixed campaigns -- makes it trivial to filter analytics by time period. 6. Audit trail -- every link is timestamped and attributed in the registry.
Naming Conventions (Enforced)
These conventions are non-negotiable. Reject or auto-correct any violations.
General Rules
1. All lowercase -- never LinkedIn, always linkedin 2. Hyphens for spaces -- never product launch, always product-launch 3. No special characters -- only alphanumeric and hyphens 4. No trailing/leading hyphens -- never -campaign-name- 5. No double hyphens -- never my--campaign 6. Maximum length: 50 characters per parameter value 7. Date format in campaigns: q[N]-[YYYY] or [YYYY]-[MM] prefix
UTM Parameter Reference
| Parameter | Required | Purpose | Example |
|---|---|---|---|
utm_source | Yes | Where the traffic comes from | linkedin, google, newsletter |
utm_medium | Yes | Marketing medium | cpc, email, social, organic |
utm_campaign | Yes | Campaign identifier | q1-2026-product-launch |
utm_term | No | Paid keyword (search ads) | project-management-software |
utm_content | No | Differentiates similar links | hero-cta, sidebar-banner, variant-a |
utm_id | No | Campaign ID for GA4 | camp-2026-q1-001 |
Source Values (Canonical List)
Only these source values are allowed. Any new source must be explicitly added to the registry.
| Canonical Source | Aliases (auto-corrected) | Platform |
|---|---|---|
google | goog, google-ads, adwords | Google Ads / Organic |
linkedin | li, linked-in, linkedin-ads | |
facebook | fb, meta, facebook-ads | Facebook / Meta |
instagram | ig, insta | |
twitter | x, x-com, tw | X (Twitter) |
youtube | yt, you-tube | YouTube |
tiktok | tt, tik-tok | TikTok |
reddit | rd | |
email | mail, e-mail, em | Email campaigns |
newsletter | nl, news-letter | Newsletter specifically |
bing | microsoft-ads, msn | Bing / Microsoft |
direct | none, (direct) | Direct traffic |
referral | ref, partner | Referral traffic |
podcast | pod, spotify | Podcast channels |
slack | sl | Slack communities |
producthunt | ph, product-hunt | Product Hunt |
hackernews | hn, hacker-news | Hacker News |
Medium Values (Canonical List)
| Canonical Medium | Aliases (auto-corrected) | Use Case |
|---|---|---|
cpc | ppc, paid-click, cost-per-click | Paid search / paid social clicks |
cpm | display, paid-impression | Display / impression campaigns |
email | e-mail, mail | Email campaigns |
social | social-media, organic-social | Organic social posts |
organic | seo, organic-search | Organic search traffic |
referral | ref, partner, affiliate | Referral / partner links |
video | vid, youtube, pre-roll | Video ad placements |
retargeting | remarketing, retarget | Retargeting campaigns |
content | blog, article, content-syndication | Content marketing |
webinar | web, event, virtual-event | Webinar / event registrations |
podcast | pod, audio | Podcast mentions / ads |
sms | text, mms | SMS / text campaigns |
qr | qr-code, print | QR code / print materials |
push | push-notification, notification | Push notifications |
Campaign Naming Pattern
Campaigns follow this structure:
[quarter-or-month]-[year]-[campaign-name]-[optional-variant]Examples:
q1-2026-product-launch2026-03-spring-webinarq2-2026-brand-awareness-linkedinevergreen-demo-request(for always-on campaigns, skip the date prefix)
Platform-Specific Variants
For each requested platform, generate an optimized link. Use the platform's recommended source, medium, and utm_content placement value.
## LinkedIn
**Post Link** (organic social):
https://example.com/pricing?utm_source=linkedin&utm_medium=social&utm_campaign=q1-2026-product-launch&utm_content=organic-post
**Ad Link** (paid):
https://example.com/pricing?utm_source=linkedin&utm_medium=cpc&utm_campaign=q1-2026-product-launch&utm_content=sponsored-post
**Message Link** (InMail/DM):
https://example.com/pricing?utm_source=linkedin&utm_medium=social&utm_campaign=q1-2026-product-launch&utm_content=inmail
**Profile Link** (bio/featured):
https://example.com/pricing?utm_source=linkedin&utm_medium=social&utm_campaign=q1-2026-product-launch&utm_content=profile-link## Email
**Primary CTA**:
https://example.com/pricing?utm_source=email&utm_medium=email&utm_campaign=q1-2026-product-launch&utm_content=primary-cta
**Secondary CTA**:
https://example.com/pricing?utm_source=email&utm_medium=email&utm_campaign=q1-2026-product-launch&utm_content=secondary-cta
**Header Link**:
https://example.com/pricing?utm_source=email&utm_medium=email&utm_campaign=q1-2026-product-launch&utm_content=header-link
**Footer Link**:
https://example.com/pricing?utm_source=email&utm_medium=email&utm_campaign=q1-2026-product-launch&utm_content=footer-linkSocial (General)
## Social
**Twitter/X**:
https://example.com/pricing?utm_source=twitter&utm_medium=social&utm_campaign=q1-2026-product-launch
**Facebook**:
https://example.com/pricing?utm_source=facebook&utm_medium=social&utm_campaign=q1-2026-product-launch
**Instagram** (bio link):
https://example.com/pricing?utm_source=instagram&utm_medium=social&utm_campaign=q1-2026-product-launch&utm_content=bio-link
**Reddit**:
https://example.com/pricing?utm_source=reddit&utm_medium=social&utm_campaign=q1-2026-product-launchAds (Paid)
## Paid Ads
**Google Ads**:
https://example.com/pricing?utm_source=google&utm_medium=cpc&utm_campaign=q1-2026-product-launch&utm_term={keyword}
**LinkedIn Ads**:
https://example.com/pricing?utm_source=linkedin&utm_medium=cpc&utm_campaign=q1-2026-product-launch
**Facebook/Meta Ads**:
https://example.com/pricing?utm_source=facebook&utm_medium=cpc&utm_campaign=q1-2026-product-launch
Note: For Google Ads, use {keyword} as a dynamic placeholder that Google will auto-replace.Registry Schema and Output Templates
utm-registry.json Structure
Append all generated links to utm-registry.json using this structure:
{
"version": "1.0",
"lastUpdated": "2026-04-10T12:00:00Z",
"namingConventions": {
"sources": ["google", "linkedin", "facebook", "instagram", "twitter", "email", "newsletter"],
"mediums": ["cpc", "cpm", "email", "social", "organic", "referral", "video", "retargeting"]
},
"campaigns": [
{
"name": "q1-2026-product-launch",
"createdAt": "2026-04-10T12:00:00Z",
"description": "Q1 2026 product launch campaign",
"links": [
{
"id": "utm-001",
"url": "https://example.com/pricing?utm_source=linkedin&utm_medium=social&utm_campaign=q1-2026-product-launch&utm_content=organic-post",
"source": "linkedin",
"medium": "social",
"campaign": "q1-2026-product-launch",
"content": "organic-post",
"platform": "linkedin",
"variant": "organic-post",
"createdAt": "2026-04-10T12:00:00Z",
"status": "active"
}
]
}
],
"stats": {
"totalLinks": 1,
"totalCampaigns": 1,
"sourcesUsed": ["linkedin"],
"mediumsUsed": ["social"]
}
}Parameter Validation Report Template
## Parameter Validation
- Source: "LinkedIn" -> "linkedin" (normalized to lowercase)
- Medium: "paid" -> "cpc" (corrected to canonical value)
- Campaign: "Q1 Product Launch!" -> "q1-product-launch" (normalized)
- URL: https://example.com/pricing -- ValidFinal Output Summary Template
## UTM Links Generated
**Campaign**: q1-2026-product-launch
**Destination**: https://example.com/pricing
**Generated**: 2026-04-10
### Ready-to-Copy Links
| Platform | Variant | Link |
|----------|---------|------|
| LinkedIn (organic) | organic-post | [full URL] |
| LinkedIn (paid) | sponsored-post | [full URL] |
| Email (primary CTA) | primary-cta | [full URL] |
| Email (secondary CTA) | secondary-cta | [full URL] |
| Twitter | default | [full URL] |
| Facebook | default | [full URL] |
### Registry Updated
- New links added: 6
- Total links in registry: 6
- Registry file: ./utm-registry.json
### Validation Report
- All parameters normalized to convention
- No duplicate links found
- No naming conflicts detected