Skip to main content
Terminus
Contents
FoundationsChapter 4 · ~8 min read

Channel Playbook

How to tag links for email, social, paid ads, QR codes, and more, channel by channel.

On this page

Chapter 3 gave you a taxonomy. This page puts it on every link you ship.

The rules never change between channels. Source, medium, and campaign mean the same thing in an email footer and a conference QR code. What changes is the values you pick and the traps each channel sets for you. The recipes below cover both.

Quick Reference: All Channels at a Glance

Channelutm_sourceutm_mediumKey notes
Email (newsletter)newsletteremailTag every link in the body; use utm_content to distinguish link positions
Email (promotional)promotional_emailemailMatch campaign name across channels
Organic socialfacebook, linkedin, etc.socialPlatform name as source; distinguish from paid
Paid socialfacebook, linkedin, etc.paid_socialUse dynamic insertion ({{campaign.name}}) where available
Paid search (Google)googlecpcTurn on auto-tagging (gclid) AND add manual UTMs via tracking templates
Paid search (Bing)bingcpcUse tracking templates with dynamic params
Display ads[network-name]displayInclude ad size/creative in utm_content
Retargeting[platform]-retargetingretargetingSeparate from prospecting in analysis
QR codes / offlineqr_code-[location]offlineShorten URLs for scannable QR codes
Events / conferencesqr_code-[event], event_app-[event]offline or referralOne utm_campaign across all pre/during/post touchpoints
Video (YouTube)youtubevideoTag descriptions, cards, and end screens
Podcastspodcast-[show-name]podcastUse vanity URLs that redirect to tagged destinations
Affiliateaffiliate-[partner]affiliateProvide pre-built links to partners

The sections below take each channel in detail. For the copy-paste version of this table, with full URL examples for 15 common scenarios, use the UTM Decision Cheat Sheet. For where to click in each platform’s UI, use the Implementation Recipes.

How to Use utm_content (and When Not To)

utm_content is the most underused parameter of the five, and the most misunderstood. It appears all through this guide (email, social, display, QR codes, A/B testing), but the strategy lives here, in one place, before you watch it work channel by channel.

What makes it different: utm_content is the only parameter that changes within a single campaign + source + medium combination. Run spring_sale through newsletter / email and every link in that email carries identical source, medium, and campaign values. The only dimension left to tell one link from another is utm_content.

Skip it and your analytics reports that 500 people clicked from the newsletter. Hero banner, body CTA, or footer logo? It can’t say.

Same campaign, same source, same medium. Only utm_content varies:

LinkPlacementTagged link
Link 1hero image...&utm_campaign=spring_sale&utm_content=hero-image
Link 2CTA button...&utm_campaign=spring_sale&utm_content=cta-primary
Link 3text link...&utm_campaign=spring_sale&utm_content=article-readmore
Link 4footer logo...&utm_campaign=spring_sale&utm_content=footer-logo

In your analytics platform: filter by campaign + source + medium, then break down by Content to see exactly which placement drove clicks and conversions.

When to use it:

  • Multiple links to the same destination in one email. The highest-value use case. A newsletter with 10–20 links needs utm_content to say more than “people clicked something.”
  • A/B testing ad creatives. Two versions of a Facebook ad pointing at one landing page: utm_content=video-testimonial vs. utm_content=static-product-shot. Campaign, source, and medium are identical, so utm_content is the only way to compare performance.
  • Multiple link placements in one page or post. A social post with a link in the text and another in the image: utm_content=text-link vs. utm_content=image-link.
  • QR code variant testing. Two versions of a printed flyer: utm_content=flyer-version-a vs. utm_content=flyer-version-b.
  • Display ad creative details. Size, placement, version: utm_content=300x250-sidebar-version-a.

When to skip it:

  • One link per source/medium/campaign combination. A single CTA in a promotional email, a single ad in a small ad set: utm_content would be a dimension with exactly one value. Skip it.
  • No capacity to maintain it. Inconsistent utm_content values are worse than none at all. If you can’t commit to a naming convention, leave the parameter blank rather than populating it haphazardly.

Naming convention: [placement]-[variant]

A consistent pattern keeps utm_content values predictable, filterable, and comparable across campaigns:

PatternExampleWhat it tells you
[section]-[element]hero-cta, sidebar-banner, footer-linkWhich part of the page/email drove the click
[section]-[element]-[variant]hero-cta-red, hero-cta-blueA/B test of the same placement
[format]-[description]video-testimonial, static-product-shotAd creative type
[size]-[placement]-[variant]300x250-sidebar-version-aDisplay ad details

Lowercase, hyphens between segments (utm_content values typically stand alone rather than nesting inside structured campaign names). Descriptive enough to mean something in a report, short enough to stay manageable.

A/B testing with utm_content:

Most ad platforms ship built-in A/B testing. It stops at the platform’s edge. Testing with utm_content works across any channel (email, organic social, QR codes, partner links), and the results land in your analytics next to everything else instead of siloed in a platform-specific report.

Four rules keep a test clean:

  1. Change one variable at a time. Red CTA vs. blue CTA means the headline, image, copy, audience, and timing all stay identical. Change two things and the difference belongs to neither.

  2. Keep every other UTM parameter identical. Same utm_source, utm_medium, utm_campaign, and utm_term. Only utm_content moves between variants. Filter by campaign + source + medium in your analytics platform and the Content dimension becomes your exact variant breakdown.

  3. Run 2–4 variants, no more. Each added variant demands proportionally more traffic before the numbers mean anything. Two variants is the fastest path to a decision. Three or four works for high-traffic campaigns. Past four, you’re splitting traffic too thin for most marketing budgets.

  4. Name variants for what changed, not “A” and “B”. hero-cta-red and hero-cta-blue still explain the test six months from now, when you’re reviewing historical data. variant-a and variant-b explain nothing.

How to run the test:

Step 1: Define what you're testing
        "Does a video testimonial ad outperform a static product image?"

Step 2: Create variants with descriptive utm_content values
        Variant 1: utm_content=video-testimonial-30sec
        Variant 2: utm_content=static-product-lifestyle

Step 3: Keep everything else identical
        utm_source=facebook
        utm_medium=paid_social
        utm_campaign=spring_sale-runners-2025_03
        (same audience, same budget split, same landing page)

Step 4: Let it run. Don't check results too early
        Wait until each variant has enough traffic to be meaningful.
        Rule of thumb: at least 100 conversions per variant for
        conversion rate comparisons, or 1,000 clicks per variant
        for click-through rate comparisons.

Step 5: Analyze in your analytics platform
        Filter: campaign = spring_sale-runners-2025_03
                source  = facebook
                medium  = paid_social
        Break down by: Content
        Compare: sessions, conversion rate, revenue per session

What you can test by channel:

ChannelWhat to testExample utm_content values
EmailCTA text, button color, placementcta-shop-now vs. cta-see-collection
EmailSubject line (with separate sends)subject-discount vs. subject-new-arrivals
Paid socialAd creative formatvideo-testimonial vs. static-product
Paid socialAd copy anglepain-point-copy vs. benefit-copy
Organic socialPost formatcarousel-tips vs. single-image-quote
QR codePhysical placementwindow-display vs. checkout-counter
DisplayAd size or placement300x250-sidebar vs. 728x90-header
Landing page linkCTA styletext-link-inline vs. button-primary

The mistake that ruins tests: two variables on one source/medium.

Run “video vs. static” on Facebook while email runs “red CTA vs. blue CTA”, both using utm_content, and the same campaign shows four utm_content values in your reports. That’s fine. They sit on different source/medium combinations and can’t interfere with each other. The trouble starts when two tests share the same source and medium:

BAD: Testing two things on the same source + medium at once

utm_contentThe problem
utm_content=video-red-ctaIs this winning because of “video” or “red CTA”?
utm_content=static-blue-ctaYou changed two variables. Results are ambiguous.

GOOD: Test one thing at a time

RoundVariantsWhat’s held constant
Round 1utm_content=video-standard-cta vs. utm_content=static-standard-ctacreative format test: CTA is the same
Round 2utm_content=winner-red-cta vs. utm_content=winner-blue-ctaCTA color test: creative format is the winning format from Round 1

