🛠️ Step-by-Step Guide · Analytics · GA4 & Event Tracking

Google Analytics 4 (GA4): How to Set Up, Track Events & Analyse Data

Published: January 11, 2026  |  🔄 Last reviewed: March 2026  |  By Rohit Sharma  |  20 Min Read  |  Analytics & Tracking, GA4

✅ 13+ Years Experience✅ 150+ GA4 Implementations✅ Cited 2025–2026 Sources

Google Analytics 4 (GA4) is Google's current analytics platform, built on an event-based data model that tracks user interactions across websites, iOS apps, and Android apps within a single property. Unlike the now-retired Universal Analytics — which was permanently shut down on July 1, 2024 — GA4 treats every interaction as an event with attached parameters, giving you far richer and more flexible data about how people actually use your product.

14.8M
websites now use Google Analytics 4 globally, representing approximately 43% of all analytics tool installations — up from under 5 million when UA was retired in mid-2023. GA4 is now the default measurement platform for the overwhelming majority of web analytics use cases.

This guide works through all the main GA4 setup questions — property creation, tag installation, event tracking, consent, BigQuery exports — with field notes from 150+ live implementations mixed in throughout. The aim isn't to give you a checklist. It's to explain the reasoning behind each step so you can adapt it to your actual setup rather than following instructions you don't understand.

Key insight: GA4 isn't a UI refresh of Universal Analytics — it's a different product built on a different data model. Teams that skip this mental shift and treat it like UA with a new coat of paint consistently end up with broken funnels, mislabelled conversions, and data they can't trust. Get the event model right before you touch Admin settings. Everything else follows from that.

📋 About This Guide & How It Was Written

Everything here comes from working implementations, not vendor docs repackaged as tutorials. Each step, warning, and callout is drawn from actual GA4 work on live sites — e-commerce stores, SaaS platforms, media publishers, B2B lead-gen sites, and apps — between 2021 and 2026. Statistics come from cited third-party sources and Google's own documentation; sources are listed inline and at the bottom of the article. The guide gets updated when Google makes meaningful changes to GA4 — the last review was March 2026.

I've been setting up and auditing GA4 implementations since it became the default in 2021 — across e-commerce, SaaS, media, and lead generation projects of varying sizes. The one pattern that holds across almost all of them: teams that spend a session mapping out what they actually want to measure before touching any settings end up with implementations that run cleanly for 18 months or more. Teams that go straight to copying the snippet and marking conversions are usually back asking questions within 60 to 90 days — inflated session counts, events firing twice, funnels that don't match anything recognisable in the business. Setup is not the hard part. Getting the event model right before you start is. — Rohit Sharma, IndexCraft

1. GA4 vs Universal Analytics: key differences explained

Most GA4 mistakes trace back to people who set it up before they understood what changed. Spend a few minutes here — it'll save hours of troubleshooting down the line.

🔴 Universal Analytics (Retired July 2024)

  • Session-based data model
  • Pageview as the primary interaction unit
  • Goals (max 20 per property)
  • Bounce rate as engagement metric
  • Limited cross-device tracking
  • Third-party cookie dependent
  • BigQuery only in paid 360 tier
  • No built-in modelling for consent gaps

🟢 Google Analytics 4 (Current)

  • Event-based data model — everything is an event
  • Any interaction can be tracked as a named event
  • Key Events (unlimited, any event)
  • Engagement rate replaces bounce rate
  • Native cross-device and cross-platform tracking
  • Consent Mode v2 with behavioural modelling
  • BigQuery free for all properties
  • ML-powered modelling fills consent gaps
20–30%
average session count discrepancy between GA4 and Universal Analytics during parallel-run migrations, mainly caused by GA4's stricter session definition (sessions reset at midnight and on campaign source changes) and much better bot filtering. Teams that don't account for this almost always assume their traffic dropped. It didn't — the data just got more accurate.
The session number discrepancy between UA and GA4 is probably the most common thing that lands in my inbox during a migration. I've had clients assume their site was broken when GA4 showed meaningfully fewer sessions than UA for the same period — in some cases 25–35% lower. Once you dig into it, the explanation is almost always the same combination of factors: GA4 filters out traffic that UA was silently counting, and GA4's midnight session reset creates two sessions for users who browse across midnight while UA doesn't do this.

The number that worries clients is usually cleaner than the UA number was. It's just a different count of a slightly different thing. I now add a plain-English 'what will change about your session numbers' note to every migration handover before anyone looks at the first report, so the reaction is 'yes, you told me this' rather than 'something is wrong.' — Rohit Sharma

2. How do you create a GA4 property?

A GA4 property is the container that holds all your tracking data. Each one gets its own Measurement ID and can include multiple data streams — web, iOS, and Android — under one roof.

  1. Go to analytics.google.com and sign in with your Google account.
  2. Click Admin (the gear icon) in the bottom-left corner.
  3. Under the Account column, select an existing account or click Create Account to start fresh.
  4. Under the Property column, click Create Property.
  5. Enter a property name, select your reporting time zone and currency, then click Next. Note: choose the time zone where the majority of your business decisions are made — not necessarily your server's time zone. Mismatched time zones cause day-boundary attribution issues in reports.
  6. Describe your business category and size, then select your primary business objective.
  7. Click Create and accept the Terms of Service.
  8. Select the platform for your first data stream: Web, iOS, or Android.
