You send 1,000 events to GA4 via the Measurement Protocol, but GA4’s reporting interface shows only 850 events. This discrepancy frustrates teams trying to reconcile their backend event data with GA4 reporting. The gap exists because GA4 applies multiple filters, deduplication rules, and quality checks between event ingestion and reporting. Understanding these filters helps you diagnose whether events are lost (bug) or filtered (working as designed).

Where Events Get Lost: The GA4 Processing Pipeline
When you send an event to GA4 via Measurement Protocol:
- Event arrives at Google’s ingestion endpoint
- GA4 validates event format and required fields
- GA4 applies data quality filters (bot detection, invalid data, duplicates)
- GA4 deduplicates events using event_id
- GA4 applies consent mode filters (analytics_enabled = false events)
- GA4 exports to BigQuery (raw data, all events including filtered ones)
- GA4 applies additional filters for reporting interface
Events can be rejected or filtered at multiple stages. This is intentional—Google wants to protect data quality and compliance. But understanding each stage helps you identify if your events have legitimate issues.
Common Causes of Event Count Discrepancies
1. Missing Required Fields
Measurement Protocol requires specific fields. Missing fields cause event rejection:
{
"measurement_id": "G-XXXXXX",
"api_secret": "your_secret",
"events": [{
"name": "purchase"
}]
}
2. Event Deduplication
GA4 deduplicates events using event_id. If you send the same event_id twice, GA4 counts it once. This is a feature not a bug – event_id is designed to be idempotent so you can safely retry failed API calls without creating duplicates.
3. Consent Mode Filtering
Events sent with analytics_storage = ‘denied’ are filtered from GA4 reports (but appear in BigQuery).
4. Bot Traffic Filtering
GA4 applies machine learning bot detection. If an event looks like bot traffic, GA4 filters it from reports. You can configure this under Admin -> Data Filters.
5. Data Freshness and Reporting Lag
GA4’s reporting interface updates with a 12-48 hour delay. Your Measurement Protocol logs show events immediately, but GA4 reports show them later. Wait 48 hours and event counts will typically match.

Debugging Event Count Discrepancies
Compare counts at different pipeline stages to identify where events are being filtered:
-- GA4 BigQuery (raw events including filtered ones) SELECT COUNT(*) as bigquery_events FROM `project.dataset.events_*` WHERE _TABLE_SUFFIX = '20240115'; -- Find non-consented events SELECT COUNT(*) as non_consented FROM `project.dataset.events_*` WHERE _TABLE_SUFFIX = '20240115' AND (SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'analytics_storage') = 'denied';
Enable debug logging in your Measurement Protocol implementation using the debug endpoint at https://www.google-analytics.com/debug/mp/collect to see validation errors and check your payload format.
Reconciliation Strategy
To prevent discrepancies from spiraling, track events at their source and compare daily against BigQuery. Allow 5-10% variance as normal filtering, and alert on variances greater than 15% which indicate real problems.
-- Daily reconciliation query
SELECT
DATE(TIMESTAMP_MICROS(event_timestamp)) as event_date,
'GA4 BigQuery' as source,
COUNT(*) as event_count
FROM `project.dataset.events_*`
WHERE _TABLE_SUFFIX = FORMAT_DATE('%Y%m%d', CURRENT_DATE() - 1)
GROUP BY event_date;
Common Resolution Paths
- Gap is 0-10%: Normal. GA4 is working as designed with quality/compliance filtering.
- Gap is 10-20%: Investigate consent mode or bot filtering configuration.
- Gap is 20%+: Likely validation errors or API failures. Enable debug logging.
- BigQuery matches source but reporting is lower: GA4 applies additional reporting filters. Use BigQuery for accurate counts.
Event count discrepancies are solvable once you understand GA4’s processing pipeline. Use BigQuery as your source of truth and expect 5-10% filtering for legitimate reasons.
Related guides: GA4 Events Not Firing, Fix Duplicate Transactions, BigQuery GA4 Event Params.