Breakthrough3x · Tutorials · How-to

How to Create UTM Tracking Codes for Email Links

Add a small piece of tracking text to the links inside client emails, so Google Analytics can tell you exactly how many people clicked and what they did next. No technical skills needed — use the generator below, fill in three boxes, copy the link.

The 30-second version

  1. Scroll to the generator below.
  2. Fill in the 3 boxes: the page the link goes to, where you're sending it from, and the name of the email.
  3. Click Copy link.
  4. Paste that link into your email button or text link, exactly like you'd paste any normal link.

That's it. The reader clicks and the page opens normally — they never notice anything. But now Google Analytics knows the visit came from that email.

What is a UTM code?

A UTM code is just extra text stuck onto the end of a link. It's a name tag for the link. It doesn't change where the link goes — it only tells Google Analytics where the click came from.

Here's a normal link, and the same link with a UTM tag added:

Normal link:

https://clientsite.com/spring-offer/

Same link, tagged:

https://clientsite.com/spring-offer/?utm_source=newsletter&utm_medium=email&utm_campaign=spring-offer-2026

Both open the same page. The second one just carries a name tag along with it.

Why bother? Without the tag, clicks from an email show up in Google Analytics as "Direct" — the same bucket as someone who typed the web address in from memory. You can't prove the email did anything. With the tag, you can tell the client "this email drove 240 visits and 12 leads." That's the whole point.

UTM Link Generator

Fill in the boxes. The finished link builds itself at the bottom. Nothing is saved or sent anywhere — this runs right in your browser.

Paste the full web address of the page you want people to land on. Copy it straight from your browser's address bar.
The list or email tool. Pick one and use the same word every time.
For emails this is always email. Locked so it can't be typed wrong.
A short, clear name for this specific send — include the month or year so next month's email doesn't blend in with this one.
Only needed if the same email has several links, or you're testing two versions. Examples: header-button, footer-link, version-a. Leave blank if you're not sure — you don't need it.
Your finished link
Fill in the boxes above and your link appears here…

How to fill in each box (with real examples)

Three pieces of information, that's all:

BoxWhat to putExamples
Where should the link go?The page you want the reader to land onhttps://clientsite.com/spring-offer/
Where are you sending from?The name of the list, or the email toolnewsletter, promo-list, mailchimp
What's the email called?A name for this specific send, with a datespring-offer-2026, march-newsletter

Example 1 — a promo email with a "Book Now" button

The button should open the spring offer page. You'd fill in: https://clientsite.com/spring-offer/, newsletter, spring-offer-2026. Out comes:

https://clientsite.com/spring-offer/?utm_source=newsletter&utm_medium=email&utm_campaign=spring-offer-2026

Paste that into the button's link field in your email tool.

Example 2 — a monthly newsletter linking to a blog post

https://clientsite.com/blog/summer-hvac-tips/?utm_source=newsletter&utm_medium=email&utm_campaign=march-newsletter&utm_content=article-1

The article-1 at the end is the optional box — it lets you see which of the newsletter's several links people actually clicked.

Example 3 — testing two versions of the same email

Same email, same campaign name, but the last part is different for each version:

Version A: …/tune-up/?utm_source=promo-list&utm_medium=email&utm_campaign=ac-tuneup-blast&utm_content=version-a
Version B: …/tune-up/?utm_source=promo-list&utm_medium=email&utm_campaign=ac-tuneup-blast&utm_content=version-b

Now Google Analytics can show you which version won.

6 rules to keep it clean

  1. Always use lowercase. Email, email, and EMAIL get counted as three different things in reports. The generator lowercases for you automatically.
  2. No spaces — use dashes. Write spring-offer-2026, not Spring Offer 2026. The generator converts spaces to dashes for you.
  3. Pick your words once and stick with them. If you use newsletter this month, don't switch to news next month — Analytics will treat them as two separate sources and split your numbers in half.
  4. Put a date or month in the campaign name. march-newsletter is better than just newsletter, so April's send doesn't get mixed in with March's.
  5. Only tag links that leave the email. Never add a UTM to a link that goes from one page of the client's site to another page of the same site — it wipes out the original tracking mid-visit.
  6. Keep a list per client. One shared sheet with the exact words you use for each client, so everyone on the team tags things the same way.