Sequential testing takes longer. It also produces answers you can trust. If time pressure forces simultaneous tests, run them on separate audiences or separate campaigns, never on the same campaign + source + medium where the utm_content values will collide in reports.

Email Marketing: Newsletters, Sponsored Emails, Transactional

Tag every clickable link in an email body. All of them.

  • Put utm_content on each one. Emails pile many links onto the same page. Tag each position (header-logo-link, cta-button-learn-more, footer-contact-link) and you learn which in-email placements actually earn clicks.
  • Hold every sender to the same tagging. Multiple Email Service Providers, third-party senders: one consistent taxonomy across all of them. For sponsored emails, hand the partner pre-built tagged URLs.

ESP Auto-UTM Features: Helpful but Dangerous

Most ESPs will auto-append UTM parameters to every link in your email. It saves time. It also tags with the ESP’s defaults, and the defaults rarely match your taxonomy. Turn it on without checking the values and your analytics fills with the ESP’s naming instead of yours.

What the major ESPs auto-tag by default:

ESPutm_sourceutm_mediumutm_campaignutm_content
MailchimpmailchimpemailYour campaign nameNot set
HubSpoths_email or hs_automationemailHubSpot campaign nameEmail ID (numeric)
KlaviyoklaviyoemailCampaign/flow nameNot set
BrevobrevoemailCampaign name (slugified)Not set
ActiveCampaignActiveCampaignemailYour campaign nameEmail subject line

The trap sits in the source column. Your taxonomy says utm_source=newsletter or promotional_email; the ESP writes its own brand name over that. Your reports end up listing mailchimp and klaviyo as sources, values your taxonomy never defined.

It gets worse when you manually tag a link and the ESP also auto-tags it:

ESPConflict behavior“Skip if already tagged”?
MailchimpAppends its UTMs regardless, creating duplicate parametersNo
HubSpotConfigurable: overwrite all, skip existing, or disable entirelyYes
KlaviyoCan overwrite existing URL parametersNo
BrevoAppends regardless, creating duplicate parametersNo
ActiveCampaignAdds to all links; no skip logicNo

When a URL ends up with duplicate parameters (e.g., ?utm_source=newsletter&utm_source=mailchimp), which value your analytics reads is anyone’s guess: no major platform documents how it resolves duplicates, and the behavior varies by tool. Your carefully chosen value survives only by luck.

Three ways to handle it, simplest first:

1. Keep auto-tagging on, customize the values. Some ESPs let you change the default utm_source and utm_campaign. Klaviyo is the most flexible: static or dynamic values for each parameter, plus up to five custom parameters. HubSpot lets you associate campaigns but locks utm_source to hs_email. Mailchimp lets you customize utm_campaign but locks utm_source to mailchimp. If your ESP can match your taxonomy, take this path. You still won’t get per-link utm_content, but source, medium, and campaign stay clean.

2. Use HubSpot’s “skip existing” mode. HubSpot is the only major ESP with a middle ground: “Add source tracking only if no existing tags in the URL.” Manually tag the specific links that need custom utm_content values, and HubSpot fills in the base parameters for the rest. On HubSpot with a link-heavy newsletter, this is the best option.

3. Turn auto-tagging off and tag every link by hand. Full control, including per-link utm_content values, at the price of real labor on newsletters with 10–20+ links. To make it practical:

  • Pre-build every URL in a UTM builder tool (like Terminus) from your taxonomy, then paste them into the email editor. Bulk generation keeps even link-heavy newsletters manageable.
  • Bake UTMs into your email template. Hardcode utm_content values by link position directly in the HTML template (utm_content=header-logo, utm_content=hero-cta, utm_content=article-1-readmore, utm_content=footer-contact). Use template variables or merge tags so utm_campaign changes per send. Upfront work, repaid on every future email.
  • Fix a naming convention for link positions so utm_content values stay predictable: [section]-[element] (e.g., hero-cta, sidebar-link-3, footer-social-twitter).

No ESP auto-generates per-link utm_content based on position. The gap runs across the whole industry. If knowing which specific link a subscriber clicked matters to you (for newsletters, it usually does), you need one of the manual approaches above. For recurring sends, the template approach (option 3, second bullet) is the most sustainable.

Email Signatures: Tag Carefully or Not at All

