How can a GA4 query avoid counting daily and intraday events twice?

The Citead team, updated

In short. Select one GA4 export table family per date and filter wildcard suffixes to daily date values.

Definition: GA4 BigQuery Export can expose a current-day staging table named events_intraday_YYYYMMDD and a daily table named events_YYYYMMDD. To avoid counting the same events twice, query the intraday table for current-day work or the daily table for a completed date, and select only daily suffixes for historical ranges.

Key facts

  • Google's BigQuery Export guide describes the daily table as the full daily export and says it should be queried instead of the intraday table for a stable dataset.
  • The BigQuery Export schema says streaming creates events_intraday_YYYYMMDD, populates it continuously, and deletes it when events_YYYYMMDD is complete.
  • The same schema says Analytics can update daily tables for up to three days after the dates of the events because some devices send data late.
  • Streaming export is best effort. Google's guide says it may omit data because of late events or failed uploads.
  • Google's wildcard-table documentation says _TABLE_SUFFIX contains the value matched by the wildcard, so a suffix filter can limit the tables accessed.

What happens to the two tables during a day?

When streaming export is enabled, Google creates one events_intraday_YYYYMMDD table for each day. It is an internal staging table for session activity during that day, and data is exported continuously. The table can include records from a session that spans multiple export operations. Its best-effort status means the current-day view can have gaps caused by late events or failed uploads.

If daily export is enabled, Google also creates events_YYYYMMDD, described as the full daily export. The intraday table is deleted when that daily table is complete. This lifecycle means a query that reads both patterns for the same date can count overlapping event records while the intraday table still exists.

events_YYYYMMDD
events_intraday_YYYYMMDD

Which table should a query read?

For a completed date, read events_YYYYMMDD. Google's BigQuery Export guide explicitly recommends that table over events_intraday_YYYYMMDD because it is the stable dataset for the day. For current-day monitoring, read only the current events_intraday_YYYYMMDD table when near-current data is required, and describe the result as best effort. After the daily table is complete, use the daily table alone.

The daily table can still receive late events. The schema documentation says Analytics updates events_YYYYMMDD for up to three days after the event date, keeps the correct event timestamp, and does not record events that arrive after that three-day window. A report that is rerun during this window can therefore change without any second table being added to the query.

How can a wildcard query select daily tables?

BigQuery wildcard tables form a union of tables matching a wildcard expression. The Google Cloud documentation says the wildcard character must be the final character of the table name and that _TABLE_SUFFIX can filter the matched tables. Use the common events_ prefix, then replace the two placeholders below with the numeric start and end dates in the YYYYMMDD format. The daily suffixes fall in that range; the intraday suffix begins with intraday_ and is outside it.

SELECT
  event_name,
  COUNT(*) AS event_count
FROM
  `project.dataset.events_*`
WHERE
  _TABLE_SUFFIX BETWEEN 'START_DATE' AND 'END_DATE'
GROUP BY
  event_name;

This pattern reads daily tables for the requested range. A current-day query should use the intraday table explicitly when that is the chosen observation, rather than widening the wildcard to include both table families. The table names and suffix values come from the two Google Analytics export pages; the wildcard and suffix behavior comes from Google's BigQuery documentation.

FAQ

Why can events_* count the same date twice?

The wildcard matches tables with the common events_ prefix, including the daily and intraday families. Filter _TABLE_SUFFIX to the numeric date range for daily history, or name the intraday table explicitly for current-day monitoring.

Does the daily table become permanently final when it appears?

No. The schema documentation says Analytics can update the daily table for up to three days after the event date to account for late arrivals. Recheck that window when a report needs the latest daily value.

Does the intraday table contain a complete current-day export?

It is a best-effort streaming export. The BigQuery Export guide says it may omit data because of late events or failed uploads, and it is deleted when the daily table is complete.

Sources

  1. Google Analytics Help, "BigQuery Export schema", undated
  2. Google Analytics Help, "BigQuery Export", undated
  3. Google Cloud Documentation, "Query multiple tables using a wildcard table", 13 October 2026

Check how a page reads to answer engines. Open the GEO score analyzer

Test a page and see what to fix first

The analysis usually takes less than 10 seconds and needs no account.

400,000+ pages scored in the public benchmark