GA4 Best Practices and Setup

GA4 setup that survives the next twelve months. Default events, custom events, dimensions, cross-domain tracking, BigQuery export, and the configuration mistakes that wreck most accounts.

By David Schaefer · LinkedIn · Updated May 2026

Where most GA4 setups go wrong

Universal Analytics was forgiving. You could leave defaults on, ignore the documentation, and still get useful reports. GA4 is not forgiving. It rewards setup discipline and punishes shortcuts. The accounts that get clean data tend to share five practices: deliberate event taxonomy, custom dimensions registered before use, BigQuery export turned on the day the property is created, internal traffic filtered, and cross-domain tracking properly declared.

Account and property structure

One account per company. One property per distinct brand or site. Multiple data streams under a property only when those streams genuinely represent the same business (web + iOS + Android of the same product). Cross-brand reporting is better solved at the BigQuery or Looker Studio layer than at the property level.

Inside the property, set up:

  1. Data retention. Admin → Data Settings → Data Retention. Default is 2 months. Change to 14 months immediately. You cannot retroactively recover data lost to the 2-month default.
  2. Google Signals. Off by default in most regions in 2026. Leave off unless you have a privacy review approving on. Signals enable cross-device but introduce thresholding that hides low-volume segments.
  3. User-ID feature. Configure if you have authenticated users. Pass your stable customer ID as the user_id parameter on every event after login.
  4. Internal traffic filter. Admin → Data Streams → Configure tag settings → Define internal traffic. Add your office and known team IP ranges. Then Admin → Data Filters → set the filter to Active. Skipping this step is one of the most common causes of inflated conversion counts.
  5. Cross-domain tracking. Admin → Data Streams → Configure tag settings → Configure your domains. List every domain a single user might traverse during a session (yoursite.com, checkout.yoursite.com, app.yoursite.com). Skip this and session counts inflate.
  6. Unwanted referrals. Same panel. Add your payment gateway domains (paypal.com, stripe.com, klarna.com). Otherwise, every payment-completed return shows up as a referral session, breaking attribution.
  7. BigQuery export. Admin → Product Links → BigQuery Linking. Set up immediately. Free tier covers most accounts. Required if you want raw event data, server-side joins, or custom modeling.

Event taxonomy

GA4 has four event categories: automatically collected, enhanced measurement, recommended, and custom. Most teams over-use custom events and under-use recommended events.

Use recommended event names where they exist. purchase, sign_up, add_to_cart, begin_checkout, view_item, view_item_list, generate_lead. These come with default parameters, default reports, and platform integrations. Custom event names like buy_now_clicked or checkout_started work but require manual report building.

Custom events should be reserved for things that genuinely do not map to a recommended event. Examples: quiz_completed, configurator_finished, price_estimator_used, support_chat_opened.

Custom dimensions and metrics

Custom dimensions store text values attached to events or users. Custom metrics store numbers. Both require registration in the GA4 UI before they can be reported on. Pass the value in your event payload, then go to Admin → Custom Definitions and create the dimension or metric with the matching parameter name.

Common custom dimensions worth creating:

  • logged_in — boolean for whether the user is authenticated
  • customer_segment — VIP / new / repeat / lapsed
  • page_type — product / category / blog / checkout
  • experiment_id and experiment_variant — for A/B tests
  • cart_value_bucket — under $50, $50-100, $100-250, $250+

You get 50 event-scoped and 25 user-scoped custom dimensions free. Use them.

Consent mode v2

Required for EEA traffic since March 2024. Consent Mode v2 communicates to Google whether the user has granted consent for ad personalization (ad_storage, ad_user_data, ad_personalization) and analytics (analytics_storage). When consent is denied, GA4 still receives cookieless pings and uses behavioral modeling to fill the gap. Pixels follow a similar pattern.

Implement via a consent management platform (Cookiebot, OneTrust, Iubenda, Termly, Cookieyes) connected to GTM. Test in GTM Preview that the default consent state is correct, that the update event fires after user choice, and that GA4 receives the update.

BigQuery export

This is the most underused feature in GA4. Once linked, GA4 streams raw event data to BigQuery daily (or in near-real-time on 360 properties). With that data you can:

  • Run cohort retention analyses GA4 does not support natively
  • Join GA4 events with backend customer data for LTV modeling
  • Reconstruct sessions with your own definitions, ignoring GA4's session timeouts
  • Build proper multi-touch attribution models in SQL or Python
  • Feed first-party data into reverse-ETL tools (Hightouch, Census) for audience activation

The BigQuery free tier covers most accounts under 10 million events per month. Beyond that, costs are usually under $50 per month per terabyte stored, with query costs depending on usage.

What GA4 still gets wrong

Session definitions changed without warning

GA4 sessions are not Universal Analytics sessions. A 30-minute inactivity rule still applies but events outside that window create new sessions automatically. Session counts in GA4 vs UA are not directly comparable.

Thresholding hides small audiences

When Google Signals is on, GA4 applies privacy thresholds. Low-volume segments (under ~50 users) show "(other)" instead of real data. Most teams discover this when an executive asks why a campaign report shows nothing.

Attribution is data-driven by default

Data-driven attribution sounds modern but is a black box. The model uses machine learning to assign credit and you cannot see the weights. For audit-grade reporting, configure an additional attribution view using last-click or position-based and reconcile the difference.

Reports lag

Standard reports are typically 24 to 48 hours behind real-time. Explore reports are quicker but still lag. For real-time intraday signal, use the Realtime report or BigQuery streaming export.

What to read next

For implementation details, see advanced GTM setup and advanced GA4 ecommerce tracking. For server-side delivery, see server-side vs client-side and the CAPI setup guide.