If you're spending money on ads and not using UTM parameters consistently, your attribution is broken. Not slightly imprecise — fundamentally broken. Without UTMs, Shopify and GA4 cannot tell the difference between a customer who came from a Meta ad and a customer who came from a TikTok video, an email, or typed your URL directly. They all look the same. Your ROAS calculations are fiction.
This guide covers everything you need to know: what UTM parameters are, how to structure them so they scale, copy-paste templates for every major channel, and the six mistakes that silently poison your data even when UTMs are technically present.
Why UTMs are the foundation of all attribution
A UTM parameter is a piece of information you attach to a URL. When someone clicks a link that contains UTMs and lands on your Shopify store, GA4 reads those parameters, records them against the session, and stores them. When that session results in an order, Shopify records the order. DataMaster (and any other proper attribution tool) then joins those two records: the GA4 session that told us where the visit came from, and the Shopify order that told us what revenue was generated.
Without UTMs, GA4 has no reliable way to know where a visit came from. GA4 makes some guesses — it can infer that a visit from a Facebook domain is probably social traffic — but those guesses are coarse, incomplete, and inconsistent. You cannot compute a per-campaign ROAS without UTMs. You cannot know whether your Meta prospecting campaign outperformed your retargeting campaign. You cannot allocate budget intelligently.
UTMs are not a nice-to-have. They are the prerequisite for everything else.
What UTM parameters actually are — the 5 parameters explained
A full UTM-tagged URL looks like this:
https://yourbrand.com/products/silk-midi-dress?utm_source=meta&utm_medium=paid_social&utm_campaign=spring_prospecting_2025&utm_content=video_lifestyle_v2&utm_term=broad_women_25_44
The five parameters — and what each one means:
utm_source — the platform
Which platform or property sent this traffic. This is the top-level "where did this come from" answer. Examples: meta, google, klaviyo, tiktok, instagram, pinterest. Keep these consistent and lowercase. The most common mistake is using facebook sometimes and meta other times — they appear as two entirely different sources in GA4.
utm_medium — the channel type
The category of channel or traffic type. This is the "how" rather than the "who". Examples: paid_social, cpc, email, organic_social, affiliate, sms. GA4 uses utm_medium to slot sessions into channel groups, so consistency here directly affects the quality of your channel-level reporting.
utm_campaign — the campaign name
The specific campaign this click belongs to. This should match your internal campaign naming so you can join reports across tools. Examples: spring_prospecting_2025, retargeting_30d_q2, black_friday_2025_acquisition. Avoid using platform-generated campaign IDs as the campaign name — they're unreadable in reports.
utm_content — the specific ad or variant
The individual ad creative, email button, or link variant that was clicked. This is where you track creative performance. Examples: video_lifestyle_v2, static_product_carousel, email_hero_cta, ugc_testimonial_v1. Without utm_content, you can see that Campaign A outperformed Campaign B, but you can't see which ad within Campaign A was doing the work.
utm_term — keyword or audience
For Google Search campaigns: the keyword that triggered the ad. For Meta campaigns: the ad set or audience name. For email: not typically used. Examples: womens_occasionwear_uk, buy_midi_dress_online, lookalike_1pct_ltv. This parameter is optional but valuable for granular analysis.
The naming convention that scales
Raw UTM parameters are just text strings. GA4 treats Meta, meta, META, and facebook as four different traffic sources. This is the single most common reason UTM data becomes useless over time — inconsistent naming turns a clean data model into a mess that requires hours of manual cleanup.
Four rules that prevent this:
- Lowercase only, always. No exceptions.
metanotMeta.paid_socialnotPaid Social. GA4 is case-sensitive. - Underscores, not spaces. Spaces in URLs become
%20or+characters, which can break tracking or create duplicate entries in your reports. - Agree on canonical terms for each field and document them. Write down: we always use
metanotfacebook. We always usepaid_socialnotsocialorcpcfor Meta. We always usecpcfor Google Search. Put this in a shared doc. Every person touching campaigns needs to use the same terms. - No special characters except underscores and hyphens. Parentheses, slashes, ampersands, and quotes all cause problems. Keep campaign names alphanumeric with underscores.
Most teams reach for a UTM builder tool and start tagging links without first agreeing on what the values should be. The tool generates the URL correctly, but the values are inconsistent — one person uses "facebook", another uses "meta", a third uses "fb". The result is three separate traffic sources in GA4 that are actually the same channel. Spend 30 minutes writing a canonical naming convention before you tag a single link. It's the highest-leverage 30 minutes in your analytics setup.
UTM templates for every major channel
Meta Ads (Facebook and Instagram)
Meta supports dynamic parameters — placeholders that Meta replaces automatically with the actual campaign, ad set, and ad name at the moment of click. Use these. They save time and ensure your UTM values always match your actual Meta structure.
?utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}
Where to add this: in the "URL Parameters" field at the ad level in Meta Ads Manager (not in the destination URL directly — Meta appends them automatically). The double-brace syntax ({{campaign.name}}) is Meta's dynamic parameter format. Meta replaces it with the actual campaign name when the ad is served.
Key Meta dynamic parameters: {{campaign.name}}, {{adset.name}}, {{ad.name}}, {{placement}} (useful for separating Feed vs Stories vs Reels), {{site_source_name}} (fb / ig / msg / an).
If you want to track placement separately — which you should, because Feed and Reels have very different performance profiles — add &utm_placement={{placement}} as a custom parameter, or encode it into utm_content: utm_content={{ad.name}}_{{placement}}.
Google Ads — Search campaigns
Google uses ValueTrack parameters, which work similarly to Meta's dynamic parameters but with different syntax.
{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={campaign}&utm_content={creative}&utm_term={keyword}
{lpurl} is the final URL. Google replaces {campaign}, {creative}, and {keyword} automatically at click time. Set this in the "Final URL suffix" field in your Google Ads account settings (Account > Settings > Account settings > Auto-tagging) or at campaign level. Note: if you have auto-tagging enabled (the gclid parameter), Google's own conversion tracking works via that mechanism — but you still need UTMs for GA4 attribution and for cross-channel reporting in tools like DataMaster.
Google Shopping campaigns
Shopping campaigns don't have keywords in the same sense as Search. Use product group or ad group name instead of keyword.
{lpurl}?utm_source=google&utm_medium=shopping&utm_campaign={campaign}&utm_content={adgroup}&utm_term={product_partition_id}
Use utm_medium=shopping (not cpc) to distinguish Shopping traffic from Search in your reports. This matters when you're calculating per-channel ROAS — Shopping and Search have different cost structures and conversion patterns.
Klaviyo and email campaigns
Email platforms don't support dynamic UTM parameters in the same way as Meta or Google. You set UTM values manually per campaign. The important thing is to tag every link in every email — not just the main CTA button.
?utm_source=klaviyo&utm_medium=email&utm_campaign=spring_sale_launch_may2025&utm_content=hero_cta_button
For automated flows (welcome series, abandoned cart, post-purchase), use a consistent campaign name that identifies the flow type: utm_campaign=welcome_series_flow, utm_campaign=abandoned_cart_flow. This lets you calculate revenue per flow in GA4 and DataMaster, not just per broadcast campaign.
Organic social (Instagram bio links, TikTok bio, etc.)
Organic social links are manual — there are no dynamic parameters. Tag them anyway. Untagged organic social traffic shows up as either Direct or Referral in GA4, understating your organic social impact and overstating Direct.
?utm_source=instagram&utm_medium=organic_social&utm_campaign=bio_link&utm_content=spring_collection_post
Update utm_content when you change your bio link destination or when you're pointing to a specific campaign. Use a link-in-bio tool like Linktree or Later that lets you create multiple UTM-tagged links without changing the bio URL.
Influencer and affiliate links
Each influencer or affiliate should get a unique UTM-tagged URL. The utm_campaign value should identify the specific person so you can calculate revenue per influencer.
?utm_source=influencer&utm_medium=affiliate&utm_campaign=jess_henderson_may2025&utm_content=instagram_story
"We audited a brand spending £8,000/month on influencer partnerships. None of the influencer links had UTMs. All of that traffic was appearing as Direct in GA4. They had no idea which influencers were actually driving sales."
The 6 most common UTM mistakes
1. Using spaces instead of underscores
A campaign name like Spring Sale 2025 becomes Spring%20Sale%202025 in a URL. GA4 may handle this correctly, or it may not — it depends on how the URL is encoded. Even when it works, it makes your reports harder to read and your regex filters harder to write. Use spring_sale_2025 everywhere. No spaces, ever.
2. Inconsistent source naming
This is the most damaging mistake in practice because it's invisible until you try to run a report. If your Meta campaigns use facebook as utm_source and your next batch uses meta, you now have two separate source lines in GA4 for the same channel. Your total Meta attribution is split across two rows. Anyone running a report who doesn't know to manually combine them will get the wrong number. Pick one name per platform — we recommend the current platform name (meta, google, tiktok, klaviyo) — and document it.
3. Missing UTMs on email campaigns
Email is one of the highest-ROAS channels for most e-commerce brands, and it's also the channel where UTM coverage is most often incomplete. When an email link is not tagged with UTMs, GA4 cannot identify the traffic as coming from email. Depending on the email client and device, it will show as Direct traffic, Referral (from the email provider's domain), or in some cases be lost entirely. Industry benchmarks suggest 30–40% of email-driven revenue shows as Direct for brands without consistent email UTM coverage. That's revenue you're crediting to the wrong channel in every budget conversation.
4. Putting UTMs on your own internal links
UTM parameters are designed for external links that point to your site. If you add UTMs to links within your own website — navigation links, footer links, internal banners — you will reset the session source for every visitor who clicks them. A customer who arrived from a Meta ad, browsed your homepage, and clicked a UTM-tagged internal banner to see the sale section will now appear as a "sale_banner" conversion in GA4, not a Meta conversion. This silently destroys your attribution data. UTMs go on links that live outside your domain. Never on links within your own site.
5. Not tagging Meta Stories and Reels separately from Feed
Meta Feed, Stories, and Reels have meaningfully different performance characteristics — different scroll contexts, different creative formats, different audience behaviours. When all placements are lumped into the same utm_content value, you can't tell whether your campaign's strong performance is being driven by Feed ads that are actually working or by Reels that are generating cheap impressions with low intent. Use Meta's {{placement}} dynamic parameter to split placement data, either as a separate parameter or encoded into utm_content.
6. Never auditing your UTM coverage
UTM coverage is not a set-and-forget task. New campaigns get created without UTMs. Media buyers change platforms. An Advantage+ campaign spins up a new ad set that isn't in your URL parameter template. Over time, gaps accumulate. Run a UTM coverage audit monthly: in GA4, go to Reports → Acquisition → Traffic acquisition and look at the Session source / medium breakdown. Any significant traffic appearing as (direct) / (none) that you can't explain is a sign of missing UTMs somewhere. More than 20% Direct traffic is a red flag for most paid-heavy brands.
Go to GA4 → Reports → Acquisition → Traffic acquisition. Set the primary dimension to "Session source / medium". Look for three things: (1) "(direct) / (none)" traffic above 20% of sessions — likely missing UTMs on email or organic social; (2) multiple entries for the same platform with different names, e.g. both "facebook / paid_social" and "meta / cpc" — inconsistent naming convention; (3) campaigns appearing as "(not set)" — UTM parameters present but campaign value empty or malformed. Each of these points to a specific fix.
UTM naming convention cheat sheet
| Channel | utm_source | utm_medium | Example utm_campaign |
|---|---|---|---|
| Meta Ads (Feed) | meta | paid_social | spring_prospecting_2025 |
| Instagram Ads | meta | paid_social | ig_retargeting_30d_q2 |
| Google Search | cpc | brand_search_uk | |
| Google Shopping | shopping | shopping_all_products_q2 | |
| Google Display | display | display_remarketing_may25 | |
| Klaviyo email | klaviyo | welcome_series_flow | |
| TikTok Ads | tiktok | paid_social | tiktok_prospecting_q2 |
| Pinterest Ads | paid_social | pinterest_spring_collection | |
| Instagram organic | organic_social | bio_link | |
| TikTok organic | tiktok | organic_social | bio_link |
| Influencer / affiliate | influencer | affiliate | jess_henderson_may2025 |
| SMS (Klaviyo / Attentive) | sms | sms | flash_sale_sms_may2025 |
How to audit your current UTM coverage
If you've been running ads for more than a few months without a formal UTM naming convention, you almost certainly have gaps. Here's a systematic way to find them.
Step 1 — Run the GA4 acquisition report. Reports → Acquisition → Traffic acquisition. Set date range to the past 90 days. Set primary dimension to "Session source / medium".
Step 2 — Calculate your Direct traffic percentage. Look at the row for "(direct) / (none)". Divide its session count by total sessions. If this is above 20% and you're running significant email and organic social, you have UTM gaps. If it's above 35%, the problem is substantial.
Step 3 — Look for duplicate channel entries. Scan the source / medium list for anything that looks like the same channel under different names. Common ones: facebook / cpc and meta / paid_social, email / email and klaviyo / (none), ig / paid and instagram / paid_social. Each duplicate represents a naming inconsistency.
Step 4 — Check campaign coverage. Add a secondary dimension: "Session campaign". Look for (not set) values within channels where you know you're running campaigns. These are sessions where utm_source and utm_medium were set but utm_campaign was missing — a partial UTM that helps channel attribution but not campaign-level ROAS.
Step 5 — Fix the gaps in priority order. Start with the channel driving the most revenue. If email is your biggest source of revenue, fix email UTMs first. If Meta is the biggest ad spend, verify Meta UTM coverage before worrying about Pinterest. Each gap you close improves the accuracy of every ROAS calculation you run.
How DataMaster uses UTM data to calculate Shopify-truth ROAS
UTMs are the input. Shopify-truth ROAS is the output. Here's how the two connect.
When a customer clicks a Meta ad with proper UTMs and lands on your Shopify store, GA4 records a session with those UTM values. When that customer completes a purchase, Shopify records an order with a transaction ID, a revenue amount, and a timestamp. DataMaster joins these two records: the GA4 session (which tells us the UTM source, medium, campaign, and content) and the Shopify order (which tells us the actual revenue that landed in your bank).
This join happens at the individual session level — not at aggregate level. DataMaster doesn't estimate the proportion of Meta revenue using channel averages. It matches the specific session to the specific order. If the session that led to the order had utm_source=meta and utm_campaign=spring_prospecting_2025, that order's revenue is attributed to that campaign. If the session had utm_source=google, it's attributed to Google, regardless of what Meta's dashboard says.
The result is a per-campaign ROAS figure that is grounded in actual Shopify revenue. Not platform-modelled revenue. Not estimated revenue. The actual number from your Shopify order records, matched to the ad click that preceded it.
For this to work, UTM coverage needs to be high. A brand with 95% UTM coverage on their Meta campaigns will get very accurate per-campaign ROAS data from DataMaster. A brand with 60% coverage will have 40% of their Meta-driven sessions appearing as Direct traffic — meaning the ROAS calculation will understate Meta performance and overstate Direct. The better your UTMs, the more accurate your attribution. There's no shortcut around it.
Get Shopify-truth ROAS per campaign — automatically
Once your UTMs are in place, DataMaster connects your Shopify store and ad platforms and calculates per-campaign ROAS using actual order data — updated every morning. No spreadsheets, no manual exports, no guessing which campaigns to scale.
Start free trial — no credit card required