The short version to memorize: the middle piece is always email. The first piece is the list you're mailing. The last piece is the name of that specific email. Get those three right and you're done.

Tagging a lot of links at once

If you're tagging a whole newsletter's worth of links, doing them one at a time is slow. Use Google Sheets instead:

  1. Column A = the destination page for each link
  2. Column B = the source (e.g. newsletter)
  3. Column C = the campaign name (e.g. march-newsletter)
  4. In column D, paste this formula:
=A2&"?utm_source="&B2&"&utm_medium=email&utm_campaign="&C2

Drag it down the column — one finished link per row, ready to copy into the email.

Where to see the results

After the email goes out and people start clicking, here's how to find the numbers in Google Analytics:

  1. Open Google Analytics for the client.
  2. In the left menu, click ReportsAcquisitionTraffic acquisition.
  3. Change the dropdown at the top of the table to Session source / medium. You'll see a row that says newsletter / email — that's your email traffic.
  4. To see individual emails, switch that dropdown to Session campaign. Each email name you used (like spring-offer-2026) gets its own row with visits, engagement, and conversions.
That row is the payoff. It's the screenshot that goes into the client report: "the spring offer email drove 240 visits and 12 leads." Without the UTM, that row simply doesn't exist.

Common questions

Does the reader see this ugly text?

Only if they look at their browser's address bar after clicking. The link in the email looks completely normal — it's a button or blue text like always.

Will it break the link?

No. The page opens exactly the same way. If you ever want to check, just paste the finished link into your browser and confirm the right page loads.

Do I need to tag every link in the email?

Tag the ones that matter — the main button and any key links. If you tag several, use the optional box (utm_content) to tell them apart.

What if the page address already has a "?" in it?

The generator handles that automatically — it'll join the tag on correctly with an & instead.

Can I reuse the same campaign name next month?

Don't. Add the month or year so each send gets its own row in the report.

Advanced — UTMs and paid ads (Google & Bing) Not needed for email. For the team's reference only.

Paid search works differently: you usually do NOT add UTMs by hand. Google Ads tags clicks automatically with a gclid, and Microsoft/Bing Ads does the same with an msclkid. Google Analytics reads those and pulls in richer detail (campaign, ad group, keyword) than a manual UTM ever could. Leave auto-tagging switched ON.

Don't stack both. Adding manual UTMs on top of auto-tagging can overwrite the better automatic data. Rule of thumb: paid search = auto-tag only. Email, organic, and partner links = manual UTM.

If a tracking template IS needed — Google and Bing use different tokens

We hit this on a live client account: pasting a Google tracking template into Bing doesn't work. Bing doesn't recognize Google's placeholder names, so they pass through as literal text and the tracking records nothing. Use each platform's own:

What you wantGoogle AdsBing Ads
Landing URL{lpurl}{lpurl}
Campaign{campaignid}{Campaign}
Ad group{adgroupid}{AdGroup}
Keyword{keyword}{keyword}
Click ID{gclid} (automatic){msclkid}

Also: set one tracking template at the account level, not at account and campaign level — stacked templates wrap the URL twice and break it.

How it flows through our stack

Clean tag → Google Analytics sees the source → CallRail/CTM swaps in a campaign-specific phone number → the call and the booked job attribute in ServiceTitan → the report shows which campaign earned the revenue. Break any link in that chain and the ROI story breaks. (Note: Meta Lead Ads don't use link UTMs at all — those leads carry ad and campaign IDs instead.)

Internal — Breakthrough3x · All tutorials