Channel Playbook
How to tag links for email, social, paid ads, QR codes, and more, channel by channel.
On this page
- Quick Reference: All Channels at a Glance
- How to Use utm_content (and When Not To)
- Email Marketing: Newsletters, Sponsored Emails, Transactional
- ESP Auto-UTM Features: Helpful but Dangerous
- Email Signatures: Tag Carefully or Not at All
- Social Media: Organic Posts, Paid Ads
- Paid Search: Google Ads, Bing Ads
- QR Codes and Offline Marketing
- Short URLs and Vanity Domains
- Retargeting Campaigns
- Events and Conferences
- Video Platforms and Podcasts
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
| Channel | utm_source | utm_medium | Key notes |
|---|---|---|---|
| Email (newsletter) | newsletter | email | Tag every link in the body; use utm_content to distinguish link positions |
| Email (promotional) | promotional_email | email | Match campaign name across channels |
| Organic social | facebook, linkedin, etc. | social | Platform name as source; distinguish from paid |
| Paid social | facebook, linkedin, etc. | paid_social | Use dynamic insertion ({{campaign.name}}) where available |
| Paid search (Google) | google | cpc | Turn on auto-tagging (gclid) AND add manual UTMs via tracking templates |
| Paid search (Bing) | bing | cpc | Use tracking templates with dynamic params |
| Display ads | [network-name] | display | Include ad size/creative in utm_content |
| Retargeting | [platform]-retargeting | retargeting | Separate from prospecting in analysis |
| QR codes / offline | qr_code-[location] | offline | Shorten URLs for scannable QR codes |
| Events / conferences | qr_code-[event], event_app-[event] | offline or referral | One utm_campaign across all pre/during/post touchpoints |
| Video (YouTube) | youtube | video | Tag descriptions, cards, and end screens |
| Podcasts | podcast-[show-name] | podcast | Use vanity URLs that redirect to tagged destinations |
| Affiliate | affiliate-[partner] | affiliate | Provide 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:
| Link | Placement | Tagged link |
|---|---|---|
| Link 1 | hero image | ...&utm_campaign=spring_sale&utm_content=hero-image |
| Link 2 | CTA button | ...&utm_campaign=spring_sale&utm_content=cta-primary |
| Link 3 | text link | ...&utm_campaign=spring_sale&utm_content=article-readmore |
| Link 4 | footer 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_contentto 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-testimonialvs.utm_content=static-product-shot. Campaign, source, and medium are identical, soutm_contentis 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-linkvs.utm_content=image-link. - QR code variant testing. Two versions of a printed flyer:
utm_content=flyer-version-avs.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_contentwould be a dimension with exactly one value. Skip it. - No capacity to maintain it. Inconsistent
utm_contentvalues 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:
| Pattern | Example | What it tells you |
|---|---|---|
[section]-[element] | hero-cta, sidebar-banner, footer-link | Which part of the page/email drove the click |
[section]-[element]-[variant] | hero-cta-red, hero-cta-blue | A/B test of the same placement |
[format]-[description] | video-testimonial, static-product-shot | Ad creative type |
[size]-[placement]-[variant] | 300x250-sidebar-version-a | Display 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:
-
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.
-
Keep every other UTM parameter identical. Same
utm_source,utm_medium,utm_campaign, andutm_term. Onlyutm_contentmoves between variants. Filter by campaign + source + medium in your analytics platform and the Content dimension becomes your exact variant breakdown. -
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.
-
Name variants for what changed, not “A” and “B”.
hero-cta-redandhero-cta-bluestill explain the test six months from now, when you’re reviewing historical data.variant-aandvariant-bexplain 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:
| Channel | What to test | Example utm_content values |
|---|---|---|
| CTA text, button color, placement | cta-shop-now vs. cta-see-collection | |
| Subject line (with separate sends) | subject-discount vs. subject-new-arrivals | |
| Paid social | Ad creative format | video-testimonial vs. static-product |
| Paid social | Ad copy angle | pain-point-copy vs. benefit-copy |
| Organic social | Post format | carousel-tips vs. single-image-quote |
| QR code | Physical placement | window-display vs. checkout-counter |
| Display | Ad size or placement | 300x250-sidebar vs. 728x90-header |
| Landing page link | CTA style | text-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_content | The problem |
|---|---|
utm_content=video-red-cta | Is this winning because of “video” or “red CTA”? |
utm_content=static-blue-cta | You changed two variables. Results are ambiguous. |
GOOD: Test one thing at a time
| Round | Variants | What’s held constant |
|---|---|---|
| Round 1 | utm_content=video-standard-cta vs. utm_content=static-standard-cta | creative format test: CTA is the same |
| Round 2 | utm_content=winner-red-cta vs. utm_content=winner-blue-cta | CTA 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_contenton 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:
| ESP | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Mailchimp | mailchimp | email | Your campaign name | Not set |
| HubSpot | hs_email or hs_automation | email | HubSpot campaign name | Email ID (numeric) |
| Klaviyo | klaviyo | email | Campaign/flow name | Not set |
| Brevo | brevo | email | Campaign name (slugified) | Not set |
| ActiveCampaign | ActiveCampaign | email | Your campaign name | Email 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:
| ESP | Conflict behavior | “Skip if already tagged”? |
|---|---|---|
| Mailchimp | Appends its UTMs regardless, creating duplicate parameters | No |
| HubSpot | Configurable: overwrite all, skip existing, or disable entirely | Yes |
| Klaviyo | Can overwrite existing URL parameters | No |
| Brevo | Appends regardless, creating duplicate parameters | No |
| ActiveCampaign | Adds to all links; no skip logic | No |
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_contentvalues 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 soutm_campaignchanges per send. Upfront work, repaid on every future email. - Fix a naming convention for link positions so
utm_contentvalues stay predictable:[section]-[element](e.g.,hero-cta,sidebar-link-3,footer-social-twitter).
No ESP auto-generates per-link
utm_contentbased 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.
Paid Search: Google Ads, Bing Ads
- Turn on auto-tagging (
gclidfor Google,msclkidfor 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:
- 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. - 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_boothorbrochure-fall_2025says 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-linkThey disable Mailchimp’s auto-UTM feature and tag manually: three links is manageable, and they need distinct
utm_contentvalues.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_03to match the UTM convention. The ad is namedvideo-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/promoinstead ofbit.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
retargetingin eitherutm_sourceorutm_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:
| Touchpoint | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Pre-event promo email | promotional_email | email | event-sxsw-2025_03 | invite-cta |
| Pre-event social post | linkedin | paid_social | event-sxsw-2025_03 | speaker-announcement |
| Registration page ad | google | cpc | event-sxsw-2025_03 | registration-ad |
| Booth QR code (main) | qr_code-sxsw_booth | offline | event-sxsw-2025_03 | booth-main-display |
| Booth QR code (demo station) | qr_code-sxsw_booth | offline | event-sxsw-2025_03 | booth-demo-station |
| Session QR code (talk slides) | qr_code-sxsw_session | offline | event-sxsw-2025_03 | session-slides-download |
| Event app link | event_app-sxsw | referral | event-sxsw-2025_03 | exhibitor-listing |
| Post-event follow-up email | promotional_email | email | event-sxsw-2025_03 | followup-day-2 |
| Post-event survey | promotional_email | email | event-sxsw-2025_03 | survey-link |
| On-demand session recording | promotional_email | email | event-sxsw-2025_03 | recording-link |
The principles behind the table:
- One
utm_campaignfor 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_sourcemarks 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_contentsplits placements within the same source. Two QR codes at the booth (main display vs. demo station) share the same source and medium;utm_contentkeeps 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_03lets 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_contentto 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.
| Platform | What it does | Impact on UTMs | Workaround |
|---|---|---|---|
| Facebook / Meta | Wraps outbound links through l.facebook.com redirect; appends fbclid parameter | UTMs generally survive the redirect, but fbclid can cause page-level fragmentation in GA4 reports | Strip fbclid with GA4’s data redaction (Admin → Data streams → your web stream → Redact data → add fbclid to the query parameters list) |
| Link-in-bio tools vary: some strip query parameters, others preserve them. In-app browser handles redirects differently than system browser | UTMs may be dropped, with no warning, depending on the link-in-bio tool used | Test your specific link-in-bio tool (Linktree, Later, etc.) by clicking through and checking the landing URL. Switch tools if UTMs are stripped | |
| Rewrites shared URLs through its own redirect; in-app browser may handle redirect chains differently | UTMs usually survive for ad clicks (direct destination URLs), but organic post links can be affected by the redirect | For organic posts, verify UTMs arrive intact by testing the full click path. For ads, use LinkedIn’s URL tracking parameters field | |
| X / Twitter | Wraps all links through t.co shortener | UTMs generally preserved through the redirect | Test after posting: the t.co redirect occasionally interacts poorly with additional shorteners in the chain |
| TikTok | In-app browser handles external links; redirect behavior can vary | UTMs usually survive for ad clicks; organic bio links depend on how TikTok processes the redirect | Use TikTok’s URL parameter feature for ads; test bio links end-to-end |
| Email clients | Some clients (especially Outlook) may truncate very long URLs; link-scanning security tools (Barracuda, Proofpoint) wrap links in their own redirects | UTMs can be stripped by security scanning redirects; long URLs may be truncated | Keep UTM-tagged URLs under ~2,000 characters total. If your audience uses enterprise email, test with those security tools active |
| Mobile in-app browsers | Facebook, LinkedIn, Twitter, and Instagram all open links in their own embedded browser rather than the system browser | Cookies 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 user | UTMs 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_contentincluded. Source, medium, and campaign set the broad context;utm_contentis 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_campaignstays 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.