GA4 Is Not Universal Analytics — Stop Treating It Like It Is
If you're still trying to recreate your old Universal Analytics reports in GA4, you're fighting the tool instead of using it. GA4's data model is fundamentally different — everything is an event, sessions are calculated differently, and the reporting interface prioritizes exploration over pre-built reports.
For SEO specifically, this means rethinking how you track organic performance. The good news: GA4 actually gives you better data once you set it up properly. The bad news: the setup takes work.
Essential GA4 Configuration for SEO
Organic Traffic Segmentation
GA4's default channel grouping handles organic search decently, but it lumps all search engines together. If you want Google organic separated from Bing, DuckDuckGo, and others, you'll need to create custom channel groups.
Go to Admin → Data display → Channel groups → Create new channel group. Define rules based on source/medium combinations:
- Google Organic: source exactly matches "google" AND medium exactly matches "organic"
- Bing Organic: source exactly matches "bing" AND medium exactly matches "organic"
- Other Organic: medium exactly matches "organic" (catch-all for remaining search engines)
Apply this channel group to your reports and explorations. It's a small thing, but separating Google from other search engines is essential when diagnosing traffic changes — a Google algorithm update won't affect your Bing traffic, and mixing them obscures what's actually happening.
Setting Up Custom Events for SEO Tracking
GA4's enhanced measurement captures page views and scrolls automatically, but you'll want custom events for SEO-specific interactions:
<!-- Track internal search usage (if your site has search) -->
<!-- GA4 Enhanced Measurement handles this via URL parameters -->
<!-- Configure in Admin → Data Streams → Enhanced Measurement → Site Search -->
<!-- Add your search parameter (usually 'q', 's', or 'query') -->
<!-- For custom tracking beyond enhanced measurement, -->
<!-- use Google Tag Manager to fire events: -->
<!-- Event name: content_engagement -->
<!-- Parameters: content_type, word_count, scroll_depth -->
Useful custom events for SEO analysis: form submissions from organic traffic, PDF downloads, video plays, outbound link clicks to specific domains, and time-based engagement triggers (e.g., 30 seconds, 60 seconds, 2 minutes on page).
Custom Reports for Organic Performance
Landing Page Performance Report
This is the report you'll use most. In GA4, go to Explore → create a new Free-form exploration. Set it up like this:
- Rows: Landing page + query string, Page title
- Values: Sessions, Engaged sessions, Engagement rate, Conversions (pick your key conversion), Average engagement time
- Filters: Session default channel group exactly matches "Organic Search"
Sort by sessions descending. This shows you which pages are pulling organic traffic and how well that traffic engages. Pages with high sessions but low engagement rate need content improvements — you're winning the click but losing the reader.
Content Group Analysis
If your site covers multiple topic areas, group your content for aggregate analysis. In GA4, you can create content groups using Google Tag Manager by firing a custom dimension based on URL path patterns.
For example: all URLs matching /blog/seo/* get tagged with content_group = "SEO", while /blog/analytics/* gets content_group = "Analytics." Then you can compare organic performance across content groups to identify which topics drive the most traffic and conversions.
Connecting GA4 with Google Search Console
This integration is critical and too many people skip it. Link your GA4 property to Search Console in Admin → Product Links → Search Console Links.
Once linked, you get two additional reports under Acquisition → Search Console: "Queries" and "Google organic search traffic." The Queries report shows which search terms drive impressions and clicks, correlated with GA4 engagement metrics. This is the closest you'll get to keyword-level organic data in GA4.
One caveat: the data won't match exactly between GA4 and GSC. Different counting methodologies, different timezone handling, and sampling differences mean the numbers will always be slightly off. Use GA4 for engagement and conversion data, GSC for impression and click data. Don't try to reconcile them to the decimal point — you'll drive yourself crazy.
Building an SEO Dashboard in Looker Studio
GA4's built-in reporting is fine for ad-hoc analysis, but for ongoing monitoring, build a Looker Studio (formerly Data Studio) dashboard. Connect both GA4 and Search Console as data sources.
The dashboard I recommend for SEO teams includes these sections:
- Organic sessions trend — 90-day line chart with comparison to prior period
- Top landing pages by sessions — table with engagement rate and conversion rate columns
- GSC query performance — impressions, clicks, CTR, average position for top 50 queries
- New vs. returning organic visitors — pie or bar chart
- Conversions from organic — goal completions with revenue if applicable
Set the date range to "Last 28 days" with "Previous period" comparison as the default. This gives anyone opening the dashboard an immediate read on whether things are trending up or down.
Common GA4 Pitfalls for SEO Reporting
Session counting in GA4 trips people up. GA4 starts a new session after 30 minutes of inactivity (same as UA) but doesn't start a new session on midnight or on new campaign parameters. This means your session counts will look different from UA — typically lower — and that's expected, not broken.
Bounce rate in GA4 is the inverse of engagement rate, and an "engaged session" requires either 10+ seconds duration, a conversion event, or 2+ page views. This makes GA4's bounce rate much more useful than UA's was, but the numbers aren't comparable between the two platforms. Don't try to trend bounce rate across the UA-to-GA4 transition.
Data thresholds are GA4's version of sampling, and they're more aggressive than UA's sampling was. If you're seeing "(other)" appearing in your reports or data seems to be missing, you've hit a threshold. Switching from "Device ID" to "Reporting Identity" (or vice versa) in your property settings sometimes resolves this, or you can export to BigQuery for unsampled data.