I build a lot of reports for clients that use Big Query GA4 as source.
Now.. that works like a charm. But.. you will need to wait some time to get processed data from the events_
tables.
More recent data will appear in the streaming _intraday_
tables, if you have that enabled. But.. that data is not always complete! Especially when your site has consent mode enabled, and does not set a cookie until after consent.
Here’s how it works:
The scenario
Someone visits the site for the first time (source: some campaign), gets confronted with the cookie banner, and then clicks accept.
We tagged the site correctly, so this is what happens
- a
page_view
event triggers (with URL parameters) – and notices analytics consent is denied (the default) - the tracker attaches some parameters to this hit, to help processing
- a session is started
- this is the first visit
- there is an item list on the page:
view_item_list
event is triggered - the cookiebanner pops up (event:
cookiebar_view
) - the visitor clicks accept (event:
cookiebar_accept
) and the tracker gets sent agranted
signal - now the cookie can be used, and is attached to an automatic event
user_engagement
Sounds simple. Now, let’s see what is streamed into Big Query:
The streaming data gap
Basically, the intraday tables store what happens, as it happens.
- cookie field (
user_pseudo_id
) is filled in on hits on/after consent - cookie field is
NULL
for hits before consent
As it should be, right? But there’s a third bullet:
- first batch of events will not appear in the
intraday
table!
Here’s what we see (most recent hit first, read from bottom to top)

- the page_view is missing in the streaming table
- the
collected_traffic_source
information is missing (it is always only filled in on the first batch of events) - As a byproduct, we also do not see the session start and first visit
- the other events are all sent without a cookie
- after consent, we see the
user_pseudo_id
– finally
The next day.. Google has glued it all together
Processed data: every event has a row
The following is in the processed data: (most recent hit first, read from bottom to top)

- The page_view event and all other events leading up to the consent have a cookie attached to it! Google rescued that information
- the “Attached” parameters to the hit expand to two extra rows
- session_start
- first_visit
- we have source information:
collected_traffic_source
is present – on the first batch, as normal
Not visible in the screenshot: session_traffic_source_last_click
– the session information is properly filled in.
The consequences
If you decide to use intraday
tables in your Big Query reports: be aware that although the information is fresh (no pun intended, GA360 users), it’s incomplete
- intraday misses crucial events, namely the first batch (most often a page_view)
- bye bye landing_page reports based on page_views
- bye bye traffic source reports based on session_traffic_source_last_click or collected_traffic_source
- intraday misses cookies on some events
- which is not too much of an issue, really
Your experiences?
Do you use intraday tables in your models? Have you found clever workarounds to get the correct data in?
Let me know! Drop a comment here, or send me a bluesky message!
Still here?
Check out GA4Dataform – a product I’ve helped build that turns the GA4 Big Query exports into usable tables!
Leave a Reply