Skip to content

How to tag email links for GA4, step by step

Fix one source per sender, utm_medium=email and a campaign name per send. Switch on automatic tagging in Klaviyo or check Shopify Messaging's defaults. Tag the links your tool skips, click a test send, and find the clicks in GA4's Traffic acquisition report a day or two later.

By , Founder & CEOUpdated 8 min read

Run the numbers for your store: the free email marketing ROI calculator.

Usually in five moves. Fix the tag values, then switch on UTM tracking in Klaviyo or check Shopify Messaging's defaults. Tag by hand the links your tool skips. Click a test send, then find the clicks in GA4's Traffic acquisition report. If the medium does not read email, those clicks usually miss GA4's Email channel.

Every menu below is copied from the Klaviyo, Shopify and Google help pages listed at the end. The reasons behind each setting sit in the plain answer.

Step by step

  1. Fix three values before you open any settings. Set utm_source to the sender, such as klaviyo or shopify_email. Set utm_medium to email on every message, and give each send or flow its own utm_campaign. Path: Analytics Help, URL builders: Collect campaign data with custom URLs, Add utm parameters to URL.
  2. Test the medium against GA4's Email rule. GA4 files a visit under Email when its source or medium is email, e-mail, e_mail or e mail. A medium such as newsletter, campaign or flow matches no rule and usually lands in Unassigned. To test one link before launch, paste it into the UTM builder and GA4 channel checker. Path: Analytics Help, Default channel group, Channels for manual traffic.
  3. Switch on Klaviyo's account-wide tagging. Click your account name in the bottom left, select Settings, then click Other > UTM tracking. Toggle on the parameters you want and set utm_medium to Message type. Toggle on Automatically add UTM parameters to links, then click Save. Path: Settings > Other > UTM tracking.
  4. Replace the old Klaviyo default if you still have it. Klaviyo switched the default utm_medium from campaign and flow to Message type on 2 June 2025. If you customised and saved your UTM settings before that date, the old values are still in place. Path: Settings > Other > UTM tracking, the utm_medium row.
  5. Tick the box in every flow email. Open the Flows tab, open the flow and select a message in the flow builder. Under Settings, check Enable UTM Tracking and click Save, then repeat for each message in the flow. Path: Flows > your flow > message > Settings.
  6. Switch tracking on before a campaign goes out. Open an unsent campaign from the Campaigns tab. In the Tracking section of Step 1: Recipients, enable Include tracking parameters. A scheduled campaign must be paused first, and a sent one cannot be changed. Path: Campaigns > your campaign > Step 1: Recipients > Tracking.
  7. On Shopify Messaging, read the defaults. From your Shopify admin, go to Apps > Messaging, click Settings and find the UTM tracking section. The defaults are utm_source=shopify_email, utm_medium=email and a campaign value made of the email name plus activity ID. Path: Apps > Messaging > Settings > UTM tracking.
  8. Tag the links your tool skips by hand. Klaviyo cannot add dynamic UTM parameters to product blocks or data feeds, though static product blocks can take them by hand. Build those links in Google's Campaign URL Builder with the same three values. Add utm_content when two buttons point at one page. Path: Analytics Help, URL builders, Campaign URL Builder.
  9. Use full https:// links. Klaviyo's help says email links need http:// or https:// in order to be tracked, so a bare www address is a risk. Path: the link field of each button and image.
  10. Send a test and click every link. Open each link from the test email in a private browser window. When the page loads, the address bar should still show utm_source, utm_medium and utm_campaign. If they are gone, a redirect or a link shortener stripped them on the way. Path: your inbox, then the address bar.
  11. Find the clicks in GA4 a day or two later. GA4's help says data processing can take 24-48 hours. Then go to Reports > Acquisition > Traffic acquisition, set the table to Session source / medium and search for klaviyo / email. Path: Reports > Acquisition > Traffic acquisition, search bar above the table.
  12. Split the result by send. Switch the table's dimension to Session campaign. Each campaign and each flow should show up under its own name. Path: Traffic acquisition, the dimension drop-down above the table.

A worked example

Start with one store's export. On Store A's Channels sheet, Direct holds 57.7% of revenue in last click, first click and touched alike. On its Journeys sheet, journeys with 1 touch hold 79.5% of revenue and took 0.5 days to buy. The export cannot say how much of that revenue began with an untagged email click.

So test your own links instead. For illustration, take a store that sends a weekly campaign and runs a welcome flow from Klaviyo. Its UTM settings were customised and saved in 2024, before Klaviyo's change, with utm_source set to the fixed value klaviyo. Here is where its links would land under GA4's published rules:

