Mailerflow Start free
Blog › Email Analytics & Optimization › Email Marketing Analytics

Email Campaign Reporting in Google Analytics 4: UTMs, Traffic, Conversions and Revenue

Published November 4, 2026 · 8 min read

Illustration for Email Campaign Reporting in Google Analytics 4: UTMs, Traffic, Conversions and Revenue

GA4 will only show your email campaigns as email traffic if the links you send carry proper UTM parameters — otherwise clicks land in Referral, Direct or Unassigned, and your campaign report is empty. This tutorial walks through the exact tagging, the GA4 reports to build, a worked example, and how to verify each step so you can see sessions, conversions and revenue per email campaign.

What you'll set up and what you need

Before you touch a link, confirm four things:

  • A GA4 property with data collection active. You need to be able to open Reports > Realtime and see your own visit. If you cannot, fix the tag first; nothing below will work.
  • Edit access to the property. You need it to create custom channel groups and save Explorations.
  • A tagging method. GA4's Campaign URL Builder (a public Google tool) or manual parameters. Manual is fine once you know the five fields.
  • Control over your email platform's link tracking. Some platforms rewrite every link through their own tracking domain. That redirect usually preserves parameters, but it can strip or override them. Send a test before you trust it.

One thing to internalise early: GA4's default channel group has no reliable "Email" bucket unless UTMs are present. A click from an untagged email typically arrives with the sending domain as referrer and gets classified as Referral. If your email client strips the referrer, it becomes Direct. Neither is what you want.

By the end you will have three things: a clean Email channel, a report showing sessions and conversions per campaign, and revenue attribution if ecommerce or key events are configured.

Step-by-step: email campaigns GA4 setup

1. Fix a naming convention before you tag anything

Decide the rules once and write them down. Lowercase only, hyphens instead of spaces, no dates in the campaign name unless you need them for a recurring send.

  • utm_source — the platform or list, e.g. mailerflow or newsletter
  • utm_medium — always email. Not newsletter, not eDM. The default channel grouping looks for email.
  • utm_campaign — the campaign slug, e.g. spring-sale or weekly-digest
  • utm_content — optional, for link position or variant, e.g. hero-cta or variant-b
  • utm_id — optional, a stable ID you can join back to your platform's campaign ID

Verify: read your convention out loud against a real past campaign. If two people would tag it differently, the convention is not specific enough.

2. Build the URL

Use GA4's Campaign URL Builder or assemble it by hand. A complete example:

https://example.com/spring-sale?utm_source=mailerflow&utm_medium=email&utm_campaign=spring-sale&utm_content=hero-cta&utm_id=mlf-1042

Order does not matter. Case does — GA4 treats Spring-Sale and spring-sale as two different campaigns.

Verify: paste the URL into a browser. The page should load normally and the parameters should remain in the address bar.

3. Apply the tags in your sending platform

Two approaches. Per-link tagging gives you the most control and is required if you want utm_content to differ by link. A global parameter setting appends the same parameters to every link, which is faster but blunter.

If your platform wraps links, check whether the wrapper keeps your query string. Send a test to an address you control and inspect the final URL after the redirect.

Verify: open the received test email, hover the link, and confirm the destination includes your parameters.

Send the campaign to yourself, then click each link. Do not skip this — it is the only way to catch a wrapper that drops parameters or a link you forgot to tag.

Verify: the landing page loads and the URL still shows utm_medium=email.

5. Confirm the session in Realtime

In GA4, go to Reports > Realtime > Traffic sources. Within a minute or two you should see a session with source/medium matching your tags.

Verify: the source reads mailerflow (or whatever you chose) and the medium reads email. If it reads (direct) or a domain name, the parameters did not survive.

If you send from several tools and want them all under one "Email" heading, go to Admin > Data display > Channel groups, create a custom group, and add a rule: Session medium exactly matches email. This keeps your email reporting stable even if you change sending platforms.

Verify: after 24–48 hours, open Reports > Acquisition > Traffic acquisition and check that the Email channel shows sessions.

7. Build the reporting view

For a quick read, use Reports > Acquisition > Traffic acquisition and change the dimension to Session campaign. For anything deeper, build an Exploration: dimension = Session campaign (plus Session source/medium and Session manual ad content), metrics = Sessions, Engaged sessions, Key events, Total revenue.

Verify: the campaign names in the report match your naming convention exactly, with no near-duplicates.

8. Save and share the exploration

Save it with a clear name and share it with anyone who reads email performance. A saved exploration beats rebuilding the same report every week.

Everything below is an illustrative example, not a benchmark or a real customer story.

A fictional outdoor-gear brand sends a weekly newsletter with three links: a hero CTA to a tent bundle, a product link to a sleeping bag, and a footer link to the blog. All three share the same campaign, and each gets a distinct utm_content:

https://example.com/tent-bundle?utm_source=mailerflow&utm_medium=email&utm_campaign=weekly-digest&utm_content=hero-cta
https://example.com/sleeping-bag?utm_source=mailerflow&utm_medium=email&utm_campaign=weekly-digest&utm_content=product-link
https://example.com/blog?utm_source=mailerflow&utm_medium=email&utm_campaign=weekly-digest&utm_content=footer-link

In GA4, the Session campaign report shows one row for weekly-digest. Here is what that row might look like, with illustrative numbers:

Session campaign Sessions Engaged sessions Key events Total revenue
weekly-digest 1,240 610 38 $2,140

Switch the dimension to Session manual ad content and the same traffic splits by link position:

Session manual ad content Sessions Key events Total revenue
hero-cta 520 24 $1,480
product-link 480 12 $660
footer-link 240 2 $0

That second table is the useful one. It tells you the hero CTA carries the campaign, the product link converts at a lower rate, and the footer link drives traffic that does not convert. Next week you test a different hero.

One caveat on how GA4 assigns credit: a session is attributed using the last non-direct click within the attribution window. If someone clicked your email yesterday, came back today via a search ad, and converted, the conversion may be credited to the ad, not the email. This is normal and not a bug — it is why email revenue in GA4 often looks lower than email revenue in your platform.

This is also where two data sources answer two different questions. Your email platform's own analytics — delivery, bounces, complaints, clicks and approximate opens, per campaign and overall — tells you whether the email arrived and whether people engaged with it. Mailerflow reports exactly these metrics. GA4 tells you what happened after the click. Read them side by side; neither replaces the other.

How to check it works

Run this checklist after your first tagged send:

  • Realtime shows the session with the expected source and medium.
  • Traffic acquisition shows the campaign within 24–48 hours. A processing delay is normal; do not panic at hour three.
  • Landing page for the session matches the tagged URL, not a redirect target.
  • Conversions appear against the Session campaign dimension, not only against the default channel.
  • DebugView (Admin > DebugView, with the debug extension active) shows the page_view and any events carrying the campaign parameters.
  • No growth in Unassigned or (not set) campaign rows. If those rows are growing, tags are missing or being stripped somewhere.

To tell the two apart: if the referrer is present but the campaign parameters are absent, something stripped your UTMs — usually a link wrapper or an email client. If both are absent, the link was never tagged.

Common mistakes and fixes

  • Inconsistent casing or spacing. Spring Sale and spring-sale become two rows. Fix: enforce lowercase and hyphens in your template.
  • Tagging only some links. Untagged links in the same email fall into Referral. Fix: tag every link, including the unsubscribe-adjacent footer links you actually want measured.
  • Using utm_medium=newsletter. The default channel grouping will not classify it as Email. Fix: use email and put the nuance in utm_source or utm_campaign.
  • Link-wrapping domains that drop parameters. Fix: test the final URL after redirect, and if the wrapper strips parameters, disable it or tag the wrapped destination.
  • Tagging transactional emails. Password resets and receipts are not campaigns; tagging them pollutes your campaign report. Fix: leave them untagged.
  • Expecting GA4 to report opens. It cannot. Opens happen in the inbox, before any page loads. Fix: read opens in your sending platform.
  • GA4 sessions not matching platform clicks. This gap is normal — bounces, link prefetching, privacy tools and repeat clicks within one session all create differences. Fix: compare trends, not exact numbers.
  • Consent mode and cookie restrictions. These reduce what GA4 can observe, so attribution is incomplete by design. Fix: accept the gap and lean on modelled data where GA4 provides it.

FAQ

Why does my email traffic show as Referral or Direct? Because the links were not tagged, or the parameters were stripped in transit. Check the received email's link destination first; if the parameters are there, look at your link wrapper.

Can GA4 track email opens? No. An open is recorded by a tracking pixel in the inbox, which never touches your website. Use your email platform for opens and GA4 for post-click behaviour.

Why do GA4 sessions and my platform's clicks not match? They measure different things. A click can fail to become a session (bounce, prefetch, blocked script), and multiple clicks in one visit count as one session. Small gaps are expected.

Should I use utm_id? It is optional. It helps when you want a stable identifier to join GA4 data with your platform's campaign records, especially across exports.

How long until campaign data appears? Realtime is near-instant. Standard reports typically populate within 24–48 hours.

Do I need a custom channel group for email? Not strictly, but it helps if you send from multiple tools or want a stable Email channel that does not depend on the default grouping rules.

Next steps

Write the naming convention into a shared doc or a link-template snippet so every future send follows it, and add utm_content to every link so you can compare positions and variants. Then put the campaign report on a fixed review cadence — weekly or monthly — and feed what you learn back into subject lines and content.

If you want the loop between reading the report and shipping the next test to be shorter, Mailerflow's A/B testing gives you variant-level results you can pair with utm_content, and the AI email builder turns a short description into a complete responsive design with subject lines and preview text. Create an account when you are ready to run the next test.