What are UTM parameters and what do they include
UTM parameters are tracking codes appended to your URL after the question mark (?). They capture five pieces of information: utm_source (where traffic comes from), utm_medium (the type of traffic), utm_campaign (campaign name), utm_content (specific ad or creative), and utm_term (keyword). The first three are required, the last two optional. The parameters don't change the destination page—users land exactly where you want them. But Google Analytics 4 (GA4) and other analytics platforms use these parameters to organize traffic data and show you exactly where visitors came from.
Without UTM tracking, analytics platforms lump all your paid traffic into generic categories like "direct / none" or "referral." You see 500 visitors arrived—but from which campaign, which ad, and which budget spent? UTM parameters solve this. Each click gets tagged, and your reports instantly show the source.
How a UTM-tagged link is structured
Let's break down a real example:
https://admetric.pro/?utm_source=google&utm_medium=cpc&utm_campaign=blog_utm&utm_content=hero_button&utm_term=how_to_set_utm
The base URL is https://admetric.pro/. The question mark (?) separates the URL from the parameters. After the question mark come key-value pairs joined by ampersands (&). Here's what this means: the visitor came from Google (utm_source=google) via a paid click (utm_medium=cpc), as part of a blog UTM campaign (utm_campaign=blog_utm), and clicked the button in the hero section (utm_content=hero_button) after searching for "how to set utm" (utm_term=how_to_set_utm). The page loads normally—parameters are invisible to users and only visible to your analytics system.
Five parameters: three required, two optional
| Parameter | What it means | Example value | Required |
|---|---|---|---|
| utm_source | Where traffic originates (ad platform, partner site) | google, meta, tiktok, linkedin | Yes |
| utm_medium | Type of traffic—paid click, display, email, social, QR | cpc, cpm, email, social, qr | Yes |
| utm_campaign | Campaign name or ID | summer_promo, brand_2026q1 | Yes |
| utm_content | Ad or creative identifier (for A/B tests) | banner_top, video_30s, ad_123 | No |
| utm_term | Keyword (for search ads) | how_to_set_utm, marketing_analytics | No |
One rule: if you tag a link, fill in all three required parameters. Leave one blank and your analytics will misattribute the data to another source. Fill in every one of them deliberately rather than copying values between campaigns.
Static vs. dynamic values
Static values stay the same: utm_source=google always remains "google." Dynamic values are auto-filled by the ad platform using macros—special codes in curly braces. For example, utm_term={keyword} in Google Ads automatically gets replaced with the actual search term that triggered the click: "how to track UTM," "UTM parameter guide," and so on. This is perfect for campaigns with hundreds of keywords—you don't have to tag each one manually. We'll cover the macro syntax for different platforms later in this guide.
Before you start: Planning your UTM strategy
Before creating tags, build a values dictionary: utm_source=google (not Google or Google Ads), utm_medium=cpc (Cost Per Click—paid clicks) or cpm (display ads) or email (email campaigns) or social (social platforms). Always use lowercase Latin letters; separate multi-word values with underscores. Next, set up a shared tracking table (Google Sheets, Notion, or Excel) where your team logs each new campaign and pulls ready-made links. Without a consistent dictionary, you'll end up with six different variations of "google" in your analytics within a month, and you won't be able to group reports.
Decide what level of detail you need
Ask yourself: do you need to see "traffic from Google Ads"—or do you also need to break it down by specific ad, keyword, and landing page? Your answer determines how granular you make utm_campaign, utm_content, and utm_term. Finer granularity means more manual work, but also sharper analytics. Find the balance that works for your team size.
Create a values dictionary (source = google, not Google)
Real example: a team of four tags a single campaign, and your analytics suddenly show google, Google, Google_Ads, and google_ads as four separate sources. Combining those reports takes an hour. To avoid this, document your tagging rules in one place:
- utm_source: lowercase Latin letters, one word or with underscores (
google,meta_ads,tiktok_ads). Transliteration only if necessary. - utm_medium: stick to standard values—
cpc,cpm,email,social,qr,offline,sms,push. Don't invent custom ones. - utm_campaign: format as "type-goal-period," e.g.,
promo-summer-2026q2orlaunch-integrations-2026. - No non-Latin characters, spaces, or special symbols in values—they'll break the link when copied.
Set up a tracking spreadsheet
Here's what a simple tracking table looks like. One person maintains it; everyone else pulls ready-made links from it:
| Campaign | Landing page | utm_source | utm_medium | utm_campaign | Ready-made link |
|---|---|---|---|---|---|
| Summer promo in Google Ads | /pricing/ | cpc | promo-summer-2026q2 | admetric.pro/pricing/?utm_source=google&utm_medium=cpc&utm_campaign=promo-summer-2026q2 | |
| Integration launch on TikTok Ads | /integrations/ | tiktok | social | launch-integrations-2026 | admetric.pro/integrations/?utm_source=tiktok&utm_medium=social&utm_campaign=launch-integrations-2026 |
Use Google Sheets, Notion, ClickUp—whatever works. Assign one person to keep it current (usually a marketing or paid-traffic specialist) so new campaigns get added on day one, not weeks later.
How to create a UTM parameter manually: Step-by-step guide
Building a UTM tag takes four steps. Start with a clean URL. Add a question mark. Type in utm_source, utm_medium, and utm_campaign separated by ampersands. Optionally add utm_content and utm_term. Finally, open the link in an incognito browser window (private browsing with no cached sessions or stored data) and make sure the page loads without a 404 error or unexpected redirect.
It sounds complex in theory, but you'll build your first tag in 60 seconds and the tenth in 20. The trick is understanding the structure: the question mark opens the parameter block, and ampersands separate key-value pairs. That's it.
- 1
Start with a clean URL
Open the page you want to drive traffic to and copy the URL from the address bar. Remove anything after the ? if it's already there—those are leftover parameters from a previous session. Example: admetric.pro/pricing/
- 2
Add the three required parameters
Add a ? and enter utm_source, utm_medium, and utm_campaign separated by &. Result: admetric.pro/pricing/?utm_source=google&utm_medium=cpc&utm_campaign=summer_promo. Order doesn't matter; case does.
- 3
Add utm_content and utm_term if needed
If you have multiple ads or keywords in one campaign, add utm_content (to distinguish ads) and utm_term (keyword). Append with &: ...&utm_content=banner_top&utm_term=how_to_set_utm
- 4
Test in incognito mode
Open the full link in a private browser window. The page should load without a 404 or redirect to a different URL. If a redirect strips the parameters, that's a server configuration issue—the tag won't work.
If your landing page has an anchor (admetric.pro/pricing/#tariff-mini), the UTM tag goes BEFORE the anchor, not after. Correct order: domain + path, then ?, then parameters, and finally # with the anchor. A working example: admetric.pro/pricing/?utm_source=google&utm_medium=cpc&utm_campaign=summer#tariff-mini. Put the parameters after the anchor and the browser will ignore them, the scroll will break, and the tag won't reach your analytics.
Here's a complete example for Google Ads—a pricing-tier campaign split across multiple ads:
https://admetric.pro/pricing/?utm_source=google&utm_medium=cpc&utm_campaign=mini_spring&utm_content=banner_top&utm_term=marketing_analytics
Copy this string into your ad platform's destination URL field when creating an ad. For deeper breakdowns of each parameter and ready-made templates for different platforms, check our complete UTM guide, which covers Google Ads, Meta Ads, TikTok Ads, email campaigns, and more.
Pro tip: create two or three working templates and keep them in your notes. Typing utm_source=google by hand every time is a shortcut to typos. And a typo in the tag (goggle instead of google) sends traffic to a completely separate analytics row, making you think you have two different sources.
Create UTM parameters with a generator: two free tools worth knowing
Using a UTM generator is faster: it automatically adds the question mark and ampersands, encodes spaces so the link doesn't break, and prevents you from accidentally entering non-ASCII characters. We recommend AdMetric's free UTM Builder (works without signup, has presets for Google Ads, Meta Ads, and TikTok Ads) and Google's own Campaign URL Builder for a simple, vendor-neutral option. Manual assembly is only needed when you're writing a dynamic template with platform macros for an entire campaign at once.
AdMetric UTM Builder
AdMetric's UTM Builder is a free online tool, no signup required. Select your ad platform from the list (Google Ads, Meta Ads, TikTok Ads, LinkedIn), enter your campaign name, and the generator automatically fills in the correct utm_source and utm_medium according to the platform's preset, while also checking for stray non-ASCII characters or accidental spaces.
Your finished link appears at the bottom—click "Copy link" and paste it into your ad. Dynamic macros are supported: for Google Ads, it will correctly insert {keyword} and {lpurl} so encoding doesn't break the macro.
Google Campaign URL Builder
Google's Campaign URL Builder is Google's own free tool for assembling a tagged link. Enter your website URL and the five UTM fields, and it stitches the string together for you. It has no ad-platform presets and doesn't support dynamic macros in curly braces, so if you want per-click values like the search term or ad ID, you'll still add those by hand afterward. It's a solid, no-frills option when you just need one clean link fast.
When you don't need a generator
Manual assembly is necessary in one case: when you're writing a dynamic template with platform macros like {keyword} or {creative}. Most generators either don't allow curly braces in parameter fields or they over-encode the braces—turning { into %7B—and the platform stops recognizing the macro.
In this case, copy a verified template into a text editor and substitute values manually—no transformations.
| Tool | Platform presets | Dynamic macros | QR code | Price |
|---|---|---|---|---|
| AdMetric UTM Builder | Google Ads, Meta Ads, TikTok Ads, LinkedIn Ads, Pinterest | Yes, correct encoding | Yes | Free, no signup |
| Google Campaign URL Builder | No | No | No | Free |
| Manual assembly | — | By hand only | — | Free |
Whichever tool you pick, run the finished link through AdMetric's UTM Builder once before launch if you're on Google Ads, Meta Ads, or TikTok Ads—the built-in presets catch source/medium mismatches that are easy to miss when you build a URL from scratch, and it's free with no account required.
How to set up UTM parameters in Google Ads: Static and dynamic values
In Google Ads, enter your UTM tag in the destination URL field at the ad level. Required parameters are static; for other fields, use Google's dynamic macros (special codes in curly braces that Google substitutes with real values when the ad is shown). {keyword} automatically inserts the search term that triggered the click; {creative} inserts the ad ID; {matchtype} tells you if the match was exact, phrase, or broad. If you use ad extensions (additional links under your main ad), tag each one separately so you can track which extension drives clicks.
Where to add the tag: ad level, not campaign level
The path in your ads manager: Campaign → Ad group → specific Ad → Destination URL field. Add the question mark and parameters at the end of your landing page URL.
A common mistake: many people add the UTM tag at the ad group level so it applies to all ads in the group. You can do this, but if those ads have different headlines or images, you won't be able to tell them apart in reports. Tagging at the ad level gives you precision: you see which exact creative delivered the click.
If the tag is accidentally set both at the group level and the ad level, Google Ads uses the ad-level version. That's actually convenient: you can keep a default template at the group level and override it for specific experiments.
Dynamic macros: Full list with explanations
Dynamic macros are codes that Google substitutes automatically at click time. Write them once and Google fills in the ad ID, search term, match type, and device for each user individually.
| Macro | Replaced with | Use in parameter | Example |
|---|---|---|---|
| {keyword} | The exact search term that triggered the click | utm_term | how to set utm |
| {creative} | Your ad's ID in Google Ads | utm_content | 98765432 |
| {campaignid} | Your campaign's ID in Google Ads | utm_campaign | 12345678 |
| {matchtype} | Match type: e, p, or b (exact, phrase, broad) | utm_medium or custom parameter | e |
| {device} | Device type: m (mobile), t (tablet), c (computer) | custom parameter | m |
| {lpurl} | Your final landing page URL after redirects | as a destination URL component | https://admetric.pro/pricing/ |
| {network} | Google Search, Google Network, or partner site | custom parameter | Google Search |
Universal template example
Copy-and-paste template for any landing page:
?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={creative}&utm_term={keyword}
The logic is simple. utm_source and utm_medium stay static—this way, all your paid Google traffic groups into one analytics row. We use IDs for campaign and content rather than names: if you rename the campaign in Google Ads, your historical data stays intact. The utm_term automatically captures the exact keyword the user searched for—perfect for analyzing keyword performance.
UTM tags in ad extensions
Ad extensions are additional links under your main ad—for example, "Pricing," "Integrations," "Free demo," and "Contact us" appearing below an ad for your main product page.
The critical mistake: many people don't tag each extension link separately. Skip the tags and all extension traffic gets credited to your main ad, so you never learn which extension actually converts.
Real example. Your main ad points to /pricing/?utm_source=google&utm_medium=cpc&utm_content=main_ad. Your extensions are tagged separately: /pricing/?utm_content=ext_demo#pricing, /integrations/?utm_content=ext_integrations, /demo/?utm_content=ext_free_demo. Now your report shows that 60% of clicks come from the main ad, 25% from the free-demo extension. Next week's budget allocation is informed, not guesswork.
UTM parameters for Meta Ads, TikTok Ads, email, and offline
Meta Ads and TikTok Ads require manual UTM tags in their URL fields—neither platform auto-fills them. Email campaigns use utm_medium=email and utm_campaign=newsletter_month for organization. QR codes and offline materials (billboards, radio, printed materials) use utm_medium=qr or offline and a descriptive utm_source like flyer_2026q2 or billboard_times_square. For online platforms that support auto-tagging (like Google Ads with gclid), you can skip manual UTM if the auto-tagging reaches your analytics destination.
Google Ads: Auto-tagging vs. manual UTM
Google's gclid (Google Click Identifier) passes more detail to GA4 than manual UTM: the full campaign, ad group, ad, and keyword that triggered the click—without you lifting a finger. UTM parameters are more basic—just five fields. So manual UTM in Google Ads is necessary in one case: if your analytics live in a system that understands UTM but doesn't read gclid, like a third-party analytics platform or a custom dashboard.
Meta Ads and TikTok Ads
Neither platform auto-fills UTM—type it into the destination URL field by hand. Copy-paste templates:
Meta Ads: ?utm_source=meta&utm_medium=cpc&utm_campaign=campaign_name&utm_content={ad.id}. The {ad.id} dynamic value is Meta's macro—it auto-inserts each specific ad's ID.
TikTok Ads: ?utm_source=tiktok&utm_medium=social&utm_campaign=campaign_name. TikTok doesn't send macros, so there's no way to auto-insert the ad ID—fill it manually or leave utm_content blank.
Email campaigns, QR codes, offline
Use a different utm_medium for each channel to avoid mixing data later:
- Email:
utm_medium=email,utm_campaign=newsletter_2026_may—include the month so monthly reports are self-explanatory. - QR code on printed materials:
utm_medium=qr,utm_source=flyer_subwayor the name of the distribution point. - Offline without QR (billboard, radio, business card): create a short memorable URL that redirects and auto-injects the UTM tag.
| Ad platform | Auto-tagging | Where to add the tag | Macro support |
|---|---|---|---|
| Google Ads | Yes, gclid (where available) | Destination URL at ad level | Yes: {keyword}, {creative}, {matchtype}, etc. |
| Meta Ads | No | URL field at ad level | Limited: {ad.id} |
| TikTok Ads | No | Destination URL field | No |
| LinkedIn Ads | No | Destination URL at campaign level | Limited |
| Email campaigns | No | In each link in the email body | No |
| QR code / offline | No | In the URL before generating QR | No |
How to analyze UTM parameters in Google Analytics 4
In Google Analytics 4, open Reports → Acquisition → Traffic acquisition. You'll see traffic broken down by source, medium, and campaign. The data flows automatically from your tagged links. If you're using a cross-platform analytics tool that syncs ad spend with CRM deals, UTM data flows in automatically from your ad accounts or call-tracking system, and you'll see ROI and cost-per-lead by source/medium/campaign combination. Those source/medium/campaign rows are also the raw material for marketing attribution: deciding which touchpoint actually gets credit for a conversion when a visitor took several steps before buying.
Google Analytics 4: Traffic acquisition report
Go to GA4, navigate to Reports → Acquisition → Traffic acquisition. You'll see a breakdown by source (Google, Meta, etc.), then medium (cpc, social, email), then campaign name. Click any row to drill down—you move from "traffic from Google" to "traffic from Google paid search" to "traffic from Google search summer promo." Each level expands so you can zoom from general to specific.
In the column selector, add a goal or conversion event—then you see "Sessions," "Conversions," and "Conversion rate" side by side. One glance tells you which UTM combination actually drives results, not just which one sends the most clicks. If you want a broader walkthrough of building reports beyond this one screen, see our guide to marketing analytics.
Linking UTM to goals and revenue
UTM without goals is wasted effort. You see 500 sessions from Google and 200 from Meta. So what? Who actually bought? Goals turn sessions into money: 500 sessions from Google produced 12 sign-ups at $50 each, while 200 from Meta produced 8 sign-ups at $35 each. Now you know where to move the budget. For the deeper math behind cost per lead and return on marketing spend, see our guide to marketing ROI.
Cross-platform analytics: UTM to CRM to ROI
Cross-platform analytics systems pull UTM data from your ad accounts and automatically sync it to your CRM when a visitor fills out a form or makes a purchase—especially useful once your ad accounts and CRM are already connected through integrations. The UTM is now attached to the deal, not just the session. The system calculates real CPL (cost per lead) and ROMI (return on marketing investment) per UTM combination—accounting for the fact that some leads go cold, others convert weeks later, and some upsell. We cover this full chain, from ad click to UTM tag to CRM deal to ROI, in our guide to end-to-end marketing analytics.
Combine UTM data from Google Ads and Meta in one CPL report
AdMetric pulls UTM data from both ad platforms and syncs deals from your CRM. Calculates CPL and ROMI per UTM combination—no manual spreadsheet work. 7 days free.
Start for free →Common mistakes and self-check checklist
The most frequent errors: inconsistent capitalization in one parameter (google vs. Google becomes two separate sources), non-ASCII characters in values (traffic counts, but the campaign name displays as %C3%A9t%C3%A9...), two question marks in a URL (everything after the second is ignored), missing question mark at the start of tags (they append to the URL and cause a 404), spaces instead of underscores (breaks the tag), quotation marks around values (also breaks it), and forgetting to tag ad extensions.
Top 7 mistakes that break analytics
- Inconsistent capitalization in one parameter.
utm_source=googleandutm_source=Googleappear as two different sources in GA4; reports won't combine. Lock in a dictionary and always use lowercase. - Non-ASCII characters in values. GA4 URL-encodes them as
%C3%A9t%C3%A9...—the campaign name becomes unreadable. Normalize upfront: "Été Sale" becomesete_sale. - Two question marks in the URL. If your landing page already has parameters (
/pricing/?tab=yearly), a second?in the UTM tag is ignored by the browser. Combine parameter blocks with&:/pricing/?tab=yearly&utm_source=google&.... - Tag placed after the # anchor.
admetric.pro/pricing/#pricing-table?utm_source=google—the tag won't fire. The browser processes the anchor client-side and drops everything after it. Put UTM BEFORE the anchor:admetric.pro/pricing/?utm_source=google#pricing-table. - Spaces or quotation marks in values.
utm_campaign="summer sale"—quote marks and spaces break parsing. Replace spaces with underscores; remove quotes. - Forgotten tags on ad extensions. Only the main ad is tagged; extensions have no UTM. All extension traffic gets lumped into one "no UTM data" row. Tag each extension separately with a unique utm_content.
- Redirect that strips parameters. Your site does a 301 redirect from
/pricingto/pricing/, but the redirect logic loses GET parameters (happens on older platforms). Verify that the final URL after all redirects contains your UTM string. If not, fix the redirect logic or use the correct URL in your ad setup from the start.
Pre-launch checklist
- Landing page URL is clean (no trailing ? or & before parameters)
- Latin characters and lowercase everywhere
- All three required parameters present (source, medium, campaign)
- Campaign name is one word or uses _ instead of spaces
- Dynamic macros only in your ad platform's fields, not hardcoded
- Each extension link tagged separately
- Link tested in incognito mode—page loads without 404 or redirect
- Tag recorded in your shared tracking table
Fixing broken UTM data after launch
You can't rewrite history—what's logged in GA4 stays logged. Create new, correct links and restart tagging. For old data, use GA4's data filter: Reports → filter menu → create rule "utm_source = Google" → action "Exclude." This removes the bad rows from future reports while your historical data stays untouched in raw data exports.
90% of UTM issues boil down to three things: case sensitivity, non-ASCII characters, or forgotten extension tags. Create a Google Sheets template with your dictionary and constants—and you'll never hit these potholes again.