Link in the emailTags it carriesWhere GA4 files the click
Button in the weekly campaignutm_medium=campaignUnassigned
Button in the welcome flowutm_medium=flowUnassigned
Button typed as www.yourstore.com, no https://none, since Klaviyo does not track itDirect, when no referrer comes along
A campaign called Shop the drop, after the medium fixutm_medium=email, campaign value with shop in itOrganic Shopping can match before Email

The fixes map onto the steps. Step 4 moves the medium to Message type, so both buttons arrive as klaviyo / email. Step 9 puts https:// in front of the bare address. Renaming the campaign value without shop in it keeps it clear of the Organic Shopping rule.

The last three steps check the result. Pass: klaviyo / email rows with sessions, and the welcome flow under its own name in Session campaign. Fail: klaviyo / campaign keeps showing up, because that message carries custom tracking parameters that ignore the account setting.

Expect the old rows to fade rather than vanish. Sent messages keep their tags, and people still click last month's email.

One limit before anyone celebrates: an Email row says where the click came from, not whether the email made the sale.

What to check when the report looks wrong

  • klaviyo / campaign survives the fix. That message uses custom tracking parameters, so new account settings skip it. Klaviyo's help says it rejoins the account settings once custom parameters are switched off in the message.
  • Your emails land in Organic Shopping. The campaign value matches GA4's shopping pattern, which GA4 lists before Email. GA4 assigns traffic to the first channel whose definition it matches, so rename the value without shop or shopping in it.
  • Texts show up under Email. Your medium is a fixed email value for every message type. Klaviyo recommends Message type if you send more than one channel, and that tags texts as sms.
  • Today's rows have no source or campaign. GA4's help says intraday data can have temporary gaps in source, medium, campaign and default channel group. Look again once the daily data is in.
  • A Shopify Messaging edit changed nothing. Edited UTM settings apply to new email campaigns only, not to existing campaigns or drafts. Create a fresh campaign to test the change.
  • Klaviyo and GA4 disagree on revenue. That is expected, not a tagging error. Klaviyo's help says GA4 counts link clicks while Klaviyo reads store data, so the two won't exactly align.

What to do this week

  1. Audit one live flow, message by message. In Klaviyo, open the Flows tab and select each message of your busiest flow in turn. Pass: Enable UTM Tracking is ticked on every message. Fail: one or more are unticked, so their clicks go out bare; tick the box and save.
  2. Click a test of your next campaign. Send yourself a test before it goes out and open every link in a private window. Pass: each landing page keeps utm_medium=email in the address bar. Fail: a link lands without tags, so tag it by hand or point it straight at the final page.
  3. Check that each send gets its own row. In GA4, go to Reports > Acquisition > Traffic acquisition and switch the dimension to Session campaign. Pass: last week's campaign and each flow appear under their own names. Fail: (not set) or one name for everything, so the campaign tag is missing or fixed.

Check the homework. Your GA4 Attribution paths export already holds the evidence. Causality Engine reads that one file and shows what each channel caused next to what last-click gave it, in 1 to 2 minutes, for €99 once (excluding VAT), refundable within 30 days. Check the homework

Sources, 1 October 2026: URL builders: Collect campaign data with custom URLs (Google); Default channel group (Google); Custom channel groups (Google); Understand (direct) / (none) traffic (Google); Traffic acquisition report (Google); Data freshness (Google); How to add UTM tracking to campaigns and flows (Klaviyo); Understanding UTM tracking in Klaviyo (Klaviyo); Shopify Messaging email analytics (Shopify)

Frequently asked questions

  • Can I add UTM parameters to an email that has already been sent?
    No. Klaviyo's help says UTM parameters cannot be edited for sent messages, and a scheduled campaign must be paused before you change them. Shopify Messaging applies edited UTM settings to new campaigns only. Fix the settings now, and the next send carries the right tags.
  • Should text message links use the same UTM tags as email?
    Keep the source and campaign, change the medium. GA4 has a separate SMS channel for a source or medium of sms. In Klaviyo, setting utm_medium to Message type tags texts as sms and emails as email, so the two channels stay apart in your reports.
  • Do Klaviyo product blocks get UTM parameters?
    Not dynamic ones. Klaviyo's help says dynamic UTM parameters cannot be applied to product blocks or data feeds. You can still add them by hand to static product blocks. Test those links in a send, because an untagged product click can lose its source.

Go deeper: Causal attribution, explained.

Sixty-second versions of these ideas: Causality Engine on YouTube Shorts.

Keep reading

Terms in this article

Browse the full glossary

Your platforms guess.
We run the math.

Upload a GA4 export and see what each channel caused, next to last-click, in 1–2 minutes. The read is yours to keep.

Free, in your browser: your file is not uploaded. The full read is €99, refundable within 30 days. Prices exclude VAT.
Or book a 30-min call.