GA4 Troubleshooting

Klaviyo GA4 Attribution Mismatch? Fix Source/Medium and Missing Flow Revenue

If Klaviyo says email drove revenue but GA4 says Direct, Unassigned, or zero conversions, the issue is usually session integrity and UTM governance, not just reporting lag.

Jun 30, 2026 10 min readBy The UTM Drift Guard team
GA4 Troubleshooting
EmailEMAILe-mailemail

Klaviyo says the campaign worked. GA4 says email barely existed. Or campaigns appear in acquisition reports while flows disappear into Direct, Unassigned, or a weird split like klaviyo / campaing. That mismatch usually is not a philosophical attribution debate. It is a tagging and session-integrity problem you can audit: inconsistent utm_medium values, missing flow campaign parameters, encoded campaign names, or landing-page and checkout paths that stop preserving the original email session.

Why Klaviyo and GA4 disagree in the first place#

Klaviyo and GA4 are answering different questions. Klaviyo is optimized to explain email performance inside the send and flow system. GA4 is trying to preserve session and purchase context across landing pages, consent rules, redirects, and checkout. When those layers stay clean, the numbers still will not match perfectly. But when the gap is extreme such as email revenue in Klaviyo versus almost nothing in GA4, the first thing to audit is not the model. It is whether the original email session reached GA4 intact and stayed labeled the same way all the way to conversion.

10–20%

of GA4 sessions commonly land in Unassigned

26%

of conversions can be credited to the wrong channel when UTM data is fragmented

29%

attribution accuracy improvement after standardization (Cometly, 2026)

  1. 1Klaviyo send or flowTemplate adds campaign parameters
  2. 2Email clickBrowser or wrapper opens the tagged URL
  3. 3Landing pageUTMs must survive redirects and consent timing
  4. 4Checkout or form pathSession context must persist to conversion
  5. 5GA4 reportingIf a hop fails, email shrinks and Direct grows
Klaviyo attribution breaks when one of these handoffs rewrites or drops the original email session details.

Run the Klaviyo to GA4 mismatch audit in 6 steps#

You do not need to reverse-engineer the whole lifecycle stack on the first pass. The fastest route is to test one campaign link and one flow link, then compare how GA4 stores them. The goal is to prove exactly where the label changes.

  1. 1

    Start in GA4 with Session source / medium

    Open Traffic acquisition and switch the primary dimension to Session source / medium. Look for email traffic split across values like klaviyo / email, email / email, klaviyo / flow, klaviyo / campaign, or (direct) / (none). If the rows are already fragmented, fix the labeling problem before you trust any top-line revenue comparison.

  2. 2

    Compare one campaign link and one flow link side by side

    Send yourself a live campaign email and trigger one real flow email. Click both. Watch the final URL and confirm each keeps utm_source, utm_medium, and utm_campaign all the way to the landing page. If flows fail while campaigns succeed, you have narrowed the problem to the flow template or the flow-specific path.

  3. 3

    Check whether utm_medium is stable

    GA4 can only classify cleanly if the medium is predictable. If one link says email, another says klaviyo-email, and a third says flow, the email lane fragments immediately. Align this with the governance rules in UTM naming convention for teams.

  4. 4

    Inspect session campaign values for encoding drift

    Recent public Klaviyo threads showed GA4 storing campaign names as encoded variants like 4th$2520of$2520July.... If one campaign appears under two spellings, compare the sent URL, the landing-page URL, and the exact campaign token GA4 stores. One campaign split into two rows is still a taxonomy problem even if the click technically arrived.

  5. 5

    Trace the post-click path through Shopify or your checkout stack

    If email sessions look tagged on the landing page but revenue still shifts to Direct, the leak may happen after the click. Audit the checkout or form path exactly as you would in Shopify direct traffic spike in GA4: consent timing, redirects, app scripts, and session persistence to purchase.

  6. 6

    Export the raw rows before changing templates

    Pull source / medium and session campaign data into CSV before you change anything. That gives you the before-state, shows every split token at once, and makes it obvious whether the mismatch is mostly a Klaviyo setup issue or a broader GA4 hygiene problem like GA4 UTM not working.

What the team sees today

Campaigns show, flows vanishEmail revenue in Klaviyo, Direct in GA4One send appears as two campaign namesSource / medium rows split across custom labels

What the audit should produce

One canonical email mediumFlow and campaign links both preserve UTMsCampaign names resolve to one token eachRevenue gap narrows to model differences, not broken labels
The clean state is boring on purpose: one source, one medium policy, and flow traffic that does not disappear on the way to conversion.

The 5 most common root causes in Klaviyo + GA4#

These five issues explain most severe Klaviyo versus GA4 attribution mismatches found in current public evidence.
Root causeWhat you seeWhat to verify first
Flows use different UTM logic than campaignsCampaigns appear in GA4 but flows do notCompare a live flow URL against a live campaign URL parameter by parameter
Medium drift across email linksEmail is split across several source / medium rowsWhether every send uses one canonical utm_medium value such as email
Campaign-name encoding or formatting driftOne send appears as two GA4 campaign namesSpaces, encoding, capitalization, and token formatting inside utm_campaign
Landing-page or redirect strippingUTMs appear in the email builder but not on the final URLRedirects, click wrappers, route rewrites, and in-app browser behavior
Checkout or conversion-path resetEmail sessions arrive, but conversions move to Direct or UnassignedConsent timing, Shopify checkout handoff, and session persistence after click

1) Flows often break where campaigns do not

