Why Do Most Email Campaigns Have Broken UTM Tracking?
Email marketing generates $36 for every $1 spent, according to Litmus's 2025 State of Email report. But here's the thing — that number is an industry average. Your actual ROI? You probably don't know it with any precision, because your email UTM tracking is either inconsistent, incomplete, or flat-out wrong.
I audited UTM data for a DTC brand running Klaviyo last year. They had 14 different utm_source values for email traffic: email, Email, klaviyo, Klaviyo, newsletter, Newsletter, email_marketing, e-mail, and six more creative spellings. GA4 treated every single one as a separate source. Their "email channel" performance was scattered across a dozen line items in acquisition reports, and nobody on the team realized it.
The fix is straightforward. But the specifics depend on which platform you use, because Mailchimp, Klaviyo, HubSpot, and eSputnik each handle UTM parameters differently — and each has its own gotchas.
How Should You Structure UTM Parameters for Email?
The correct utm_medium for email is email. Not e-mail, not newsletter, not Email, not e_mail. Just email, lowercase. GA4's Default Channel Grouping maps traffic to the "Email" channel when utm_medium exactly matches email — any variation sends your traffic to "Unassigned."
Here's the template that works across every email platform:
utm_source={esp_name}
utm_medium=email
utm_campaign={campaign_slug}
utm_content={link_description}
A real example for a Mailchimp weekly newsletter:
utm_source=mailchimp
utm_medium=email
utm_campaign=weekly_digest_2026-04-21
utm_content=hero_cta
And for a Klaviyo abandoned cart flow:
utm_source=klaviyo
utm_medium=email
utm_campaign=abandoned_cart_reminder_1
utm_content=product_image
Notice utm_source is the platform name, not "email." That's utm_medium's job. Mixing them up is the single most common email UTM mistake — about 40% of the email UTM strings I've reviewed get this wrong. The Clean Signal Method principle "Source Means Platform" is explicit: utm_source answers who sent the traffic, utm_medium answers how.
| Field | What to put | What NOT to put |
|---|---|---|
utm_source | mailchimp, klaviyo, hubspot, esputnik | email, newsletter, e-mail |
utm_medium | email | Platform name, campaign name |
utm_campaign | Campaign slug: spring_sale_2026, weekly_digest_04 | Generic "email" or full sentences |
utm_content | Link identifier: hero_cta, footer_link, product_card_2 | Campaign name again |
utm_term | Optional: audience segment vip_customers, churned_30d | Keywords (that's for paid search) |
Tip: UTM Generator has a "Direct Messages (Email/SMS)" preset that pre-fills
utm_medium=emailand shows recommended source values for every major ESP. Saves you from the "is it
How Do You Set Up UTM Tracking in Mailchimp?
Mailchimp has built-in UTM tracking that appends parameters to every link automatically. The catch: Mailchimp's default UTM values don't follow GA4 best practices.
When you enable "Google Analytics link tracking" in a campaign, Mailchimp adds:
utm_source=mailchimp
utm_medium=email
utm_campaign={campaign_name_from_settings}
That's three parameters. No utm_content, no way to tell which of the 6 links in your newsletter someone clicked.
Better approach — manual UTM override:
- In the campaign builder, go to Settings & Tracking
- Uncheck "Google Analytics link tracking" (the auto-appended one)
- Add UTM parameters directly to each link in the email body
Or keep auto-tracking on for utm_source and utm_medium, then manually add utm_content to individual links to differentiate them:
https://yoursite.com/sale?utm_source=mailchimp&utm_medium=email&utm_campaign=spring_promo_2026&utm_content=hero_button
https://yoursite.com/sale?utm_source=mailchimp&utm_medium=email&utm_campaign=spring_promo_2026&utm_content=footer_text_link
Mailchimp has roughly 11 million active users as of Intuit's 2025 annual report. Most of them rely on the default auto-tracking and never add utm_content. That means they can't tell whether their hero CTA, sidebar banner, or footer link drove the conversion.
For Mailchimp's merge tags, you can use *|CAMPAIGN_UID|* as your utm_id to get a stable identifier that survives campaign renames.
How Does Klaviyo Handle UTM Parameters?
Klaviyo appends UTM parameters to every tracked link by default — and it does it better than most ESPs. Here's what Klaviyo adds out of the box:
utm_source=klaviyo
utm_medium=email
utm_campaign={campaign_or_flow_name}
Klaviyo automatically slugifies campaign names: spaces become + signs, and it uses the name you gave the campaign in the platform. This is mostly fine, but + encoding in URLs is inconsistent across browsers and analytics tools. Some interpret + as a space, others keep it literal.
Where to customize:
- Campaigns: Campaign → Settings → UTM Tracking section
- Flows: Each email in a flow has its own UTM settings under the email's Settings tab
Klaviyo doesn't auto-generate utm_content. You need to add it manually per link:
?utm_source=klaviyo&utm_medium=email&utm_campaign=abandoned_cart_step_1&utm_content=return_to_cart_button
Klaviyo-specific tip: For flows, include the flow step in utm_campaign. An abandoned cart sequence with 3 emails should be abandoned_cart_step_1, abandoned_cart_step_2, abandoned_cart_step_3. Without this, all three emails attribute to the same campaign and you can't tell which reminder actually converted.
According to Klaviyo's 2025 benchmark data, abandoned cart flows have a 3.33% conversion rate on average. But step 1 typically outperforms step 3 by 2-4x. You'll only see that difference if your UTM campaign values distinguish between steps.
How Do You Configure UTM in HubSpot?
HubSpot tracks email clicks internally through its own analytics system. But if you also use GA4, you need UTM parameters — HubSpot doesn't send data to Google Analytics automatically.
Two options:
Option 1: HubSpot's built-in tracking URL builder
Go to Settings → Tracking & Analytics → Tracking URLs. Create a tracking URL with:
- Source:
hubspot - Medium:
email - Campaign: your campaign identifier
HubSpot generates the full URL with parameters.
Option 2: Manual parameters on each link
More control. Add utm_content per link to track which CTA performs.
HubSpot's Marketing Hub has a quirk. When you use their "Add tracking to URLs" toggle on an email, it prepends utm_ parameters using the campaign name exactly as entered — including spaces and mixed case. A campaign named "Spring Sale 2026" becomes utm_campaign=Spring%20Sale%202026 in the URL.
Spaces encoded as %20. Mixed case. Exactly the kind of thing that fragments your GA4 data.
Fix: Always set campaign names in lowercase with underscores before creating the email: spring_sale_2026. Or override HubSpot's auto-UTM and build the parameters yourself.
HubSpot processes over 39 billion emails per year according to their 2025 annual report. For B2B companies using HubSpot's CRM alongside GA4, proper UTM tracking is the bridge that connects "which email generated this website visit" in GA4 with "which contact became a customer" in HubSpot.
What About eSputnik (Yespo) UTM Setup?
eSputnik — now rebranded as Yespo — is the dominant ESP in Ukraine and growing across Eastern Europe. It sends over 7 billion messages monthly across email, SMS, Viber, and web push.
eSputnik has auto-UTM tracking in campaign settings:
- Go to Message Settings → Google Analytics Tracking
- Enable tracking — eSputnik appends
utm_source,utm_medium, andutm_campaign - Default values:
utm_source=eSputnik,utm_medium=email,utm_campaign={message_name}
The problem: Default utm_source=eSputnik uses a capital "E" and capital "S." GA4 is case-sensitive. If you also have links with utm_source=esputnik (lowercase), GA4 treats them as two different sources.
Fix: Override the default source in campaign settings to esputnik (lowercase). Alternatively, in the UTM settings panel, you can set global defaults for your entire account.
eSputnik also supports dynamic variables in UTM:
utm_source=esputnik
utm_medium=email
utm_campaign=${campaign_name}
utm_content=${link_name}
The ${variable} syntax is eSputnik-specific. Don't confuse it with Mailchimp's *|MERGE_TAG|* format or Klaviyo's Jinja-style {{ variable }}.
Should You UTM-Tag Links in Transactional Emails?
Short answer: yes, but differently.
Transactional emails — order confirmations, password resets, shipping notifications — are not marketing campaigns. But they still generate website visits, and without UTM parameters those visits show up as "Direct" traffic in GA4. That inflates your direct channel and makes attribution messy.
A sensible approach:
utm_source=klaviyo
utm_medium=email
utm_campaign=transactional_order_confirmation
utm_content=track_order_button
Some teams use utm_medium=transactional instead of email. Don't. GA4 doesn't have a "Transactional" channel grouping. Use utm_medium=email and put the distinction in utm_campaign.
One exception worth thinking about: re-engagement emails to existing customers. The Clean Signal Method warns about UTM overwriting first-touch attribution. If someone originally came from a Google Ads click costing $12 and you send them a "come back" email with UTMs, their next visit attributes to email — not the paid click that actually acquired them. For CRM-triggered follow-ups to known leads, consider skipping UTM parameters or using custom parameters like first_touch to preserve the original source.
How Do UTM Parameters Compare Across Email Platforms?
| Feature | Mailchimp | Klaviyo | HubSpot | eSputnik (Yespo) |
|---|---|---|---|---|
| Auto UTM appending | Yes (toggle) | Yes (default on) | Yes (toggle) | Yes (toggle) |
| Default utm_source | mailchimp | klaviyo | Customizable | eSputnik (fix case!) |
| Default utm_medium | email | email | email | email |
| utm_content per link | Manual only | Manual only | Manual only | Manual or ${link_name} |
| Dynamic campaign name | *|CAMPAIGN_UID|* | Auto-slugified | Campaign name verbatim | ${campaign_name} |
| Case handling | Lowercase | Lowercase (mostly) | Preserves original case | Preserves original case |
| Spaces in values | Underscores | + encoding | %20 encoding | Underscores |
| Flow/automation UTM | Limited | Per-step config | Per-email config | Per-message config |
The differences are small but they compound. A team running campaigns across 2-3 ESPs (say Mailchimp for newsletters and Klaviyo for e-commerce flows) will end up with fragmented data unless they enforce identical naming conventions across both platforms.
Tip: Build your UTM template once in UTM Generator, share it via URL with your team, and use that as the single source of truth across all ESPs. The template link auto-loads all parameters — no room for "was it
klaviyoorKlaviyo?" debates.
What Are Common UTM Mistakes in Email Marketing?
Mistake 1: Using utm_source=email
"Email" is a medium, not a source. Your source is the platform: Mailchimp, Klaviyo, HubSpot, ConvertKit, Brevo. If you set utm_source=email, you lose all visibility into which ESP drove the traffic. And if you switch ESPs next quarter, your historical data becomes meaningless.
Mistake 2: Same utm_campaign for every email
I've seen accounts where utm_campaign=newsletter was used for 200+ different emails over two years. That's like filing every document in your office under "document." The campaign field should identify the specific send: weekly_digest_2026-04-21, product_launch_spring, abandoned_cart_step_2.
Mistake 3: No utm_content differentiation
A typical marketing email has 4-8 clickable elements. Header logo, hero CTA, product cards, text links, social icons, footer links. If all of them share the same UTM string, you see "14 clicks from this email" in GA4 but zero information about what people actually clicked. Was it the hero button or the fine print at the bottom?
Mistake 4: Forgetting automated flows
Teams set up UTMs on campaigns but forget about flows — welcome series, abandoned carts, post-purchase sequences. Flows often generate 30-50% of email revenue in e-commerce (Klaviyo's 2025 benchmarks report this range). That's a massive chunk of revenue with no proper attribution.
Mistake 5: UTM on internal transactional links
Password reset emails with utm_source=hubspot&utm_medium=email&utm_campaign=password_reset — this overwrites the user's last-touch attribution. Someone who was about to convert from an organic search visit now looks like an email conversion because they clicked "reset password" mid-session. Use UTMs on transactional emails selectively, primarily on links that lead to marketing-relevant pages.
How Do You Test Email UTM Parameters Before Sending?
Send a test email to yourself. Click every link. Check that:
- The landing page URL contains the full UTM string
- Parameters are lowercase, no spaces, no special characters
- GA4 Realtime report → Traffic Sources shows your
utm_sourceandutm_medium utm_contentvalues differ for each link you clicked
GA4's DebugView is even better for testing. Install the GA4 Debugger Chrome extension, click a test email link, and watch the page_view event arrive with all UTM parameters in real time.
One more thing people skip: testing the link after URL shortening. If you're shortening links in email (some ESPs do this by default for click tracking), confirm the shortened URL preserves your UTM parameters through the redirect chain. Some URL shorteners strip query parameters. That turns your carefully crafted UTM string into nothing.
For a deeper look at the full UTM naming conventions framework and how teams enforce consistency, that guide covers the three main models and when each one works best.
FAQ
Do Mailchimp UTM parameters work with GA4?
Yes. Mailchimp's built-in Google Analytics tracking appends utm_source=mailchimp, utm_medium=email, and utm_campaign to every link. GA4 reads these parameters automatically on page load. No extra configuration needed in GA4 — just make sure Enhanced Measurement is enabled in your GA4 property settings.
Can I use different utm_source values for different email types?
Absolutely. Use utm_source=mailchimp for newsletters, utm_source=klaviyo for transactional and flow emails if you run both. Some teams prefer utm_source=newsletter or utm_source=crm_email to distinguish by type rather than platform. Pick one pattern and stick with it across your organization.
What happens if I don't add UTM parameters to emails?
Email clicks without UTM parameters show up as "Direct" traffic in GA4. GA4 can sometimes detect the referring email client (like Gmail), but this is unreliable — most email clients strip or obscure the HTTP referer header. Without UTMs, you lose attribution for a channel that typically drives 15-25% of website traffic.
Should utm_campaign match the email subject line?
No. Subject lines change per A/B test, contain spaces, punctuation, and mixed case. Use a clean, slugified campaign identifier: spring_sale_2026_announcement instead of 🌸 Spring Sale Is HERE! 40% OFF. The campaign field should be machine-readable for GA4 reporting, not human-readable marketing copy.
How do I track which link in an email was clicked?
Use utm_content with a descriptive value for each link: hero_cta, product_card_1, footer_link, social_instagram. Each unique link in the email gets a unique utm_content value while sharing the same utm_source, utm_medium, and utm_campaign.
Do automated email flows need separate UTM parameters?
Yes. Each email in a flow should have distinct utm_campaign values. For a 3-step abandoned cart flow, use abandoned_cart_step_1, abandoned_cart_step_2, abandoned_cart_step_3. This lets you measure which step actually recovers revenue rather than lumping all flow emails into one bucket.
Is utm_term useful for email marketing?
utm_term was designed for paid search keywords, but it works well in email for audience segmentation. Use it to track which subscriber segment received the email: utm_term=vip_customers, utm_term=churned_60d, utm_term=new_subscribers. This adds a segmentation dimension to your GA4 reports without requiring custom dimensions.
How do I prevent UTM parameters from breaking email links?
Always URL-encode special characters in UTM values. Avoid &, =, ?, #, and spaces in parameter values. Use hyphens or underscores as separators. Test every link by clicking it in a test email before sending to your full list. Building links through a UTM generator handles encoding automatically and prevents syntax errors.