If you’ve been working with Google Analytics 4 and BigQuery, you’ve likely encountered a frustrating problem: your data in BigQuery doesn’t match what you see in the GA4 interface. The most common culprit is the GA4 BigQuery event timestamp discrepancy. Events that appear in your GA4 reports at specific times show up with completely different timestamps in BigQuery, leaving you wondering which data source is correct.

GA4 BigQuery event timestamp discrepancy

Understanding the Root Cause

The GA4 BigQuery event timestamp discrepancy stems from several interconnected factors. The primary reason is timezone handling. GA4 displays events according to the timezone configured in your property settings. When data is exported to BigQuery, timestamps are stored in UTC (Coordinated Universal Time). If your GA4 property is configured for Pacific Time, events that appear at 2:00 PM in GA4 will show as 9:00 PM UTC in BigQuery—a seven-hour difference. This isn’t an error; it’s expected behavior.

Beyond timezone handling, there’s another layer of complexity: event_timestamp precision and collection delays. GA4 collects events with microsecond precision in BigQuery, but some events are queued and sent in batches, delayed due to network conditions, or retroactively adjusted by Google’s systems. Additionally, the discrepancy manifests differently depending on which BigQuery table you’re querying—intraday tables (updated frequently throughout the day) vs daily tables (finalized snapshots).

How GA4 Handles Timestamps: User Timezone vs Server Timezone

When an event fires on a user’s device, the gtag.js library captures the event along with the user’s local timestamp, which is sent to Google’s servers. GA4 receives this event and stores it with knowledge of both when the user believes the event occurred (their local device time) and when Google’s servers received it (server time in UTC).

In the GA4 user interface, timestamps are displayed in your property’s timezone setting. When this same data is exported to BigQuery, timestamps are stored in UTC. A report saying an event occurred at 3:00 PM in GA4 and the same event showing 8:00 PM in BigQuery (UTC) isn’t a data error—it’s expected when your property timezone is Eastern Time.

Diagnosing the Discrepancy

Start by selecting a specific event that’s easy to identify—perhaps a purchase or form submission from a known user at a known time. Find this event in GA4 reports, noting the exact timestamp. Then query the same event in BigQuery using user_pseudo_id and session_id to locate it. Compare the event_timestamp field, accounting for your property’s timezone offset. Use this diagnostic query:

SELECT
  user_pseudo_id,
  event_timestamp,
  event_name,
  TIMESTAMP_MICROS(event_timestamp) as event_timestamp_readable,
  DATETIME(TIMESTAMP_MICROS(event_timestamp), 'America/New_York') as event_datetime_eastern,
  DATETIME(TIMESTAMP_MICROS(event_timestamp), 'UTC') as event_datetime_utc
FROM
  `project_id.analytics_1234567.events_*`
WHERE
  _TABLE_SUFFIX >= '20240101'
  AND user_pseudo_id = 'YOUR_USER_ID'
LIMIT 100

Intraday vs Daily Tables: Key Differences

AspectIntraday TablesDaily Tables
Update FrequencyEvery 1-2 hoursOnce per UTC day
Timestamp AccuracyInitial collection timeProcessed and validated
Subject to ChangeYesNo (immutable)
Data CompletenessIncomplete for current dayComplete and finalized
Best Use CaseReal-time dashboardsHistorical analysis

Always use daily tables for historical analysis to avoid the GA4 BigQuery event timestamp discrepancy. Use intraday tables only when you need real-time data and understand that timestamps may shift once the day finalizes.

Fixing Timestamp Discrepancies with SQL

The first and simplest fix is timezone normalization. Convert BigQuery timestamps to match your property timezone:

SELECT
  user_pseudo_id,
  event_name,
  TIMESTAMP_MICROS(event_timestamp) as event_timestamp_utc,
  DATETIME(TIMESTAMP_MICROS(event_timestamp), 'America/New_York') as event_timestamp_eastern
FROM
  `project_id.analytics_1234567.events_*`
WHERE
  _TABLE_SUFFIX >= '20240101'
  AND _TABLE_SUFFIX < '20240102'
GA4 timestamp SQL code BigQuery comparison

Reconciling GA4 Reports with BigQuery Data

Beyond fixing individual timestamp issues, you often need to reconcile overall event counts. The challenge is that GA4 reports apply filters, sessions, and deduplication logic not reflected in raw BigQuery export. Use this reconciliation query to compare counts:

SELECT
  DATE(TIMESTAMP_MICROS(event_timestamp), 'America/New_York') as event_date,
  event_name,
  COUNT(DISTINCT user_pseudo_id) as user_count,
  COUNT(*) as total_events
FROM
  `project_id.analytics_1234567.events_20240315`
GROUP BY
  event_date, event_name
ORDER BY
  event_date DESC, total_events DESC

If event counts match within 1-2%, your discrepancy is purely a timezone interpretation issue. If counts are significantly different, investigate whether certain event types are being filtered differently between systems. Note that GA4 reports may apply sampling when they exceed certain thresholds, but BigQuery exports always include the full unsampled dataset.

Best Practices for Prevention

Always document your property's timezone setting and make this visible to anyone analyzing your data. Include timezone information in dashboards and reports. Use consistent timezone handling across all your analytics infrastructure. Store timestamps in UTC in your data warehouse and convert to display timezone only when presenting reports—this is the industry standard. Regularly audit your data by spot-checking specific events in both GA4 and BigQuery to catch discrepancies before they cause problems.

FAQ

Why are BigQuery event timestamps in a different format than GA4 timestamps? BigQuery stores event_timestamp as microseconds since the Unix epoch, while GA4 displays human-readable timestamps in your property's timezone. Convert using TIMESTAMP_MICROS() and DATETIME() functions, and account for the timezone offset.

How much timestamp difference is normal between GA4 and BigQuery? After accounting for timezone conversion, timestamps should match within a few seconds. Differences of a minute or two can occur due to collection delays. Differences of more than 5 minutes suggest a data quality issue.

Why do my total event counts differ between GA4 and BigQuery? GA4 reports may apply sampling, filters, and deduplication logic not in the raw BigQuery export. Always check whether your GA4 reports have filters applied and whether sampling is active.

Conclusion

The GA4 BigQuery event timestamp discrepancy is a common source of confusion, but it's entirely manageable with proper understanding. Most "discrepancies" are actually timezone handling differences—GA4 displays timestamps in your property timezone while BigQuery stores them in UTC. Once you account for this conversion, your data will align. By implementing the best practices in this guide—documenting your timezone handling, using consistent conversions, auditing your data regularly, and choosing the right table types—you can prevent timestamp discrepancy issues before they start.

Leave a Comment