Conversion Tracking Debugger
Debug 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.
Full docs: https://cogny.com/docs/conversion-tracking-debugger
Usage
/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
Instructions
You 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.
When 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.
If the user provides a specific topic as an argument, focus on that area. Otherwise, ask what platform or issue they need help with.
When MCP tools are available, follow this diagnostic approach:
- Use GTM tools to inspect tags, triggers, and workspace status
- Use GA4 tools to check conversion events, run reports, and verify data streams
- Use Google Ads tools to query conversion action status and performance
- Use Meta tools to check pixel configuration and compare conversion counts
- Cross-reference findings across platforms to identify the root cause
The Conversion Tracking Stack
Understanding data flow is the first step to debugging:
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) |
+-------------------+
Key data flow points:
- dataLayer push -- Website pushes event data to
window.dataLayer - GTM triggers -- Tags fire based on trigger conditions matching dataLayer events
- Network requests -- Each tag sends a separate HTTP request to its destination
- Platform processing -- Each platform processes, deduplicates, and attributes independently
- BigQuery export -- GA4 exports raw events to BigQuery (daily ~5 AM property timezone)
Common Discrepancies and Why
GA4 vs Google Ads Conversion Count Differences
GA4 and Google Ads will almost never match. This is expected.
| Factor | GA4 | Google Ads |
|---|---|---|
| Attribution model | Data-driven (cross-channel) | Data-driven (Google channels only) |
| Counting method | Configurable: once per session or once per event | Configurable: one or every conversion |
| Conversion window | Default 30 days | Default 30 days (up to 90 days) |
| Cross-device | Google Signals + User-ID | Google account sign-in |
| View-through | Not counted by default | Included for Display/Video (1-day default) |
| Data freshness | 24-72h processing lag | Conversions appear within hours |
| Modeled conversions | Behavioral modeling for consent gaps | Conversion modeling for unobserved |
Typical variance: 5-20% is normal. Over 20% warrants investigation.
MCP diagnostic approach:
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 vs GA4 Differences
| Factor | Meta | GA4 |
|---|---|---|
| Click-through window | 7 days (default) | 30 days (default) |
| View-through | 1-day included by default | Not counted by default |
| Attribution | Last-touch within Meta | Data-driven cross-channel |
| Deduplication | eventID for browser+CAPI dedup | transaction_id parameter |
| Cross-device | Facebook login graph | Google Signals + User-ID |
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.
GTM Firing but GA4 Not Receiving
- Consent Mode blocking -- Tag fires but sends no data when consent denied
- Ad blockers -- ~25-30% of users block
google-analytics.comrequests - Race conditions -- Page unloads before request completes (form submits, outbound links)
- Measurement ID mismatch -- Wrong
G-XXXXXXXin the tag config - Data filters -- GA4 property filters hiding or altering events
- Draft vs published -- GTM Preview uses draft; live site uses published version
Duplicate Conversions
The most expensive tracking bug. Common causes:
- Missing
transaction_id-- GA4 cannot deduplicate without a unique ID - Double-firing tags -- Multiple tags sending the same conversion
- Thank-you page reloads -- User refreshes the confirmation page
- Back button -- User navigates back to confirmation
- Missing CAPI dedup -- Meta Pixel and CAPI both fire without matching
eventID
Prevention:
// 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');
}
Debugging Checklist by Platform
Google Tag Manager (GTM)
Preview Mode Inspection:
- Correct workspace/container version active?
- Trigger event appears in the timeline?
- Tag shows as "Fired"?
- No unexpected duplicate tags firing?
Trigger Conditions:
- Event name matches
dataLayer.push({ event: '...' })exactly (case-sensitive)? - All filter conditions correct?
- No blocking triggers preventing fire?
Variable Values (in Preview mode):
transaction_idpopulated and unique?valueandcurrencypresent and correct types?- Custom JS variables returning expected values?
dataLayer Inspection:
// 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);
Network Request Verification (DevTools > Network):
google-analytics.com/g/collect-- GA4- `googleads.g.doubleclick.net/pagead/con