Property naming best practice: Name your property with the format [Brand] — [Platform] — [Environment], e.g. "Acme Corp — Website — Production". This naming convention becomes critical when you have multiple properties (staging, production, apps) in the same account and prevents accidental data mixing — a mistake I see in roughly 30% of multi-property GA4 accounts I audit. Correcting a mixed-data property after the fact requires deleting and recreating the property, losing all historical data in the process. — Rohit Sharma

Once the property is created, you'll be assigned a Measurement ID in the format G-XXXXXXXXXX. This is what connects your site or app to GA4. Keep it somewhere accessible — you'll need it for every tracking step that follows.

3. How do you install GA4 directly on a website?

If you're not using Google Tag Manager, the direct install is straightforward: paste the Google tag snippet into the <head> of every page. It's the right approach for simpler sites that don't need complex event tracking.

  1. In GA4, go to Admin > Data Streams and select your web stream.
  2. Under Google tag, click View tag instructions.
  3. Copy the entire tag snippet provided.
  4. Paste it as high as possible in the <head> section of every HTML page — ideally as the first script in the head, before any other tracking or marketing scripts.
  5. Verify installation by opening your site, waiting 60–90 seconds, then checking the Realtime report in GA4 for your own active session.
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXXXXX');
</script>

Replace G-XXXXXXXXXX with your actual Measurement ID. For CMS platforms, Site Kit by Google (WordPress) or MonsterInsights can handle installation without touching code directly.

Critical: do not install GA4 on your site AND also via GTM. Doing so fires two separate GA4 hits per interaction, doubling your event counts, session counts, and reported conversions. In my audits, dual-installation is the second most common GA4 data quality issue after missing consent configuration, and it is entirely avoidable. Before publishing a GTM-based GA4 tag, always search your site's source code for any existing gtag/js?id=G- strings and remove them first. Choose one installation method and use it exclusively.

4. How do you set up GA4 with Google Tag Manager?

GTM is the better choice for most sites. It keeps all your tracking in one place, means non-developers can make changes without touching site code, and gives you Preview mode for debugging — which alone is worth using it for.

73%
of GA4 implementations on sites with over 50,000 monthly sessions are deployed via Google Tag Manager, according to a BuiltWith analysis of one million websites in January 2026. Direct gtag.js installs are more common on smaller sites and on platforms with native GA4 integrations — Shopify, Squarespace, Wix.
  1. In Google Tag Manager, open your container and go to Tags > New.
  2. Click Tag Configuration and choose Google Tag from the tag type list.
  3. Enter your GA4 Measurement ID (G-XXXXXXXXXX) in the Tag ID field.
  4. Under Triggering, select Initialization — All Pages. Using the Initialization trigger (not the standard All Pages trigger) ensures the GA4 tag fires before any other tags — which is essential for accurate session attribution and for event tags that depend on the GA4 config being established first.
  5. Name the tag clearly (e.g. "GA4 — Google Tag — Production") and click Save.
  6. Click Preview to enter Debug Mode. Open your website in the preview window and confirm the Google Tag fires on page load in the GTM debug panel.
  7. Return to GTM, click Submit, add a descriptive version name (e.g. "v1.0 — Initial GA4 deployment"), and click Publish.
The most common GTM mistake I come across in GA4 setups is the base configuration tag being set to fire on 'All Pages' instead of 'Initialization — All Pages.' It sounds minor. The consequence is not.

When event tags fire before the GA4 config tag is properly initialised, session attribution breaks — events are either queued and dropped or attached to the wrong session. In an audit I ran on a financial services site, this one trigger type selection had been silently dropping around 12 to 15% of form completion events over several months. No errors anywhere visible, nothing flagged in the UI. The events just weren't making it through. The fix took about three minutes once the issue was identified. Fixing the data history was not possible. Always use the Initialization trigger for the base GA4 config tag. — Rohit Sharma

5. How do you enable Enhanced Measurement in GA4?

Enhanced Measurement automatically tracks common user interactions — scrolls, outbound clicks, file downloads, video plays — without any custom code. In Universal Analytics, all of this required manual GTM setup. It's one of the more practical improvements in GA4.

Event NameWhat It TracksDefault StatusWatch Out For
page_viewEvery page load or browser history change (SPA-aware)OnCan double-fire on SPAs with custom push-state routing
scrollFirst time a user reaches 90% of page depth in a sessionOnOnly fires once per page per session — not a continuous depth tracker
clickOutbound link clicks leaving your domainOnDoes not track internal clicks; use custom events for that
view_search_resultsSite search queries using your internal searchOnRequires your search URL to contain a query parameter GA4 can detect
video_start / video_progress / video_completeEmbedded YouTube video interactionsOnOnly works for YouTube embeds with JS API enabled
file_downloadClicks on downloadable files (PDF, DOCX, ZIP, etc.)OnTracks link clicks to downloadable URLs — does not confirm actual download completion
form_start / form_submitForm interactions where forms are accessible to the tagOnUnreliable on custom or shadow-DOM forms; use GTM Form Submission trigger instead
The warnings in the table above come from real issues I've diagnosed in live implementations. The one that causes the most confusion is Enhanced Measurement's form_submit event — it works fine on straightforward native HTML forms, but on a meaningful proportion of the sites I audit that use a JavaScript form library or a headless CMS form component, it either fires on focus rather than submission or doesn't fire at all.

The most damaging version of this I've seen was a lead generation setup where form_submit was triggering on field focus. Reported lead volume was running around 280% higher than actual contacts received. The client had been treating that inflated number as their baseline for months before we looked at it. For any event you're using as a conversion or feeding into bidding, don't rely on Enhanced Measurement. Build a dedicated GTM trigger and verify it fires on submission only, against a real form on the real site. — Rohit Sharma

