{"id":"0ba36e3a-ab9a-45cb-9add-405aa9372c6d","shortId":"6BJz5r","kind":"skill","title":"conversion-debug","tagline":"Conversion Tracking Debugger — diagnose discrepancies across GTM, GA4, Google Ads & Meta Pixel with live API access, BigQuery validation queries, and troubleshooting flowcharts","description":"# Conversion Tracking Debugger\n\nDebug conversion tracking across GTM, GA4, Google Ads, and Meta Pixel. Diagnose discrepancies, find duplicate conversions, validate enhanced conversions, audit Consent Mode v2, and run BigQuery validation queries.\n\nFull docs: https://cogny.com/docs/conversion-tracking-debugger\n\n## Usage\n\n```\n/conversion-debug                          # Full debugging overview\n/conversion-debug duplicate conversions    # Diagnose duplicate purchases\n/conversion-debug consent mode             # Consent Mode v2 audit\n/conversion-debug meta vs ga4              # Cross-platform discrepancy analysis\n/conversion-debug enhanced conversions     # Validate enhanced conversion setup\n/conversion-debug server-side tagging      # Server-side GTM overview\n/conversion-debug value wrong              # Debug incorrect conversion values\n```\n\n## Instructions\n\nYou are a conversion tracking debugging expert. Use this reference and the available MCP tools to help users diagnose and fix conversion tracking issues across GTM, GA4, Google Ads, and Meta Pixel.\n\nWhen the user asks a question, find the relevant section below and provide precise, actionable answers. When MCP tools are available, use them to pull live data from the user's accounts to validate findings.\n\nIf the user provides a specific topic as an argument, focus on that area. Otherwise, ask what platform or issue they need help with.\n\n**When MCP tools are available, follow this diagnostic approach:**\n\n1. Use GTM tools to inspect tags, triggers, and workspace status\n2. Use GA4 tools to check conversion events, run reports, and verify data streams\n3. Use Google Ads tools to query conversion action status and performance\n4. Use Meta tools to check pixel configuration and compare conversion counts\n5. Cross-reference findings across platforms to identify the root cause\n\n---\n\n## The Conversion Tracking Stack\n\nUnderstanding data flow is the first step to debugging:\n\n```\nUser Action (click, form submit, purchase)\n        |\n        v\n+-------------------+\n|   Website / App   |\n|   (dataLayer)     |\n+-------------------+\n        |\n        v\n+-------------------+       +-------------------+\n|  Google Tag       | ----> |  GA4              |\n|  Manager (GTM)    |       |  (Measurement     |\n|                   |       |   Protocol)       |\n|  - GA4 Config Tag |       +-------------------+\n|  - GA4 Event Tag  |               |\n|  - Google Ads Tag |               v\n|  - Meta Pixel Tag |       +-------------------+\n+-------------------+       |  BigQuery Export  |\n        |                   |  (daily/intraday) |\n        |                   +-------------------+\n        |\n        +----------> +-------------------+\n        |            |  Google Ads       |\n        |            |  (Conversion      |\n        |            |   Tracking)       |\n        |            +-------------------+\n        |\n        +----------> +-------------------+\n                     |  Meta Pixel       |\n                     |  + Conversions    |\n                     |    API (CAPI)     |\n                     +-------------------+\n```\n\n**Key data flow points:**\n\n1. **dataLayer push** -- Website pushes event data to `window.dataLayer`\n2. **GTM triggers** -- Tags fire based on trigger conditions matching dataLayer events\n3. **Network requests** -- Each tag sends a separate HTTP request to its destination\n4. **Platform processing** -- Each platform processes, deduplicates, and attributes independently\n5. **BigQuery export** -- GA4 exports raw events to BigQuery (daily ~5 AM property timezone)\n\n## Common Discrepancies and Why\n\n### GA4 vs Google Ads Conversion Count Differences\n\nGA4 and Google Ads will almost never match. This is expected.\n\n| Factor | GA4 | Google Ads |\n|--------|-----|------------|\n| **Attribution model** | Data-driven (cross-channel) | Data-driven (Google channels only) |\n| **Counting method** | Configurable: once per session or once per event | Configurable: one or every conversion |\n| **Conversion window** | Default 30 days | Default 30 days (up to 90 days) |\n| **Cross-device** | Google Signals + User-ID | Google account sign-in |\n| **View-through** | Not counted by default | Included for Display/Video (1-day default) |\n| **Data freshness** | 24-72h processing lag | Conversions appear within hours |\n| **Modeled conversions** | Behavioral modeling for consent gaps | Conversion modeling for unobserved |\n\nTypical variance: 5-20% is normal. Over 20% warrants investigation.\n\n**MCP diagnostic approach:**\n\n```\n1. GA4: tool_list_conversion_events → check which events are marked as conversions\n2. GA4: tool_run_report → pull conversion counts by date\n3. Google Ads: tool_execute_gaql → query conversion_action metrics\n4. Compare the numbers and identify the gap source\n```\n\n### Meta Pixel vs GA4 Differences\n\n| Factor | Meta | GA4 |\n|--------|------|-----|\n| **Click-through window** | 7 days (default) | 30 days (default) |\n| **View-through** | 1-day included by default | Not counted by default |\n| **Attribution** | Last-touch within Meta | Data-driven cross-channel |\n| **Deduplication** | `eventID` for browser+CAPI dedup | `transaction_id` parameter |\n| **Cross-device** | Facebook login graph | Google Signals + User-ID |\n\n**Why Meta often reports higher:** View-through conversions. User sees Meta ad, doesn't click, later converts via Google search. Meta counts it; GA4 attributes to organic/CPC.\n\n### GTM Firing but GA4 Not Receiving\n\n1. **Consent Mode blocking** -- Tag fires but sends no data when consent denied\n2. **Ad blockers** -- ~25-30% of users block `google-analytics.com` requests\n3. **Race conditions** -- Page unloads before request completes (form submits, outbound links)\n4. **Measurement ID mismatch** -- Wrong `G-XXXXXXX` in the tag config\n5. **Data filters** -- GA4 property filters hiding or altering events\n6. **Draft vs published** -- GTM Preview uses draft; live site uses published version\n\n### Duplicate Conversions\n\nThe most expensive tracking bug. Common causes:\n\n1. **Missing `transaction_id`** -- GA4 cannot deduplicate without a unique ID\n2. **Double-firing tags** -- Multiple tags sending the same conversion\n3. **Thank-you page reloads** -- User refreshes the confirmation page\n4. **Back button** -- User navigates back to confirmation\n5. **Missing CAPI dedup** -- Meta Pixel and CAPI both fire without matching `eventID`\n\nPrevention:\n\n```javascript\n// dataLayer push with transaction_id for deduplication\nwindow.dataLayer.push({\n  event: 'purchase',\n  ecommerce: {\n    transaction_id: 'T-12345',  // REQUIRED for dedup\n    value: 99.99,\n    currency: 'USD',\n    items: [/* ... */]\n  }\n});\n```\n\n```javascript\n// Prevent duplicate pushes on page reload\nif (!window.sessionStorage.getItem('purchase_tracked_T-12345')) {\n  window.dataLayer.push({\n    event: 'purchase',\n    ecommerce: { transaction_id: 'T-12345', value: 99.99, currency: 'USD' }\n  });\n  window.sessionStorage.setItem('purchase_tracked_T-12345', 'true');\n}\n```\n\n## Debugging Checklist by Platform\n\n### Google Tag Manager (GTM)\n\n**Preview Mode Inspection:**\n- Correct workspace/container version active?\n- Trigger event appears in the timeline?\n- Tag shows as \"Fired\"?\n- No unexpected duplicate tags firing?\n\n**Trigger Conditions:**\n- Event name matches `dataLayer.push({ event: '...' })` exactly (case-sensitive)?\n- All filter conditions correct?\n- No blocking triggers preventing fire?\n\n**Variable Values (in Preview mode):**\n- `transaction_id` populated and unique?\n- `value` and `currency` present and correct types?\n- Custom JS variables returning expected values?\n\n**dataLayer Inspection:**\n\n```javascript\n// View full dataLayer\nconsole.table(window.dataLayer);\n\n// Filter for purchase events\nwindow.dataLayer.filter(e => e.event === 'purchase');\n\n// Check ecommerce data\nwindow.dataLayer.filter(e => e.event === 'purchase').map(e => e.ecommerce);\n```\n\n**Network Request Verification (DevTools > Network):**\n- `google-analytics.com/g/collect` -- GA4\n- `googleads.g.doubleclick.net/pagead/conversion` -- Google Ads\n- `facebook.com/tr` -- Meta Pixel\n\n**MCP diagnostic:**\n\n```\ntool_list_tags → see all tags in the container\ntool_search_tags → find conversion-related tags\ntool_get_tag → inspect specific tag configuration\ntool_list_triggers → verify trigger setup\ntool_get_workspace_status → check for unpublished changes\n```\n\n### GA4\n\n**DebugView:**\n\n```javascript\n// Enable debug mode\ngtag('config', 'G-XXXXXXX', { debug_mode: true });\n```\n\nThen GA4 > Admin > DebugView: verify events, parameters, user properties.\n\n**Realtime Reports:**\n- Event count incrementing on trigger?\n- Conversions card shows the event?\n\n**MCP diagnostic:**\n\n```\ntool_list_conversion_events → verify which events are marked as conversions\ntool_run_realtime_report → check real-time event data\ntool_run_report → pull historical conversion data by date\ntool_list_data_streams → verify stream configuration\n```\n\n**BigQuery Validation:**\n\n```sql\n-- Check conversion events in BigQuery\nSELECT\n  event_name,\n  COUNT(*) as event_count,\n  COUNT(DISTINCT user_pseudo_id) as unique_users,\n  MIN(TIMESTAMP_MICROS(event_timestamp)) as earliest,\n  MAX(TIMESTAMP_MICROS(event_timestamp)) as latest\nFROM `project.analytics_PROPERTY_ID.events_*`\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 3 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())\n  AND event_name IN ('purchase', 'generate_lead', 'sign_up', 'add_to_cart', 'begin_checkout')\nGROUP BY event_name\nORDER BY event_count DESC\n```\n\n### Google Ads\n\n**Conversion Action Status:**\n- \"Recording conversions\" (green) = working\n- \"No recent conversions\" = tag installed but not firing or data delayed\n- \"Tag inactive\" = no hits in 7+ days\n- \"Unverified\" = tag never detected\n\n**MCP diagnostic:**\n\n```\ntool_execute_gaql →\n  SELECT\n    conversion_action.name,\n    conversion_action.status,\n    conversion_action.type,\n    conversion_action.tag_snippets,\n    metrics.conversions,\n    metrics.conversions_value\n  FROM conversion_action\n  WHERE segments.date DURING LAST_7_DAYS\n\ntool_get_gaql_doc → look up conversion_action fields\n```\n\n**Google Tag Verification:**\n\n```javascript\n// Check gtag is loaded\ntypeof gtag === 'function'  // Should be true\n\n// Check conversion linker cookie\ndocument.cookie.split(';').filter(c => c.includes('_gcl'))\n```\n\n### Meta Pixel\n\n**Events Manager Test Events:**\n- Enter website URL, perform conversion, verify event appears\n- Check event parameters (value, currency, content_ids)\n- Check Event Match Quality score (aim for 6+)\n\n**CAPI Deduplication:**\nBoth browser Pixel and CAPI events must share the same `eventID`:\n\n```javascript\n// Browser-side\nfbq('track', 'Purchase', {\n  value: 99.99,\n  currency: 'USD',\n  content_ids: ['SKU-123'],\n  content_type: 'product'\n}, { eventID: 'purchase_T-12345' });\n```\n\n```bash\n# Server-side CAPI\ncurl -X POST \\\n  \"https://graph.facebook.com/v18.0/PIXEL_ID/events?access_token=TOKEN\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"data\": [{\n      \"event_name\": \"Purchase\",\n      \"event_time\": 1700000000,\n      \"event_id\": \"purchase_T-12345\",\n      \"action_source\": \"website\",\n      \"user_data\": {\n        \"em\": [\"HASHED_EMAIL\"],\n        \"client_ip_address\": \"1.2.3.4\",\n        \"client_user_agent\": \"Mozilla/5.0...\"\n      },\n      \"custom_data\": {\n        \"value\": 99.99,\n        \"currency\": \"USD\",\n        \"content_ids\": [\"SKU-123\"]\n      }\n    }]\n  }'\n```\n\n**MCP diagnostic:**\n\n```\ntool_get_pixels → verify pixel configuration\ntool_get_insights → pull conversion data for comparison with GA4/Google Ads\n```\n\n## BigQuery Validation Queries\n\n### Count Conversions by Day (Compare to GA4 UI)\n\n```sql\nSELECT\n  PARSE_DATE('%Y%m%d', event_date) as date,\n  event_name,\n  COUNT(*) as total_events,\n  COUNT(DISTINCT user_pseudo_id) as unique_users,\n  COUNT(DISTINCT\n    CONCAT(user_pseudo_id, '-',\n      (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id'))\n  ) as unique_sessions\nFROM `project.analytics_PROPERTY_ID.events_*`\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n  AND event_name IN ('purchase', 'generate_lead', 'sign_up')\nGROUP BY 1, 2\nORDER BY 1 DESC, 2\n```\n\nSmall differences (1-5%) between BigQuery and GA4 UI are normal due to thresholding, sampling, and modeled conversions (present in UI, absent in BigQuery).\n\n### Find Duplicate Transaction IDs\n\n```sql\nWITH purchase_events AS (\n  SELECT\n    PARSE_DATE('%Y%m%d', event_date) as date,\n    user_pseudo_id,\n    (SELECT value.string_value FROM UNNEST(event_params)\n     WHERE key = 'transaction_id') as transaction_id,\n    TIMESTAMP_MICROS(event_timestamp) as event_time,\n    ecommerce.purchase_revenue_in_usd as revenue\n  FROM `project.analytics_PROPERTY_ID.events_*`\n  WHERE _TABLE_SUFFIX BETWEEN\n    FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))\n    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n    AND event_name = 'purchase'\n)\n\nSELECT\n  transaction_id,\n  COUNT(*) as occurrence_count,\n  COUNT(DISTINCT user_pseudo_id) as distinct_users,\n  MIN(event_time) as first_occurrence,\n  MAX(event_time) as last_occurrence,\n  TIMESTAMP_DIFF(MAX(event_time), MIN(event_time), SECOND) as seconds_between,\n  SUM(revenue) as total_revenue_recorded,\n  MAX(revenue) as actual_revenue\nFROM purchase_events\nWHERE transaction_id IS NOT NULL\nGROUP BY transaction_id\nHAVING COUNT(*) > 1\nORDER BY occurrence_count DESC\n```\n\n```sql\n-- Find purchases with NULL transaction_id (cannot be deduplicated)\nSELECT\n  PARSE_DATE('%Y%m%d', event_date) as date,\n  COUNT(*) as purchases_without_txn_id,\n  SUM(ecommerce.purchase_revenue_in_usd) as revenue_at_risk\nFROM `project.analytics_PROPERTY_ID.events_*`\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n  AND event_name = 'purchase'\n  AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'transaction_id') IS NULL\nGROUP BY 1\nORDER BY 1 DESC\n```\n\n### Check Conversion Event Parameters Completeness\n\n```sql\nSELECT\n  event_name,\n  param.key,\n  COUNT(*) as events_with_param,\n  COUNT(DISTINCT user_pseudo_id) as users_with_param,\n  COUNTIF(param.value.string_value IS NOT NULL) as has_string_value,\n  COUNTIF(param.value.int_value IS NOT NULL) as has_int_value,\n  COUNTIF(param.value.float_value IS NOT NULL) as has_float_value\nFROM `project.analytics_PROPERTY_ID.events_*`,\n  UNNEST(event_params) as param\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n  AND event_name IN ('purchase', 'generate_lead', 'sign_up', 'begin_checkout')\nGROUP BY 1, 2\nORDER BY 1, events_with_param DESC\n```\n\n```sql\n-- Check required ecommerce fields on purchase events\nSELECT\n  PARSE_DATE('%Y%m%d', event_date) as date,\n  COUNT(*) as total_purchases,\n  COUNTIF(ecommerce.transaction_id IS NOT NULL) as has_transaction_id,\n  COUNTIF(ecommerce.purchase_revenue_in_usd > 0) as has_revenue,\n  COUNTIF(ecommerce.total_item_quantity > 0) as has_quantity,\n  COUNTIF(ARRAY_LENGTH(items) > 0) as has_items,\n  ROUND(SAFE_DIVIDE(\n    COUNTIF(\n      ecommerce.transaction_id IS NOT NULL\n      AND ecommerce.purchase_revenue_in_usd > 0\n      AND ARRAY_LENGTH(items) > 0\n    ), COUNT(*)\n  ) * 100, 1) as pct_fully_complete\nFROM `project.analytics_PROPERTY_ID.events_*`\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n  AND event_name = 'purchase'\nGROUP BY 1\nORDER BY 1 DESC\n```\n\n### Validate Enhanced Conversions Data\n\n```sql\nSELECT\n  PARSE_DATE('%Y%m%d', event_date) as date,\n  event_name,\n  COUNT(*) as total_events,\n  COUNTIF(user_id IS NOT NULL) as has_user_id,\n  COUNTIF(\n    (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'email') IS NOT NULL\n    OR (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'user_data_email') IS NOT NULL\n  ) as has_email_signal,\n  COUNTIF(\n    (SELECT value.string_value FROM UNNEST(user_properties) WHERE key = 'phone') IS NOT NULL\n    OR (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'user_data_phone') IS NOT NULL\n  ) as has_phone_signal\nFROM `project.analytics_PROPERTY_ID.events_*`\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n  AND event_name IN ('purchase', 'generate_lead', 'sign_up')\nGROUP BY 1, 2\nORDER BY 1 DESC, 2\n```\n\n### Cross-Reference Expected vs Actual Events\n\n```sql\nWITH expected_events AS (\n  SELECT event_name FROM UNNEST([\n    'purchase', 'add_to_cart', 'begin_checkout', 'view_item',\n    'generate_lead', 'sign_up', 'add_payment_info', 'add_shipping_info'\n  ]) as event_name\n),\nactual_events AS (\n  SELECT\n    event_name,\n    COUNT(*) as event_count,\n    MAX(TIMESTAMP_MICROS(event_timestamp)) as last_seen\n  FROM `project.analytics_PROPERTY_ID.events_*`\n  WHERE _TABLE_SUFFIX BETWEEN\n    FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))\n    AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\n  GROUP BY event_name\n)\n\nSELECT\n  e.event_name,\n  COALESCE(a.event_count, 0) as event_count,\n  a.last_seen,\n  CASE\n    WHEN a.event_count IS NULL THEN 'MISSING - never received'\n    WHEN a.last_seen < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 48 HOUR) THEN 'STALE - no events in 48h'\n    ELSE 'OK'\n  END as status\nFROM expected_events e\nLEFT JOIN actual_events a USING(event_name)\nORDER BY\n  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,\n  e.event_name\n```\n\n## Consent Mode v2\n\n### How It Affects Conversion Tracking\n\nGoogle Consent Mode v2 (required in EEA since March 2024) controls data collection based on user consent.\n\n**Required signals:**\n\n| Signal | Controls |\n|--------|----------|\n| `analytics_storage` | GA4 cookies and full measurement |\n| `ad_storage` | Google Ads cookies and conversion measurement |\n| `ad_user_data` | Sending user data to Google for advertising |\n| `ad_personalization` | Remarketing and personalized advertising |\n\n**Behavior:**\n- `granted` -- Full data collection, cookies set, user-level data sent\n- `denied` -- Cookieless pings, Google models conversions (appear in UI, NOT in BigQuery)\n\n### Implementation\n\n```javascript\n// Set defaults BEFORE GTM snippet\ngtag('consent', 'default', {\n  analytics_storage: 'denied',\n  ad_storage: 'denied',\n  ad_user_data: 'denied',\n  ad_personalization: 'denied',\n  wait_for_update: 500\n});\n\n// Update on user choice (called by CMP)\ngtag('consent', 'update', {\n  analytics_storage: 'granted',\n  ad_storage: 'granted',\n  ad_user_data: 'granted',\n  ad_personalization: 'granted'\n});\n```\n\n### Implementation Checklist\n\n- Default consent set BEFORE GTM snippet loads?\n- All four v2 signals configured?\n- CMP calls `gtag('consent', 'update', ...)` on user choice?\n- GTM built-in consent checks enabled?\n- `wait_for_update` set (500ms recommended)?\n- Consent persists across pages?\n- Denied state: cookieless pings sent (`gcs=G100` in Network tab)?\n- Granted state: full measurement resumes?\n\n### BigQuery: Consent Impact Analysis\n\n```sql\nSELECT\n  PARSE_DATE('%Y%m%d', event_date) as date,\n  COUNTIF(user_pseudo_id IS NOT NULL) as events_with_user_id,\n  COUNTIF(user_pseudo_id IS NULL) as events_without_user_id,\n  COUNTIF(\n    (SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') IS NOT NULL\n  ) as events_with_session,\n  ROUND(SAFE_DIVIDE(\n    COUNTIF((SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') IS NULL),\n    COUNT(*)\n  ) * 100, 1) as pct_likely_consent_denied\nFROM `project.analytics_PROPERTY_ID.events_*`\nWHERE _TABLE_SUFFIX BETWEEN\n  FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY))\n  AND FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)\nGROUP BY 1\nORDER BY 1 DESC\n```\n\n## Enhanced Conversions\n\n### What Data Is Sent\n\nHashed first-party customer data sent alongside conversion tags for better matching.\n\n| Field | Format | Required |\n|-------|--------|----------|\n| Email | SHA-256 hashed, lowercase, trimmed | At least one of: email, phone, or name+address |\n| Phone | SHA-256 hashed, E.164 format | Optional but recommended |\n| First/Last name | SHA-256 hashed, lowercase | Optional |\n| Address fields | SHA-256 hashed | Optional |\n| Country | ISO 3166-1 alpha-2, unhashed | Optional |\n\n### Setup via GTM (dataLayer method)\n\n```javascript\nwindow.dataLayer.push({\n  event: 'purchase',\n  user_data: {\n    email: 'user@example.com',       // Auto-hashed by GTM\n    phone_number: '+11234567890',\n    address: {\n      first_name: 'John',\n      last_name: 'Doe',\n      street: '123 Main St',\n      city: 'New York',\n      region: 'NY',\n      postal_code: '10001',\n      country: 'US'\n    }\n  },\n  ecommerce: {\n    transaction_id: 'T-12345',\n    value: 99.99,\n    currency: 'USD'\n  }\n});\n```\n\n### Setup via gtag.js\n\n```javascript\ngtag('set', 'user_data', {\n  email: 'user@example.com',\n  phone_number: '+11234567890',\n  address: {\n    first_name: 'John', last_name: 'Doe',\n    street: '123 Main St', city: 'New York',\n    region: 'NY', postal_code: '10001', country: 'US'\n  }\n});\n```\n\n### Validation Checklist\n\n- Google Ads > Conversions > Diagnostics > Enhanced Conversions status = \"Recording\"?\n- Match rate visible after 48-72h?\n- GTM Preview: \"User-provided data\" tab shows hashed values?\n- Network request contains `em=` (hashed email)?\n\n## Server-Side Tagging\n\n### Benefits\n\n1. **Ad blocker resistance** -- First-party domain, not blocked\n2. **Longer cookie lifetime** -- 2+ years vs 7 days (ITP)\n3. **Reduced page weight** -- Fewer browser scripts\n4. **Data control** -- Inspect/modify before sending to vendors\n5. **Better consent** -- Single enforcement point\n\n### Architecture\n\n```\nBrowser                    Server                          Endpoints\nGTM Web Container  --->  GTM Server Container  --->  GA4 / Google Ads / Meta CAPI\n                         (Cloud Run)\n                         gtm.yourdomain.com\n```\n\n### First-Party Domain Setup\n\n```javascript\n// GA4 Config tag: set server container URL\ngtag('config', 'G-XXXXXXX', {\n  server_container_url: 'https://gtm.yourdomain.com'\n});\n```\n\n```\n# DNS: CNAME to Cloud Run service\ngtm.yourdomain.com  CNAME  your-cloud-run-service.run.app\n```\n\n## Troubleshooting Flowcharts\n\n### Conversions Not Showing Up\n\n```\nTag installed? --NO--> Install tag. Publish GTM container.\n  |YES\n  v\nTag fires in GTM Preview? --NO--> Check trigger: event name exact match?\n  |YES                              Conditions met? Blocking triggers?\n  v\nNetwork request in DevTools? --NO--> Consent Mode blocking?\n  |YES                                Ad blocker? CSP blocking?\n  v\nRequest returning 200/204? --NO--> Check endpoint URL, measurement ID, credentials.\n  |YES\n  v\nPlatform-specific:\n- GA4: Wait 24-48h. Check DebugView. Check data filters.\n- Google Ads: Wait 24h. Check conversion action status. Is it \"Primary\"?\n- Meta: Check Events Manager > Test Events. Check event match quality.\n```\n\n### Conversion Count Mismatch\n\n```\nDifference > 20%? --NO--> Normal variance. Document baseline.\n  |YES\n  v\nWhich platform shows MORE?\n- Google Ads > GA4: Counting \"every\"? View-through? Longer window? Modeled?\n- GA4 > Google Ads: All channels vs Google-only? Action set to Primary?\n- Meta > GA4: View-through included? iOS modeling?\n- GA4 > Meta: Ad blockers? No CAPI? Low match quality?\n  |\n  v\nRun BigQuery validation queries to get ground truth.\n```\n\n### Conversion Value Wrong\n\n```\nValue always 0/NULL? --YES--> Check: 'value' in dataLayer? 'currency' present?\n  |NO                          value is number not string? Variable mapping?\n  v\nValue consistently wrong? --YES--> Static value override? Currency conversion?\n  |NO\n  v\nValue doubled? --YES--> Duplicate events. Multiple tags. Double dataLayer push.\n  |NO\n  v\nCheck: tax/shipping included? cents vs dollars? string formatting? locale?\n```\n\n## Quick Reference: dataLayer Examples\n\n### E-Commerce Purchase\n\n```javascript\nwindow.dataLayer.push({ ecommerce: null });  // Clear previous\nwindow.dataLayer.push({\n  event: 'purchase',\n  ecommerce: {\n    transaction_id: 'T-12345',\n    value: 99.99,\n    tax: 8.50,\n    shipping: 5.99,\n    currency: 'USD',\n    items: [{\n      item_id: 'SKU-001',\n      item_name: 'Product Name',\n      item_brand: 'Brand',\n      item_category: 'Category',\n      price: 99.99,\n      quantity: 1\n    }]\n  }\n});\n```\n\n### Lead Generation\n\n```javascript\nwindow.dataLayer.push({\n  event: 'generate_lead',\n  value: 50.00,\n  currency: 'USD',\n  lead_source: 'contact_form'\n});\n```\n\n### gtag.js Direct (No GTM)\n\n```javascript\n// Google Ads conversion\ngtag('event', 'conversion', {\n  send_to: 'AW-XXXXXXXXX/CONVERSION_LABEL',\n  value: 99.99,\n  currency: 'USD',\n  transaction_id: 'T-12345'\n});\n\n// GA4 purchase\ngtag('event', 'purchase', {\n  transaction_id: 'T-12345',\n  value: 99.99,\n  currency: 'USD',\n  items: [{ item_id: 'SKU-001', item_name: 'Product', price: 99.99, quantity: 1 }]\n});\n```\n\n## Resources\n\n- **GA4 Conversion Setup:** https://support.google.com/analytics/answer/9267568\n- **Google Ads Conversion Tracking:** https://support.google.com/google-ads/answer/6095821\n- **Enhanced Conversions:** https://support.google.com/google-ads/answer/9888656\n- **Consent Mode:** https://developers.google.com/tag-platform/security/guides/consent\n- **Meta Conversions API:** https://developers.facebook.com/docs/marketing-api/conversions-api\n- **GTM Server-Side Tagging:** https://developers.google.com/tag-platform/tag-manager/server-side\n- **Full Cogny Docs:** https://cogny.com/docs/conversion-tracking-debugger","tags":["conversion","debug","claude","code","marketing","skills","cognyai","agent-skills","ai-agents","claude-code","claude-skills","cluade-mcp"],"capabilities":["skill","source-cognyai","skill-conversion-debug","topic-agent-skills","topic-ai-agents","topic-claude-code","topic-claude-skills","topic-cluade-mcp","topic-cursor","topic-geo","topic-growth-hacking","topic-llm","topic-marketing","topic-mcp","topic-seo"],"categories":["claude-code-marketing-skills"],"synonyms":[],"warnings":[],"endpointUrl":"https://skills.sh/cognyai/claude-code-marketing-skills/conversion-debug","protocol":"skill","transport":"skills-sh","auth":{"type":"none","details":{"cli":"npx skills add cognyai/claude-code-marketing-skills","source_repo":"https://github.com/cognyai/claude-code-marketing-skills","install_from":"skills.sh"}},"qualityScore":"0.471","qualityRationale":"deterministic score 0.47 from registry signals: · indexed on github topic:agent-skills · 42 github stars · SKILL.md body (25,692 chars)","verified":false,"liveness":"unknown","lastLivenessCheck":null,"agentReviews":{"count":0,"score_avg":null,"cost_usd_avg":null,"success_rate":null,"latency_p50_ms":null,"narrative_summary":null,"summary_updated_at":null},"enrichmentModel":"deterministic:skill-github:v1","enrichmentVersion":1,"enrichedAt":"2026-05-01T06:56:25.744Z","embedding":null,"createdAt":"2026-04-18T22:23:29.632Z","updatedAt":"2026-05-01T06:56:25.744Z","lastSeenAt":"2026-05-01T06:56:25.744Z","tsv":"'+11234567890':2690,2733 '-001':3131,3203 '-1':2665 '-123':1308,1370 '-12345':808,829,837,846,1315,1344,2716,3118,3185,3194 '-2':2667 '-20':511 '-256':2627,2642,2652,2659 '-30':676 '-48':2949 '-5':1495 '-72':489,2770 '/analytics/answer/9267568':3217 '/conversion-debug':63,67,73,80,89,96,106 '/conversion_label':3177 '/docs/conversion-tracking-debugger':61,3254 '/docs/marketing-api/conversions-api':3240 '/g/collect':954 '/google-ads/answer/6095821':3224 '/google-ads/answer/9888656':3229 '/pagead/conversion':958 '/tag-platform/security/guides/consent':3234 '/tag-platform/tag-manager/server-side':3248 '/tr':963 '/v18.0/pixel_id/events?access_token=token':1326 '0':1899,1907,1915,1933,1938,2221,2279 '0/null':3048 '1':214,335,483,521,584,659,738,1473,1485,1489,1494,1591,1661,1728,1749,1752,1839,1853,1857,1941,1972,1979,1982,2109,2121,2125,2210,2291,2563,2595,2598,2601,2793,3145,3210 '1.2.3.4':1356 '100':1940,2562 '10001':2709,2752 '123':2699,2742 '1700000000':1339 '2':225,344,534,672,749,1486,1491,1854,2122,2127,2293,2803,2807 '20':515,2981 '200/204':2933 '2024':2314 '24':488,2948 '24h':2959 '25':675 '3':239,356,544,682,760,1133,2813 '30':451,454,578,1463,1581,1718,1962 '3166':2664 '4':251,369,554,694,771,2820 '48':2245,2288,2769 '48h':2252 '5':263,379,389,510,706,779,2828 '5.99':3124 '50.00':3154 '500':2407 '500ms':2464 '6':716,1280 '7':575,1191,1218,1829,2099,2200,2585,2810 '8.50':3122 '90':458 '99.99':813,839,1302,1364,2718,3120,3143,3179,3196,3208 'a.event':2219,2229,2274 'a.last':2225,2238,2281 'absent':1513 'access':19 'account':177,469 'across':9,32,138,268,2468 'action':160,247,289,552,1169,1213,1227,1345,2962,3013 'activ':862 'actual':1644,2133,2166,2264 'ad':13,36,142,242,313,323,400,407,418,546,637,673,960,1167,1389,2333,2336,2341,2351,2394,2397,2401,2421,2424,2428,2758,2794,2846,2926,2957,2994,3006,3027,3167,3219 'add':1152,2146,2157,2160 'address':1355,2639,2656,2691,2734 'admin':1022 'advertis':2350,2356 'affect':2302 'agent':1359 'aim':1278 'almost':409 'alongsid':2616 'alpha':2666 'alter':714 'alway':3047 'analysi':88,2488 'analyt':2326,2391,2418 'answer':161 'api':18,329,3237 'app':296 'appear':494,865,1265,2375 'application/json':1331 'approach':213,520 'architectur':2834 'area':194 'argument':190 'array':1912,1935 'ask':149,196 'attribut':377,419,593,650 'audit':48,79 'auto':2684 'auto-hash':2683 'avail':126,166,209 'aw':3175 'aw-xxxxxxxxx':3174 'back':772,776 'base':349,2318 'baselin':2986 'bash':1316 'begin':1155,1849,2149 'behavior':499,2357 'benefit':2792 'better':2620,2829 'bigqueri':20,54,319,380,387,1080,1087,1390,1497,1515,2380,2485,3036 'block':662,679,894,2802,2914,2924,2929 'blocker':674,2795,2927,3028 'brand':3137,3138 'browser':608,1284,1296,2818,2835 'browser-sid':1295 'bug':735 'built':2455 'built-in':2454 'button':773 'c':1249 'c.includes':1250 'call':2412,2446 'cannot':743,1674 'capi':330,609,781,786,1281,1287,1320,2848,3030 'card':1037 'cart':1154,2148 'case':887,2227,2272 'case-sensit':886 'categori':3140,3141 'caus':274,737 'cent':3091 'chang':1005 'channel':426,431,604,3008 'check':230,256,527,937,1002,1058,1083,1233,1243,1266,1273,1754,1863,2458,2905,2935,2951,2953,2960,2968,2973,3050,3088 'checklist':849,2432,2756 'checkout':1156,1850,2150 'choic':2411,2452 'citi':2702,2745 'clear':3109 'click':290,572,640 'click-through':571 'client':1353,1357 'cloud':2849,2877 'cmp':2414,2445 'cname':2875,2881 'coalesc':2218 'code':2708,2751 'cogni':3250 'cogny.com':60,3253 'cogny.com/docs/conversion-tracking-debugger':59,3252 'collect':2317,2361 'commerc':3103 'common':393,736 'compar':260,555,1397 'comparison':1386 'complet':689,1758,1945 'concat':1428 'condit':352,684,879,891,2912 'config':307,705,1013,2859,2866 'configur':258,435,443,991,1079,1378,2444 'confirm':769,778 'consent':49,74,76,502,660,670,2297,2306,2321,2389,2416,2434,2448,2457,2466,2486,2567,2830,2922,3230 'consist':3066 'console.table':927 'contact':3159 'contain':976,2784,2840,2843,2863,2871,2896 'content':1271,1305,1309,1329,1367 'content-typ':1328 'control':2315,2325,2822 'convers':2,4,26,30,44,47,69,91,94,111,117,135,231,246,261,276,324,328,401,447,448,493,498,504,525,533,540,551,633,730,759,982,1036,1045,1053,1069,1084,1168,1172,1177,1212,1226,1244,1262,1383,1394,1509,1755,1986,2303,2339,2374,2604,2617,2759,2762,2885,2961,2977,3043,3073,3168,3171,3213,3220,3226,3236 'conversion-debug':1 'conversion-rel':981 'conversion_action.name':1203 'conversion_action.status':1204 'conversion_action.tag':1206 'conversion_action.type':1205 'convert':642 'cooki':1246,2329,2337,2362,2805 'cookieless':2370,2472 'correct':859,892,913 'count':262,402,433,477,541,590,647,1032,1091,1094,1095,1164,1393,1414,1418,1426,1599,1602,1603,1660,1665,1687,1764,1769,1880,1939,2001,2172,2175,2220,2224,2230,2275,2561,2978,2996 'countif':1778,1788,1798,1884,1894,1903,1911,1922,2005,2015,2049,2500,2512,2523,2546 'countri':2662,2710,2753 'credenti':2940 'cross':85,265,425,461,603,615,2129 'cross-channel':424,602 'cross-devic':460,614 'cross-platform':84 'cross-refer':264,2128 'csp':2928 'curl':1321 'currenc':814,840,910,1270,1303,1365,2719,3054,3072,3125,3155,3180,3197 'current':1130,1141,1460,1471,1578,1589,1715,1726,1826,1837,1959,1970,2096,2107,2197,2208,2242,2285,2582,2593 'custom':915,1361,2613 'd':1127,1140,1332,1407,1457,1470,1530,1575,1588,1682,1712,1725,1823,1836,1875,1956,1969,1994,2093,2106,2194,2207,2495,2579,2592 'daili':388 'daily/intraday':321 'data':172,237,280,332,341,422,428,486,600,668,707,939,1063,1070,1075,1184,1333,1349,1362,1384,1987,2040,2074,2316,2343,2346,2360,2367,2399,2426,2606,2614,2680,2728,2777,2821,2954 'data-driven':421,427,599 'datalay':297,336,354,794,921,926,2673,3053,3084,3099 'datalayer.push':883 'date':543,1072,1124,1128,1131,1137,1142,1404,1409,1411,1454,1458,1461,1467,1472,1527,1532,1534,1572,1576,1579,1585,1590,1679,1684,1686,1709,1713,1716,1722,1727,1820,1824,1827,1833,1838,1872,1877,1879,1953,1957,1960,1966,1971,1991,1996,1998,2090,2094,2097,2103,2108,2191,2195,2198,2204,2209,2492,2497,2499,2576,2580,2583,2589,2594 'day':452,455,459,484,576,579,585,1134,1192,1219,1396,1464,1582,1719,1830,1963,2100,2201,2586,2811 'debug':3,29,65,109,119,287,848,1010,1017 'debugg':6,28 'debugview':1007,1023,2952 'dedup':610,782,811 'dedupl':375,605,744,800,1282,1676 'default':450,453,479,485,577,580,588,592,2384,2390,2433 'delay':1185 'deni':671,2369,2393,2396,2400,2403,2470,2568 'desc':1165,1490,1666,1753,1861,1983,2126,2602 'destin':368 'detect':1196 'developers.facebook.com':3239 'developers.facebook.com/docs/marketing-api/conversions-api':3238 'developers.google.com':3233,3247 'developers.google.com/tag-platform/security/guides/consent':3232 'developers.google.com/tag-platform/tag-manager/server-side':3246 'devic':462,616 'devtool':950,2920 'diagnos':7,40,70,132 'diagnost':212,519,967,1042,1198,1372,2760 'diff':1624 'differ':403,567,1493,2980 'direct':3162 'discrep':8,41,87,394 'display/video':482 'distinct':1096,1419,1427,1604,1609,1770 'divid':1921,2545 'dns':2874 'doc':58,1223,3251 'document':2985 'document.cookie.split':1247 'doe':2697,2740 'doesn':638 'dollar':3093 'domain':2800,2855 'doubl':751,3077,3083 'double-fir':750 'draft':717,723 'driven':423,429,601 'due':1503 'duplic':43,68,71,729,819,875,1517,3079 'e':934,941,945,2261,3102 'e-commerc':3101 'e.164':2644 'e.ecommerce':946 'e.event':935,942,2216,2295 'earliest':1109 'ecommerc':804,833,938,1865,2712,3107,3114 'ecommerce.purchase':1559,1694,1895,1929 'ecommerce.total':1904 'ecommerce.transaction':1885,1923 'eea':2311 'els':2253,2292 'em':1350,2785 'email':1352,2025,2041,2047,2625,2635,2681,2729,2787 'enabl':1009,2459 'end':2255,2294 'endpoint':2837,2936 'enforc':2832 'enhanc':46,90,93,1985,2603,2761,3225 'enter':1258 'event':232,310,340,355,385,442,526,529,715,802,831,864,880,884,932,1025,1031,1040,1046,1049,1062,1085,1089,1093,1106,1113,1144,1159,1163,1254,1257,1264,1267,1274,1288,1334,1337,1340,1408,1412,1417,1437,1475,1523,1531,1543,1554,1557,1593,1612,1618,1626,1629,1648,1683,1730,1739,1756,1761,1766,1811,1841,1858,1869,1876,1974,1995,1999,2004,2035,2069,2111,2134,2138,2141,2164,2167,2170,2174,2179,2213,2223,2250,2260,2265,2268,2496,2508,2519,2529,2540,2552,2677,2907,2969,2972,2974,3080,3112,3150,3170,3189 'eventid':606,791,1293,1312 'everi':446,2997 'exact':885,2909 'exampl':3100 'execut':548,1200 'expect':414,919,2131,2137,2259 'expens':733 'expert':120 'export':320,381,383 'facebook':617 'facebook.com':962 'facebook.com/tr':961 'factor':415,568 'fbq':1298 'fewer':2817 'field':1228,1866,2622,2657 'filter':708,711,890,929,1248,2955 'find':42,152,180,267,980,1516,1668 'fire':348,654,664,752,788,872,877,897,1182,2900 'first':284,1615,2611,2692,2735,2798,2853 'first-parti':2610,2797,2852 'first/last':2649 'fix':134 'float':1806 'flow':281,333 'flowchart':25,2884 'focus':191 'follow':210 'form':291,690,3160 'format':1123,1136,1453,1466,1571,1584,1708,1721,1819,1832,1952,1965,2089,2102,2190,2203,2575,2588,2623,2645,3095 'four':2441 'fresh':487 'full':57,64,925,2331,2359,2482,3249 'fulli':1944 'function':1239 'g':700,1015,2868 'g-xxxxxxx':699,1014,2867 'g100':2476 'ga':1441,2533,2556 'ga4':11,34,83,140,227,301,306,309,382,397,404,416,522,535,566,570,649,656,709,742,955,1006,1021,1399,1499,2328,2844,2858,2946,2995,3004,3018,3025,3186,3212 'ga4/google':1388 'gap':503,561 'gaql':549,1201,1222 'gcl':1251 'gcs':2475 'generat':1148,1479,1845,2115,2153,3147,3151 'get':986,999,1221,1374,1380,3040 'googl':12,35,141,241,299,312,322,399,406,417,430,463,468,545,620,644,852,959,1166,1229,2305,2335,2348,2372,2757,2845,2956,2993,3005,3011,3166,3218 'google-analytics.com':680,953 'google-analytics.com/g/collect':952 'google-on':3010 'googleads.g.doubleclick.net':957 'googleads.g.doubleclick.net/pagead/conversion':956 'grant':2358,2420,2423,2427,2430,2480 'graph':619 'graph.facebook.com':1325 'graph.facebook.com/v18.0/pixel_id/events?access_token=token':1324 'green':1173 'ground':3041 'group':1157,1483,1655,1747,1851,1977,2119,2211,2596 'gtag':1012,1234,1238,2388,2415,2447,2725,2865,3169,3188 'gtag.js':2723,3161 'gtm':10,33,104,139,216,303,345,653,720,855,2386,2437,2453,2672,2687,2772,2838,2841,2895,2902,3164,3241 'gtm.yourdomain.com':2851,2873,2880 'h':490,1327,2771,2950 'hash':1351,2609,2628,2643,2653,2660,2685,2780,2786 'help':130,203 'hide':712 'higher':629 'histor':1068 'hit':1189 'hour':496,2246,2289 'http':364 'id':467,612,624,696,741,748,798,806,835,904,1099,1272,1306,1341,1368,1422,1431,1443,1519,1537,1548,1551,1598,1607,1651,1658,1673,1692,1744,1773,1886,1893,1924,2007,2014,2503,2511,2515,2522,2535,2558,2714,2939,3116,3129,3183,3192,3201 'identifi':271,559 'impact':2487 'implement':2381,2431 'inact':1187 'includ':480,586,3022,3090 'incorrect':110 'increment':1033 'independ':378 'info':2159,2162 'insight':1381 'inspect':219,858,922,988 'inspect/modify':2823 'instal':1179,2890,2892 'instruct':113 'int':1796 'interv':1132,1462,1580,1717,1828,1961,2098,2199,2244,2287,2584 'investig':517 'io':3023 'ip':1354 'iso':2663 'issu':137,200 'item':816,1905,1914,1918,1937,2152,3127,3128,3132,3136,3139,3199,3200,3204 'itp':2812 'javascript':793,817,923,1008,1232,1294,2382,2675,2724,2857,3105,3148,3165 'john':2694,2737 'join':2263 'js':916 'key':331,1440,1546,1742,2024,2038,2058,2072,2532,2555 'lag':492 'last':595,1217,1621,2182,2695,2738 'last-touch':594 'later':641 'latest':1116 'lead':1149,1480,1846,2116,2154,3146,3152,3157 'least':2632 'left':2262 'length':1913,1936 'level':2366 'lifetim':2806 'like':2566 'link':693 'linker':1245 'list':524,969,993,1044,1074 'live':17,171,724 'load':1236,2439 'local':3096 'login':618 'longer':2804,3001 'look':1224 'low':3031 'lowercas':2629,2654 'm':1126,1139,1406,1456,1469,1529,1574,1587,1681,1711,1724,1822,1835,1874,1955,1968,1993,2092,2105,2193,2206,2494,2578,2591 'main':2700,2743 'manag':302,854,1255,2970 'map':944,3063 'march':2313 'mark':531,1051 'match':353,411,790,882,1275,2621,2765,2910,2975,3032 'max':1110,1617,1625,1641,2176 'mcp':127,163,206,518,966,1041,1197,1371 'measur':304,695,2332,2340,2483,2938 'met':2913 'meta':14,38,81,144,253,316,326,563,569,598,626,636,646,783,964,1252,2847,2967,3017,3026,3235 'method':434,2674 'metric':553 'metrics.conversions':1208,1209 'micro':1105,1112,1553,2178 'min':1103,1611,1628 'mismatch':697,2979 'miss':739,780,2234 'mode':50,75,77,661,857,902,1011,1018,2298,2307,2923,3231 'model':420,497,500,505,1508,2373,3003,3024 'mozilla/5.0':1360 'multipl':754,3081 'must':1289 'name':881,1090,1145,1160,1335,1413,1476,1594,1731,1762,1842,1975,2000,2112,2142,2165,2171,2214,2217,2269,2296,2638,2650,2693,2696,2736,2739,2908,3133,3135,3205 'navig':775 'need':202 'network':357,947,951,2478,2782,2917 'never':410,1195,2235 'new':2703,2746 'normal':513,1502,2983 'null':1654,1671,1746,1783,1793,1803,1889,1927,2010,2028,2044,2062,2078,2232,2277,2506,2517,2538,2560,3108 'number':557,2689,2732,3059 'ny':2706,2749 'occurr':1601,1616,1622,1664 'often':627 'ok':2254 'one':444,2633 'option':2646,2655,2661,2669 'order':1161,1487,1662,1750,1855,1980,2123,2270,2599 'organic/cpc':652 'otherwis':195 'outbound':692 'overrid':3071 'overview':66,105 'page':685,764,770,822,2469,2815 'param':1438,1544,1740,1768,1777,1812,1814,1860,2036,2070,2530,2553 'param.key':1763 'param.value.float':1799 'param.value.int':1789 'param.value.string':1779 'paramet':613,1026,1268,1757 'pars':1403,1526,1678,1871,1990,2491 'parti':2612,2799,2854 'payment':2158 'pct':1943,2565 'per':437,441 'perform':250,1261 'persist':2467 'person':2352,2355,2402,2429 'phone':2059,2075,2081,2636,2640,2688,2731 'ping':2371,2473 'pixel':15,39,145,257,317,327,564,784,965,1253,1285,1375,1377 'platform':86,198,269,370,373,851,2944,2990 'platform-specif':2943 'point':334,2833 'popul':905 'post':1323 'postal':2707,2750 'precis':159 'present':911,1510,3055 'prevent':792,818,896 'preview':721,856,901,2773,2903 'previous':3110 'price':3142,3207 'primari':2966,3016 'process':371,374,491 'product':1311,3134,3206 'project.analytics_property_id.events':1118,1448,1566,1703,1809,1947,2084,2185,2570 'properti':391,710,1028,2022,2056 'protocol':305 'provid':158,184,2776 'pseudo':1098,1421,1430,1536,1606,1772,2502,2514 'publish':719,727,2894 'pull':170,539,1067,1382 'purchas':72,293,803,826,832,843,931,936,943,1147,1300,1313,1336,1342,1478,1522,1595,1647,1669,1689,1732,1844,1868,1883,1976,2114,2145,2678,3104,3113,3187,3190 'push':337,339,795,820,3085 'qualiti':1276,2976,3033 'quantiti':1906,1910,3144,3209 'queri':22,56,245,550,1392,3038 'question':151 'quick':3097 'race':683 'rate':2766 'raw':384 'real':1060 'real-tim':1059 'realtim':1029,1056 'receiv':658,2236 'recent':1176 'recommend':2465,2648 'record':1171,1640,2764 'reduc':2814 'refer':123,266,2130,3098 'refresh':767 'region':2705,2748 'relat':983 'relev':154 'reload':765,823 'remarket':2353 'report':234,538,628,1030,1057,1066 'request':358,365,681,688,948,2783,2918,2931 'requir':809,1864,2309,2322,2624 'resist':2796 'resourc':3211 'resum':2484 'return':918,2932 'revenu':1560,1564,1636,1639,1642,1645,1695,1699,1896,1902,1930 'risk':1701 'root':273 'round':1919,2543 'run':53,233,537,1055,1065,2850,2878,3035 'safe':1920,2544 'sampl':1506 'score':1277 'script':2819 'search':645,978 'second':1631,1633 'section':155 'see':635,971 'seen':2183,2226,2239,2282 'segments.date':1215 'select':1088,1202,1402,1432,1525,1538,1596,1677,1734,1760,1870,1989,2016,2030,2050,2064,2140,2169,2215,2490,2524,2547 'send':361,666,756,2344,2825,3172 'sensit':888 'sent':2368,2474,2608,2615 'separ':363 'server':98,102,1318,2789,2836,2842,2862,2870,3243 'server-sid':97,101,1317,2788,3242 'servic':2879 'session':438,1442,1446,2534,2542,2557 'set':2363,2383,2435,2463,2726,2861,3014 'setup':95,997,2670,2721,2856,3214 'sha':2626,2641,2651,2658 'share':1290 'ship':2161,3123 'show':870,1038,2779,2887,2991 'side':99,103,1297,1319,2790,3244 'sign':471,1150,1481,1847,2117,2155 'sign-in':470 'signal':464,621,2048,2082,2323,2324,2443 'sinc':2312 'singl':2831 'site':725 'skill' 'skill-conversion-debug' 'sku':1307,1369,3130,3202 'small':1492 'snippet':1207,2387,2438 'sourc':562,1346,3158 'source-cognyai' 'specif':186,989,2945 'sql':1082,1401,1520,1667,1759,1862,1988,2135,2489 'st':2701,2744 'stack':278 'stale':2248 'state':2471,2481 'static':3069 'status':224,248,1001,1170,2257,2763,2963 'step':285 'storag':2327,2334,2392,2395,2419,2422 'stream':238,1076,1078 'street':2698,2741 'string':1786,3061,3094 'sub':1129,1459,1577,1714,1825,1958,2095,2196,2241,2284,2581 'submit':292,691 'suffix':1121,1451,1569,1706,1817,1950,2087,2188,2573 'sum':1635,1693 'support.google.com':3216,3223,3228 'support.google.com/analytics/answer/9267568':3215 'support.google.com/google-ads/answer/6095821':3222 'support.google.com/google-ads/answer/9888656':3227 'tab':2479,2778 'tabl':1120,1450,1568,1705,1816,1949,2086,2187,2572 'tag':100,220,300,308,311,314,318,347,360,663,704,753,755,853,869,876,970,973,979,984,987,990,1178,1186,1194,1230,2618,2791,2860,2889,2893,2899,3082,3245 'tax':3121 'tax/shipping':3089 'test':1256,2971 'thank':762 'thank-you':761 'threshold':1505 'time':1061,1338,1558,1613,1619,1627,1630 'timelin':868 'timestamp':1104,1107,1111,1114,1552,1555,1623,2177,2180,2240,2243,2283,2286 'timezon':392 'tool':128,164,207,217,228,243,254,523,536,547,968,977,985,992,998,1043,1054,1064,1073,1199,1220,1373,1379 'topic':187 'topic-agent-skills' 'topic-ai-agents' 'topic-claude-code' 'topic-claude-skills' 'topic-cluade-mcp' 'topic-cursor' 'topic-geo' 'topic-growth-hacking' 'topic-llm' 'topic-marketing' 'topic-mcp' 'topic-seo' 'total':1416,1638,1882,2003 'touch':596 'track':5,27,31,118,136,277,325,734,827,844,1299,2304,3221 'transact':611,740,797,805,834,903,1518,1547,1550,1597,1650,1657,1672,1743,1892,2713,3115,3182,3191 'trigger':221,346,351,863,878,895,994,996,1035,2906,2915 'trim':2630 'troubleshoot':24,2883 'true':847,1019,1242 'truth':3042 'txn':1691 'type':914,1310,1330 'typeof':1237 'typic':508 'ui':1400,1500,1512,2377 'understand':279 'unexpect':874 'unhash':2668 'uniqu':747,907,1101,1424,1445 'unload':686 'unnest':1436,1542,1738,1810,2020,2034,2054,2068,2144,2528,2551 'unobserv':507 'unpublish':1004 'unverifi':1193 'updat':2406,2408,2417,2449,2462 'url':1260,2864,2872,2937 'us':2711,2754 'usag':62 'usd':815,841,1304,1366,1562,1697,1898,1932,2720,3126,3156,3181,3198 'use':121,167,215,226,240,252,722,726,2267 'user':131,148,175,183,288,466,623,634,678,766,774,1027,1097,1102,1348,1358,1420,1425,1429,1535,1605,1610,1771,1775,2006,2013,2021,2039,2055,2073,2320,2342,2345,2365,2398,2410,2425,2451,2501,2510,2513,2521,2679,2727,2775 'user-id':465,622 'user-level':2364 'user-provid':2774 'user@example.com':2682,2730 'v':294,298,315,2898,2916,2930,2942,2988,3034,3064,3075,3087 'v2':51,78,2299,2308,2442 'valid':21,45,55,92,179,1081,1391,1984,2755,3037 'valu':107,112,812,838,899,908,920,1210,1269,1301,1363,1434,1540,1736,1780,1787,1790,1797,1800,1807,2018,2032,2052,2066,2526,2549,2717,2781,3044,3046,3051,3057,3065,3070,3076,3119,3153,3178,3195 'value.int':1433,2525,2548 'value.string':1539,1735,2017,2031,2051,2065 'variabl':898,917,3062 'varianc':509,2984 'vendor':2827 'verif':949,1231 'verifi':236,995,1024,1047,1077,1263,1376 'version':728,861 'via':643,2671,2722 'view':474,582,631,924,2151,2999,3020 'view-through':473,581,630,2998,3019 'visibl':2767 'vs':82,398,565,718,2132,2809,3009,3092 'wait':2404,2460,2947,2958 'warrant':516 'web':2839 'websit':295,338,1259,1347 'weight':2816 'window':449,574,3002 'window.datalayer':343,928 'window.datalayer.filter':933,940 'window.datalayer.push':801,830,2676,3106,3111,3149 'window.sessionstorage.getitem':825 'window.sessionstorage.setitem':842 'within':495,597 'without':745,789,1690,2520 'work':1174 'workspac':223,1000 'workspace/container':860 'wrong':108,698,3045,3067 'x':1322 'xxxxxxx':701,1016,2869 'xxxxxxxxx':3176 'y':1125,1138,1405,1455,1468,1528,1573,1586,1680,1710,1723,1821,1834,1873,1954,1967,1992,2091,2104,2192,2205,2493,2577,2590 'year':2808 'yes':2897,2911,2925,2941,2987,3049,3068,3078 'york':2704,2747 'your-cloud-run-service.run.app':2882","prices":[{"id":"473bbf34-dde8-408c-95ed-6da99dbff8fd","listingId":"0ba36e3a-ab9a-45cb-9add-405aa9372c6d","amountUsd":"0","unit":"free","nativeCurrency":null,"nativeAmount":null,"chain":null,"payTo":null,"paymentMethod":"skill-free","isPrimary":true,"details":{"org":"cognyai","category":"claude-code-marketing-skills","install_from":"skills.sh"},"createdAt":"2026-04-18T22:23:29.632Z"}],"sources":[{"listingId":"0ba36e3a-ab9a-45cb-9add-405aa9372c6d","source":"github","sourceId":"cognyai/claude-code-marketing-skills/conversion-debug","sourceUrl":"https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/conversion-debug","isPrimary":false,"firstSeenAt":"2026-04-18T22:23:29.632Z","lastSeenAt":"2026-05-01T06:56:25.744Z"}],"details":{"listingId":"0ba36e3a-ab9a-45cb-9add-405aa9372c6d","quickStartSnippet":null,"exampleRequest":null,"exampleResponse":null,"schema":null,"openapiUrl":null,"agentsTxtUrl":null,"citations":[],"useCases":[],"bestFor":[],"notFor":[],"kindDetails":{"org":"cognyai","slug":"conversion-debug","github":{"repo":"cognyai/claude-code-marketing-skills","stars":42,"topics":["agent-skills","ai-agents","claude-code","claude-skills","cluade-mcp","cursor","geo","growth-hacking","llm","marketing","mcp","seo","vibe","windsurf"],"license":null,"html_url":"https://github.com/cognyai/claude-code-marketing-skills","pushed_at":"2026-04-29T13:43:50Z","description":"Marketing skills for Claude Code — SEO audits and implementation, ad analysis, ad optimization. Free skills need no account. $9/mo for live Search Console, Bing & LinkedIn data.","skill_md_sha":"3d776dd9513304b295c87d2c5b693100f6de37eb","skill_md_path":"skills/conversion-debug/SKILL.md","default_branch":"main","skill_tree_url":"https://github.com/cognyai/claude-code-marketing-skills/tree/main/skills/conversion-debug"},"layout":"multi","source":"github","category":"claude-code-marketing-skills","frontmatter":{"name":"conversion-debug","description":"Conversion Tracking Debugger — diagnose discrepancies across GTM, GA4, Google Ads & Meta Pixel with live API access, BigQuery validation queries, and troubleshooting flowcharts"},"skills_sh_url":"https://skills.sh/cognyai/claude-code-marketing-skills/conversion-debug"},"updatedAt":"2026-05-01T06:56:25.744Z"}}