TL;DR
A link tagged with utm_source and utm_medium but no utm_campaign reports perfectly in GA4 and does not exist as far as Shopify's marketing attribution is concerned [4]. That asymmetry, together with GA4's rule that auto-tagging outranks manual tagging because there is no override option [1], explains most cases where the same day's traffic splits differently in the two tools. The convention below satisfies both keys at once. It also stops the most common self-inflicted wound, which is hand-tagging Google Ads links so that GA4 will "match".
Key Takeaways
- Ship all three of
utm_source,utm_mediumandutm_campaignon every tagged link. Google states that missing UTM parameters produce(not set)values in reporting rather than an inferred guess [2]. - Values are case sensitive.
utm_source=googleandutm_source=Googleare different values, andSpringSaleandSpring_Saleare counted as distinct campaigns [2]. Lowercase and underscores, everywhere, with no exceptions. - Your medium has to match
^(.*cp.*|ppc|retargeting|paid.*)$for GA4 to group the traffic as Paid Search or Paid Social [3].cpc,ppcandpaid_socialqualify.social-paid,fb-adsandsponsoreddo not. - Never hand-tag Google Ads destination URLs to force agreement with GA4. If your Google Ads and GA4 accounts are linked, auto-tagging wins there [1], and the hand tags only fragment the reports that do read UTM fields.
- Shopify attributes traffic to marketing on the presence of
utm_campaignin the landing URL [4]. Source and medium alone buy you nothing in the Shopify admin. - Shopify treats visits less than 30 minutes apart as one session [4], and campaign values travel with a server-side purchase only while the shopper is still inside the analytics session that captured them.
- Ad platforms report off their own click identifiers; Google Ads uses
gclid,gbraidandwbraid[5]. UTM strings are for your analytics and your Shopify reports.
One URL, three systems, three different keys
The reason a tagging convention feels arbitrary is that it is asked to serve three readers that key on three different things.
| System | What it reads first | What your UTM strings do there |
|---|---|---|
| GA4 | The auto-tagged click ID when one is present, otherwise the UTM set on the landing URL [1][2] | Populate source, medium, campaign, term and content, except on auto-tagged Google Ads clicks |
| Shopify marketing reports | Whether utm_campaign appears in the landing URL [4] |
Decide whether the visit is counted as marketing at all |
| Meta, Google Ads and other ad dashboards | Their own click identifiers, for example gclid [5] |
Nothing measurable |
Read the middle row twice. Shopify's marketing performance documentation is specific about it: "Traffic that comes to your store with utm_campaign parameters in the URL is attributed to marketing", and that traffic is what feeds the Sales attributed to Marketing and Top channel performance reports [4]. A newsletter link tagged utm_source=klaviyo&utm_medium=email and nothing else is a well-formed GA4 email session and a visit Shopify does not attribute to marketing at the same time. You have probably seen the two tools disagree about the size of your email channel and assumed it was a modelling difference. Sometimes it is one missing parameter.
How Shopify then assigns credit across touches, and which of its five models is doing the assigning, is a separate question covered in how Shopify attribution works and in the Channel Performance report mechanics.
Does hand-tagging your Google Ads links make GA4 agree?
No, and the attempt makes things worse.
Google's auto-tagging documentation states it plainly: "However, in Google Analytics 4 (GA4), auto-tagging is prioritized over manual tagging due to the absence of an override option" [1]. So when a click arrives carrying both a gclid and your carefully written UTM strings, GA4 reports the Google Ads pairing. Your strings are still in the URL, still visible in the Page location dimension [2], and still ignored by the acquisition reports you were trying to influence.
The damage is downstream. Shopify reads the UTM fields, and so does every dashboard built on the landing URL. If your hand tags say utm_source=google-ads while the rest of your account has settled on google plus cpc, that one campaign now occupies its own row in the Shopify reports while GA4 shows it merged with the rest of paid search. Two tools, two answers, one avoidable cause.
The same documentation gives the exception: "If you'd like to continue tracking Google Ads traffic using manual tags and don't wish to create integrations between Analytics and your Google Ads, you can manually tag the destination URLs in your ads with UTM parameters to collect the data" [1]. That is a choice for accounts with no Analytics link at all. If your properties are linked, leave auto-tagging alone and let it do the work.
The naming rules that decide which report row you land in
Naming conventions get treated as taste. Four of the rules are mechanical, and each one has a source.
Case is data. Google's manual-tagging reference states that "Parameter values are case sensitive, e.g. utm_source=google is different from utm_source=Google", and its best-practice table adds that "Keywords with different capitalization, such as Meta and meta, are treated as different values" and that "SpringSale and Spring_Sale are considered distinct" [2]. Pick lowercase with underscores and write it into the brief template that your agency and your freelancers copy from.
One source per platform, one medium per channel. The same table says to "Use only one unique utm_source for each distinct platform" and "Use only one unique utm_medium for each distinct channel. For example, paid_social and organic_search" [2]. The failure this prevents is the six-variant sprawl: facebook, Facebook, fb, meta, facebook.com, fb-paid, all of them the same platform, none of them summing.
The medium is what triggers channel grouping. GA4's default channel group definitions are published rules, not a black box. Paid Search for manual traffic requires that "Source matches a list of search sites AND Medium matches regex ^(.*cp.*|ppc|retargeting|paid.*)$", and Paid Social requires a social source with the same medium regex [3]. Email is matched on source or medium equal to email, e-mail, e_mail or e mail [3]. So cpc, ppc, paid_social and paid-social land in a paid group, and social-paid or sponsored match no paid rule at all. This is the single highest-value line in any tagging document, because it converts "use a sensible medium" into a testable rule.
Ship the whole set or accept (not set). Google recommends setting all relevant parameters, "especially utm_source, utm_medium, utm_campaign, utm_id, and utm_source_platform", and states that "Missing UTM parameters will result in (not set) values being present in reporting" [2]. The consequences of that value spreading through your reports are covered in GA4 (not set) and unattributed Shopify orders.
One small footnote from the same page, useful when someone asks why they cannot find their UTMs in a landing-page report: UTM parameters are stripped from the Landing page + query string and Page path + query string dimensions, and appear in Page location instead [2].
How long does a tagged visit actually stay tagged?
Shorter than most first-touch schemes assume, and the ceiling has two halves.
The Shopify half is documented. "A session is a period of activity from a visitor where each visit they make to your online store is less than 30 minutes apart" [4], attribution data in the Growth section is available only from October 1, 2021 [4], and report metrics can take up to 24 hours to update [4]. That last number matters on tagging launch day, because a convention change looks broken for a day before it looks correct.
The measurement half is where server-side tracking has an honest limit. WeltPixel Conversion Tracking reads the campaign values from the landing URL and carries them onto the server-side purchase under the parameter names GA4 actually reads for session source, medium and campaign. That carry is scoped to the shopper's analytics session. Someone who arrives on a tagged link, closes the tab, and buys two days later sends a purchase with no campaign values attached, and GA4 applies its own attribution modelling instead. That is a ceiling on what any tagging convention can promise, not a defect to fix, and it is the reason first-touch reporting belongs in a warehouse rather than in a UTM string.
What does survive longer is the click identifier. If the browser capture was blocked or never ran, an ad click ID can still be recovered from the order's landing site and attached to the conversion. Campaign UTM values cannot be recovered the same way. Google's own definitions are worth using verbatim, since secondary sources reverse them: "A gbraid is a URL parameter that is present when a user clicks on an ad on the web and is directed to your iOS app", while "A wbraid is a URL parameter that is present when a user clicks on an ad in an iOS app and is directed to your webpage" [5]. The wbraid parameter was introduced in March 2021 [6]. The branch where no click ID arrives at all is covered in Google Ads conversions without a gclid.
For Shopify's own attribution-cookie background, see our piece on Shopify's attribution cookies. For the current session rule, use the definition on Shopify's live help page [4].
Audit your own tagging in about twenty minutes
Do this before rewriting a single link, because the sprawl is usually smaller than it feels.
- In GA4, open Reports → Acquisition → Traffic acquisition and set the dimension to Session source / medium. Sort by sessions and read the bottom half of the table. Every near-duplicate pair you see there is a convention violation with a date on it.
- Switch the dimension to Session medium alone and check each value against
^(.*cp.*|ppc|retargeting|paid.*)$[3]. Anything paid that fails the regex is money sitting in the wrong channel group. - Open Admin → Data display → Channel groups and confirm nobody has built a custom group that papers over a naming problem instead of fixing it.
- In the Shopify admin, open the Top channel performance report [4] and compare its session totals per channel against the GA4 numbers from step 1. Gaps concentrated in one channel usually mean links without
utm_campaign. - Take one live ad from each platform, copy its destination URL, and read the query string. You are checking for hand-written UTMs on Google Ads links, and for missing
utm_campaignvalues on email and affiliate links. - Write the convention down as a table with one row per platform, store it where whoever builds links can find it, and pick a date next quarter to run steps 1 and 2 again.
Step 5 is the one that finds real money. Steps 1 through 4 find rows; step 5 finds the person who has been tagging by hand for a year.
FAQ
Should I add UTM parameters to my Google Ads final URLs?
No, if your Google Ads and GA4 accounts are linked. Auto-tagging is prioritized over manual tagging in GA4 and there is no override option [1], so the manual tags cannot change the acquisition report and will fragment any report that reads the UTM fields, including Shopify's.
Why does Shopify show fewer marketing sessions than GA4?
The most common cause is links tagged with source and medium but no utm_campaign. Shopify attributes traffic to marketing based on utm_campaign being present in the URL [4], while GA4 is happy with source and medium alone.
Does utm_source=Facebook really report separately from utm_source=facebook?
Yes. Google states that parameter values are case sensitive and that differently capitalized keywords are treated as different values [2]. Standardize on lowercase and fix historical values with a naming convention rather than a report filter.
Which UTM parameters does a server-side tracking app pass to GA4 with the purchase?
WeltPixel Conversion Tracking carries source, medium, campaign, term, content and campaign ID from the landing URL onto the server-side purchase, using the parameter names GA4 reads for its session attribution dimensions. The carry lasts as long as the shopper's analytics session.
Do UTM parameters affect what Meta or Google Ads reports?
No. Ad platforms report off their own click identifiers, and Google Ads uses gclid, gbraid and wbraid [5]. UTM strings are for your analytics and your Shopify reports only.
If you want the campaign values captured at the landing page to still be on the purchase after checkout, WeltPixel Conversion Tracking [7] sends the purchase server-side, and on the GA4 side it carries the campaign values captured at the landing page, so a blocked browser pixel does not cost you the campaign row.
One last thing to decide before you start: whether your convention lives in a spreadsheet or in a link builder that refuses to produce a URL without all three parameters. Google's guidance to always use utm_source, utm_medium and utm_campaign [2] is easier to enforce in a tool than in a document.
Sources
- Google Ads Help, "About auto-tagging" (GA4 prioritizes auto-tagging over manual tagging due to the absence of an override option; manual tagging option for unlinked accounts), support.google.com/google-ads/answer/3095550, accessed September 10, 2026
- Google Analytics Help, "URL builders: Collect campaign data with custom URLs" (parameter list, case sensitivity, one unique source per platform, one unique medium per channel, missing parameters produce (not set), UTM parameters omitted from landing-page dimensions), support.google.com/analytics/answer/10917952, accessed September 10, 2026
- Google Analytics Help, "Traffic-source dimensions" (Default channel group definitions; Paid Search and Paid Social manual-traffic rules with medium regex
^(.*cp.*|ppc|retargeting|paid.*)$; Email source and medium matches), support.google.com/analytics/answer/9756891, accessed September 10, 2026 - Shopify Help Center, "Marketing performance" (traffic with
utm_campaignparameters is attributed to marketing; five attribution models; Growth attribution data from October 1, 2021; session defined as visits less than 30 minutes apart; up to 24 hours for reports to update), help.shopify.com/en/manual/promoting-marketing/analyze-marketing/marketing-performance, accessed September 10, 2026 - Google Ads API documentation, "Upload click conversions" (
gclidcaptured from URL parameters;gbraidandwbraiddefinitions), developers.google.com/google-ads/api/docs/conversions/upload-clicks, accessed September 10, 2026 - Google Ads Help, "Updates to iOS 14 campaign measurement" (
wbraidintroduced March 2021), support.google.com/google-ads/answer/10417364, accessed September 10, 2026 - WeltPixel Conversion Tracking, Shopify App Store listing, apps.shopify.com/weltpixel-conversion-tracking, accessed September 10, 2026