Campaign URL Builder: Why Two People Tag the Same Link Two Different Ways

Bhargav Dhameliya
Bhargav Dhameliya
August 24, 2026
5 min read

Two people on your team tag the same campaign. Same landing page, same launch, same week. You open GA4 expecting one row and find four.

Neither of them did anything wrong. Both used a campaign URL builder. Both produced a link that works.

Here’s the thing. I spent two years telling people to use Google’s builder before I understood why it kept failing my own team. The builder was never the problem. What the builder cannot do is the problem.

This post is not about how to build a tagged link. I already wrote the step-by-step build walkthrough for that. This is about what happens when two people use the same builder and get answers that do not match.

What a Campaign URL Builder Actually Guarantees

A campaign URL builder guarantees a valid URL, not a consistent one.

A campaign URL builder is a tool that appends UTM parameters to a destination URL so analytics can attribute the traffic. UTM parameters are the labelled tags in a query string (utm_source, utm_medium, utm_campaign) that tell GA4 where a visit came from.

The builder does exactly two useful things. It puts the ? and & separators in the right places. It encodes characters that would otherwise break the link.

That is real work. Hand-typing a query string is how you end up with two ? characters and a link that drops every parameter after the first one.

But look at what the guarantee actually covers:

The builder controls The builder does not control
Query string syntax Which words you type in the fields
Character encoding Whether those words match your teammate’s
Parameter order in the output Whether the values mean anything to GA4
That the URL resolves Whether the campaign already has a name

Every column on the left is about form. Every column on the right is about vocabulary. A builder is a formatting instrument. It is not a governance instrument.

The honest limitation here: this is not a flaw in Google’s tool. A general-purpose builder cannot know your team’s vocabulary, because it has never seen your other campaigns. It is doing the only job it can do.

Why the Blank Field Is the Whole Problem

The blank field is where consistency dies, because a blank field is a question with no answer key.

Open Google’s Campaign URL Builder and look at the campaign source field. It accepts any string. facebook. Facebook. FB. facebook-ads. meta. All valid. All accepted. All different.

Now put two marketers in front of that field on a Tuesday morning. One writes facebook because that is the platform. One writes meta because that is the company. Neither checked, because there was nothing to check against.

Real numbers from an audit I ran on a client account last year: 90 days of data, 11 distinct source values that all meant Facebook. Not one of them showed total Facebook performance. The biggest single row captured 41% of the actual traffic.

Three properties of the builder make this inevitable:

  • No memory. The builder does not save your links. It cannot compare what you typed against what you typed last month.
  • No shared state. Two people using the same builder are using two isolated copies. There is no lookup of what a teammate already used.
  • No validation beyond syntax. It will not flag Facebook as a variant of facebook, because it has no idea facebook exists.

I want to be fair to the tool. Google built a URL formatter and shipped it free. Expecting it to enforce a taxonomy it has no access to is expecting the wrong thing.

What GA4 Does With Two Versions of the Same Campaign

Here is where most explanations get it wrong, and it cost me a full afternoon once to work out why.

Inconsistent values fail in two independent ways. Fixing one does not fix the other.

Failure one: the report splits

GA4 stores UTM values case-sensitively. Facebook, facebook, and FACEBOOK become three separate rows in your Traffic acquisition report.

Nothing merges them. No setting collapses them. The report is showing you exactly what arrived, and what arrived was three different strings.

Failure two: the channel misses

Separately, GA4 matches utm_medium against a fixed vocabulary to assign a default channel. That matching is case-insensitive, and it only accepts specific strings.

For the Email channel, GA4 accepts exactly four values:

  • email
  • e-mail
  • e_mail
  • emailmarketing

For Paid Search, utm_medium must be cpc, ppc, paidsearch, or paid search, and the source must be a recognised search engine. Both conditions, not either.

Anything outside the list matches no rule. newsletter matches nothing. fb matches nothing. paid_search with an underscore matches nothing. paid on its own matches nothing. All of it lands in Unassigned.

Why this combination confuses people

Put the two together and you get the outcome nobody expects.

utm_medium=Email lands in the correct Email channel, because channel matching ignores case. That same value simultaneously creates its own row next to email, because storage respects case.

So your channel report looks clean while your source-medium report is fragmenting underneath it. A team can pass the channel check and still have unusable campaign data.

That is the single most useful thing to understand here. Channel assignment and value storage are two separate operations reading the same field.

The Campaign URL Builder Fields That Cause the Most Disagreement

Not all seven fields are equally dangerous. Three cause most of the arguments.

Campaign source versus campaign medium. This is the most common mix-up I see. Source is where the traffic came from (facebook, newsletter, partner-site). Medium is the type of traffic (social, email, cpc). People routinely put the platform in medium, which breaks channel assignment instantly.

Campaign name. The only genuinely free-text field of the three, and the one with the longest tail of variants. spring_sale, spring-sale, Spring Sale 2026, and springsale are four campaigns as far as GA4 is concerned. This field needs a decision made before the campaign launches, not during.

Campaign ID (utm_id). Almost everyone leaves this blank. It is the one field that can save you later. utm_id is a stable identifier for a campaign that stays constant even when other values drift, which makes it the only practical way to reconcile variants after a campaign has already run.