To review or toggle Enhanced Measurement events, go to Admin > Data Streams, select your web stream, and click the settings gear icon next to the Enhanced measurement toggle.

6. How do you track custom events in GA4?

In GA4, any user interaction can be tracked as a custom event. There are three ways to do this, and picking the right one for your setup keeps implementations simple and maintainable.

Method 1: Create events inside GA4 (no-code)

GA4 allows you to create new events based on existing ones directly in the interface. Go to Admin > Events > Create Event. You can define a new event name and set conditions based on existing event parameters — for example, creating a blog_scroll_complete event that fires when event_name equals scroll AND page_location contains /blog/. This is ideal for simple derivations from Enhanced Measurement events without involving a developer.

Method 2: Send events via gtag.js (direct install)

If GA4 is installed directly without GTM, call gtag('event', ...) at the point where the interaction occurs in your JavaScript:

gtag('event', 'newsletter_signup', {
  'method': 'footer_form',
  'user_type': 'new_visitor',
  'page_location': window.location.href
});

Event names must follow GA4's naming rules: snake_case, no spaces, no special characters except underscores. Names beginning with an underscore are reserved by Google and will be silently dropped.

Method 3: Use Google Tag Manager triggers (recommended for complex setups)

In GTM, create a Google Analytics: GA4 Event tag, add your event name and parameters, then set the trigger to match the interaction — a button click, form submission, element visibility, a timer. This is the most flexible and maintainable approach for anything beyond basic interactions, and the right choice when you need to pull dynamic values from the data layer.

GA4 event naming conventions: Always document your event taxonomy in a shared spreadsheet before implementation. Include the event name, the trigger condition, the parameters it carries, and its intended key event status. Sites that implement events ad-hoc without documentation end up with duplicated events with inconsistent naming — a problem that is expensive and time-consuming to clean up. The official GA4 recommended events list is a useful starting point for naming conventions.

7. How do you set up key events (conversions) in GA4?

Key events are how you tell GA4 what actually matters to your business — a purchase, a sign-up, a demo request, a form submission. They show up prominently across reports and sync to Google Ads for smart bidding. UA had Goals, capped at 20 per property. GA4 has no hard limit — but that's not an invitation to mark everything. The more you designate, the less any individual one means.

  1. Go to Admin > Events. You will see all events GA4 has recorded in the last 28 days.
  2. Find the event you want to designate as a key event (e.g. form_submit, purchase, demo_request).
  3. Toggle the Mark as key event switch to the right of that event name.
  4. Alternatively, click New key event to manually enter the name of a custom event you intend to implement but have not yet fired.
Key event validation: Check that your event is actually firing before you mark it as a key event. Use DebugView or the Realtime report. Key events apply retroactively in standard reports, but won't show in conversion reports until the event has fired at least once. If the event never fires and you mark it anyway, GA4 just shows zero conversions — no error, no warning, nothing to tell you something's wrong.
A mistake I see often is teams marking 15 to 20 interactions as key events because UA Goals allowed up to 20 and the assumption carries over. Scroll depth, video plays, tab clicks, time-on-page milestones — all marked as conversions. When everything is a conversion, the conversion reports tell you nothing useful, and smart bidding has no clean signal to optimise against.

I worked with a SaaS team in 2025 that had 19 key events active. When we audited what actually correlated with revenue, four of them mattered — trial signup, demo request, pricing page visit, and plan activation. We demoted everything else to regular events visible in Explore. Bidding performance on their paid campaigns improved noticeably within six to eight weeks because the algorithm was finally receiving high-intent signals rather than a mix of page-level interactions it couldn't distinguish. Key events should reflect business outcomes, not user activity. — Rohit Sharma

8. How do you filter internal traffic in GA4?

Office visits, dev testing, QA runs — if you're not filtering these out, they're sitting in your data. They inflate user counts, skew engagement metrics, and if someone on your team submits a test form, that's a fake conversion in your reports.

  1. Go to Admin > Data Streams, select your web stream, and scroll to More tagging settings.
  2. Click Define internal traffic, then click Create.
  3. Enter a rule name (e.g. "Head Office IP"), set the match type to IP address equals, and enter your office's public IP address. Add multiple conditions for multiple office locations or IP ranges.
  4. Save the rule, then navigate to Admin > Data Filters and create a new filter of type Internal Traffic.
  5. Critically: set the filter state to Testing first, not Active. Testing mode flags internal traffic with a dimension but does not exclude it, allowing you to verify the filter is catching the right sessions before permanently excluding any data.
  6. After 5–7 days of testing, confirm only internal sessions are being flagged, then switch the filter state to Active.
8–15%
of recorded sessions on small-to-medium business websites (under 100k monthly sessions) are internal or bot traffic, according to analysis of 200 GA4 properties by Simo Ahava in 2025. For e-commerce sites, unchecked internal traffic inflates reported conversion rates by an average of 2.3 percentage points — enough to trigger false positive signals in Google Ads smart bidding.

IP-based filtering does not work for remote workers or users on mobile data. For individuals, the Google Analytics Opt-Out browser extension prevents the GA4 tag from firing entirely for that browser session — the cleanest solution for team members whose IPs change frequently.

9. How do you set up custom dimensions and metrics in GA4?

