Product catalog and Shopping campaigns create a tracking problem that most standard UTM setups aren’t built to handle. The issue comes down to a basic structural difference between two types of campaigns:

  • Collection or landing-page campaigns, where you choose the destination URL yourself

  • Individual product or catalog campaigns, where the platform dynamically selects which product a user lands on

With a landing-page campaign, adding a UTM string is straightforward: there’s one URL, and you tag it once. With catalog and Shopping campaigns, there isn’t one URL. There are hundreds, pulled dynamically from a product feed, and each one can point to a different landing page. Manually building and maintaining individual UTM-tagged URLs for every product in a catalog simply isn’t practical, and it breaks the moment the catalog changes.

1. The Problem With Product-Level Advertising

The core constraint is this: collection campaigns give you control over the destination URL, but catalog and Shopping campaigns don’t work that way by design. The platform selects the product, and the product selects the URL.

Because each product can carry a different landing page, any tracking approach that relies on manually editing individual product URLs will fail to scale. A catalog with 50 SKUs today might have 80 next quarter, and a manually maintained tracking setup has to be rebuilt every time the catalog changes. The only scalable solution is a tracking structure that adapts automatically to whichever product is served, without anyone touching the feed.

2. Meta Catalog Ads: Use Dynamic UTM Parameters

Meta solves this exact problem through dynamic UTM parameters, configured once at the campaign level rather than per product. Instead of editing every product URL in the catalog, you add a single dynamic parameter string in the campaign’s URL Parameters section, and Meta populates the actual values automatically for every impression and click.

These dynamic parameters can identify:

  • Source, the platform the click originated from

  • Medium, the type of traffic

  • Campaign, which specific campaign served the ad

  • Ad set, which audience or ad set the click came from

  • Ad, which specific creative was clicked

  • Product/catalog information, which product from the catalog was involved

Because these values are populated dynamically at serve time, the same parameter string works across the entire catalog, regardless of how many products are in it or how often the feed changes.

3. Dynamic UTM Structure for Meta

The dynamic UTM string to use for Meta Catalog and Shopping ads is:

?utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{adset.name}}&utm_term={{ad.name}}&utm_placement={{placement}}

Here’s what each parameter does:

  • utm_source=meta: a static value identifying Meta as the traffic source

  • utm_medium=paid_social: a static value identifying the medium as paid social

  • utm_campaign={{campaign.name}}: dynamically pulls in the actual campaign name for every click

  • utm_content={{adset.name}}: dynamically pulls in the ad set name, useful for isolating audience-level performance

  • utm_term={{ad.name}}: dynamically pulls in the specific ad or creative name

  • utm_placement={{placement}}: dynamically pulls in where the ad was shown, such as Feed, Stories, or Reels

This string should be added once in the campaign’s URL Parameters field. From that point on, every click on every product in the catalog inherits the correct values automatically, with no manual editing required as products are added or removed.

Dynamic values are preferable to static ones here specifically because a catalog campaign isn’t one ad, it’s potentially hundreds of ad and product combinations running simultaneously. Static UTMs would collapse all of that into a single undifferentiated bucket in analytics; dynamic UTMs preserve the granularity.

4. Why Dynamic Parameters Are Important for Catalog Tracking

A single catalog campaign can contain hundreds of products, and that product list can change constantly as SKUs are added, discontinued, or go out of stock. Dynamic parameters remove the need for any manual URL maintenance as that happens.

Beyond convenience, this structure is what makes product-level reporting possible in the first place. Without dynamic parameters, it’s not possible to tell which product, ad set, or placement actually drove a given session. With them, every session in GA4 or your analytics platform can be reconciled back to the exact campaign, ad set, ad, and placement that generated it, which is essential for comparing Meta’s own reported numbers against independent analytics data.

5. Google Shopping: Tracking Through the Final URL

Google Shopping has the same underlying challenge as Meta Catalog, but it’s solved through a different mechanism. Shopping campaigns don’t use manually set landing pages; the product URLs are pulled directly from the product data in Merchant Center.

Because of that, tracking for Shopping needs to be handled through Google Ads’ tracking configuration rather than by editing individual product URLs in the feed. Editing URLs directly in Merchant Center is both impractical at scale and risks creating inconsistencies between what’s advertised and what’s actually live on the site.

6. Google Ads Static URL / Tracking Configuration

Tracking for Shopping and PMax campaigns is configured in the account, campaign, or ad group’s tracking settings in Google Ads, rather than in the Merchant Center feed itself. This is done through a tracking template, which appends tracking information to whatever final URL the product data provides, instead of replacing that URL.

A typical tracking template structure looks like:

{lpurl}?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={creative}&network={network}

The key building blocks here:

  • {lpurl} preserves the original destination URL pulled from the product feed, so the tracking template adds parameters on top of it rather than overriding it

  • {campaignid} and other Google ValueTrack parameters dynamically insert the actual campaign, ad group, and network values for every click, the same role {{campaign.name}} plays on Meta

