Skip to content

How to fix utm_source and utm_medium in GA4, step by step

List Session source and Session medium in GA4's Traffic acquisition report. Mark swapped pairs and spellings GA4 cannot place, and fix them where each link is built. Then re-file past visits with a custom channel group. Purchase paths only improve from the day you fix the tags.

By , Founder & CEOUpdated 9 min read

Run the numbers for your store: the free UTM builder.

To fix utm_source and utm_medium, list both columns in GA4's Traffic acquisition report and mark swapped or unknown values. Correct them where each link is built, such as Meta's URL parameters field. Then re-file past visits with a custom channel group. If you rely on purchase paths, fix the tags first, because that report ignores custom groups.

The plain answer covers what each tag means. This page is the repair job. Every menu below comes from Google's and Meta's help pages, read on 1 October 2026.

Step by step

  1. Pull your source list. In GA4, select Reports, then Acquisition > Traffic acquisition, and switch the table's dimension to Session source. Set the date range to your last full quarter. Path: Reports > Acquisition > Traffic acquisition > Session source.
  2. Pull your medium list. Switch the same table to Session medium and paste both lists into one sheet. Google's advice is one source per platform and one medium per channel, so both lists should be short. Path: the dimension drop-down above the table.
  3. Mark the swaps. A platform name in the medium list, such as facebook or klaviyo, means someone filled the slots the wrong way round. A channel word in the source list, such as email or paid, points the same way. Where: your sheet, one row per suspect value.
  4. Mark the mediums no rule knows. Compare each medium with GA4's default channel definitions. A medium such as newsletter or print matches no rule, so the visit lands in Unassigned unless its source matches a rule by itself. Where: GA4 Help, Default channel group, the rules for manual traffic.
  5. Check paid sources against Google's list. Paid Social, Paid Search and Paid Video only accept a source on Google's lists, which the same help page offers as a spreadsheet. That list holds facebook and fb but not meta, so a paid click tagged meta can land in Paid Other. Where: the link "Download a spreadsheet of GA4 default-channel-group sources and categories".
  6. Find the campaigns behind each bad pair. Set the table to Session source / medium, click the plus next to the dimension drop-down and add Session campaign. Type the bad pair into the search bar above the table. Path: Traffic acquisition > Session source / medium > + > Session campaign.
  7. Fix the pair where the link is built. For Meta ads, open the ad and edit the URL parameters field below Tracking, which Meta says overrides duplicates in the website URL. For Google Ads, leave auto-tagging on, since GA4 uses the auto-tagged source and medium over yours. Path: Ads Manager > your ad > Tracking > URL parameters.
  8. Re-file past visits with a custom channel group. In Admin, under Data display, click Channel groups, then Create new channel group, which starts as a copy of the default. Open its Paid Social channel and add a condition group for the swapped pair, such as Medium exactly matches facebook. Then click Save channel and Save group. Path: Admin > Data display > Channel groups > Create new channel group.
  9. Mind the order of channels. GA4 puts traffic in the first channel whose rule it matches, in the group's current order. If a fixed pair could match an earlier channel, click Reorder, drag your channel above it and click Apply. Path: your group > Reorder.
  10. Make the fixed group your primary channel group. At the top of the Channel groups page, click the pencil icon and pick your new group. Data then fills in with the new rules from that point forward, and the paths report breaks out by this primary group. Path: Admin > Data display > Channel groups > pencil icon.
  11. Test one fixed link. Open the corrected link in a private window. Once the data has processed, type its pair into the search bar in Traffic acquisition. Path: Reports > Acquisition > Traffic acquisition > search bar.

A worked example

Here is the kind of export that should send you to step 1. On one store's Channels sheet, Paid Social holds 0.0% of revenue in last click, first click and touched, while Direct holds 57.7%. The export cannot say whether that store ran no social ads or ran them under pairs GA4 could not file.

For illustration, say your lists from steps 1 and 2 turn up five pairs worth a second look. Here is where GA4's published rules would send each one:

Pair in Traffic acquisitionWhat is wrongWhere GA4 files itFix
facebook / paid_socialNothingPaid SocialKeep it
paid / facebookSource and medium swappedUnassignedfacebook / paid_social at the sender
meta / paid_socialSource not on Google's social listPaid Otherfb or facebook as the source
email / klaviyoSwapped, but the Email rule reads either slotEmailklaviyo / email, so the sender shows
mailer / newsletterA medium no rule namesUnassignedmailer / email

The swap in the second row is the costly one. GA4 has no rule for a medium of facebook, so those ad clicks drop to Unassigned and vanish from every paid report.

The fourth row hides in plain sight. The channel is right, because the Email rule accepts email as a source. But every sender now reads email in the source column, so your newsletter and your flows look like one sender.

Fix the senders first, as in step 7. Then, in the group from step 8, add Medium exactly matches facebook to Paid Social. Add one more condition group there: Source exactly matches meta together with Medium exactly matches paid_social. Last quarter's clicks then move into Paid Social in your reports, retroactively.

Your purchase paths do not move. Google says custom channel groups cannot be used in the Key events paths report, so old paths keep the old verdicts. There, only data from after the fix and the primary group switch reads correctly.

A month later, rerun steps 1 and 2. Pass: facebook and newsletter are gone from the medium list, and meta is gone from the sources. Fail: one of them is back, so a template somewhere still builds the old link.

Back to the export. On the Channels sheet, one store's Paid Social row reads 0.0%. That is what no social ads at all would look like, and also every ad tagged like the second row. Your two lists can tell those apart. The export cannot.

What to check when the report looks wrong

  • Your custom group is missing from the paths report. That is expected. Google says custom channel groups cannot be used in the Key events paths report, which breaks out by the primary channel group instead.
  • Google Ads clicks ignore your hand tags. Also expected. When a click carries auto-tagging and UTMs together, GA4 uses the auto-tagged source and medium.
  • The medium shows (not set). The link carried a source and no medium, and Google says missing UTM parameters result in (not set) values. Unless the source matches a rule by itself, such as a listed social site, the visit lands in Unassigned.
  • A fixed link still shows the old pair. Old sessions keep the pair they arrived with, and only new clicks carry the new one. Compare date ranges before and after the fix.
  • Two senders share one row. One utm_source covers two platforms, such as a newsletter and a text tool both tagged mailer. Split them at the sender, because no report can pull them apart by source later.

What to do this week

  1. Run the two lists. In GA4, open Reports > Acquisition > Traffic acquisition and switch the table to Session source, then to Session medium, for last month. Pass: no platform names among the mediums and no channel words among the sources. Fail: either turns up, so trace it with Session campaign as in step 6.
  2. Read one live Meta ad. In Ads Manager, open your newest ad and find the URL parameters field below Tracking. Pass: utm_source is facebook, fb or ig, and utm_medium starts with paid. Fail: meta, a swapped pair or an empty field, so correct it on the next ad you launch.
  3. Build the history fix. In GA4 Admin, under Data display, click Channel groups and create a new group from the default. Add each swapped pair from your sheet to the channel it belongs in, then save. Pass: with the new group picked as the dimension in Traffic acquisition, Unassigned shrinks for past months. Fail: nothing moves, so check the spelling and the channel order.

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: Traffic acquisition report (Google); URL builders: Collect campaign data with custom URLs (Google); Default channel group (Google); GA4 default-channel-group sources and categories (Google); Add URL parameters to your Meta ads in Meta Ads Manager (Meta); Traffic-source dimensions, manual tagging, and auto-tagging (Google); Custom channel groups (Google); Key events attribution paths report (Google)

Frequently asked questions

  • Can I fix old UTM values in GA4 after the fact?
    Not the stored values: each session keeps the source and medium it arrived with. You can change how they are grouped. A custom channel group can move swapped pairs into the right channel in your reports, retroactively, but not in the Key events paths report.
  • What if two senders share one utm_source?
    Then one row hides two senders, and no report can pull them apart by source later. Google's tagging advice is one unique utm_source for each platform. Split them at the sender now, knowing that past sessions keep the shared value.
  • Why do my fixed links still land in Unassigned?
    Check three things. The medium must be one a GA4 rule names, such as email or affiliate. For paid social, search or video, the source must be on Google's list. And only new clicks carry the fix, because a session keeps the pair it started with.

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.