GA4 picks up standard parameters automatically — page_title, session_source, event_count. But any custom parameters you send with your own events don't appear in reports until you register them as custom dimensions or metrics. This trips up a lot of implementations: you fire the event, the parameter shows up in DebugView, but it's nowhere in reports. Register it first.

  1. Go to Admin > Custom Definitions, then click Create Custom Dimension.
  2. Enter a human-readable Dimension Name (e.g. "Article Category", "User Plan Type").
  3. Select the Scope: Event for parameters that vary per interaction, or User for properties that describe a user's persistent attributes (e.g. subscription tier, account age).
  4. In the Event parameter field, type the exact parameter name as used in your event code — this is case-sensitive (e.g. article_category, not Article_Category).
  5. Click Save. The dimension will begin populating from this point forward — it does not backfill historical data.
GA4 custom dimension limits (free tier): 50 event-scoped custom dimensions, 25 user-scoped custom dimensions, and 50 custom metrics per property. These limits sound generous, but teams that fail to plan their parameter taxonomy often exhaust event-scoped dimensions within 6 months by creating near-duplicate parameters with slightly different names. Conduct a parameter audit and consolidation exercise before registering dimensions. Once registered, unused dimensions cannot be deleted — only archived — which counts against your limit. Source: Google Analytics Help: Custom dimensions & metrics limits

10. How do you create audiences in GA4?

Audiences in GA4 do two things: they let you compare user segments in Explore reports, and they power remarketing in Google Ads. GA4's audience builder is considerably more capable than UA's — you can use sequential conditions, time-bounded behaviours, and predictive ML-based audiences when you have enough conversion volume.

  1. Go to Admin > Audiences and click New Audience.
  2. Choose a starting point: use a Suggested audience template, build from scratch, or use a predictive audience (requires sufficient conversion data).
  3. Define your audience conditions using the dimension and metric builder. Combine conditions using AND/OR logic. Add sequences to target users who performed actions in a specific order within a specified time window.
  4. Set the Membership duration — how long a user remains in the audience after last meeting the criteria (up to 540 days, compared to 180 days in UA).
  5. Name the audience descriptively and click Save. New audiences only populate from the creation date forward.
1,000
returning purchasers and 1,000 non-purchasers within a 28-day window is the minimum GA4 needs before predictive audiences become available. Most e-commerce sites with under 5,000 monthly transactions won't hit that threshold — so custom behavioural audiences are the main option for mid-market retailers.

11. How do you use Explore reports in GA4?

The Explore section is where GA4 gets genuinely useful for analysis. Standard reports tell you what happened. Explore lets you ask why. It has several templates — Free Form, Funnel Exploration, Path Exploration, Segment Overlap, User Lifetime, Cohort — each built for a different type of question.

Creating a Free Form Explore report

  1. Click Explore in the left navigation, then select Free Form.
  2. In the Variables panel, click + next to Dimensions and Metrics to add the data points you want to analyse.
  3. Drag dimensions to the Rows or Columns fields in the Settings panel, and drag metrics to Values.
  4. Apply segments from the Variables panel to compare different user groups side-by-side. You can apply up to 4 segments simultaneously for comparison.
  5. Use the Filters field to restrict the report to specific events, pages, or user types.
  6. Switch the chart type (table, bar chart, scatter plot, line, geo map) to suit the data you are examining.
Funnel Exploration is the report template I find myself using most in client work. The feature I reach for most is the open funnel option — it lets users enter the funnel at any stage, which reflects how most real journeys work rather than forcing a rigid top-to-bottom path.

The most useful thing I've done with it recently was for an e-commerce client who had assumed for over two years that cart abandonment was their biggest checkout problem. When I built an open funnel from product view through to purchase and looked at where drop-off was actually concentrated, the largest gap was between payment information entry and purchase confirmation — not at the cart. About 62% of checkout abandonment was happening at that final step. When we looked at why, a mandatory account creation prompt was sitting between payment and confirmation for non-registered users. Removing it and making registration optional post-purchase increased checkout completion noticeably over the following two months. The data had been available the whole time. — Rohit Sharma

Explore reports are private by default — only you can see them. If a report needs to be available to the whole team on an ongoing basis, publish it to a shared space or rebuild it as a custom report in the standard Reports section.

12. How do you create and save custom reports in GA4?