Plenty of companies UTM-tag the links in employee email signatures, and accidentally manufacture millions of “marketing” touchpoints out of everyday sales and support conversations. A 50-person company sending 30 emails per day each puts 1,500 tagged links into inboxes daily, and every click on one becomes traffic attributed to whatever source and medium the signature carries. Let those values overlap with your campaign email tracking (utm_source=newsletter, utm_medium=email) and signature clicks contaminate your campaign data until email performance looks dramatically different from reality.

If you tag signature links, make the values unmistakably distinct from campaign email: utm_source=email_signature&utm_medium=email_signature. Signature traffic stays filterable and campaign metrics stay honest. Some teams add the department (utm_campaign=sales_team or utm_campaign=support_team) to see which teams drive the most website visits from conversations.

If you’re not sure it’s worth tracking, it probably isn’t. Signature clicks are low-intent; someone clicking a logo in a reply-all thread has nothing in common with someone clicking a campaign CTA. Many teams find the data noisy enough that leaving signature links untagged is the better deal.

Social Media: Organic Posts, Paid Ads

One distinction matters above the rest: organic vs. paid. Give them different utm_medium values (social vs. paid_social) and the two never blur together in a report.

Organic: Tag every link you control (bio links, link stickers, post links). When a single post carries multiple links, utm_content tells the placements apart.

Paid: Lean on dynamic parameter insertion so UTM values stay in sync with your ad platform naming. In Meta Ads use {{campaign.name}} for campaign, {{ad.name}} or {{ad.id}} for content. Use utm_term to capture ad set or audience segment.

  • Turn on auto-tagging (gclid for Google, msclkid for Bing) for native analytics integration, and add manual UTMs through tracking templates anyway. Manual UTMs feed the analytics platforms that don’t read click IDs, act as a fallback when redirects strip the click IDs, and keep your taxonomy in the data.
  • Use dynamic ValueTrack parameters in tracking templates ({keyword}, {creative}, {adgroupid} in Google; {Keyword}, {CampaignID}, {AdGroupID} in Microsoft Advertising) to auto-populate UTM values and eliminate manual errors.
  • Other ad networks rarely support auto-tagging. Plan on manual UTM tagging per your taxonomy almost everywhere else.

Auto-tagging overrides manual UTMs in GA4. When a click carries both gclid and manual UTM parameters, GA4 builds the traffic dimensions from the gclid: the campaign name, source, and medium in GA4 reports come from Google Ads, not from your utm_campaign, utm_source, or utm_medium. (Your manual utm_content and utm_term do survive, but only in the separate “Manual ad content” and “Manual term” dimensions.)

Specifically, auto-tagging pulls the campaign name as you set it in Google Ads into GA4’s Campaign dimension. Name the campaign summer_sale-shoes-us-2025_q2 and that’s what GA4 shows. Name it Summer Sale (1) - COPY and GA4 shows that. Your carefully crafted utm_campaign=summer_sale-shoes-us-2025_q2 is ignored outright.

Two implications follow:

  1. On Google Ads, your manual UTMs exist for the other platforms. Adobe Analytics, Mixpanel, Matomo, any tool that doesn’t read gclid: for those, manual UTMs are the only attribution signal. Add them via tracking templates even though GA4 won’t use them.
  2. Your Google Ads campaign naming directly controls what GA4 displays. That promotes the ad platform naming conventions in Chapter 7b (governed campaign names, structured naming, consistent taxonomy) from a nice-to-have for warehouse reporting to a requirement for clean GA4 data. Every misspelling, inconsistency, and (COPY) suffix in a Google Ads campaign name flows straight into GA4 reports.

Bottom line: For Google Ads specifically, governed campaign naming in the ad platform (see Chapter 7b: Naming Your Ads, Not Just Your Links) is your GA4 attribution strategy. Manual UTMs are your attribution strategy for everything else.

QR Codes and Offline Marketing

