{
  "id": "measurement.utm.feed-links",
  "protocol": "measurement",
  "layer": "foundation",
  "role": "merchant",
  "status": "recommended",
  "title": "Tag every feed link with required UTMs (source and medium)",
  "description": "Feed links (OpenAI url, Google and Microsoft link and ads_redirect, agent hand off URLs) are where AI and shopping surfaces send buyers. Google's link must use your verified domain and an encoded URL; its own example has query parameters. ads_redirect (Google and Microsoft) exists to add parameters for ads clicks and must stay on the same domain; Microsoft's link must not redirect.",
  "goal": "See which surface drove each visit. Organic and cpc media map into GA4 Default Channel Groups. For AI assistants, pick Option A (utm_medium=ai-assistant, GA4 built-in channel) or Option B (own medium plus custom channel group; see measurement.referrer-segments). Optional UTMs add campaign and product detail.",
  "note": "Templates follow Simon Vreeman's convention (vreeman.com/utm): required utm_source and utm_medium (lowercase, no duplicates, URL returns 200); optional utm_campaign, utm_term, utm_content, utm_source_platform, utm_creative_format, utm_marketing_tactic. For AI assistants choose the medium yourself (not referral). Templates use {ai_medium}. Option A: utm_medium=ai-assistant lands in GA4's built-in AI Assistant default channel with no setup (support.google.com/analytics/answer/9756891). Option B: your own medium (for example ai) plus a GA4 custom channel group placed above Referral; without that group the traffic lands in Unassigned. Conflicts: a platform appended utm_source may override or duplicate yours; Google Ads auto-tagging (gclid) usually decides attribution in linked GA4 (assumption). Do not tag a link that both free listings and ads use as organic; use ads_redirect for cpc. No official UCP or ACP guidance on UTMs was found. The audit only checks that source and medium are present and lowercase; it does not enforce a specific medium value.",
  "how_to_implement": {
    "steps": [
      "Required on every feed URL: utm_source and utm_medium, lowercase, no duplicates; tagged URL returns 200.",
      "AI assistants: replace {ai_medium} with your choice (Option A ai-assistant, or Option B e.g. ai); sources stay per assistant (chatgpt.com, gemini, perplexity, copilot, claude).",
      "Optional (examples): OpenAI url also ?utm_campaign=chatgpt-shopping&utm_content={item_id}&utm_source_platform=openai",
      "Optional: Google free listings also &utm_campaign=shopping-free-listings&utm_content={id}",
      "Optional: Google or Microsoft ads_redirect also &utm_campaign={campaign}-shopping&utm_content={id}",
      "Optional: UCP or ACP hand off also &utm_campaign=agentic-checkout&utm_content={item_id}",
      "Minimal required examples: OpenAI ?utm_source=chatgpt.com&utm_medium={ai_medium}; Google link ?utm_source=google&utm_medium=organic; ads_redirect ?utm_source=google|bing&utm_medium=cpc; hand off ?utm_source={agent host}&utm_medium={ai_medium}.",
      "Append with & when a query string exists.",
      "If you pick Option B, create a GA4 custom channel group (see measurement.referrer-segments)."
    ]
  },
  "resources": [
    {
      "label": "Simon Vreeman: GA4 UTM convention and builder",
      "url": "https://vreeman.com/utm",
      "type": "docs",
      "publisher": "Simon Vreeman (convention)"
    },
    {
      "label": "OpenAI file upload: products spec",
      "url": "https://developers.openai.com/commerce/specs/file-upload/products",
      "type": "spec",
      "publisher": "OpenAI"
    },
    {
      "label": "Google product data specification",
      "url": "https://support.google.com/merchants/answer/7052112",
      "type": "spec",
      "publisher": "Google"
    },
    {
      "label": "Microsoft Merchant Center catalog file",
      "url": "https://learn.microsoft.com/en-us/advertising/msa-help/hlp_ba_conc_aboutbingmerchantcentercatalogfile",
      "type": "docs",
      "publisher": "Microsoft"
    },
    {
      "label": "GA4 default channel group",
      "url": "https://support.google.com/analytics/answer/9756891",
      "type": "docs",
      "publisher": "Google"
    }
  ],
  "audit": {
    "method": "feed_check",
    "automatable": true,
    "expect": {
      "url_fields": [
        "url",
        "link",
        "ads_redirect"
      ],
      "required_params": [
        "utm_source",
        "utm_medium"
      ],
      "optional_params": [
        "utm_campaign",
        "utm_content",
        "utm_term",
        "utm_source_platform",
        "utm_creative_format",
        "utm_marketing_tactic"
      ],
      "lowercase": true,
      "no_duplicate_params": true,
      "http_status": 200
    },
    "human": "Parse every feed URL: utm_source and utm_medium present once (any medium value; the audit does not enforce a specific medium), all lowercase, and the URL returns 200. Optional UTMs (campaign, content, term, source_platform, creative_format, marketing_tactic) are reported as info only."
  },
  "how_to_verify": "Parse every feed URL: utm_source and utm_medium present once (any medium value; the audit does not enforce a specific medium), all lowercase, and the URL returns 200. Optional UTMs (campaign, content, term, source_platform, creative_format, marketing_tactic) are reported as info only.",
  "artifacts": [
    "utm_source",
    "utm_medium",
    "ads_redirect",
    "{ai_medium}"
  ],
  "depends_on": [
    "acp.feed.openai"
  ],
  "status_note": "Templates follow Simon Vreeman's convention (vreeman.com/utm): required utm_source and utm_medium (lowercase, no duplicates, URL returns 200); optional utm_campaign, utm_term, utm_content, utm_source_platform, utm_creative_format, utm_marketing_tactic. For AI assistants choose the medium yourself (not referral). Templates use {ai_medium}. Option A: utm_medium=ai-assistant lands in GA4's built-in AI Assistant default channel with no setup (support.google.com/analytics/answer/9756891). Option B: your own medium (for example ai) plus a GA4 custom channel group placed above Referral; without that group the traffic lands in Unassigned. Conflicts: a platform appended utm_source may override or duplicate yours; Google Ads auto-tagging (gclid) usually decides attribution in linked GA4 (assumption). Do not tag a link that both free listings and ads use as organic; use ads_redirect for cpc. No official UCP or ACP guidance on UTMs was found. The audit only checks that source and medium are present and lowercase; it does not enforce a specific medium value.",
  "verified": true,
  "slug": "measurement-utm-feed-links",
  "category": "foundation",
  "url": "https://vreeman.ai/commerce/checklist#measurement.utm.feed-links",
  "updated": "2026-10-12",
  "sources": [
    {
      "label": "Simon Vreeman: GA4 UTM convention and builder",
      "url": "https://vreeman.com/utm",
      "type": "docs",
      "publisher": "Simon Vreeman (convention)"
    },
    {
      "label": "OpenAI file upload: products spec",
      "url": "https://developers.openai.com/commerce/specs/file-upload/products",
      "type": "spec",
      "publisher": "OpenAI"
    },
    {
      "label": "Google product data specification",
      "url": "https://support.google.com/merchants/answer/7052112",
      "type": "spec",
      "publisher": "Google"
    },
    {
      "label": "Microsoft Merchant Center catalog file",
      "url": "https://learn.microsoft.com/en-us/advertising/msa-help/hlp_ba_conc_aboutbingmerchantcentercatalogfile",
      "type": "docs",
      "publisher": "Microsoft"
    },
    {
      "label": "GA4 default channel group",
      "url": "https://support.google.com/analytics/answer/9756891",
      "type": "docs",
      "publisher": "Google"
    }
  ],
  "related_slugs": [
    "acp-feed-openai"
  ]
}