The trade-off with utm_id: it only helps if it was set from the start. Adding it halfway through a campaign gives you two eras of data that still will not reconcile. It is insurance you have to buy before the accident.

Where the actual naming decisions belong is a separate discipline. I set out the full rulebook in UTM naming conventions, and there is no point repeating it here. The point for this article is narrower: the builder will never ask you whether you have a rule. It just takes the string.

Turning a Campaign URL Builder Into a System

A builder becomes reliable the moment the vocabulary is chosen once instead of every time.

That is the whole shift. You are not replacing the builder. You are removing the blank field.

Three changes, in the order I would make them:

  1. Fix the medium vocabulary first. Write down the exact strings GA4 accepts for the channels you use, and allow nothing else. This single step eliminates Unassigned traffic, and it takes about fifteen minutes.
  2. Turn recurring campaigns into templates. If you run a monthly newsletter, the source and medium should never be typed again. They get typed once and reused. Typing is where variants come from.
  3. Validate at creation, not at reporting. A wrong value caught in the report is already in your data permanently. A wrong value caught at creation costs nothing.

That third point is the one that actually changed my team’s data. We used to audit monthly and fix nothing, because you cannot retroactively repair a tagged link that people have already clicked. Now UTM rules reject a non-conforming value before the link exists, which means the audit finds nothing because there is nothing to find.

Honest limitation: enforcement adds friction. Someone will hit a blocked value at 6pm before a launch and be annoyed. The trade is real. I think a five-second delay at creation beats a quarter of unusable attribution data, but that is a judgment call, and on a two-person team the informal version may genuinely be enough.

Where This Approach Breaks

Four situations where consistency at creation does not save you.

Platforms that auto-tag. Google Ads appends gclid and can auto-tag independently of your manual UTM values. If both are present, GA4 generally prefers the auto-tagged data. Your careful manual tagging can be overridden by a setting in a different platform.

Links you do not create. Partners, affiliates, and press contacts tag their own links. You can send them a template. You cannot enforce anything. Expect drift on every external relationship.

Historical data. None of this repairs the past. Values already in GA4 stay as they are. You are fixing the flow from today forward, and the first 90 days of a cleanup still look messy in year-over-year comparisons.

Renaming mid-campaign. Changing a campaign name after launch creates a second campaign in your reports, not a renamed one. The old value keeps collecting traffic from links already in circulation. This is exactly what utm_id exists to survive.

Frequently Asked Questions

What is a campaign URL builder?

A campaign URL builder is a tool that adds UTM parameters to a destination URL so analytics platforms can attribute the resulting traffic to a named campaign. It handles the query string syntax, placing the ? and & separators correctly and encoding special characters. Google’s version is free and covers GA4, iOS, and Play. It formats the link, but it does not check the values you type.

Are UTM parameters case sensitive in GA4?

Partly, and the distinction matters. GA4 stores UTM values case-sensitively, so Facebook and facebook appear as two separate rows in your reports. However, GA4 matches utm_medium against its default channel vocabulary case-insensitively, so Email and email both reach the Email channel. This means a value can be assigned to the right channel and still fragment your source-medium report.

Why do two people build different links for the same campaign?

Because the builder presents empty fields with no reference to what anyone else used. One person writes facebook, another writes meta, and both links are technically valid. The tool has no memory of past links and no shared state between users, so there is nothing to compare against. Consistency has to come from a rule outside the builder.

Does Google’s Campaign URL Builder check for mistakes?

It checks syntax only. The builder will correctly encode and assemble any strings you give it, including misspellings, inconsistent casing, and medium values that GA4 does not recognise. It will not warn you that newsletter fails to match a default channel rule, or that you used Facebook last month and facebook today.

What is the utm_id field for?

utm_id is a stable campaign identifier that stays constant even when other parameter values drift. Because it does not change, it is the only practical way to group variants of the same campaign back together in reporting. Most people leave it blank. It only helps if you set it from the campaign’s first link, since adding it partway through leaves you with two sets of data that still will not reconcile.

Why is my tagged traffic showing as Unassigned?

Almost always because utm_medium does not match any of GA4’s default channel rules. Values like newsletter, fb, ads, or paid_search match nothing and fall through to Unassigned. Check the exact strings GA4 expects for your channel, such as email, e-mail, e_mail, or emailmarketing for the Email channel, and correct your medium vocabulary going forward.

Stop Fixing Tags in the Report

A campaign URL builder is a good tool doing a narrow job. It makes a link that works. It cannot make a link that agrees with your teammate’s, because agreement is not a formatting problem.

Start with the smallest version of the fix. Write down the exact medium values GA4 accepts for your channels. Turn your two most frequent campaigns into templates. Then stop letting anyone type a source from memory.

To build tagged links against a fixed vocabulary instead of a blank field, use the free UTM builder at linkutm.

Bhargav Dhameliya

About Bhargav Dhameliya

Share this article

Ready to track your campaigns better?

Join thousands of marketers who use linkutm to build, track, and manage their marketing campaigns with ease.

Get Started for Free