A QR code is the bridge from offline marketing (print ads, flyers, event signage, packaging, direct mail) to online analytics. The URL it encodes should be fully UTM-tagged.

  • Shorten first, then generate the QR. Long UTM-tagged URLs produce dense, hard-to-scan codes. Point the QR at a short URL that redirects to the full tagged destination. Verify the shortener preserves every parameter through the redirect and uses HTTPS.
  • Get specific in utm_source. Offline materials leave no other trail; without a descriptive source value, the scan can’t be traced back. qr_code-conference_booth or brochure-fall_2025 says exactly where it came from.
  • A/B test the print run with utm_content. When you print multiple versions of a flyer or poster, differentiate them (poster-version-a, flyer-discount-qr) to see which one performs.

Follow Along: Stride Footwear

Dana’s team launches the spring sale campaign across three channels. Here are the exact links they create:

Newsletter (3 links in the email):

Hero image:   https://stride.com/spring-sale?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale-runners-2025_03&utm_content=hero-image
CTA button:   https://stride.com/spring-sale?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale-runners-2025_03&utm_content=cta-shop-now
Footer link:  https://stride.com/spring-sale?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale-runners-2025_03&utm_content=footer-link

They disable Mailchimp’s auto-UTM feature and tag manually: three links is manageable, and they need distinct utm_content values.

Facebook ad (using dynamic parameters):

URL Parameters field in Meta Ads Manager:
utm_source=facebook&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}

Their Meta campaign is named spring_sale-runners-2025_03 to match the UTM convention. The ad is named video-testimonial-runner-15sec.

QR code on the Fleet Feet NYC retail display:

Full URL:  https://stride.com/spring-sale?utm_source=qr_code-fleet_feet_nyc&utm_medium=offline&utm_campaign=spring_sale-runners-2025_03&utm_content=window-display
Short URL: https://stride.co/nyc25  (redirects to full URL)

The QR code on the display encodes the short URL. They test it by scanning with two phones (iPhone and Android) and verifying the landing page URL contains all parameters.

Three channels, one campaign name, consistent taxonomy. The links go live on March 1.

Short URLs and Vanity Domains

  • How they work: A short URL (Bitly, Rebrandly, or a custom shortener) is a redirect. The QR code or social post links to the short URL, which forwards to the full UTM-tagged destination.
  • Vanity domains: A branded short domain (yourbrand.co/promo instead of bit.ly/xyz123) earns more trust and more clicks.
  • HTTPS on both ends. Browsers send no referrer at all on an HTTPS-to-HTTP hop, so one plain-HTTP link in the redirect chain can erase where a click came from, and an untagged visit then files as “direct.” Use HTTPS for the shortener and the destination.
  • The shortener is a delivery vehicle for a fully UTM-tagged URL. Don’t rely on the shortener itself as the tracking mechanism.

Retargeting Campaigns

Retargeting and prospecting run on fundamentally different economics. Keep them clearly separated in your UTMs so each one answers for its own numbers. The levers:

  • Put retargeting in either utm_source or utm_medium (e.g., facebook-retargeting / retargeting) and these campaigns become instantly filterable in reports.
  • Encode the audience segment in utm_campaign (e.g., cart-abandoners-q1-promo, website-visitors-30d-awareness) to compare performance across retargeting audiences.

Events and Conferences

Events generate more trackable touchpoints than most teams realize, and most of those touchpoints go untagged. A single conference involves pre-event promotion, the registration page, event-day interactions, and post-event follow-up, each with its own links. Tag them without a coherent plan and the event’s traffic scatters across “direct,” “email,” and “(not set)”, with no way to measure the event’s total impact.

The event tracking lifecycle:

PRE-EVENT

  • Promotional emails
  • Social posts about event
  • Partner/speaker promos
  • Registration page ads
  • Landing page for event

EVENT DAY

  • QR codes at booth
  • Event app links
  • Badge scan landing page
  • Session-specific QR codes
  • Wi-Fi splash page links

POST-EVENT

  • Follow-up email sequence
  • "Thanks for visiting" email
  • Survey / feedback form
  • On-demand content links
  • Sales outreach links

Every line item above is a separate link that needs UTMs, and every one of them shares the same utm_campaign. That’s what lets a single report show the whole event.

Recommended tagging for a conference:

Touchpointutm_sourceutm_mediumutm_campaignutm_content
Pre-event promo emailpromotional_emailemailevent-sxsw-2025_03invite-cta
Pre-event social postlinkedinpaid_socialevent-sxsw-2025_03speaker-announcement
Registration page adgooglecpcevent-sxsw-2025_03registration-ad
Booth QR code (main)qr_code-sxsw_boothofflineevent-sxsw-2025_03booth-main-display
Booth QR code (demo station)qr_code-sxsw_boothofflineevent-sxsw-2025_03booth-demo-station
Session QR code (talk slides)qr_code-sxsw_sessionofflineevent-sxsw-2025_03session-slides-download
Event app linkevent_app-sxswreferralevent-sxsw-2025_03exhibitor-listing
Post-event follow-up emailpromotional_emailemailevent-sxsw-2025_03followup-day-2
Post-event surveypromotional_emailemailevent-sxsw-2025_03survey-link
On-demand session recordingpromotional_emailemailevent-sxsw-2025_03recording-link

The principles behind the table:

  • One utm_campaign for the entire event. All touchpoints, pre, during, and post, use the same campaign value. This is how “what was the total ROI of attending SXSW?” becomes a single report.
  • utm_source marks where the touchpoint lives. The QR code at your booth is a different source than the pre-event email. Don’t lump them together.
  • utm_content splits placements within the same source. Two QR codes at the booth (main display vs. demo station) share the same source and medium; utm_content keeps them distinguishable.
  • Pre-build every event URL before you leave the office. Events are chaotic. Links improvised on-site are links with mistakes in them. Build every URL in advance, generate the QR codes, test them, and print them before the event.
  • Put the event name and date in the campaign value. You attend conferences repeatedly; event-sxsw-2025_03 lets this year’s SXSW answer to last year’s.

The touchpoint most teams miss: post-event follow-up.

The post-event email sequence often generates more conversions than the event itself. Tag every link in every follow-up email with the same event utm_campaign so those conversions land on the event, and not on “email” generically. Skip this and the event’s report shows booth visits while the follow-up emails quietly collect the conversion credit. The event’s true ROI reads lower than it was.

Video Platforms and Podcasts

YouTube / TikTok: Tag every link you control: descriptions, cards, end screens, bio links. YouTube adds nothing to your outbound links on your behalf; your UTMs are the only taxonomy those clicks carry.

Podcasts: Tag all links in show notes and episode descriptions. For spoken calls to action, use a vanity URL (e.g., yoursite.com/podcast) that redirects to a UTM-tagged destination. Nobody can click a UTM string they heard read aloud.

Affiliate Marketing

  • Hand every partner pre-built tagged URLs. Affiliates who write their own UTM strings write them inconsistently, and your data pays for it. Generate the links yourself and distribute them.
  • Use utm_content to distinguish link types (banner-sidebar, text-link-blog-post) so you can see which placements convert.

Display Ads (Non-Search/Social)

  • Encode creative details in utm_content. Ad size, creative version, and page placement (e.g., 300x250-top-banner, video-preroll-variant-b) are exactly the data points you’ll want when optimizing.
  • Tag identically across every network. If you run display through multiple ad networks or publishers, one naming convention applies to all of them, or cross-network comparison stops meaning anything.

Platform Quirks: How Platforms Interfere with Your UTMs

You can tag every link perfectly and still lose attribution data, because the platform itself modifies your URL before the user reaches your site. Your tagging is fine. The platform rewrote the URL in transit, and working around that is part of the job.

