Google Analytics 4 for SEO
GA4's event-based model, the GSC-GA4 connection, Key Events, engagement metrics, landing page reports, traffic acquisition, custom events for micro-conversions, audience segmentation, and BigQuery export for SEO analysis.
GA4 replaced Universal Analytics in July 2023 and broke every report SEOs had been using for fifteen years. The good news: GA4’s event model is a far better fit for modern SEO measurement, especially when paired with the Search Console connection and BigQuery export. The bad news: nothing you knew about UA carries over verbatim.
TL;DR
- Everything in GA4 is an event. Pageviews, scrolls, file downloads, conversions — all events with parameters. Bounce rate is gone; engaged sessions and engagement rate replace it.
- Connect GSC to GA4 under
Admin > Property > Search Console links. This unlocks two reports —QueriesandGoogle organic search traffic— that join GSC impressions/clicks with GA4 landing page behavior. - Free BigQuery export is the cheat code. Stream every event, including PII-safe user pseudo IDs, into BigQuery for SQL-grade SEO analysis. The UI sampling limits disappear at the data warehouse layer.
The mental model
GA4 is like a stream of timestamped events flowing through a river — Universal Analytics was a pile of pre-aggregated buckets. The river preserves every drop with its full context; the buckets gave you tidy averages but discarded the rest.
This shift matters because SEO questions in 2026 rarely have tidy answers. You do not just want “how many sessions came from organic search last month.” You want “for users who landed on a long-tail blog post from AI Mode, then visited the pricing page within the same session, what was the eventual conversion rate broken down by device class and content type.” That question is unanswerable with bucketed data. It is trivial in BigQuery against the GA4 export.
The other half of the mental model: GA4 measures what users do on your site, while GSC measures what users do on Google. Neither can answer the question the other was built for. SEOs who confuse Sessions (GA4) with Clicks (GSC) burn entire afternoons reconciling numbers that are intentionally different.
Deep dive: the 2026 reality
GA4 in 2026 is mature enough to trust, but you need to know its quirks.
1. Event taxonomy. GA4 ships with automatic events (first_visit, session_start, page_view), enhanced measurement events (scroll, click on outbound, file_download, video_start), and recommended events that you implement (sign_up, purchase, generate_lead). Anything beyond those is a custom event. Each event can carry up to 25 parameters and 25 user properties per property.
2. Key Events replaced Conversions. As of March 2025, GA4 renamed Conversions to Key Events. Functionally identical: mark the event, and it appears in the Key Events column of every report. Cap: 50 Key Events per property. Use them for genuine business outcomes, not for engagement signals.
3. Engagement metrics.
| Metric | Definition |
|---|---|
| Engaged session | A session that lasts >= 10 seconds, fires a Key Event, or has >= 2 page views |
| Engagement rate | Engaged sessions / total sessions |
| Average engagement time | Time the page or app was in the foreground |
| Engagement time per session | Total engagement time / sessions |
Bounce rate exists in GA4 as 1 - engagement rate, but treating it as the UA bounce rate is a mistake — the threshold is different and it is reported less prominently for a reason.
4. Source/medium changes. GA4’s default channel grouping evolved twice in 2024 and once in 2025. Organic Search now includes traffic from google.com, bing.com, duckduckgo.com, yandex.com, plus newer search-like surfaces: chatgpt.com, perplexity.ai, gemini.google.com, and claude.ai when those surfaces send a referrer. Always check the actual source/medium of “AI traffic” because some AI products strip the referrer entirely and your traffic lands as Direct.
5. The GSC-GA4 link. In Admin > Search Console links, you connect a verified GSC property to one or more GA4 web data streams. Two reports unlock: Queries (impressions, clicks, CTR, position joined with landing page) and Google organic search traffic (landing page behavior for organic). Both reports must be published before they show up in the left navigation — the link does not publish automatically.
6. BigQuery export. Free for standard properties, with daily or streaming export. The schema produces one row per event with all parameters as a RECORD array. For SEO, this is invaluable: you can compute landing-page-level engagement metrics filtered to organic and joined with GSC click data — the kind of join the GA4 UI cannot do.
Visualizing it
flowchart LR
A[User clicks SERP result] --> B[Lands on page with gtag.js]
B --> C[page_view event]
C --> D[Enhanced measurement: scroll, outbound click]
D --> E[Custom event: read_progress, newsletter_signup]
E --> F[Key Event: generate_lead]
C --> G[BigQuery streaming export]
F --> G
G --> H[SQL join with GSC export on date and landing_page]
H --> I[Per-query engagement and conversion]
Bad vs. expert
The bad approach
The default GA4 install gets dropped on the site, conversions are slapped on every form submit, and the team reads Reports > Acquisition > Traffic acquisition every Monday.
<!-- Hardcoded gtag with no event taxonomy planning -->
<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>
<!-- Then later, randomly: -->
<button onclick="gtag('event', 'click', {'event_category': 'cta'})">Buy</button>
This fails three ways. First, every CTA click becomes a Key Event candidate, blowing through the 50-event cap. Second, parameter naming is inconsistent — event_category, event_label, link_url all referring to similar concepts. Third, no plan exists for what to do when the Key Event fires; it just lives in the GA4 UI as a number with no downstream system.
The expert approach
Implement via Google Tag Manager with a documented event taxonomy, fire Key Events only for genuine business outcomes, and pipe everything to BigQuery for analysis.
// dataLayer push from a SPA route change after a successful form submit
window.dataLayer.push({
event: "generate_lead",
lead_form_id: "demo-request",
lead_value_usd: 250,
page_path: window.location.pathname,
page_referrer: document.referrer,
page_organic_query: new URLSearchParams(window.location.search).get("q") || null
});
Then, in BigQuery, join the GA4 export with the GSC export to answer real SEO questions:
-- Engagement and conversion by landing page, organic only, last 28 days
WITH organic_sessions AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS session_date,
user_pseudo_id,
(SELECT value.int_value FROM UNNEST(event_params) WHERE key = 'ga_session_id') AS session_id,
(SELECT value.string_value FROM UNNEST(event_params) WHERE key = 'page_location') AS landing_page,
traffic_source.medium AS medium
FROM `project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN FORMAT_DATE('%Y%m%d', DATE_SUB(CURRENT_DATE(), INTERVAL 28 DAY))
AND FORMAT_DATE('%Y%m%d', CURRENT_DATE())
AND event_name = 'session_start'
AND traffic_source.medium = 'organic'
)
SELECT
landing_page,
COUNT(DISTINCT CONCAT(user_pseudo_id, session_id)) AS sessions,
COUNTIF(event_name = 'generate_lead') AS leads,
SAFE_DIVIDE(COUNTIF(event_name = 'generate_lead'),
COUNT(DISTINCT CONCAT(user_pseudo_id, session_id))) AS lead_rate
FROM organic_sessions
GROUP BY landing_page
ORDER BY sessions DESC
LIMIT 100;
This works because the event taxonomy is named consistently, the lead value is captured as a parameter for revenue projection, and BigQuery handles the heavy joins the GA4 UI cannot.
Do this today
- In GA4 > Admin > Property > Search Console links > Link, choose your verified GSC property and the matching web data stream. After linking, go to Reports > Library > Search Console and click Publish on both the
QueriesandGoogle organic search trafficcollections. - In Admin > Property > Data Streams > Web > Enhanced measurement, confirm
Scrolls,Outbound clicks,Site search,Form interactions, andFile downloadsare all toggled on. Set the Site search query parameter if your search uses anything besidesq. - Open Admin > Events > Mark as key event and remove anything that is not a real business outcome. The 50-cap fills fast. Keep
purchase,generate_lead,sign_up, and one or two product-specific events. - In Admin > Custom definitions, register the parameters you actually want as report dimensions:
lead_form_id,content_group,author. Without registration, parameters are searchable in Explore but not available in standard reports. - Go to Reports > Engagement > Landing page and add a filter for
Session source / mediumcontaininggoogle / organic. Sort byEngagement rateto find pages where users arrive but bounce. - In Explore > Free form, build a
Landing pagexAverage engagement time per sessionxKey eventstable for organic traffic. Save it. This is your weekly content quality dashboard. - In Admin > Property > BigQuery links > Link, connect a Google Cloud project. Choose Daily export at minimum, Streaming if you have <1M events/day. The first export arrives in ~24 hours.
- Use Looker Studio with the GA4 connector to build a public-facing dashboard. Pair it with the GSC Site Impression data source for query-level joins.
- Set up anomaly alerts in Admin > Custom alerts: drop in organic sessions >20% week-over-week, drop in
generate_lead>30% day-over-day. Email the SEO lead. - Audit your Default channel group under Admin > Property > Data settings > Channel groups. If
chatgpt.com / referralis not aliased into anAI Searchchannel, create a custom channel group so AI traffic does not hide insideReferral.
Mark complete
Toggle to remember this module as mastered. Saved to your browser only.
More in this part