关于 utm-builder
utm-builder 是面向营销人员的归因参考技能,可用于构建或审查 UTM 链接。内容涵盖命名规则、GA4 渠道分组、渠道模板和 BigQuery 验证查询。
主要功能
- 01按命名规则生成 UTM 链接
- 02查看 GA4 渠道分组规则
- 03查阅各渠道的 UTM 模板
- 04用 BigQuery 查询审计归因
- 05了解自动标记行为
适用场景
- 01创建 Google Ads 的 UTM 链接
- 02统一营销活动命名
- 03诊断 GA4 中的 Unassigned 流量
- 04在 BigQuery 中验证来源和媒介数据
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cognyai/ claude-code-marketing-skills --skill utm-builder安装后在 Claude Code 中输入/utm-builder确认已加载。
详细介绍
UTM 参数策略与构建参考
关于 UTM 参数策略、命名规范、GA4 默认渠道分组规则、自动标记行为、常见错误以及用于营销归因的 BigQuery 验证查询的完整指南。
完整文档:https://cogny.com/docs/utm-strategy
用法
/utm-builder # Full UTM strategy overview
/utm-builder naming conventions # Show naming convention rules
/utm-builder channel grouping # GA4 default channel grouping rules
/utm-builder meta ads # Meta Ads UTM template
/utm-builder audit # BigQuery validation queries
/utm-builder build google cpc # Generate UTM URL for Google Ads
说明
你是 UTM 策略与营销归因专家。请使用此参考帮助用户构建正确的 UTM URL、审核现有的 UTM 命名规范、了解 GA4 默认渠道分组规则,并在 BigQuery 中验证归因数据。
用户提问时,请找到下方相关章节,并提供准确、可执行的答复。构建 UTM URL 时,始终使用小写字母和连字符分隔的命名规范。
如果用户将特定主题作为参数提供,请重点介绍该领域。否则,请概述 UTM 策略基础知识。
连接到 Cogny MCP 工具后,你可以提取实时 GA4 数据和 Google Ads 数据,审核实际的 UTM 实现。
五种 UTM 参数
| 参数 | 必填 | 用途 | 示例 |
|---|---|---|---|
utm_source | 是 | 发送流量的平台或发布方 | google、facebook、linkedin、newsletter |
utm_medium | 是 | 营销渠道类型 | cpc、paid-social、email、organic-social |
utm_campaign | 是 | 具体的营销活动名称 | spring-sale-2025、brand-awareness-q1 |
utm_term | 否 | 付费搜索关键词 | running+shoes、crm+software |
utm_content | 否 | 创意版本或链接位置 | hero-banner、sidebar-cta、blue-variant |
参数详情
utm_source — 点击实际发生在哪里?
utm_source=google # Google Ads or Google organic
utm_source=facebook # Meta Ads (Facebook/Instagram)
utm_source=linkedin # LinkedIn Ads or organic
utm_source=klaviyo # Email via Klaviyo
utm_source=tiktok # TikTok Ads
utm_source=partner-blog # A specific referral partner
utm_medium — 渠道类型。这是 GA4 默认渠道分组中最重要的参数。如果 utm_medium 有误,流量就会被归入错误的渠道。
utm_medium=cpc # Cost-per-click (paid search)
utm_medium=paid-social # Paid social ads
utm_medium=email # Email marketing
utm_medium=organic-social # Organic social posts
utm_medium=display # Display/banner ads
utm_medium=affiliate # Affiliate traffic
utm_medium=referral # Partner/referral traffic
utm_medium=video # Video ads
utm_campaign — 采用一致结构的营销活动名称:
utm_campaign=spring-sale-2025
utm_campaign=brand-awareness-q1-2025
utm_campaign=retargeting-cart-abandoners
utm_term — 关键词或定向词:
utm_term=running-shoes
utm_term=best-crm-software
utm_content — 创意版本或展示位置:
utm_content=hero-image-v1
utm_content=sidebar-cta
utm_content=video-30s
GA4 默认渠道分组规则
GA4 根据 source、medium 和 campaign 的值,将每个会话归入默认渠道组。这些规则决定流量在 GA4 标准报告中的呈现方式。
| 渠道 | Medium 必须匹配 |
|---|---|
| 直接流量 | source = (direct),且 medium 为 (not set) 或 (none) |
| 自然搜索 | medium = organic |
| 付费搜索 | medium 匹配 ^(cpc|ppc|paidsearch)$ |
| 展示广告 | medium 匹配 ^(display|cpm|banner)$ |
| 付费社交 | medium 匹配 ^(paid-social|paidsocial|paid_social)$ |
| 自然社交 | medium 匹配 ^(social|social-network|social-media|sm|organic-social)$ |
| 电子邮件 | medium = email |
| 联盟营销 | medium = affiliate |
| 引荐 | medium = referral |
| 音频 | medium = audio |
| 短信 | medium 匹配 ^(sms|sms_message)$ |
| 视频 | medium 匹配 ^(video|youtube)$ |
| 跨网络 | 营销活动名称包含 cross-network |
| 未分配 | 不匹配以上任何规则 |
重要: 如果 utm_medium 不匹配以上任何模式,流量将归入 未分配。
BigQuery 中的 GA4 Source/Medium 映射
UTM 值会出现在 GA4 BigQuery 导出数据的多个位置:
| UTM 参数 | BigQuery 位置 | 范围 |
|---|---|---|
utm_source | traffic_source.source | 用户(首次接触) |
utm_medium | traffic_source.medium | 用户(首次接触) |
utm_campaign | traffic_source.name | 用户(首次接触) |
utm_source | session_start 上的事件参数 source | 会话 |
utm_medium | session_start 上的事件参数 medium | 会话 |
utm_campaign | session_start 上的事件参数 campaign | 会话 |
会话级别的 source/medium 查询:
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') as session_source,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') as session_medium,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'campaign') as session_campaign,
COUNT(*) as sessions
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name = 'session_start'
GROUP BY 1, 2, 3
ORDER BY sessions DESC
命名规范
规则
- 全部使用小写。 GA4 区分大小写。
Facebook和facebook是不同的来源。 - 使用连字符分隔单词。 不要使用空格(会变成
%20)或特殊字符。 - 不要使用特殊字符。 仅使用
a-z、0-9和-。 - 具体但简洁。 使用
paid-social,不要用ps。 - 在广告系列中包含时间标识。 使用
spring-sale-2025,不要用spring-sale。
推荐分类法
| 参数 | 约定 | 示例 |
|---|---|---|
utm_source | 平台名称,使用小写 | google、facebook、linkedin、klaviyo |
utm_medium | 符合 GA4 规则的渠道类型 | cpc、paid-social、email、display |
utm_campaign | name-date 或 name-quarter | spring-sale-2025、retarget-cart-q1 |
utm_term | 关键词或定向条件 | running-shoes、brand-keyword |
utm_content | 创意版本或展示位置 | video-30s-v2、hero-banner、cta-red |
各渠道的 UTM 模板
Google Ads(搜索)
?utm_source=google&utm_medium=cpc&utm_campaign={campaign_name}&utm_term={keyword}&utm_content={ad_variant}
Google Ads(展示广告)
?utm_source=google&utm_medium=display&utm_campaign={campaign_name}&utm_content={creative_variant}
Meta Ads(Facebook/Instagram)
utm_source=facebook&utm_medium=paid-social&utm_campaign={{campaign.name}}&utm_content={{ad.name}}&utm_term={{adset.name}}
Meta 动态参数:{{campaign.name}}、{{campaign.id}}、{{adset.name}}、{{adset.id}}、{{ad.name}}、{{ad.id}}、{{placement}}、{{site_source_name}}。
LinkedIn Ads
utm_source=linkedin&utm_medium=paid-social&utm_campaign={{CAMPAIGN_NAME}}&utm_content={{CREATIVE_NAME}}
LinkedIn 宏:{{CAMPAIGN_ID}}、{{CAMPAIGN_NAME}}、{{CAMPAIGN_GROUP_ID}}、{{CAMPAIGN_GROUP_NAME}}、{{CREATIVE_ID}}、{{CREATIVE_NAME}}。
电子邮件
?utm_source={esp_name}&utm_medium=email&utm_campaign={email_campaign_name}&utm_content={link_placement}
自然社交
?utm_source={platform}&utm_medium=organic-social&utm_campaign={post_theme}&utm_content={post_variant}
网红
?utm_source=creator-{name}&utm_medium=paid-social&utm_campaign=influencer-{campaign}-{date}&utm_content={platform}-{format}
联盟营销
?utm_source=partner-{name}&utm_medium=affiliate&utm_campaign=affiliate-program-{year}&utm_content={placement}
自动标记与手动标记
Google Ads(gclid)
- 自动标记会在每个点击 URL 中附加
gclid - GA4 会自动将会话归因到 Google Ads,并获取广告系列、广告组和关键词数据
- 来源/媒介会自动设置为
google / cpc - 如果同时存在 gclid 和 UTM,GA4 会优先使用 gclid — GA4 归因时会忽略 UTM
Google Ads 中仍需使用 UTM 的情况:
- 会解析 UTM 参数的 CRM 系统(HubSpot、Salesforce)
- 第三方分析工具(Mixpanel、Amplitude)
- 无法读取 gclid 的跨平台仪表板
- 使用
page_location的自定义 BigQuery 归因模型
Meta Ads(fbclid)
- GA4 不会原生解析
fbclid进行归因 - 如果没有 UTM,Meta 流量会显示为
facebook.com / referral或l.facebook.com / referral - 必须使用 UTM 参数,才能在 GA4 中正确归因 Meta Ads
LinkedIn Ads
- LinkedIn Insight Tag 会跟踪转化,但不会提供点击级别的 GA4 归因
- 必须使用 UTM 参数,才能在 GA4 中正确归因 LinkedIn Ads
何时同时使用两者
- Google Ads + CRM 集成:gclid 提供数据给 GA4,UTM 提供数据给 CRM
- 需要 UTM 的跨平台仪表板
- 自定义 BigQuery 归因模型
警告: 对于 Google Ads,除非确实希望 UTM 覆盖 gclid,否则请确保在 GA4 设置中未勾选“允许手动标记覆盖自动标记”。
常见的 UTM 错误
1. 命名不一致
GA4 会将每个不同的字符串视为单独的来源:
utm_source=Facebook # WRONG: capital F
utm_source=facebook # CORRECT
utm_source=fb # WRONG: abbreviation
2. 在站内链接上添加 UTM
在自己网站内的链接上添加 UTM 会重置会话来源并抬高会话数。切勿这样做:
<a href="/pricing?utm_source=homepage&utm_medium=banner">Pricing</a>
3. 缺少 utm_medium
如果没有 utm_medium,流量会被归入“未分配”:
# BAD: No medium
?utm_source=facebook&utm_campaign=spring-sale
# GOOD: Medium present
?utm_source=facebook&utm_medium=paid-social&utm_campaign=spring-sale
4. 对特殊字符进行 URL 编码
# BAD
utm_campaign=Spring Sale 2025 # Becomes Spring%20Sale%202025
# GOOD
utm_campaign=spring-sale-2025
5. 在自然流量/SEO 页面上添加 UTM
切勿在搜索引擎抓取的页面上添加 UTM 参数 — 这会分散页面权重并产生重复内容。
6. 广告系列名称中未包含日期
# BAD: Cannot distinguish quarters
utm_campaign=brand-search
# GOOD: Time-scoped
utm_campaign=brand-search-q1-2025
BigQuery 验证查询
所有唯一的来源/媒介组合
SELECT
traffic_source.source,
traffic_source.medium,
COUNT(DISTINCT user_pseudo_id) as users,
MIN(PARSE_DATE('%Y%m%d', event_date)) as first_seen,
MAX(PARSE_DATE('%Y%m%d', event_date)) as last_seen
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY 1, 2
ORDER BY users DESC
查找不一致的来源命名
WITH source_variants AS (
SELECT
LOWER(traffic_source.source) as normalized_source,
traffic_source.source as original_source,
COUNT(DISTINCT user_pseudo_id) as users
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 90 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND traffic_source.source IS NOT NULL
GROUP BY 1, 2
)
SELECT
normalized_source,
ARRAY_AGG(STRUCT(original_source, users) ORDER BY users DESC) as variants,
COUNT(*) as variant_count
FROM source_variants
GROUP BY 1
HAVING COUNT(*) > 1
ORDER BY variant_count DESC
预测渠道分组归类
SELECT
traffic_source.source,
traffic_source.medium,
CASE
WHEN traffic_source.source = '(direct)' AND (traffic_source.medium IS NULL OR traffic_source.medium IN ('(not set)', '(none)')) THEN 'Direct'
WHEN traffic_source.medium = 'organic' THEN 'Organic Search'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(cpc|ppc|paidsearch)$') THEN 'Paid Search'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(display|cpm|banner)$') THEN 'Display'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(paid-social|paidsocial|paid_social)$') THEN 'Paid Social'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(social|social-network|social-media|sm|social_network|social_media|organic-social)$') THEN 'Organic Social'
WHEN traffic_source.medium = 'email' THEN 'Email'
WHEN traffic_source.medium = 'affiliate' THEN 'Affiliates'
WHEN traffic_source.medium = 'referral' THEN 'Referral'
WHEN traffic_source.medium = 'audio' THEN 'Audio'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(sms|sms_message)$') THEN 'SMS'
WHEN REGEXP_CONTAINS(traffic_source.medium, r'^(video|youtube)$') THEN 'Video'
WHEN REGEXP_CONTAINS(IFNULL(traffic_source.name, ''), r'cross-network') THEN 'Cross-network'
ELSE 'Unassigned'
END as predicted_channel_group,
COUNT(DISTINCT user_pseudo_id) as users
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY 1, 2, 3
ORDER BY users DESC
查找站内 UTM 污染
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') as landing_page,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_referrer') as referrer,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') as session_source,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') as session_medium,
COUNT(*) as sessions
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name = 'session_start'
-- Replace example.com with your domain
AND REGEXP_CONTAINS(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_referrer'),
r'example\.com'
)
AND REGEXP_CONTAINS(
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location'),
r'utm_'
)
GROUP BY 1, 2, 3, 4
ORDER BY sessions DESC
查找缺少 utm_medium 的会话
SELECT
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') as source,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'campaign') as campaign,
COUNT(*) as sessions
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name = 'session_start'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') IS NOT NULL
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'source') != '(direct)'
AND (
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') IS NULL
OR (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'medium') IN ('(not set)', '(none)', '')
)
GROUP BY 1, 2
ORDER BY sessions DESC
电子表格生成公式
Google Sheets 公式:根据各列生成 UTM URL(A=URL,B=来源,C=媒介,D=广告系列,E=词语,F=内容):
=A2&"?utm_source="&B2&"&utm_medium="&C2&"&utm_campaign="&D2&IF(E2<>"","&utm_term="&E2,"")&IF(F2<>"","&utm_content="&F2,"")
Resources
- Google UTM Builder: https://ga-dev-tools.google/ga4/campaign-url-builder/
- GA4 Default Channel Grouping: https://support.google.com/analytics/answer/9756891
- GA4 BigQuery Export Schema: https://support.google.com/analytics/answer/7029846
- Google Ads Auto-Tagging: https://support.google.com/google-ads/answer/3095550
- Meta URL Parameters: https://www.facebook.com/business/help/1016122818401732
- Full Cogny Docs: https://cogny.com/docs/utm-strategy