← Back to blog
GA4 · BIGQUERY

A missing day in the GA4 BigQuery export isn't always a gap: how to tell

I noticed that several days’ tables were missing from my GA4 dataset in BigQuery and assumed the export had failed. It hadn’t. Before opening a support case, there’s one very simple thing worth checking.

What the daily export does

GA4 generates an events_YYYYMMDD table per day only if that day had events. If there were none, it doesn’t create an empty table: it creates nothing. On a high-traffic property you never see it. On a low-traffic one, or one where consent keeps many visitors from being measured, days without a table can be the norm.

Step 1: list the missing days

This query cross-references a calendar with the tables that exist. Change the project, the dataset and the range:

WITH dias AS (
  SELECT d
  FROM UNNEST(GENERATE_DATE_ARRAY(DATE '2026-09-11', DATE '2026-11-02')) AS d
),
tablas AS (
  SELECT PARSE_DATE('%Y%m%d', REGEXP_EXTRACT(table_name, r'^events_(\d{8})$')) AS d
  FROM `proyecto.analytics_XXXXXXXXX.INFORMATION_SCHEMA.TABLES`
  WHERE REGEXP_CONTAINS(table_name, r'^events_\d{8}$')
)
SELECT dias.d AS dia_sin_tabla
FROM dias
LEFT JOIN tablas USING (d)
WHERE tablas.d IS NULL
ORDER BY dia_sin_tabla

The regular expression leaves out the events_intraday_ and pseudonymous_users_ tables. In my case, with data up to 2 November 2026, out of 53 days in the range 13 had a table and 40 didn’t.

Step 2: check against a second source

A missing table doesn’t tell you whether it was loss or simply no visits. To find out you need another source that records activity on its own. I run my own tagging server on Cloud Run, so I counted the requests to /g/collect per day in its logs:

gcloud logging read \
  'resource.type="cloud_run_revision" AND httpRequest.requestUrl:"/g/collect"' \
  --freshness=60d --format='value(timestamp)' \
  | cut -c1-10 | sort | uniq -c

Other valid sources are web server logs or CDN analytics.

What I found

The days with requests to /g/collect on the tagging server matched the days with a table in BigQuery one to one. Not one day with traffic and no table, and not one table without traffic. The gaps were days with no measured visits at all.

The “gaps” weren’t a technical problem: they were the correct measure of days on which no visit had been measured. The export had done exactly what it should.

When it is a real gap

Suspect data loss if any of these happens:

  • There’s traffic in the second source on a day with no table.
  • There’s a table, but with far fewer events than comparable days.
  • There’s a sudden cut that coincides with a change (a deployment, a CSP change, a container change).

In those cases, the next step is to check what was published in GTM that day and whether the browser console shows any blocking.

How to keep watch

You don’t need to check it by hand. Once the logic above works, you can turn it into a scheduled test that alerts you when tables are missing on days with known traffic, or directly measure daily event volume against the average of the previous days. I’ve done that in a dbt model on GA4.