mcpField
C
conversion-debug

conversion-debug

github.com/cognyai营销与增长11148 次安装2 周前更新
代码仓库

关于 conversion-debug

conversion-debug 是用于排查 GTM、GA4、Google Ads 和 Meta Pixel 转化追踪问题的技能,面向营销与分析人员。它涵盖数据差异、重复转化、同意模式和 BigQuery 验证。

主要功能

  1. 01跨平台转化差异分析
  2. 02重复转化诊断
  3. 03Consent Mode v2 与增强型转化检查
  4. 04各平台追踪检查清单
  5. 05BigQuery 验证查询

适用场景

  1. 01比较 Meta Pixel、GA4 与 Google Ads 转化数
  2. 02查找重复购买事件或缺失的交易 ID
  3. 03审计同意状态与增强型转化
  4. 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 工具时,请遵循以下诊断方法:

  1. 使用 GTM 工具检查标签、触发器和工作区状态
  2. 使用 GA4 工具检查转化事件、运行报告并验证数据流
  3. 使用 Google Ads 工具查询转化操作状态和效果
  4. 使用 Meta 工具检查 Pixel 配置并比较转化次数
  5. 交叉比对各平台的发现,以确定根本原因

转化跟踪技术栈

了解数据流是调试的第一步:

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)     |
                     +-------------------+

关键数据流环节:

  1. dataLayer 推送——网站将事件数据推送到 window.dataLayer
  2. GTM 触发器——标签根据与 dataLayer 事件匹配的触发条件触发
  3. 网络请求——每个标签都会向其目标平台发送独立的 HTTP 请求
  4. 平台处理——每个平台独立处理、去重并进行归因
  5. BigQuery 导出——GA4 将原始事件导出到 BigQuery(每天约在媒体资源时区凌晨 5 点)

常见数据差异及其原因

GA4 与 Google Ads 的转化次数差异

GA4 和 Google Ads 几乎不会完全一致,这是正常的。

因素GA4Google Ads
归因模型数据驱动(跨渠道)数据驱动(仅限 Google 渠道)
计数方式可配置:每个会话计一次或每个事件计一次可配置:计一次或每次转化都计
转化窗口默认 30 天默认 30 天(最长 90 天)
跨设备Google Signals + User-IDGoogle 账号登录
浏览型转化默认不计入展示广告/视频广告会计入(默认 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 的差异
因素MetaGA4
点击归因窗口7 天(默认)30 天(默认)
浏览型转化默认计入 1 天默认不计入
归因方式Meta 内的末次触点跨渠道数据驱动
去重使用 eventID 对浏览器+CAPI 事件去重transaction_id 参数
跨设备Facebook 登录关系图谱Google Signals + User-ID

**Meta 报告的转化次数通常较高的原因:**浏览型转化。用户看到了 Meta 广告但没有点击,之后通过 Google 搜索完成转化。Meta 会将其计入;GA4 则会将其归因到自然流量/CPC。

GTM 触发但 GA4 未接收到数据
  1. 同意模式阻止——拒绝同意时,标签会触发但不会发送数据
  2. 广告拦截器——约 25-30% 的用户会拦截 google-analytics.com 请求
  3. 竞态条件——请求完成前页面已卸载(提交表单、点击外部链接)
  4. 衡量 ID 不匹配——标签配置中使用了错误的 G-XXXXXXX
  5. 数据过滤器——GA4 媒体资源过滤器隐藏或更改了事件
  6. 草稿与已发布版本——GTM 预览使用草稿;线上网站使用已发布版本
转化次数重复

这是代价最高的跟踪错误。常见原因:

  1. 缺少 transaction_id——没有唯一 ID,GA4 无法去重
  2. 标签重复触发——多个标签发送了相同的转化
  3. 感谢页面重新加载——用户刷新了确认页面
  4. 后退按钮——用户返回确认页面
  5. 缺少 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——GA4
  • googleads.g.doubleclick.net/pagead/conversion——Google Ads
  • facebook.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_storageGA4 Cookie 和完整衡量
ad_storageGoogle 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=(经过哈希处理的电子邮件)?

服务器端标记

优势
  1. 抵御广告拦截器 —— 使用第一方域名,不会被拦截
  2. Cookie 有效期更长 —— 2 年以上,而非 7 天(ITP)
  3. 减少页面体积 —— 减少浏览器脚本
  4. 数据控制 —— 发送给供应商前可检查/修改数据
  5. 更好地处理同意状态 —— 单一执行点
架构
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 }]
});

资源

评论

支持 Markdown