关于 conversion-debug
conversion-debug 是用于排查 GTM、GA4、Google Ads 和 Meta Pixel 转化追踪问题的技能,面向营销与分析人员。它涵盖数据差异、重复转化、同意模式和 BigQuery 验证。
主要功能
- 01跨平台转化差异分析
- 02重复转化诊断
- 03Consent Mode v2 与增强型转化检查
- 04各平台追踪检查清单
- 05BigQuery 验证查询
适用场景
- 01比较 Meta Pixel、GA4 与 Google Ads 转化数
- 02查找重复购买事件或缺失的交易 ID
- 03审计同意状态与增强型转化
- 04在 BigQuery 中验证 GA4 事件数据
MCP 相关
提供 MCP 工具时,该技能会指导查询 GTM、GA4、Google Ads 和 Meta 账户数据以核实诊断结果。
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ cognyai/ claude-code-marketing-skills --skill conversion-debug安装后在 Claude Code 中输入/conversion-debug确认已加载。
详细介绍
转化跟踪调试器
调试 GTM、GA4、Google Ads 和 Meta Pixel 的转化跟踪。诊断数据差异、查找重复转化、验证增强型转化、审核 Consent Mode v2,并运行 BigQuery 验证查询。
完整文档:https://cogny.com/docs/conversion-tracking-debugger
用法
/conversion-debug # Full debugging overview
/conversion-debug duplicate conversions # Diagnose duplicate purchases
/conversion-debug consent mode # Consent Mode v2 audit
/conversion-debug meta vs ga4 # Cross-platform discrepancy analysis
/conversion-debug enhanced conversions # Validate enhanced conversion setup
/conversion-debug server-side tagging # Server-side GTM overview
/conversion-debug value wrong # Debug incorrect conversion values
说明
你是一名转化跟踪调试专家。请使用此参考资料和可用的 MCP 工具,帮助用户诊断并解决 GTM、GA4、Google Ads 和 Meta Pixel 的转化跟踪问题。
用户提问时,请找到下方相关章节,并提供准确、可执行的答复。若有可用的 MCP 工具,请使用它们从用户的账户中获取实时数据,以验证发现。
如果用户提供了特定主题作为参数,请聚焦于该主题。否则,请询问他们需要哪种平台或问题的帮助。
有可用的 MCP 工具时,请遵循以下诊断方法:
- 使用 GTM 工具检查标签、触发器和工作区状态
- 使用 GA4 工具检查转化事件、运行报告并验证数据流
- 使用 Google Ads 工具查询转化操作状态和效果
- 使用 Meta 工具检查 Pixel 配置并比较转化次数
- 交叉比对各平台的发现,以确定根本原因
转化跟踪技术栈
了解数据流是调试的第一步:
User Action (click, form submit, purchase)
|
v
+-------------------+
| Website / App |
| (dataLayer) |
+-------------------+
|
v
+-------------------+ +-------------------+
| Google Tag | ----> | GA4 |
| Manager (GTM) | | (Measurement |
| | | Protocol) |
| - GA4 Config Tag | +-------------------+
| - GA4 Event Tag | |
| - Google Ads Tag | v
| - Meta Pixel Tag | +-------------------+
+-------------------+ | BigQuery Export |
| | (daily/intraday) |
| +-------------------+
|
+----------> +-------------------+
| | Google Ads |
| | (Conversion |
| | Tracking) |
| +-------------------+
|
+----------> +-------------------+
| Meta Pixel |
| + Conversions |
| API (CAPI) |
+-------------------+
关键数据流环节:
- dataLayer 推送——网站将事件数据推送到
window.dataLayer - GTM 触发器——标签根据与 dataLayer 事件匹配的触发条件触发
- 网络请求——每个标签都会向其目标平台发送独立的 HTTP 请求
- 平台处理——每个平台独立处理、去重并进行归因
- BigQuery 导出——GA4 将原始事件导出到 BigQuery(每天约在媒体资源时区凌晨 5 点)
常见数据差异及其原因
GA4 与 Google Ads 的转化次数差异
GA4 和 Google Ads 几乎不会完全一致,这是正常的。
| 因素 | GA4 | Google Ads |
|---|---|---|
| 归因模型 | 数据驱动(跨渠道) | 数据驱动(仅限 Google 渠道) |
| 计数方式 | 可配置:每个会话计一次或每个事件计一次 | 可配置:计一次或每次转化都计 |
| 转化窗口 | 默认 30 天 | 默认 30 天(最长 90 天) |
| 跨设备 | Google Signals + User-ID | Google 账号登录 |
| 浏览型转化 | 默认不计入 | 展示广告/视频广告会计入(默认 1 天) |
| 数据新鲜度 | 处理延迟 24-72 小时 | 转化会在数小时内显示 |
| 建模转化 | 针对同意状态缺失的行为建模 | 针对未观测到的转化进行建模 |
典型差异:5-20% 属于正常范围。超过 20% 时应进行调查。
MCP 诊断方法:
1. GA4: tool_list_conversion_events → check which events are marked as conversions
2. GA4: tool_run_report → pull conversion counts by date
3. Google Ads: tool_execute_gaql → query conversion_action metrics
4. Compare the numbers and identify the gap source
Meta Pixel 与 GA4 的差异
| 因素 | Meta | GA4 |
|---|---|---|
| 点击归因窗口 | 7 天(默认) | 30 天(默认) |
| 浏览型转化 | 默认计入 1 天 | 默认不计入 |
| 归因方式 | Meta 内的末次触点 | 跨渠道数据驱动 |
| 去重 | 使用 eventID 对浏览器+CAPI 事件去重 | transaction_id 参数 |
| 跨设备 | Facebook 登录关系图谱 | Google Signals + User-ID |
**Meta 报告的转化次数通常较高的原因:**浏览型转化。用户看到了 Meta 广告但没有点击,之后通过 Google 搜索完成转化。Meta 会将其计入;GA4 则会将其归因到自然流量/CPC。
GTM 触发但 GA4 未接收到数据
- 同意模式阻止——拒绝同意时,标签会触发但不会发送数据
- 广告拦截器——约 25-30% 的用户会拦截
google-analytics.com请求 - 竞态条件——请求完成前页面已卸载(提交表单、点击外部链接)
- 衡量 ID 不匹配——标签配置中使用了错误的
G-XXXXXXX - 数据过滤器——GA4 媒体资源过滤器隐藏或更改了事件
- 草稿与已发布版本——GTM 预览使用草稿;线上网站使用已发布版本
转化次数重复
这是代价最高的跟踪错误。常见原因:
- 缺少
transaction_id——没有唯一 ID,GA4 无法去重 - 标签重复触发——多个标签发送了相同的转化
- 感谢页面重新加载——用户刷新了确认页面
- 后退按钮——用户返回确认页面
- 缺少 CAPI 去重——Meta Pixel 和 CAPI 都触发了,但没有匹配的
eventID
预防方法:
// dataLayer push with transaction_id for deduplication
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T-12345', // REQUIRED for dedup
value: 99.99,
currency: 'USD',
items: [/* ... */]
}
});
// Prevent duplicate pushes on page reload
if (!window.sessionStorage.getItem('purchase_tracked_T-12345')) {
window.dataLayer.push({
event: 'purchase',
ecommerce: { transaction_id: 'T-12345', value: 99.99, currency: 'USD' }
});
window.sessionStorage.setItem('purchase_tracked_T-12345', 'true');
}
按平台分类的调试检查清单
Google Tag Manager(GTM)
预览模式检查:
- 当前是否启用了正确的工作区/容器版本?
- 时间线中是否出现了触发事件?
- 标签是否显示为“已触发”?
- 是否有意外的重复标签触发?
触发条件:
- 事件名称是否与
dataLayer.push({ event: '...' })完全匹配(区分大小写)? - 所有筛选条件是否正确?
- 是否有阻止触发器阻止了触发?
变量值(在预览模式下):
transaction_id是否已填充且唯一?value和currency是否存在且类型正确?- 自定义 JS 变量是否返回了预期值?
检查 dataLayer:
// View full dataLayer
console.table(window.dataLayer);
// Filter for purchase events
window.dataLayer.filter(e => e.event === 'purchase');
// Check ecommerce data
window.dataLayer.filter(e => e.event === 'purchase').map(e => e.ecommerce);
验证网络请求(DevTools > Network):
google-analytics.com/g/collect——GA4googleads.g.doubleclick.net/pagead/conversion——Google Adsfacebook.com/tr——Meta Pixel
MCP 诊断:
tool_list_tags → see all tags in the container
tool_search_tags → find conversion-related tags
tool_get_tag → inspect specific tag configuration
tool_list_triggers → verify trigger setup
tool_get_workspace_status → check for unpublished changes
GA4
DebugView:
// Enable debug mode
gtag('config', 'G-XXXXXXX', { debug_mode: true });
然后前往 GA4 > 管理 > DebugView:验证事件、参数和用户属性。
实时报告:
- 触发时事件计数是否增加?
- 转化卡片是否显示该事件?
MCP 诊断:
tool_list_conversion_events → verify which events are marked as conversions
tool_run_realtime_report → check real-time event data
tool_run_report → pull historical conversion data by date
tool_list_data_streams → verify stream configuration
BigQuery 验证:
-- Check conversion events in BigQuery
SELECT
event_name,
COUNT(*) as event_count,
COUNT(DISTINCT user_pseudo_id) as unique_users,
MIN(TIMESTAMP_MICROS(event_timestamp)) as earliest,
MAX(TIMESTAMP_MICROS(event_timestamp)) as latest
FROM `project.analytics_PROPERTY_ID.events_*`
WHERE _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
AND event_name IN ('purchase', 'generate_lead', 'sign_up', 'add_to_cart', 'begin_checkout')
GROUP BY event_name
ORDER BY event_count DESC
Google Ads
转化操作状态:
- “正在记录转化”(绿色)=正常工作
- “近期没有转化”=标签已安装但未触发,或数据延迟
- “标签未启用”=7 天以上没有点击
- “未验证”=从未检测到标签
MCP 诊断:
tool_execute_gaql →
SELECT
conversion_action.name,
conversion_action.status,
conversion_action.type,
conversion_action.tag_snippets,
metrics.conversions,
metrics.conversions_value
FROM conversion_action
WHERE segments.date DURING LAST_7_DAYS
tool_get_gaql_doc → look up conversion_action fields
Google 标签验证:
// Check gtag is loaded
typeof gtag === 'function' // Should be true
// Check conversion linker cookie
document.cookie.split(';').filter(c => c.includes('_gcl'))
Meta Pixel
Events Manager 测试事件:
- 输入网站 URL,执行转化操作,确认事件是否出现
- 检查事件参数(value、currency、content_ids)
- 检查事件匹配质量评分(目标为 6+)
CAPI 去重:
浏览器 Pixel 和 CAPI 事件必须使用相同的 eventID:
// Browser-side
fbq('track', 'Purchase', {
value: 99.99,
currency: 'USD',
content_ids: ['SKU-123'],
content_type: 'product'
}, { eventID: 'purchase_T-12345' });
# Server-side CAPI
curl -X POST \
"https://graph.facebook.com/v18.0/PIXEL_ID/events?access_token=TOKEN" \
-H "Content-Type: application/json" \
-d '{
"data": [{
"event_name": "Purchase",
"event_time": 1700000000,
"event_id": "purchase_T-12345",
"action_source": "website",
"user_data": {
"em": ["HASHED_EMAIL"],
"client_ip_address": "1.2.3.4",
"client_user_agent": "Mozilla/5.0..."
},
"custom_data": {
"value": 99.99,
"currency": "USD",
"content_ids": ["SKU-123"]
}
}]
}'
MCP 诊断:
tool_get_pixels → verify pixel configuration
tool_get_insights → pull conversion data for comparison with GA4/Google Ads
BigQuery 验证查询
按日统计转化次数(与 GA4 界面对比)
SELECT
PARSE_DATE('%Y%m%d', event_date) as date,
event_name,
COUNT(*) as total_events,
COUNT(DISTINCT user_pseudo_id) as unique_users,
COUNT(DISTINCT
CONCAT(user_pseudo_id, '-',
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id'))
) as unique_sessions
FROM `project.analytics_PROPERTY_ID.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 IN ('purchase', 'generate_lead', 'sign_up')
GROUP BY 1, 2
ORDER BY 1 DESC, 2
BigQuery 与 GA4 界面之间存在小幅差异(1-5%)属于正常情况,原因包括阈值处理、抽样和建模转化(会显示在界面中,但不会出现在 BigQuery 中)。
查找重复的交易 ID
WITH purchase_events AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) as date,
user_pseudo_id,
(SELECT value.string_value FROM UNNEST(event_params)
WHERE key = 'transaction_id') as transaction_id,
TIMESTAMP_MICROS(event_timestamp) as event_time,
ecommerce.purchase_revenue_in_usd as revenue
FROM `project.analytics_PROPERTY_ID.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 = 'purchase'
)
SELECT
transaction_id,
COUNT(*) as occurrence_count,
COUNT(DISTINCT user_pseudo_id) as distinct_users,
MIN(event_time) as first_occurrence,
MAX(event_time) as last_occurrence,
TIMESTAMP_DIFF(MAX(event_time), MIN(event_time), SECOND) as seconds_between,
SUM(revenue) as total_revenue_recorded,
MAX(revenue) as actual_revenue
FROM purchase_events
WHERE transaction_id IS NOT NULL
GROUP BY transaction_id
HAVING COUNT(*) > 1
ORDER BY occurrence_count DESC
-- Find purchases with NULL transaction_id (cannot be deduplicated)
SELECT
PARSE_DATE('%Y%m%d', event_date) as date,
COUNT(*) as purchases_without_txn_id,
SUM(ecommerce.purchase_revenue_in_usd) as revenue_at_risk
FROM `project.analytics_PROPERTY_ID.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 = 'purchase'
AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'transaction_id') IS NULL
GROUP BY 1
ORDER BY 1 DESC
检查转化事件参数是否完整
SELECT
event_name,
param.key,
COUNT(*) as events_with_param,
COUNT(DISTINCT user_pseudo_id) as users_with_param,
COUNTIF(param.value.string_value IS NOT NULL) as has_string_value,
COUNTIF(param.value.int_value IS NOT NULL) as has_int_value,
COUNTIF(param.value.float_value IS NOT NULL) as has_float_value
FROM `project.analytics_PROPERTY_ID.events_*`,
UNNEST(event_params) as param
WHERE _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name IN ('purchase', 'generate_lead', 'sign_up', 'begin_checkout')
GROUP BY 1, 2
ORDER BY 1, events_with_param DESC
-- Check required ecommerce fields on purchase events
SELECT
PARSE_DATE('%Y%m%d', event_date) as date,
COUNT(*) as total_purchases,
COUNTIF(ecommerce.transaction_id IS NOT NULL) as has_transaction_id,
COUNTIF(ecommerce.purchase_revenue_in_usd > 0) as has_revenue,
COUNTIF(ecommerce.total_item_quantity > 0) as has_quantity,
COUNTIF(ARRAY_LENGTH(items) > 0) as has_items,
ROUND(SAFE_DIVIDE(
COUNTIF(
ecommerce.transaction_id IS NOT NULL
AND ecommerce.purchase_revenue_in_usd > 0
AND ARRAY_LENGTH(items) > 0
), COUNT(*)
) * 100, 1) as pct_fully_complete
FROM `project.analytics_PROPERTY_ID.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 = 'purchase'
GROUP BY 1
ORDER BY 1 DESC
验证增强型转化数据
SELECT
PARSE_DATE('%Y%m%d', event_date) as date,
event_name,
COUNT(*) as total_events,
COUNTIF(user_id IS NOT NULL) as has_user_id,
COUNTIF(
(SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'email') IS NOT NULL
OR (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'user_data_email') IS NOT NULL
) as has_email_signal,
COUNTIF(
(SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'phone') IS NOT NULL
OR (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'user_data_phone') IS NOT NULL
) as has_phone_signal
FROM `project.analytics_PROPERTY_ID.events_*`
WHERE _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
AND event_name IN ('purchase', 'generate_lead', 'sign_up')
GROUP BY 1, 2
ORDER BY 1 DESC, 2
交叉核对预期事件与实际事件
WITH expected_events AS (
SELECT event_name FROM UNNEST([
'purchase', 'add_to_cart', 'begin_checkout', 'view_item',
'generate_lead', 'sign_up', 'add_payment_info', 'add_shipping_info'
]) as event_name
),
actual_events AS (
SELECT
event_name,
COUNT(*) as event_count,
MAX(TIMESTAMP_MICROS(event_timestamp)) as last_seen
FROM `project.analytics_PROPERTY_ID.events_*`
WHERE _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY event_name
)
SELECT
e.event_name,
COALESCE(a.event_count, 0) as event_count,
a.last_seen,
CASE
WHEN a.event_count IS NULL THEN 'MISSING - never received'
WHEN a.last_seen < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR) THEN 'STALE - no events in 48h'
ELSE 'OK'
END as status
FROM expected_events e
LEFT JOIN actual_events a USING(event_name)
ORDER BY
CASE WHEN a.event_count IS NULL THEN 0 WHEN a.last_seen < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR) THEN 1 ELSE 2 END,
e.event_name
Consent Mode v2
对转化跟踪的影响
Google Consent Mode v2(自 2024 年 3 月起在 EEA 为必需)根据用户同意情况控制数据收集。
必需信号:
| 信号 | 控制内容 |
|---|---|
analytics_storage | GA4 Cookie 和完整衡量 |
ad_storage | Google Ads Cookie 和转化衡量 |
ad_user_data | 向 Google 发送用于广告的用户数据 |
ad_personalization | 再营销和个性化广告 |
行为:
granted——完整数据收集,设置 Cookie,发送用户级数据denied——发送无 Cookie 的 ping,Google 对转化进行建模(会显示在界面中,不会出现在 BigQuery 中)
实现
// Set defaults BEFORE GTM snippet
gtag('consent', 'default', {
analytics_storage: 'denied',
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
wait_for_update: 500
});
// Update on user choice (called by CMP)
gtag('consent', 'update', {
analytics_storage: 'granted',
ad_storage: 'granted',
ad_user_data: 'granted',
ad_personalization: 'granted'
});
实施检查清单
- 是否在 GTM 代码段加载前设置了默认同意状态?
- 是否配置了全部四个 v2 信号?
- CMP 是否会在用户选择后调用
gtag('consent', 'update', ...)? - 是否启用了 GTM 内置的同意检查?
- 是否设置了
wait_for_update(建议为 500ms)? - 同意状态是否会在不同页面间保留?
- 拒绝状态:是否发送了无 Cookie 的 ping(Network 选项卡中的
gcs=G100)? - 授权状态:是否恢复了完整的数据衡量?
BigQuery:同意影响分析
SELECT
PARSE_DATE('%Y%m%d', event_date) as date,
COUNTIF(user_pseudo_id IS NOT NULL) as events_with_user_id,
COUNTIF(user_pseudo_id IS NULL) as events_without_user_id,
COUNTIF(
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') IS NOT NULL
) as events_with_session,
ROUND(SAFE_DIVIDE(
COUNTIF((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') IS NULL),
COUNT(*)
) * 100, 1) as pct_likely_consent_denied
FROM `project.analytics_PROPERTY_ID.events_*`
WHERE _TABLE_SUFFIX BETWEEN
FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY 1
ORDER BY 1 DESC
增强型转化
发送的数据
与转化代码一同发送的第一方客户数据(经过哈希处理),用于提高匹配效果。
| 字段 | 格式 | 必填 |
|---|---|---|
| 电子邮件 | SHA-256 哈希、小写、已去除首尾空格 | 至少提供以下其中一项:电子邮件、电话号码或姓名+地址 |
| 电话号码 | SHA-256 哈希、E.164 格式 | 可选,但建议提供 |
| 名字/姓氏 | SHA-256 哈希、小写 | 可选 |
| 地址字段 | SHA-256 哈希 | 可选 |
| 国家/地区 | ISO 3166-1 alpha-2,未哈希 | 可选 |
通过 GTM 设置(dataLayer 方法)
window.dataLayer.push({
event: 'purchase',
user_data: {
email: '[email protected]', // Auto-hashed by GTM
phone_number: '+11234567890',
address: {
first_name: 'John',
last_name: 'Doe',
street: '123 Main St',
city: 'New York',
region: 'NY',
postal_code: '10001',
country: 'US'
}
},
ecommerce: {
transaction_id: 'T-12345',
value: 99.99,
currency: 'USD'
}
});
通过 gtag.js 设置
gtag('set', 'user_data', {
email: '[email protected]',
phone_number: '+11234567890',
address: {
first_name: 'John', last_name: 'Doe',
street: '123 Main St', city: 'New York',
region: 'NY', postal_code: '10001', country: 'US'
}
});
验证检查清单
- Google Ads > 转化次数 > 诊断 > 增强型转化状态是否为“正在记录”?
- 48–72 小时后是否可以看到匹配率?
- GTM 预览:“用户提供的数据”选项卡是否显示哈希值?
- 网络请求中是否包含
em=(经过哈希处理的电子邮件)?
服务器端标记
优势
- 抵御广告拦截器 —— 使用第一方域名,不会被拦截
- Cookie 有效期更长 —— 2 年以上,而非 7 天(ITP)
- 减少页面体积 —— 减少浏览器脚本
- 数据控制 —— 发送给供应商前可检查/修改数据
- 更好地处理同意状态 —— 单一执行点
架构
Browser Server Endpoints
GTM Web Container ---> GTM Server Container ---> GA4 / Google Ads / Meta CAPI
(Cloud Run)
gtm.yourdomain.com
第一方域名设置
// GA4 Config tag: set server container URL
gtag('config', 'G-XXXXXXX', {
server_container_url: 'https://gtm.yourdomain.com'
});
# DNS: CNAME to Cloud Run service
gtm.yourdomain.com CNAME your-cloud-run-service.run.app
故障排查流程图
未显示转化次数
Tag installed? --NO--> Install tag. Publish GTM container.
|YES
v
Tag fires in GTM Preview? --NO--> Check trigger: event name exact match?
|YES Conditions met? Blocking triggers?
v
Network request in DevTools? --NO--> Consent Mode blocking?
|YES Ad blocker? CSP blocking?
v
Request returning 200/204? --NO--> Check endpoint URL, measurement ID, credentials.
|YES
v
Platform-specific:
- GA4: Wait 24-48h. Check DebugView. Check data filters.
- Google Ads: Wait 24h. Check conversion action status. Is it "Primary"?
- Meta: Check Events Manager > Test Events. Check event match quality.
转化次数不匹配
Difference > 20%? --NO--> Normal variance. Document baseline.
|YES
v
Which platform shows MORE?
- Google Ads > GA4: Counting "every"? View-through? Longer window? Modeled?
- GA4 > Google Ads: All channels vs Google-only? Action set to Primary?
- Meta > GA4: View-through included? iOS modeling?
- GA4 > Meta: Ad blockers? No CAPI? Low match quality?
|
v
Run BigQuery validation queries to get ground truth.
转化价值错误
Value always 0/NULL? --YES--> Check: 'value' in dataLayer? 'currency' present?
|NO value is number not string? Variable mapping?
v
Value consistently wrong? --YES--> Static value override? Currency conversion?
|NO
v
Value doubled? --YES--> Duplicate events. Multiple tags. Double dataLayer push.
|NO
v
Check: tax/shipping included? cents vs dollars? string formatting? locale?
速查:dataLayer 示例
电子商务购买
window.dataLayer.push({ ecommerce: null }); // Clear previous
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T-12345',
value: 99.99,
tax: 8.50,
shipping: 5.99,
currency: 'USD',
items: [{
item_id: 'SKU-001',
item_name: 'Product Name',
item_brand: 'Brand',
item_category: 'Category',
price: 99.99,
quantity: 1
}]
}
});
潜在客户开发
window.dataLayer.push({
event: 'generate_lead',
value: 50.00,
currency: 'USD',
lead_source: 'contact_form'
});
直接使用 gtag.js(不使用 GTM)
// Google Ads conversion
gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXX/CONVERSION_LABEL',
value: 99.99,
currency: 'USD',
transaction_id: 'T-12345'
});
// GA4 purchase
gtag('event', 'purchase', {
transaction_id: 'T-12345',
value: 99.99,
currency: 'USD',
items: [{ item_id: 'SKU-001', item_name: 'Product', price: 99.99, quantity: 1 }]
});
资源
- GA4 转化设置: https://support.google.com/analytics/answer/9267568
- Google Ads 转化跟踪: https://support.google.com/google-ads/answer/6095821
- 增强型转化: https://support.google.com/google-ads/answer/9888656
- 同意模式: https://developers.google.com/tag-platform/security/guides/consent
- Meta 转化 API: https://developers.facebook.com/docs/marketing-api/conversions-api
- GTM 服务器端标记: https://developers.google.com/tag-platform/tag-manager/server-side
- Cogny 完整文档: https://cogny.com/docs/conversion-tracking-debugger