On this page+
A SaaS marketing team that has clean GA4 reports has a written campaign naming template. A team that has messy GA4 reports does not. The template does not have to be elaborate. Three slots, lowercase, hyphens, applied consistently, covers roughly 95 percent of the leakage.
Here is the template we hand to teams that want to fix their attribution data without blowing up six months of campaign history.
The template
<initiative>-<stage>-<cohort>
Three slots, separated by hyphens, lowercase throughout. Each slot has a defined vocabulary the team agrees on once and reuses.
Examples:
| utm_campaign | Decoded |
|---|---|
| q2-launch-trial | Q2 launch initiative, trial-conversion stage, all trial users |
| q2-launch-existing | Q2 launch initiative, retention stage, existing customers |
| black-friday-2026 | Annual sale (2026 cohort) |
| onboarding-day-3 | Onboarding initiative, day-3 stage, new signups |
| pricing-page-test-a | Pricing-page experiment, variant A |
| webinar-q2-attendees | Webinar initiative, post-event, attendees cohort |
Each row is a single, stable value across email, paid social, paid search, and partner blasts.
Why three slots and not more
Two slots is usually too few:
launch-q2does not tell you which audience or stage. Top-of-funnel acquisition gets mixed with mid-funnel nurture.
Four slots is usually too many:
q2-launch-trial-2026-april-week-3becomes unreadable. The week and date already live in your campaign platform's metadata.
Three slots is the sweet spot. The first answers "what initiative." The second answers "what stage of the funnel." The third answers "which audience or variant."
If you genuinely need four dimensions, push the fourth into utm_content rather than utm_campaign.
The vocabulary your team has to agree on
The template only works if everyone uses the same words for the same concepts. Three vocabularies the team needs to write down once.
Initiative names. The big buckets your campaign brief uses. Common SaaS examples:
- launch (a product or feature launch)
- pricing (pricing page experiments, pricing communication)
- onboarding (welcome sequences, activation flows)
- retention (existing-customer engagement)
- winback (re-engaging churned or inactive users)
- expansion (upsell, cross-sell to existing accounts)
- partner (partner-driven campaigns)
- event (webinars, conferences, podcasts)
Pick a list of 8 to 12 initiatives that cover everything your team runs. Add to it sparingly.
Stage values. What part of the funnel the campaign targets:
- awareness
- consideration
- trial
- conversion
- onboarding
- expansion
- retention
- winback
Some teams skip the stage slot and use only initiative-cohort. That works too if your initiatives are stage-specific. The trade-off is you lose the funnel slice in GA4.
Cohort identifiers. Who the campaign is targeting. Highly team-specific:
- trial (trial users)
- existing (paying customers)
- prospects (cold list)
- attendees (webinar attendees)
- registrants (webinar registrants)
- segment-a (custom segment from your CRM)
Three to five cohort labels typically cover most campaigns. Add segment-specific labels when needed.
What lives in utm_campaign vs utm_content vs utm_source
The split matters for clean reports.
utm_campaign is the initiative-stage-cohort. Same value across channels for the same campaign.
utm_source is the specific origin (klaviyo, mailchimp, facebook, partner-name). Different across channels.
utm_medium is the channel category (email, paid_social, social, paid_search, referral). Different across channels.
utm_content is the variant or position. The hero CTA, the footer link, the A/B variant.
utm_term is the audience identifier or paid keyword. Optional.
For the Q2 launch campaign hitting email, paid LinkedIn, and a partner blast:
| Channel | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Customer email | klaviyo | q2-launch-existing | hero-cta | |
| LinkedIn ads | paid_social | q2-launch-trial | carousel-v1 | |
| Partner blast | partner-name | referral | q2-launch-prospects | banner |
Three different audiences (existing, trial, prospects) means three different utm_campaign values. The base initiative (q2-launch) holds across all three.
Two patterns that go wrong
1. Encoding the channel in utm_campaign. q2-launch-email, q2-launch-social-paid, q2-launch-partners. This breaks the campaign workspace because the same initiative shows up as three campaigns. Channel lives in utm_source and utm_medium.
2. Using the campaign brief title verbatim. "Q2 Product Launch (Round 2): Existing Customer Re-Engagement Push" becomes a UTM value with parentheses, capital letters, and special characters. The slug works for the brief; the UTM should be the slug-form: q2-launch-existing.
Most ESP and ad-platform tools let you set the UTM value separately from the platform's display name. Use the convention for the UTM and let the platform display whatever readable name your team prefers.
A template page for your team
The single most useful artifact: a Google Doc, Notion page, or wiki entry titled "Campaign Naming." Three sections:
- The template syntax (
<initiative>-<stage>-<cohort>). - The current vocabulary lists (initiatives, stages, cohorts).
- Example values for the last 5 to 10 campaigns the team ran.
Link this page from the campaign brief template, the onboarding doc for new hires, and the link-builder tool's Help section. The convention only works if it is visible.
What to do when your existing data is a mess
Three steps:
- Adopt the template going forward. Start with the next campaign. Do not rewrite history.
- Build a Custom Channel Group in GA4 that maps your old broken values into the right buckets. This makes historical data legible without retagging.
- Audit weekly for the first month. Open GA4 → Acquisition → Traffic Acquisition. Look for any new campaign rows that broke the convention. Catch them in week 1, before the data has had time to compound.
Worked example: Q2 launch campaign
A SaaS company runs a Q2 launch with three audiences:
| Audience | utm_campaign | Channels |
|---|---|---|
| Active trial users | q2-launch-trial | Klaviyo flow, in-app banner, paid LinkedIn |
| Existing paid customers | q2-launch-existing | Klaviyo campaign, Mailchimp, sales rep email |
| Cold prospects | q2-launch-prospects | Paid LinkedIn, paid Reddit, partner blast |
After the launch ends, GA4's campaign workspace shows three rows for the launch:
- q2-launch-trial: 8,200 sessions, 412 conversions
- q2-launch-existing: 3,100 sessions, 287 conversions
- q2-launch-prospects: 11,800 sessions, 78 conversions
Each row reads cleanly. The team can compare conversion rates across audiences (existing converts at 9.3 percent, prospects at 0.7 percent, trial at 5.0 percent) and adjust budget allocation accordingly.
To apply the template without typing the same UTMs by hand for every link, the free Trakl UTM builder enforces lowercase and the source-medium taxonomy.
If all three audiences had been tagged utm_campaign=q2-launch, the report would show one row with mixed conversion rates and the team would lose the audience comparison.
For the broader naming convention rules, the UTM naming conventions playbook covers the casing, separators, and team rollout. For the technical UTM mechanics, the UTM parameters pillar guide is the foundation.
Frequently filed
Common questions.
Q.01What is a good campaign naming template for SaaS?+
<initiative>-<stage>-<cohort> works for most SaaS marketing teams. Example, q2-launch-trial for the trial-cohort variant of the Q2 launch. Lowercase, hyphens, three slots that decode in a glance. The template fits inside utm_campaign and stays legible in GA4 reports.
Q.02How long should a utm_campaign value be?+
Under 50 characters total. Long enough to communicate the initiative, stage, and cohort. Short enough to fit in URL bars without truncation in dashboards. Most clean values land between 15 and 35 characters.
Q.03Should I encode the date into utm_campaign?+
Encode the quarter or year only if the campaign repeats annually. q2-launch implies the year is the current one. black-friday-2026 disambiguates from black-friday-2025 if both campaigns will exist in your reports concurrently.
By the byline
Trakl TeamEditorial team
We build Trakl, a link shortener and UTM tracker for marketing teams. We write here from the cleanup work, support tickets, and campaign reviews that fill the rest of our week. Specifics over slogans, and we cite the source.
Photo: Neon Wang on Unsplash