PlatformWhat it doesImpact on UTMsWorkaround
Facebook / MetaWraps outbound links through l.facebook.com redirect; appends fbclid parameterUTMs generally survive the redirect, but fbclid can cause page-level fragmentation in GA4 reportsStrip fbclid with GA4’s data redaction (Admin → Data streams → your web stream → Redact data → add fbclid to the query parameters list)
InstagramLink-in-bio tools vary: some strip query parameters, others preserve them. In-app browser handles redirects differently than system browserUTMs may be dropped, with no warning, depending on the link-in-bio tool usedTest your specific link-in-bio tool (Linktree, Later, etc.) by clicking through and checking the landing URL. Switch tools if UTMs are stripped
LinkedInRewrites shared URLs through its own redirect; in-app browser may handle redirect chains differentlyUTMs usually survive for ad clicks (direct destination URLs), but organic post links can be affected by the redirectFor organic posts, verify UTMs arrive intact by testing the full click path. For ads, use LinkedIn’s URL tracking parameters field
X / TwitterWraps all links through t.co shortenerUTMs generally preserved through the redirectTest after posting: the t.co redirect occasionally interacts poorly with additional shorteners in the chain
TikTokIn-app browser handles external links; redirect behavior can varyUTMs usually survive for ad clicks; organic bio links depend on how TikTok processes the redirectUse TikTok’s URL parameter feature for ads; test bio links end-to-end
Email clientsSome clients (especially Outlook) may truncate very long URLs; link-scanning security tools (Barracuda, Proofpoint) wrap links in their own redirectsUTMs can be stripped by security scanning redirects; long URLs may be truncatedKeep UTM-tagged URLs under ~2,000 characters total. If your audience uses enterprise email, test with those security tools active
Mobile in-app browsersFacebook, LinkedIn, Twitter, and Instagram all open links in their own embedded browser rather than the system browserCookies set in the in-app browser don’t persist to the system browser; if the user later returns via Safari/Chrome, they appear as a new userUTMs still work for the initial session. For multi-session attribution this is a known limitation; server-side tracking (Chapter 12) helps

The universal rule: After tagging any link destined for a social platform, click through the actual published post (not just the raw URL) and verify that the landing page URL in the browser’s address bar contains your complete UTM parameters. Then do it again on mobile; in-app browser behavior often differs from desktop.

Ensuring Consistency Across All Channels

One rule outranks everything else in multi-channel tracking:

utm_campaign stays constant across every channel of the same initiative. A “spring sale” running through email, social, paid search, and QR codes uses utm_campaign=spring_sale everywhere. Only utm_source, utm_medium, and utm_content change per channel and variant.

                        +----------------------------+
                        |  NEW MULTI-CHANNEL CAMPAIGN |
                        |  utm_campaign = spring_sale  |
                        +----------------------------+
                                     |
              +-------------+--------+--------+-------------+
              |             |                 |             |
           EMAIL         SOCIAL           PAID AD       QR / OFFLINE
              |             |                 |             |
              v             v                 v             v
     source: newsletter  Organic or Paid?  Platform?    source: qr_code-[location]
     medium: email          |     |           |         medium: offline
              |        +----+     +----+      |
              v        v               v      +------+------+------+
     content: cta-     source:      source:   |      |      |      |
     [variant]  facebook  facebook  google   bing  linkedin  other
                medium:   medium:   medium:  medium: medium:
                social    paid_     cpc      cpc    paid_
                          social                    social
                  |         |        |        |      |
                  v         v        v        v      v
               content:  content:  content: content: content:
               [post-id] [ad-set]  [ad-grp] [ad-grp] [ad-var]

  KEY RULE: utm_campaign stays CONSISTENT across ALL channels
  for the same initiative (e.g., "spring_sale" everywhere).
  Only source, medium, and content change per channel/variant.

The supporting practices:

  • One documented taxonomy governs all channels.
  • Centralized link creation: a UTM management platform for larger teams, or at minimum a shared document with rules, approved values, and examples.
  • Regular audits of links and analytics for inconsistencies.
  • Training for every team member and agency that touches a link.
  • utm_content included. Source, medium, and campaign set the broad context; utm_content is what separates individual links and creatives pointing at the same URL.

Key Points

  • Tag every external link: email, social, ads, QR codes, podcasts, affiliate links
  • utm_campaign stays identical across all channels of one initiative; only source, medium, and content change
  • Use dynamic parameter insertion (e.g., {{campaign.name}}) in ad platforms so UTM values match your ad platform naming
  • QR codes, video descriptions, and podcast show notes are the channels teams forget to tag
  • Platforms actively interfere with your UTMs: Facebook wraps links, Instagram may strip parameters, email security tools add redirects. Always click-test the published link, not just the raw URL

Action Item: Pick your next campaign launch. Before any links go live, build every tagged URL from the quick reference table above and your Chapter 3 starter taxonomy. Then test each one by clicking through and verifying it arrives in your analytics platform’s real-time reports.

Next upChapter 5: Common Mistakes