On this page+
Klaviyo's UTM tracking lives in three places: the account level, the campaign level, and the flow level. Each has its own settings, and the defaults capitalize utm_source in a way that conflicts with the lowercase convention every clean GA4 setup uses. Most teams set up Klaviyo once, miss one of the three settings, and end up with split data across multiple rows.
Here is the practical setup.
Where the toggles live
1. Account-level default. Account → Settings → Other → UTM tracking. Set "Add UTM parameters to outbound links" to on. This applies to all campaigns and flows by default.
2. Per-campaign override. Inside the campaign builder, under "Tracking & links" → "UTM parameters." Override the account default for this specific campaign.
3. Per-flow override. Inside a flow's email step, under "Tracking" → "UTM parameters." Override the account default for this specific flow.
The three levels exist because different sends need different campaign values. A weekly newsletter campaign uses one campaign value. The post-purchase flow uses another. Setting them per-level keeps the attribution clean.
What Klaviyo adds by default
For a campaign named "Q2 Launch":
utm_source=Klaviyo
utm_medium=email
utm_campaign=Q2 Launch
Same problems as Mailchimp's defaults:
- utm_source is capitalized ("Klaviyo" instead of "klaviyo"). Lowercase the value at the account level.
- utm_campaign carries spaces. Override at the campaign level with hyphenated lowercase:
q2-launch. - No utm_content. Klaviyo does not auto-tag utm_content; you append it manually in the URL field of each template link.
Account-level setup
Account → Settings → Other → UTM tracking. Three fields:
utm_source: klaviyo
utm_medium: email
utm_campaign: {{ campaign.name | lowercase | replace_string: " ", "-" }}
The third value uses Klaviyo's Liquid templating to lowercase and hyphenate the campaign name automatically. Most teams skip this and end up with utm_campaign=Q2 Launch rendering as Q2%20Launch in URLs. The Liquid filter pattern fixes it on the way out.
For the medium value, default email is correct. Some teams use email-newsletter or transactional for finer-grained channel grouping; either works as long as the value is in GA4's Email channel grouping match list.
Flow-level setup
Klaviyo flows are automations: welcome series, abandoned cart, post-purchase, win-back. Each flow gets its own UTM settings inside the flow's email step.
The convention we recommend:
| Flow | utm_source | utm_medium | utm_campaign |
|---|---|---|---|
| Welcome series | klaviyo | welcome | |
| Abandoned cart | klaviyo | abandoned-cart | |
| Post-purchase | klaviyo | post-purchase | |
| Win-back | klaviyo | win-back | |
| Browse abandoned | klaviyo | browse-abandoned |
The campaign value is what your team will use to slice automation performance in GA4. Using a stable value per flow makes the data legible: "win-back has been driving X conversions per month for the last six months."
Per-recipient utm_content via Liquid
Klaviyo's Liquid templating extends to URL parameters. You can set utm_content based on the recipient's segment, the email step, or the trigger that fired the flow.
In the campaign editor or flow step, under Tracking → UTM parameters, add a custom utm_content value:
utm_content: {{ segment.name | lowercase | replace_string: " ", "-" }}
Now every recipient's UTM-tagged link carries their segment as utm_content. In GA4, you can slice clicks by segment without manually building variant URLs.
This is cleaner than the manual approach Mailchimp requires and is the strongest reason teams pick Klaviyo for sophisticated email programs.
What about transactional emails?
Do not auto-tag transactional emails. Receipt emails, password resets, shipping notifications should not carry UTMs. The Klaviyo flow toggle for UTM tracking should be OFF on transactional templates.
If you use the same Klaviyo flow for both marketing and transactional sends (not recommended), split the flow into two so each can have its own UTM settings.
Verifying the setup
Three checks before relying on the data:
- Send a test campaign to yourself. Open a link from the test email in incognito. Confirm the URL bar shows lowercase utm_source, the right campaign, and the right utm_content.
- Check GA4 Realtime while clicking. The session should appear with
utm_source=klaviyoand the right campaign value. - Audit existing flows. Go through every active flow and confirm the UTM settings are correct. Most teams have at least one flow with the default capitalized utm_source still in place.
Wrapping Klaviyo links in a shortener
If you want branded short URLs in your Klaviyo emails (acme.co/q2 instead of long tagged URLs), the workflow:
- 01
Build the long tagged URL.
Either let Klaviyo auto-tag, or paste a pre-tagged URL into the Klaviyo template's link field. - 02
Shorten the URL through your tool.
Trakl, Bitly, Rebrandly, Short.io. Paste the Klaviyo-tagged URL, get a short URL. - 03
Replace the link in the Klaviyo template.
Where you previously used the long URL, paste the short URL. Klaviyo's auto-tag does not re-tag URLs that already have UTMs. - 04
Disable Klaviyo's UTM tracking for this template if needed.
If your shortened URL already has UTMs and you want Klaviyo to not duplicate them, toggle the campaign-level UTM tracking off for this specific send.
The trade-off: Klaviyo's analytics on opens-vs-clicks still works on the shortened URL, but the click count Klaviyo reports may differ slightly from your shortener's because of how Klaviyo's tracking pixel interacts with the short link.
Common Klaviyo-specific mistakes
- Capitalized utm_source. The most common. Override at the account level once.
- Forgetting to set UTM tracking on flows. Account-level default does not always apply to flows; check each flow individually.
- Using campaign.name without the lowercase Liquid filter. Spaces and capitals leak through.
- Setting different conventions per flow. Pick a consistent format across all flows so your GA4 reports group cleanly.
For the per-flow overrides where Klaviyo's account-level UTM template does not apply, the free Trakl UTM builder generates the tagged URL once and you paste it into the flow's link field.
- Tagging links inside transactional emails. Receipts and shipping notifications should not carry UTMs.
For the broader email tagging strategy, UTM tracking for email campaigns covers the patterns. For Mailchimp specifically, UTM tracking in Mailchimp is the parallel guide.
Frequently filed
Common questions.
Q.01Does Klaviyo add UTMs automatically?+
Yes, when UTM tracking is enabled at the account level. The defaults are utm_source=Klaviyo (capitalized, which causes the casing problems most teams have), utm_medium=email, and utm_campaign matching the campaign or flow name. Override the source to lowercase before launching anything.
Q.02How is UTM tracking different in Klaviyo flows vs campaigns?+
Campaigns are one-time sends. Flows are automated sequences (welcome, abandoned cart). Each has its own UTM settings. A campaign-level override does not apply to flows. Set both at the account level, then override per flow if you need a different campaign value.
Q.03Can Klaviyo add UTMs based on segment?+
Yes, using URL parameters in the Klaviyo template editor. You can write utm_content={{ segment.name }} in the template's URL fields, and Klaviyo populates it dynamically per recipient. This is the cleanest way to attribute clicks back to subscriber segments.
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.