This is the exact pain pattern repeated in current Klaviyo-community evidence: campaigns pull through to GA4, but flows stay missing. That usually means the email channel is not broken in general. One lane is tagged cleanly and the other is not. Treat that as good news. It narrows the fix to flow-specific URL construction, a missing campaign token, or a post-click path unique to flow destinations.

2) Medium drift makes one email lane look like three

Teams often overcomplicate this by inventing a new medium for every message type. email, flow, newsletter, and sms-email might all feel descriptive, but they force GA4 to treat one lifecycle channel as several acquisition lanes. Put the detail somewhere safer, such as utm_campaign or utm_content, and keep the medium policy stable. If you need channel-level granularity for SMS, create an intentional rule for it instead of letting templates invent their own labels.

Klaviyoklaviyoemailnewsletter
klaviyo
Emailemailflowklaviyo-email
email
VIP Drop 2026vip_drop_2026vip%20drop%202026
vip-drop-2026
Browse Abandonmentbrowse_abandonmentbrowse-abandonment
browse-abandonment
The mismatch is often one email program split by avoidable label drift rather than a deep attribution mystery.

3) Encoded campaign names create fake duplicates

Several same-day Klaviyo threads describe campaign names mutating into encoded strings inside GA4. Even when revenue is real, that formatting drift makes reporting tedious and can hide performance under multiple rows. The practical fix is simple: keep utm_campaign lowercase, avoid spaces, and use one repeatable token format. UTM campaign naming structure gives you a structure that survives handoffs without becoming unreadable.

A safer Klaviyo URL policy: one source, one medium, and campaign names that do not split when GA4 stores them.
https://example.com/products/serum?utm_source=klaviyo&utm_medium=email&utm_campaign=vip-drop-2026&utm_content=campaign-hero
https://example.com/products/serum?utm_source=klaviyo&utm_medium=email&utm_campaign=browse-abandonment&utm_content=flow-reminder-1

What a clean Klaviyo attribution policy should look like#

You are not trying to make Klaviyo and GA4 identical. You are trying to remove preventable drift so the remaining difference is explainable. A clean policy is boring: one source convention, one medium convention, campaign names that do not fork, and a QA habit for both campaigns and flows. Once that is in place, you can have a real attribution conversation instead of a labeling conversation disguised as an attribution one.

Klaviyo + GA4 pre-send QA checklist

  • Campaign and flow templates both append the same canonical utm_source and utm_medium policy.
  • Campaign names are lowercase and do not contain raw spaces or stray punctuation.
  • One live campaign link and one live flow link were clicked and verified on the final landing page.
  • Session source / medium in GA4 shows one stable email lane instead of fragmented variants.
  • The conversion path was tested through checkout or form completion, not only to the landing page.

Do not debug from dashboard totals alone

If Klaviyo says revenue exists and GA4 says zero, avoid arguing from topline screenshots. Export the raw source / medium and session campaign rows first. Severe mismatch with fragmented labels is a governance problem until proven otherwise.

Audit the export before you rewrite every template#

A manual spot check catches one broken link. An export audit catches the whole pattern: every medium variant, every encoded campaign token, and every row that fell into Direct or Unassigned after a Klaviyo send. That is why UTM Drift Guard starts with the CSV and grades the mess before it suggests a canonical taxonomy. The Claude API clusters spelling, case, and token variants so you can review the problem as a system, not as one email at a time. Nothing writes back to Klaviyo or GA4 automatically.

For lifecycle teams, that matters because the same mismatch rarely stays isolated to one campaign. The exact same drift usually appears in flows, promo blasts, SMS-to-email hybrids, and ecommerce handoffs. Once the export is clean, outreach and reporting get easier because the proof asset is specific: you can show exactly which source / medium and campaign tokens are poisoning the report.

Why does Klaviyo show revenue but GA4 shows zero email conversions?

Usually because GA4 is not preserving the original email session cleanly through the landing page or conversion path. Common causes are missing or inconsistent utm_medium values, flow-specific tagging gaps, redirects that strip UTMs, and checkout steps that reset attribution to Direct or Unassigned.

Why do Klaviyo campaigns appear in GA4 but flows do not?

That usually means the problem is specific to the flow lane, not email in general. Compare a live campaign URL and a live flow URL side by side. If the flow template is missing a parameter, uses a different medium policy, or lands on a path that rewrites the query string, GA4 will undercount flows even while campaigns look normal.

What should utm_medium be for Klaviyo in GA4?

The important thing is consistency. Many teams keep utm_medium=email for both campaigns and flows, then use utm_campaign or utm_content to describe the send type. If you invent a different medium for each email class, GA4 splits one lifecycle channel into several rows and the mismatch gets worse.

Why is one Klaviyo campaign name showing as two rows in GA4?

Encoding and formatting drift is the usual cause. Spaces, mixed capitalization, and token variations can make one campaign appear as multiple GA4 values. Use lowercase campaign names with a stable separator format so the exact same send resolves to one row every time.

What is the fastest way to audit a Klaviyo GA4 attribution mismatch?

Export session source / medium and session campaign data, then click one real campaign link and one real flow link from end to end. Confirm the final landing page keeps the UTM parameters, confirm the medium policy is stable, and confirm the conversion path preserves the same session through to purchase or form completion.

See which Klaviyo rows are actually breaking GA4

Paste your GA4 source / medium export and get an A–F UTM health grade, clustered email variants, and the exact rows turning lifecycle revenue into Direct or Unassigned.

Run a free audit