On this page+
An email with one tagged link tells you which channel sent the click. An email with every link tagged tells you which content inside the email actually drove action. Most teams do the first and stop there.
Here is the practical setup for getting per-link attribution out of every email send.
The minimum viable email tagging
Every external link in the email gets, at minimum:
utm_source=mailchimp (or whatever your ESP is)
utm_medium=email
utm_campaign=q2-launch
Three parameters identify the email send. Source is your ESP. Medium is always email. Campaign matches the broader initiative.
If every link in the email has the same source/medium/campaign and you stop there, GA4 attributes all clicks correctly to the email. But you cannot tell which link inside the email drove the action. That is what utm_content is for.
Adding utm_content for per-link attribution
utm_content distinguishes the position of the link within the email. A common template:
| Link position | utm_content |
|---|---|
| Hero CTA at the top | hero-cta |
| First body link | body-1 |
| Second body link | body-2 |
| Footer link | footer |
| Logo at the top | header-logo |
| Image in the middle | body-image |
Now every click in the email carries the campaign attribution AND the link position. GA4 can show you which link inside the email actually drove the conversion.
For an email with 5 links, you will have 5 different utm_content values. The source, medium, and campaign stay the same; only the content changes per link.
What about A/B testing?
If you split-test two versions of an email (different subject line, different hero copy), use utm_content to identify the variant. A simple convention:
- Variant A hero:
utm_content=variant-a-hero - Variant A footer:
utm_content=variant-a-footer - Variant B hero:
utm_content=variant-b-hero - Variant B footer:
utm_content=variant-b-footer
The combined value tells you both the variant and the link position. After 7 days you can pull GA4 → Conversions filtered by utm_content and see which variant won and which link drove the win.
ESP-specific notes
Different email platforms have different conventions for default UTM tagging.
Mailchimp. Has "Google Analytics" tracking under campaign settings. When enabled, Mailchimp adds utm_source=newsletter, utm_medium=email, and utm_campaign=<your campaign name lowercase-hyphenated>. The campaign value comes from the Mailchimp campaign name. To override, edit the auto-tag values in Account → Settings → Mailchimp & Google Analytics.
Klaviyo. Has UTM Tracking under the campaign settings. Defaults are utm_source=Klaviyo (capitalized, which causes the casing problems above), utm_medium=email, utm_campaign=<campaign name>. Override the source to lowercase. Klaviyo also supports custom UTMs at the flow level.
HubSpot. Adds UTMs based on the campaign-level settings. Configurable in Settings → Marketing → Email → Configuration. By default, HubSpot adds utm_source=hubspot, utm_medium=email, and utm_campaign=<email name>. Like Mailchimp, you can override.
Customer.io. Does not auto-tag. You add UTMs to each link manually. This means the discipline burden is on the campaign builder, but you also have full control over each tag.
ActiveCampaign, ConvertKit, Beehiiv. All have similar auto-tag toggles. Check the per-platform docs.
The fix in every case: turn the auto-tagger ON, then override the defaults to use your team's lowercase taxonomy. Most teams accept the defaults and end up with utm_source=Klaviyo in their reports.
Newsletter vs broadcast vs transactional
Three types of email need different tagging strategies:
Recurring newsletter. Same template, different content week to week. Tag at the template level so every send shares utm_campaign=newsletter and utm_content=<position>. Some teams add the date to the campaign value (newsletter-2026-04-12) for week-over-week comparison. The trade-off: per-week values multiply your campaign rows in GA4. We recommend the stable value with utm_content carrying the position.
Broadcast email. A one-off send, like a Q2 launch announcement. Each broadcast gets its own utm_campaign value. Per-link utm_content distinguishes positions inside the email.
Transactional email. Password resets, receipts, order confirmations. Do not tag these. A receipt is not a marketing campaign. Tagging treats every transaction as a marketing event and corrupts your attribution data. The platform-level auto-tag should be OFF for transactional templates.
Internal vs external links inside the email
Every email contains some internal links you should not tag:
- "View this email in browser" link (lands on your ESP-hosted view)
- "Update preferences" link (lands on your ESP preferences page)
- "Unsubscribe" link (lands on your ESP unsubscribe page)
- Social media icons in footer (link to your social profiles rather than to your site)
These should not carry UTMs that would attribute their clicks to your email campaign on landing. Most ESPs handle this correctly by default. Verify by hovering over each link in a test email; the URL should NOT contain UTMs.
What to look at after the send
24 hours after the email lands:
- Source/Medium = mailchimp/email. Total sessions for the campaign.
- Top utm_content values. Which link position drove the most clicks.
- Conversions by utm_content. Which link position drove the most conversions. Often not the same as the top click position.
For teams whose ESP does not auto-tag (or whose template uses dynamic merge tags that the auto-tag mangles), the free Trakl UTM builder generates the per-link URLs without typing the same parameters six times.
The piece on utm tracking in GA4 covers the GA4 settings that affect email attribution specifically (session timeout, cross-domain measurement).
For the broader UTM mechanics, the UTM parameters pillar guide is the foundation. For the tagging convention, utm naming conventions is the playbook.
Frequently filed
Common questions.
Q.01Should every link in an email have UTMs?+
Yes, every external link to your website should carry UTMs. The campaign-level attribution comes from utm_source, utm_medium, and utm_campaign. The link position inside the email comes from utm_content. The same campaign can have a hero, a footer, and three body links each carrying the same source/medium/campaign and different utm_content values.
Q.02Should transactional emails have UTMs?+
No. Password reset emails, receipt emails, and other transactional sends should not carry UTMs. Tagging them treats every transaction as a marketing campaign and corrupts your attribution data.
Q.03Do most email platforms add UTMs automatically?+
Mailchimp, HubSpot, ActiveCampaign, and similar platforms have an "Auto-tag" or "Google Analytics tracking" toggle that adds UTMs to outbound links. The tags are usually utm_source=newsletter or utm_source=mailchimp with utm_medium=email and a utm_campaign matching the email name. Override the defaults if your taxonomy uses different values.
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: the blowup on Unsplash


