As you may have heard, our beloved Universal Analytics (the Google Analytics we were all used to) will be sunset between July/October 2023 leaving us with only historical data in those UA properties and views.
In late 2019 Google released Google Analytics 4 (formerly known as App + Web), a new generation of Analytics which packs in a lot of goodies and brings a fresh solution to the landscape of Analytics.
Although some may feel this can be a direct replacement for Universal Analytics, Google has re-vamped Analytics in a drastic way making it more of a brand new tool instead of a direct replacement.
Despite hearing a lot of frustration around GA4, I feel the product itself (once it’s fully baked) will bring measurement into this century with much less rigidity that came with Universal Analytics.
In an effort to help speed up everyone’s learning curve, here are a few caveats, gotchas, limitations and warning that helped me quite a lot (in no particular order).
GA4 Limitations, gotchas & need to knows
Last modified: 29 June 2023
- GA4 account hierarchy differs (Account <- Property <- Data streams)
You can’t change your stream name once it’s been created[Edit: This seems to be fixed]- Your tracking ID isn’t easily accesible (it's nested inside data streams)
- Event parameters don’t automatically populate GA4 UI reports, you have to explicitly activate them using custom dimensions
- Some common dimensions/metrics aren’t available in the UI (
UTM content,Landing page, eCommerce: Shipping, Discount, Affiliation, Item variant) [Edit: UTM Content and Landing Page are available now] You cannot customise your marketing channel groupings as of yet[Edit: Custom channel groupings are now available]- User Explorer reports don’t show event parameters making them hard to get value from
Measurement protocol hits don’t get “sessionized”, (you won't have attribution for a backend event sent via Measurement protocol)[Edit: You can now sendsession_id
with your MP hits]- GA4 properties don’t have usable filters
Session/product scoped dimensions aren’t available (...yet)Session scoped dimensions are not available. [Edit: Product scoped dimensions are now available :)]- The Revenue description states it includes tax and shipping in the UI, but it doesn’t - it's simply the value sent in
- Sessions in GA4 aren’t measured as they were in Universal Analytics - it's very probable you'll have mis-matches if dual running (with less sessions in GA4)
- Data retention period is set to 2 months by default (ensure you extend it if need be)
- GA4 switches on automatic event collection which can cause some odd behaviour with SPAs (specifically with pageviews and scroll events)
- GA4 batches event data so you may not see your events leave your browser immediately (unless you're using debug mode)
- Events shown in DebugView do not show up in your reports
- GA4 doesn’t have views (or subproperties) on free accounts (...yet)
- GA4 hits are sent from your browser differently (using beacon) so it’s probable your metrics will differ slightly
- The Hit limit is no longer 8192 bytes for requests, there is still a limit however
- The GA4 UI doesn’t show hits for small amount of Users (using User-ID and device identity as your default identification). This is because of Google Signals.
- UA Goals won’t match GA4 conversion event counts (goals are session scoped, conversions are hit scoped). [Edit: Whilst this is true, you now have the ability of modifying the counting method and switching it to session-scoped which should come much closer to UA]
- Cross domain tracking can be configured in the GA4 UI as well as the GTAG tracker
- There is no ability to use
customTask
in GA4 - Ip Anonymization is switched on by default
- Measurement protocol events cannot be modified from the UI using the Modify event
- Data-driven attribution is the default attribution in GA4
- Unlike UA, GA4 doesn’t export last click attribution when linked with other products such as Google Ads. It now supports a shared attribution method.
- GA4 adds default events to your measured events. These are:
first_visit
,session_start
,user_engagement
. Custom event parameters are not added to these (exceptuser_engagement
), so if you have event parameters for debug views, environments or similar you won't be able to exclude them without manipulation - User properties are not consistently populated for all relevant events
- GA4 funnel reports are user scoped (unlike UA’s session scoped)
- Google signals data is not shared so BigQuery user counts and other data may differ to GA4 UI
- High cardinality is troublesome for the UI. If you have an event with a timestamp collected and enabled in the UI, you'll come across lots of `(other)` entries all over the UI
- eCommerce checkout reports do not bake in as many checkout steps natively, but you can add your own events if needed.
- Today’s data isn’t available in the Explore reports on free GA4 versions (it is available for 360 accounts)
- UA channel grouping reports will differ to GA4 given the differences in sessionisation and attribution
Hour and minute dimensions are not available in the GA4 UI[Edit: Both of these are now available in the UI]- DV360 Insertion Order and Line Item not available in GA4
- Attribution reports only follow GA4 default data-driven attribution when talking about conversions. Otherwise user scoped reports are first touch and other metrics are last non direct
- Subproperties add on half a hit when used. If you sent in 1000 events, the subproperty would count as 500 hits and increase your cost accordingly
- GA4 allows you to import offline event data with a maximum of a 72h delay
- Automatic conversions events cannot be disabled in the UI (purchase etc)
GA4 imported conversions (into G Ads) cannot be used for bidding optimisation (Universal Analytics goals could be)[Edit: This seems to be fixed]- The GA4 config tag is not like a GA settings variable. Values are fired once and it's common they’ll be static
- When overwriting UTM parameters, make sure to do this on the
page_view
tag. If you have a config + page_view tag you can do it on there, alternatively you need to send it through in GTM as an event parametercampaign_source
orcampaign_medium
which will overwrite the UTM settings - In GA4
source
andmedium
dimensions are NOT equivalent to Universal Analytics. The closest equivalent in GA4 areSession source
andSession medium
- The page_location dimension is truncated to
300420 characters [Edit: Modified as per Google docs] - An event parameter can be registered as a dimension or a metric, not both
- Event timestamps are actually the time a batch of events were sent into GA4 (not the exactly time the event fired on the page)
- Roll-ups aren't available in GA4 free editions but are available in 360 accounts. (You could add your data streams to one GA4 account and filter by stream ID/name as a workaround). [Edited: 20 May 22 from anonymous submission]
UTM parametersEdit: Added to UI ~ 12-Jul-22Term
andContent
aren't available in GA4 by default. However, if you addterm
andcontent
as custom dimensions, you should be able to report on them (hit level only, not session level)- Upon reaching your GA4 custom dimensions quota, it may take 48h upon deleting a custom dimension for GA4 to recognise a space is available
- GA4 uses a full regex match unlike Universal Analytics, this means if you entered
india
into a regex field expecting "Indiana" in your results, GA4 would only return results for "India". For GA4 you'd need to writeindia.*
to have a like for like with Universal Analytics - Measurement protocol
page_location
has a 100 parameter character limit so query parameters will very likely be cut off - The GA4 API exports data as per the UI so high levels of aggregations are expected (high amount of
(other)
.) - GA4 does not support regular expressions when defining new events from existing events (i.e. you won't be able to have a
generate_lead
event fire frompage_*
events, instead you'll need to list out the full event names [page_view
,page_fail
]) - GA4's BigQuery
traffic_source
data is user scoped and not session-scoped as it was in Universal Analytics. - GA4's BigQuery
traffic_source
data is incorrectly matched for Google Ads. Look forgclid
in thepage_location
as a workaround - GA4 converts all revenue into USD first and then into your original currency. Sending £25 into GA4 may result in the UI showing £25.22. This affects the following monetary metrics:
Purchase Revenue, Tax, Shipping, Item Revenue, Revenue per Transaction, Total Value
. BigQuery does store your original amount and thevalue
in yourpurchase
event should also be accurate. [Source] - BigQuery's
event_timestamp
is the batched event time in microseconds not the actual time of the event. In turn, your event order may not be accurate by up to 5 seconds (the max batch window). This only affects web data streams as Android/iOS have anevent_server_timestamp_offset
field to support with this. - If your GCP project is protected by VPC Service Controls, your GA4 BigQuery exports won't work as VPC Service Controls aren't supported yet.
- GA4's BigQuery integration may contain duplicate or missing data given the nature of the integration. This seems like a bug where data is written once and 2 appends of the data follow. The fragments may be written multiple times leading to issues with your dataset.
- No
Page Path level X
dimensions are currently available in GA4. - Google Optimize does not automatically enable event parameters in GA4 for experiment impressions. Ensure you manually create the following custom dimensions:
experiment_id
,optimize_personalization_id
,variant_id
. - If Google Signals is enabled and GA4's default reporting identity is set to Observered or Blended, reports may have threshholding applied. Reports won't show user counts for low traffic. Ensure you cross check your data by switching the reporting identity to Device-based and comparing the counts.
- Acquisition reports do not respect your selected GA4 attribution. "Acquisition > Traffic acquisition" is always last (non-direct) touch, "Acquisition > User acquisition" is always first touch and Conversions reports start off as last touch. Only when you click into a specific conversion do you see your select default attribution applied (linear/data-driven etc). This also applies to Explore reports, only the
Default Channel Grouping
dimension applied to your conversions shows your property default reporting attribution. [Source: Charles Farina - Measure Summit 2022] - Raw GA4 tables can de updated upto 72 hours after they were created (Measurement protocol hits can be delayed up to 72h)
- If a
user_id
is set during a session and the session contains a change insource/medium
, theSession source
for that session is set todirect
. [Source] - Special characters and alphabets (i.e. Chinese symbols) are encoded and left unreadable in the UI e.g. 書 becomes %E6%9B%B8
Contributions
If you'd like to add to this list, please submit your finding/update here.
A big thank you to everyone on this list who has helped confirm these issues or actively answer questions within the community. A special thanks to:
- Artem Korneev
- Charles Farina
- Julius Fedorovicius
- Jules Stuifbergen
- Krista Seiden
- Michel Gort
- Nicolas Boyer
- Peter Mindenhall
- Sébastien Brodeur
- Simo Ahava
- Todd Bullivant
- Zach Shearer
Thx. Good overview
Will you do another update of gotchas?
Absolutely Sébastien, I just did another one today 🙂
Precision for point #59. You need to first remove the project from the VPC Service Controls Perimeter before setting the BigQuery export. Then, when the export is started, you can put your project back into the VPC Service Controls Perimeter.
This is super helpful!
Here’s another one – Search Console is not automatically linked from old properties. Just worked this out over a year later and so missing a year of keyword data (I just thought I had not worked out how to view them in GA4).