40+ GA4 Gotchas, Limitations & Need to knows

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

Filter by
    1. GA4 account hierarchy differs (Account <- Property <- Data streams)
    2. You can’t change your stream name once it’s been created [Edit: This seems to be fixed]
    3. Your tracking ID isn’t easily accesible (it's nested inside data streams)
    4. Event parameters don’t automatically populate GA4 UI reports, you have to explicitly activate them using custom dimensions
    5. 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]
    6. You cannot customise your marketing channel groupings as of yet[Edit: Custom channel groupings are now available]
    7. User Explorer reports don’t show event parameters making them hard to get value from
    8. Measurement protocol hits don’t get “sessionized”, (you won't have attribution for a backend event sent via Measurement protocol) [Edit: You can now send session_id with your MP hits]
    9. GA4 properties don’t have usable filters
    10. Session/product scoped dimensions aren’t available (...yet)Session scoped dimensions are not available. [Edit: Product scoped dimensions are now available :)]
    11. The Revenue description states it includes tax and shipping in the UI, but it doesn’t - it's simply the value sent in
    12. 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)
    13. Data retention period is set to 2 months by default (ensure you extend it if need be)
    14. GA4 switches on automatic event collection which can cause some odd behaviour with SPAs (specifically with pageviews and scroll events)
    15. GA4 batches event data so you may not see your events leave your browser immediately (unless you're using debug mode)
    16. Events shown in DebugView do not show up in your reports
    17. GA4 doesn’t have views (or subproperties) on free accounts (...yet)
    18. GA4 hits are sent from your browser differently (using beacon) so it’s probable your metrics will differ slightly
    19. The Hit limit is no longer 8192 bytes for requests, there is still a limit however
    20. 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.
    21. 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]
    22. Cross domain tracking can be configured in the GA4 UI as well as the GTAG tracker
    23. There is no ability to use customTask in GA4
    24. Ip Anonymization is switched on by default
    25. Measurement protocol events cannot be modified from the UI using the Modify event
    26. Data-driven attribution is the default attribution in GA4
    27. 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.
    28. GA4 adds default events to your measured events. These are: first_visit, session_start, user_engagement. Custom event parameters are not added to these (except user_engagement), so if you have event parameters for debug views, environments or similar you won't be able to exclude them without manipulation
    29. User properties are not consistently populated for all relevant events
    30. GA4 funnel reports are user scoped (unlike UA’s session scoped)
    31. Google signals data is not shared so BigQuery user counts and other data may differ to GA4 UI
    32. 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
    33. eCommerce checkout reports do not bake in as many checkout steps natively, but you can add your own events if needed.
    34. Today’s data isn’t available in the Explore reports on free GA4 versions (it is available for 360 accounts)
    35. UA channel grouping reports will differ to GA4 given the differences in sessionisation and attribution
    36. Hour and minute dimensions are not available in the GA4 UI [Edit: Both of these are now available in the UI]
    37. DV360 Insertion Order and Line Item not available in GA4
    38. 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
    39. 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
    40. GA4 allows you to import offline event data with a maximum of a 72h delay
    41. Automatic conversions events cannot be disabled in the UI (purchase etc)
    42. GA4 imported conversions (into G Ads) cannot be used for bidding optimisation (Universal Analytics goals could be) [Edit: This seems to be fixed]
    43. The GA4 config tag is not like a GA settings variable. Values are fired once and it's common they’ll be static
    44. 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 parameter campaign_source or campaign_medium which will overwrite the UTM settings
    45. In GA4 source and medium dimensions are NOT equivalent to Universal Analytics. The closest equivalent in GA4 are Session source and Session medium
    46. The page_location dimension is truncated to 300420 characters [Edit: Modified as per Google docs]
    47. An event parameter can be registered as a dimension or a metric, not both
    48. Event timestamps are actually the time a batch of events were sent into GA4 (not the exactly time the event fired on the page)
    49. 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]
    50. UTM parameters Term and Content aren't available in GA4 by default. However, if you add term and content as custom dimensions, you should be able to report on them (hit level only, not session level)Edit: Added to UI ~ 12-Jul-22
    51. Upon reaching your GA4 custom dimensions quota, it may take 48h upon deleting a custom dimension for GA4 to recognise a space is available
    52. 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 write india.* to have a like for like with Universal Analytics
    53. Measurement protocol page_location has a 100 parameter character limit so query parameters will very likely be cut off
    54. The GA4 API exports data as per the UI so high levels of aggregations are expected (high amount of (other).)
    55. 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 from page_* events, instead you'll need to list out the full event names [page_view,page_fail])
    56. GA4's BigQuery traffic_source data is user scoped and not session-scoped as it was in Universal Analytics.
    57. GA4's BigQuery traffic_source data is incorrectly matched for Google Ads. Look for gclid in the page_location as a workaround
    58. 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 the value in your purchase event should also be accurate. [Source]
    59. 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 an event_server_timestamp_offset field to support with this.
    60. 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.
    61. 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.
    62. No Page Path level X dimensions are currently available in GA4.
    63. 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.
    64. 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.
    65. 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]
    66. Raw GA4 tables can de updated upto 72 hours after they were created (Measurement protocol hits can be delayed up to 72h)
    67. If a user_id is set during a session and the session contains a change in source/medium, the Session source for that session is set to direct. [Source]
    68. Special characters and alphabets (i.e. Chinese symbols) are encoded and left unreadable in the UI e.g. 書 becomes %E6%9B%B8


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

Useful links

4.4 7 votes
Article Rating
Notify of

Newest Most Voted
Inline Feedbacks
View all comments

Thx. Good overview

Sébastien Brodeur

Will you do another update of gotchas?

Sébastien Brodeur

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!