It’s worth being precise about the distinction between four related fields in Google Ads:

  • Final URL: the actual destination the product data points to, pulled from Merchant Center

  • Tracking template: the wrapper that appends tracking parameters to the Final URL without changing the destination

  • Custom parameters: account-level or campaign-level variables that can be referenced inside a tracking template

  • UTM parameters: the specific source/medium/campaign tagging convention layered on top through the tracking template, so the resulting sessions are readable in GA4

7. Meta vs Google: Tracking Approach

Platform

Campaign Type

Tracking Approach

Meta

Collection

Controlled destination URL + UTM

Meta

Catalog

Dynamic UTM parameters

Google

Search

Tracking template / URL parameters

Google

Shopping

Google Ads tracking configuration + product URL

Google

PMax

Tracking configuration + dynamic parameters

8. How to Validate the Tracking

Before relying on any of this data for optimization, it needs to be validated end to end:

  • Click an actual ad or product, not just preview it

  • Check the resulting URL to confirm it lands where expected

  • Confirm UTM parameters are appended correctly and haven’t been stripped or overwritten

  • Verify source, medium, and campaign are showing up correctly in GA4

  • Compare platform-level reported numbers against analytics data to check for discrepancies

  • Check specifically that product-level attribution isn’t being overwritten by a later click or a different channel

9. Common Tracking Mistakes

  • Using static campaign names on dynamic catalog campaigns, which collapses all product-level data into one bucket

  • Manually editing individual product URLs instead of using dynamic parameters or a tracking template

  • Missing utm_source, which breaks channel attribution in GA4

  • Missing campaign identifiers, making it impossible to isolate campaign-level performance

  • Using inconsistent naming conventions between Meta and Google, which makes cross-platform reporting harder to reconcile

  • Not testing the final destination URL before scaling spend

  • Assuming the product URL itself provides campaign attribution, when in fact it only provides the destination, not the source of the click

  • Standardize UTM naming conventions across Meta and Google so reporting is consistent

  • Use dynamic parameters wherever the platform supports them, rather than static or manually maintained values

  • Keep campaign naming consistent across platforms to simplify cross-channel analysis

  • Test the tracking setup before scaling any new campaign

  • Document the tracking structure so new catalogs and products automatically inherit the same framework, instead of requiring setup from scratch each time


In practice, most teams validate this once at setup and then stop, since manually cross-checking source, medium, and campaign against GA4 every week isn't realistic. This is where a platform like NYX helps: Neo continuously reconciles platform-reported numbers against your analytics data, flagging attribution gaps or dropped parameters before they skew a week of decisions. The core discipline stays the same (dynamic parameters, consistent naming, a Final URL that isn't overwritten), it's just no longer something that degrades the moment nobody's watching it.

1. Why can't I just add a UTM string to my product URLs like I would for a landing page campaign?
 

Landing page campaigns have one destination URL you control directly. Catalog and Shopping campaigns pull product URLs dynamically from a feed that can hold hundreds of products and changes constantly, so manually tagging each URL isn't scalable and breaks the moment the catalog updates.

2. What does the Meta dynamic UTM string actually do?

The string ?utm_source=meta&utm_medium=paid_social&utm_campaign={{campaign.name}}&utm_content={{adset.name}}&utm_term={{ad.name}}&utm_placement={{placement}} is added once in the campaign's URL Parameters field. Meta then populates campaign, ad set, ad, and placement values automatically on every click, across every product, without any manual editing.

3. How is tracking handled differently on Google Shopping compared to Meta Catalog?

 Meta uses dynamic UTM parameters set at the campaign level. Google Shopping pulls product URLs from Merchant Center, so tracking is handled through a tracking template in Google Ads that appends parameters to the existing Final URL ({lpurl}) using ValueTrack parameters like {campaignid}, rather than editing the feed itself.

4. What's the difference between a Final URL, a tracking template, custom parameters, and UTM parameters in Google Ads?

 The Final URL is the actual destination pulled from the product feed. The tracking template wraps around it to append tracking data without changing the destination. Custom parameters are variables you can reference inside that template. UTM parameters are the specific source/medium/campaign tags layered on top so sessions read correctly in GA4.

5. How do I confirm the tracking setup is actually working before scaling spend?

 Click an actual ad or product rather than just previewing it, check that the resulting URL carries the correct UTM parameters, and confirm source, medium, and campaign show up correctly in GA4. Compare platform-reported numbers against analytics data and check that product-level attribution isn't being overwritten by a later click or a different channel.

 Conclusion

Product catalogs and Shopping campaigns don’t need to be difficult to track. The complexity comes from trying to apply a landing-page-campaign mindset, one static UTM string per URL, to a dynamic, product-driven environment where that approach simply doesn’t scale.

The fix is the same on both platforms: use dynamic parameters instead of manually modifying product URLs. On Meta, that means the dynamic UTM string added once at the campaign level. On Google, that means the appropriate tracking configuration layered on top of the Final URL pulled from Merchant Center. Either way, nothing should be trusted for optimization decisions until it’s been validated in GA4 against actual platform data.