Custom reports in the standard Reports section are different from Explore reports — they're visible to everyone on the property, persist in the left nav, and don't require people to hunt for a shared Explore workspace.

  1. Navigate to Reports > Library (visible at the bottom of the Reports navigation — you need Editor or Administrator role to access this).
  2. Click Create new report and choose between a Detail Report (table + chart view) or a Funnel Report.
  3. Add the dimensions, metrics, and filters you need using the report builder on the right panel.
  4. Click Save, give the report a descriptive name, and optionally add it to an existing collection in the Reports navigation.
  5. To create a new collection (a logical grouping of related reports, similar to UA's custom dashboards), go to Reports > Library and click Create new collection. Add your custom reports and publish the collection to make it visible in the left navigation for all users.

Linking GA4 to Google Ads makes the data flow both ways. GA4 key events show up in Ads as conversion actions for smart bidding, and Google Ads campaign data — cost, clicks, impressions, ROAS — appears in GA4's Acquisition reports. Without the link, you're running both platforms without any shared context.

  1. Go to Admin > Google Ads Links and click Link.
  2. Select the Google Ads accounts you want to link. You must have admin access to both the GA4 property and the Google Ads account.
  3. Review configuration options — particularly Auto-tagging. Enable it. Auto-tagging appends a gclid parameter to ad URLs that allows GA4 to attribute sessions to the exact ad, campaign, and keyword that drove them. Without auto-tagging, you see only "google / cpc" traffic with no campaign granularity.
  4. Click Submit. The link activates within 24–48 hours.
  5. In Google Ads, go to Tools > Conversions. Your GA4 key events will now be importable as Google Ads conversion actions for campaign measurement and smart bidding.
23%
average improvement in Google Ads smart bidding ROAS observed in a Google study of 300 advertisers who switched from Google Ads native conversion tracking to GA4-linked key events. Google attributes this to GA4's more accurate cross-session and cross-device attribution, versus last-click attribution in Google Ads.

The Search Console integration adds a dedicated collection to GA4 Reports that combines organic search data — impressions, clicks, CTR, average position — with GA4's behavioural data. It's one of the most useful integrations available: instead of jumping between tools to understand both ranking and post-click behaviour, you can see them together.

  1. Go to Admin > Search Console Links and click Link.
  2. Click Choose accounts, select the Search Console property that matches your GA4 web stream URL, and click Confirm.
  3. Select the GA4 web data stream to associate with this property, then click Next and Submit.
  4. Navigate to Reports > Library to find the Search Console collection and publish it to your navigation.
Set up the Search Console link early — you can't backfill the data. The GSC integration only shows data from the date you created the link. Waiting six months means six months of organic search performance is gone from GA4 forever. Do it within the first day of creating a new property, even before you have any traffic.

15. How do you link GA4 to BigQuery?

The BigQuery integration exports all your raw, unsampled GA4 event data to Google Cloud. It's the only way to go beyond GA4's 14-month retention limit, run SQL queries across your full history, and build reliable custom dashboards in Looker Studio, Tableau, or Power BI.

Free — The daily BigQuery export costs nothing for all GA4 properties. This was a big deal: UA charged $150,000/year for BigQuery access at the 360 tier. Now it's included. Google Cloud storage and query costs still apply, but for most sites under 5 million monthly events that typically works out to under $5/month. There's genuinely no reason to skip this integration. Source: Google Analytics Help: About BigQuery Export
  1. Create a Google Cloud project with BigQuery enabled and billing activated. (Without billing, BigQuery is in sandbox mode and GA4 cannot export to it.)
  2. In GA4, go to Admin > BigQuery Links and click Link.
  3. Select your Google Cloud project. Your GA4 account email must have roles/bigquery.dataEditor and roles/bigquery.jobUser IAM roles on the project.
  4. Choose a data location — select the region closest to your primary user base for query performance and data residency compliance.
  5. Configure export frequency: Daily (free, exports the previous day's full event data once per day around 09:00 UTC) or Streaming (small additional cost, near-real-time data appended continuously).
  6. Click Submit. The first daily export runs the following morning.
2025 update — BigQuery + Vertex AI: Google introduced native integration between GA4's BigQuery exports and Vertex AI in 2025 via the AI.GENERATE SQL function. This means you can now run generative AI queries directly against your GA4 event tables — for example, summarising user behaviour patterns by cohort or generating natural-language explanations of conversion funnel drop-off. If your team is building on BigQuery, this integration is worth exploring. See: BigQuery AI.GENERATE documentation
The BigQuery export is the part of GA4 that changes what's actually possible in analysis, and it's the first thing I configure once a basic implementation is stable. The standard GA4 interface is useful for operational monitoring — checking that traffic is arriving, events are firing, conversions are recording. For anything involving user-level journeys, cohort behaviour, or cross-channel attribution at any real depth, you quickly hit the sampling and aggregation limits of the built-in reports.

With BigQuery, I can run queries that answer questions the GA4 interface can't easily surface — how long the typical path from first visit to first purchase is across different acquisition channels, which content topics produce the highest 90-day retention by cohort, how conversion rates differ between users who arrived via paid and then returned organically versus those who converted on a single channel. These analyses have driven meaningful strategy decisions for clients that wouldn't have been visible in standard reporting. My practical rule: if a site has more than basic monthly reporting needs, set up BigQuery in the first few weeks. Every month without it is session-level data you can never recover after the rolling export window closes. — Rohit Sharma

16. How do you set up cross-domain tracking in GA4?

Cross-domain tracking is needed when you own more than one domain and users move between them — from your main site to a separate checkout domain, for example, or to a third-party booking platform. Without it, GA4 counts a new user and session the moment someone crosses that domain boundary, making your funnel reports look like a cliff edge at a point where nobody actually dropped off.

  1. Go to Admin > Data Streams, select your web stream, and click Configure tag settings.
  2. Under Settings, click Configure your domains.
  3. Click Add condition and enter each domain you want to include (e.g. yourbrand.com, checkout.yourbrand.com). Use the "contains" match type rather than "equals" to catch all subdomains.
  4. Click Save. GA4 automatically appends a _gl linker parameter to links between these domains, passing identity across the boundary.

You must have the GA4 tracking code installed on all domains in the cross-domain list. Verify the setup by navigating between the two domains in your browser and confirming in the Realtime report that both page views appear under the same user session without a session reset.

17. How do you configure data retention settings in GA4?

The data retention setting controls how long GA4 stores event-level user data before deleting it. The default is 2 months — which isn't long enough for any meaningful trend analysis or year-over-year comparisons in Explore. Change this on day one.

  1. Go to Admin > Data Settings > Data Retention.
  2. Under Event data retention, change the dropdown from 2 months to 14 months — the maximum available on the free tier.
  3. Enable Reset user data on new activity. This restarts the retention clock whenever a user is active, meaning engaged returning users' data is never deleted while they continue using your product.
  4. Click Save.
Worth clarifying: The retention limit only affects event-level data used in Explore reports. Aggregated data in standard Reports — Acquisition, Engagement, Monetisation — is kept indefinitely regardless of this setting. So even at the 2-month default, you can still see monthly traffic trends in standard reports going all the way back to when the property was created. The retention limit kicks in when you need user-level, event-level analysis in Explore beyond the retention window. For unlimited event-level data, use BigQuery.

18. How do you enable Google Signals in GA4?

Google Signals taps into data from users who are signed into their Google accounts and opted into personalised ads. Turning it on lets GA4 report on cross-device journeys and show demographic breakdowns based on Google's ad profiles.

  1. Go to Admin > Data Settings > Data Collection.
  2. Under Google Signals data collection, click Get Started.
  3. Read the data collection disclosure and click Continue, then Activate.
Data thresholding warning: Enabling Google Signals often triggers thresholding — GA4 withholds demographic data when user counts are too low to protect anonymity, replacing real values with "(other)". In practice this suppresses 15–40% of reportable data on sites under 100,000 monthly users. For most small-to-medium sites, the demographic data isn't worth the distortion it introduces. Enable it only if cross-device attribution or demographic targeting in Google Ads is a specific, stated requirement. If thresholding is already affecting your data quality, disable Google Signals under Reporting Identity and switch to Device-based identity instead.

Consent Mode v2 is how GA4 adapts data collection based on what users actually consent to. It's been mandatory for Google Ads advertisers targeting EEA users since March 2024 — sites that don't have it properly configured lost Remarketing and Smart Bidding for EEA traffic from that point.

65%
of EU-based websites audited by Usercentrics in Q1 2025 had incomplete or misconfigured Consent Mode v2 implementations — either collecting data without valid consent signals, or blocking collection entirely instead of using GA4's modelling to fill the gaps. Both create problems: one is a compliance risk, the other is avoidable data loss.

CM2 requires four consent parameters to all be configured:

ParameterControlsRequired for EEA?New in CM2?
analytics_storageGA4 analytics cookies and user measurementYesNo (existed in CM1)
ad_storageGoogle Ads conversion and remarketing cookiesYesNo (existed in CM1)
ad_user_dataSending user data to Google for advertising purposesYesYes — new in CM2
ad_personalizationPersonalised advertising and audience remarketingYesYes — new in CM2

You'll need a Google-certified CMP (Consent Management Platform) — Cookiebot, OneTrust, Usercentrics, and similar — to handle this properly. The CMP needs to set the default consent state (typically denied for EEA users) before the GA4 tag fires, then update it to granted once the user consents. When consent is denied, GA4 uses behavioural modelling to estimate non-consenting user activity — keeping your conversion reports statistically useful without collecting individual user data.

Consent Mode misconfiguration is the issue I flag most urgently when I find it, because it sits at the intersection of analytics accuracy and legal compliance, and getting it wrong in both directions causes problems.

The version that concerns me most is when the default consent state is set to 'granted' for all users including EEA visitors — meaning full analytics data is collected before the user has made any choice. I've found this in several implementations where the technical setup looked correct on the surface but the default state hadn't been configured specifically for regulated markets. The fix is straightforward: set the default to 'denied' for analytics and ad storage for EEA users, and let the CMP update those values only after explicit consent is given. Before any GA4 implementation goes live in markets where GDPR or similar applies, I always simulate a first-time visit from a VPN pointed to a relevant country and confirm in DebugView that no events are firing before consent is granted. — Rohit Sharma

20. How do you debug and test your GA4 implementation?

Don't assume your tracking is working just because no errors appeared during setup. GA4 gives you a couple of solid tools for checking, and there's a third-party extension worth knowing about too.

DebugView (primary debugging tool)

DebugView (under Admin > DebugView) streams events in real time from any device currently in debug mode. It's the best tool for deep event validation — you can see every parameter and its value as interactions happen. To activate debug mode:

  • Chrome extension (recommended): Install the Google Analytics Debugger Chrome extension and enable it. All events fired in that browser session appear in DebugView in real time, including every parameter and their values.
  • GTM Preview mode: Entering GTM Preview Mode automatically activates GA4 debug mode for the preview browser window. Events from that session appear in DebugView.
  • URL parameter: Appending ?_ga4_debug=1 to any page URL activates debug mode for that page load.

Realtime Report (quick validation)

The Reports > Realtime report shows all activity from the last 30 minutes. It's the fastest sanity check after a deployment — your site in one tab, GA4 Realtime in another, events appearing as you navigate. Click any event row to see its parameters. Not as detailed as DebugView, but more than enough to confirm a tag is firing.

GA4 Debugger browser extension (professional-grade)

The GA4 Debugger by Adswerve gives you a detailed view of every event and parameter at the network layer — including events that DebugView sometimes delays or batches. For complex implementations where multiple events fire simultaneously, it's the most reliable debugging tool available.

The five checks I run without exception before any GA4 implementation goes to production traffic:

First — DebugView shows all intended key events firing with correct parameter values on the correct pages, none on the wrong ones. Second — Realtime report shows no duplicate events; I look specifically for any event appearing twice per interaction. Third — the internal traffic filter is in Testing mode and correctly catching my own IP before it's switched to Active. Fourth — Consent Mode default state is set to 'denied' for EEA users, confirmed by a VPN visit to a German IP and a check in DebugView that nothing fires before consent is granted. Fifth — BigQuery export is linked and today's data is already appearing in the intraday events table.

If any of these five aren't passing, the implementation isn't ready. Every one of them has caught a real issue in a live project at some point. — Rohit Sharma

21. How do you set up GA4 e-commerce tracking?

GA4 e-commerce tracking is built around a set of recommended events defined by Google. Unlike UA Enhanced Ecommerce, where you could get away with a loose implementation, GA4's schema is strict — get the parameter names wrong and whole sections of the Monetisation reports just stay empty with no obvious indication why.

EventWhen to FireRequired Parameters
view_item_listCategory page, search results, or product carousel loadsitem_list_name, items[]
view_itemProduct detail page loadcurrency, value, items[]
add_to_cartUser adds a product to their cartcurrency, value, items[]
begin_checkoutUser initiates the checkout processcurrency, value, items[]
add_payment_infoUser enters payment detailscurrency, value, payment_type, items[]
purchaseTransaction successfully completedtransaction_id, value, currency, tax, shipping, items[]
refundFull or partial refund issuedtransaction_id, value, currency, optionally items[]

Each event needs to include an items array containing objects with standardised parameters: item_id, item_name, item_category, price, and quantity. The item_id and item_name are required — the rest are strongly recommended.

44%
of GA4 e-commerce implementations audited by Measurelab in 2025 had at least one critical error in their purchase event — most commonly a missing or badly formatted items[] array, or a transaction_id that changed on page refresh, which causes duplicate purchase events and inflated reported revenue.
Duplicate purchase events from order confirmation page refreshes are more common than most teams realise, and the downstream effect on revenue reporting and bidding is material enough that I treat it as a required check on every e-commerce implementation.

The typical scenario: the purchase event fires on every load of the order confirmation page, and a small but consistent percentage of customers — anywhere from 1 in 10 to 1 in 20 depending on the site — refreshes that page out of habit or to screenshot their order details. I audited a retail site where around 7.8% of reported orders were duplicates from this pattern. At their average order value and monthly volume, the inflated revenue figure was large enough to be significantly distorting their CAC calculations and skewing automated bidding targets upward.

The fix is straightforward: gate the purchase event behind a session flag check using sessionStorage and set the flag immediately after the event fires so it can't fire again in the same session. If you can't modify the page code, use GTM's 'fire once per page' trigger option. Either approach resolves it. — Rohit Sharma

22. Common GA4 mistakes and how to avoid them

Mistake #1: Dual installation (site snippet + GTM). Installing GA4 directly on the site AND via Google Tag Manager doubles every event, session, and conversion count. Pick one method and stick to it. If you're moving to GTM, search your site's source for any existing gtag/js?id=G- strings and remove them before publishing the GTM tag.

Mistake #2: Leaving data retention at 2 months. The default retention period means all event-level data in Explore reports gets deleted after 60 days. Change it to 14 months in Admin > Data Settings > Data Retention on day one — you can't recover data that's already been deleted.

Mistake #3: Marking micro-interactions as key events. Scroll depth, outbound clicks, video plays — these are not conversions. When every interaction is marked as a key event, the reports become noise and your smart bidding signals in Google Ads degrade. Keep key events reserved for actions that directly indicate business value.

Mistake #4: Skipping the BigQuery integration. Without it, event-level data is gone after 14 months, SQL queries across your full history aren't possible, and any BI dashboard work is significantly harder. The daily export is free to set up and costs most sites under $5/month in storage. There's no good reason to skip it.

Mistake #5: Wrong Consent Mode v2 default states. Setting granted as the default for all users — including EEA visitors — is a GDPR violation. EEA defaults must be denied. Always verify your consent default by simulating a first-time EEA visitor visit using a VPN before launch. This is a legal issue, not just a configuration preference.

Mistake #6: Never cross-referencing GA4 against another source of truth. GA4 can look like it's working perfectly while quietly under- or over-counting. Cross-reference conversion data against your CRM, payment processor, or server logs at least once a month. A 5–10% discrepancy is normal. Above 15%, something needs investigating.

Frequently Asked Questions

Universal Analytics was built around sessions and pageviews — the session was the core unit of measurement. GA4 flips this: everything is an event with attached parameters, whether it's a pageview, a button click, a scroll, or a purchase. On top of that, GA4 has native cross-device tracking, built-in machine learning for predictive metrics and modelled consent data, Consent Mode v2, and free BigQuery access. Universal Analytics shut down for good on July 1, 2024. One practical thing to know: GA4 typically reports 20–30% fewer sessions than UA for the same period — stricter session definitions and better bot filtering. That's a data quality improvement, not a traffic drop.

Go to Admin > Data Streams, select your web stream, and click "View tag instructions" under the Google tag section. Copy the gtag.js snippet and paste it as high as possible in the <head> of every page, replacing G-XXXXXXXXXX with your actual Measurement ID. Verify it's working by checking the Realtime report in GA4 — your own session should appear within a minute or two of loading the page. One heads-up: if you later switch to Google Tag Manager, remove the direct snippet first. Running both at once is one of the most common GA4 data quality problems, and it doubles all your event counts.

Key events are GA4's version of Goals from Universal Analytics — except there's no cap of 20 per property, and any event can be marked as one. You do it from Admin > Events by toggling "Mark as key event" next to the event name. They show up across standard reports, can be imported into Google Ads as conversion actions, and feed GA4's predictive audience models. The purchase event is automatically treated as a key event when e-commerce tracking is set up properly. Keep key events focused on things that directly indicate business value — purchases, leads, sign-ups, demo requests. Marking micro-interactions like scrolls or video plays as key events dilutes your conversion data and can actively harm smart bidding performance.

Standard GA4 reports — Acquisition, Engagement, Monetisation — are unsampled. Sampling can happen in Explore reports when you're querying large datasets over long date ranges; GA4 tells you when it's occurring. You can reduce it by shortening the date range, adding filters, or splitting the analysis into smaller chunks. If you need guaranteed unsampled analysis at any scale, export your raw event data to BigQuery and query it there — that's the standard approach for teams doing serious analytics work.

GA4 gives you the tools to support GDPR compliance — Consent Mode v2, data deletion requests, IP anonymisation (on by default and not configurable), adjustable data retention, and the option to disable personalised advertising. But compliance is your responsibility as the site owner, not Google's. You need a valid cookie consent mechanism from a Google-certified CMP, your Privacy Policy needs to accurately describe what you're collecting, and Consent Mode v2 defaults must be set to "denied" for EEA users. Setting "granted" as the default is a GDPR violation even if you're showing a consent banner. Also worth knowing: GA4 has faced regulatory scrutiny in several EU countries — Austria, France, Italy, Denmark — over US data transfers. If you operate in those markets, talk to your legal team.

The default is 2 months. You can extend it to 14 months — the maximum on the free tier — in Admin > Data Settings > Data Retention. This only affects event-level data in Explore reports; standard Reports keep aggregated data indefinitely regardless of this setting. For raw event-level data with no expiry, use the BigQuery integration — daily exports create tables in your Google Cloud project that GA4 never automatically deletes. Change retention to 14 months when you first create a property. You can't get back data that's already been deleted.

The most reliable approach is a thank-you page redirect: after the form submits, send users to a dedicated confirmation URL (like /thank-you/) and track that page_view as a key event using Admin > Events > Create Event. Zero false positives, works regardless of how the form is built. If you can't use a redirect, set up a GTM Form Submission trigger to fire a custom GA4 event on completion. Don't rely on Enhanced Measurement's built-in form_submit event for anything you're using as a conversion — it breaks on roughly 40% of custom JavaScript form implementations and should only be treated as supplementary data, not a primary conversion signal.

Yes — GA4 was designed for this. A single property can include web and mobile app data streams side by side, so you can see cross-platform user journeys in one place. For iOS, integrate the Firebase SDK for iOS. For Android, use the Firebase SDK for Android. Both stream into the same GA4 property alongside your web data, which lets you track things like users who browse on mobile web and then convert in-app, or follow the journey from a Google Ads click through to an in-app purchase.

Goals from Universal Analytics became Key Events in GA4. Any event can be designated as a key event from Admin > Events, and unlike UA's hard cap of 20 Goals per property, there's no limit in GA4. Key events also apply retroactively to all historical data in standard reports — not just from the date you created them, which was a frequent frustration with UA Goals. When your GA4 property is linked to Google Ads, key events automatically become available as conversion actions without the separate import step that UA required.

Go to Reports > Realtime in the left nav. It shows everything from the last 30 minutes — active user count, locations on a map, top active pages, top traffic sources, a minute-by-minute event chart. Click any event row to see its parameters. It's also the quickest way to check a new installation: load your site in one tab, watch GA4 Realtime in another, and your session should appear within 60–90 seconds. If nothing shows up after two minutes, the most common culprit is the snippet being placed in the <body> instead of the <head>.

📚 Sources & References

  1. W3Techs, "Web Technology Surveys: Google Analytics". w3techs.com
  2. Measurelab, "State of GA4 Report 2025". measurelab.co.uk
  3. MeasureSchool, "GA4 vs Universal Analytics Session Discrepancy Analysis", 2024. measureschool.com
  4. BuiltWith Technology Report: GA4 Deployment Methods, January 2026. builtwith.com
  5. Google Analytics Help: Predictive audiences eligibility criteria. support.google.com
  6. Google Analytics Help: Custom dimensions & metrics limits. support.google.com
  7. Simo Ahava, "Internal Traffic Impact on GA4 Data Quality", 2025. simoahava.com
  8. Google Ads Help: Connect Google Analytics to Google Ads. support.google.com
  9. Google Analytics Help: About BigQuery Export. support.google.com
  10. Usercentrics, Consent Mode v2 Knowledge Hub, 2025. usercentrics.com
  11. Measurelab, "GA4 E-commerce Implementation Audit Findings", 2025. measurelab.co.uk
  12. Google Analytics 4 Official Developer Documentation — E-commerce Events Reference. developers.google.com
  13. Google Analytics Help: GA4 Setup Guide. support.google.com
  14. Google Cloud: BigQuery AI.GENERATE documentation. cloud.google.com
  15. IndexCraft Internal Audits: GA4 implementation findings across 150+ client sites, 2021–2026. (Aggregated anonymised data; available on request.)

RS

Written by

Rohit Sharma

Rohit Sharma is a Technical SEO Specialist and the founder of IndexCraft. He has spent 13+ years working hands-on across SEO programs for enterprise technology companies, SaaS platforms, e-commerce brands, and digital agencies in India. His work spans the full technical stack — crawl architecture, Core Web Vitals, structured data, GA4 analytics, and content strategy — applied across 150+ websites of varying scales and industries.

The guides published on IndexCraft are written from direct practice: audits run on live sites, strategies tested on real projects, and observations built up over years of working inside SEO programs rather than commenting on them from the outside. No tool, tactic, or framework in these articles is recommended without first-hand use behind it.

He is based in Bengaluru, India.