Many marketers struggle with seeing fewer conversions in Google Analytics 4 (GA4) than in ad platforms—or vice versa. These discrepancies can lead to inaccurate ROI reporting, poor optimization decisions, and wasted ad spend.
🎯 Common Causes of Discrepancy
Reason | Description |
---|---|
Event Deduplication Failure | Events counted twice or ignored due to mismatched event_id s |
Ad Blockers / iOS App Tracking | Block client-side scripts (only CAPI may fire) |
Consent Restrictions | Tags not firing due to lack of user consent |
GTM Trigger Misalignment | Client-side event doesn’t trigger across all platforms |
Parameter Mismatch | Key values like transaction_id , email are missing in ad platform calls |
Attribution Windows / Models | Platforms use different lookback windows or attribution logic |
Time Zone Differences | GA4 uses site time; ad platforms may use UTC or account timezone |
🧰 Step 1: Setup Unified Conversion Event in GTM
Choose a shared event like purchase
, and ensure it’s pushed consistently:
<script>
(function() {
const eventId = 'evt_' + Date.now(); // Use UUID in production
window.dataLayer = window.dataLayer || [];
dataLayer.push({
event: 'purchase',
event_id: eventId,
transaction_id: '{{ order_id }}',
value: {{ total }},
currency: '{{ currency }}',
email: '{{ email | lower | sha256 }}',
phone: '{{ phone | sha256 }}'
});
localStorage.setItem('event_id_purchase', eventId);
})();
</script>
📊 Step 2: Confirm GA4 Event Tracking
GA4 Tag in GTM:
- Event Name:
purchase
- Trigger: Custom Event =
purchase
- Parameters:
event_id
,transaction_id
,value
,currency
Debug:
- Use GA4 DebugView
- Confirm event fires once
- Confirm
transaction_id
andevent_id
are populated
🎯 Step 3: Validate Meta Pixel + CAPI Tracking
Pixel Tag (Client-Side):
- Fires on
purchase
event - Includes
eventID
={{DLV - event_id}}
Meta CAPI Tag (Server-Side):
- Passes same
event_id
,transaction_id
, andvalue
- Match with
em
,ph
, orexternal_id
Debug:
- Use Meta Events Manager
- Look for:
- Event match quality (email/phone match)
- Deduplication status
- Timestamp alignment
- Event count (client + server)
🎥 Step 4: Validate TikTok Pixel + Events API
TikTok Pixel (Client-Side):
- Event Name:
CompletePayment
- Pass
event_id
+ order info
TikTok CAPI (Server-Side):
- Same
event_id
,value
,currency
Debug:
- Use TikTok Events Manager
- Check:
- Signal source
- Deduplication success
- UTM/click_id match
🧾 Step 5: Validate Google Ads Tracking
Google Ads Tag:
- Use gtag/GTAG via GTM or Google Ads Conversion tag
- Parameters:
conversion_id
,conversion_label
transaction_id
,value
,currency
Debug:
- Use Google Ads Conversion Debug Tool
- Check Chrome DevTools > Network tab >
collect?
hit - Verify:
"transaction_id": "123456",
"value": 199.99
🧪 Step 6: Compare Raw Hit Data
Use tools to inspect outgoing hits:
Tool | Use Case |
---|---|
GA4 DebugView | See live browser GA4 events |
Meta Pixel Helper + Events Manager | Inspect client & CAPI match status |
TikTok Pixel Helper | Real-time TikTok event validation |
Google Tag Assistant | Inspect Google Ads & GA4 events |
DevTools > Network > Payload | See collect? requests and payload contents |
Server GTM Logs | Monitor server-tag delivery, headers, event_ids |
📏 Step 7: Match GA4 + Ad Platform Conversions
Compare across platforms:
Metric | GA4 | Meta Ads | TikTok Ads | Google Ads |
---|---|---|---|---|
Conversions Today | 95 | 105 | 93 | 99 |
% Match to GA4 | 100% | 110% | 98% | 104% |
Duplicates Detected | 0 | 5 | 2 | 1 |
Look for:
- 10–20% mismatch is normal due to tracking limitations
- 30% = Tagging or duplication issue
🔍 Step 8: Identify Root Causes
Symptom | Likely Cause |
---|---|
Meta showing double conversions | Missing or mismatched event_id on Pixel & CAPI |
TikTok showing zero server events | Event not reaching CAPI endpoint |
GA4 lower than ad platforms | Client-side blockers or consent filtering |
Google Ads showing wrong values | value or currency mismatch |
🔧 Step 9: Fixes & Best Practices
- Always pass
event_id
to both client and server tags - Use same
transaction_id
in GA4 + Ads + CAPI - Set up consent-aware tag firing
- Store & retrieve
event_id
via cookie/localStorage consistently - Track and log payloads for debugging audit trails
🔐 Consent Wrapping (if applicable)
For regions under GDPR/CCPA, ensure tags fire only after consent:
if (window.Cookiebot && Cookiebot.consents.given.marketing) {
// fire pixels and dataLayer.push
}
Or use GTM’s Consent Initialization trigger types.