Before you start
- GA4 property installed on your domain with conversions configured
- Google Search Console verified on the same domain
- Both connected (Search Console linked from GA4 Admin -> Product links)
- A spreadsheet or BI tool (Looker Studio, Mode, Metabase) for the final report
The playbook
8 steps
Connect Search Console to GA4
GA4 -> Admin -> Product links -> Search Console links -> Link. Pick your Search Console property and the GA4 web stream. This enables the Search Console reports inside GA4 - Queries and Google organic search traffic. Without this link, GA4 has no keyword data at all (GA4 sees sessions; Search Console sees queries; the link bridges them).
Expected outcome
Search Console queries visible in GA4 under Reports -> Acquisition -> Search Console.
Publish the Search Console reports inside GA4
Once linked, the reports exist but aren't published by default. GA4 -> Library -> Search Console collection -> Publish. Now Queries and Google organic search traffic appear in your Reports navigation. This is the GA4-native view; it's limited but free.
TipGA4's Search Console reports use unsampled data direct from Search Console. They're trustworthy but capped at 1,000 rows in the UI - use the export for full data.Expected outcome
Search Console reports live in GA4 Reports navigation; queryable in the UI.
Set up the GA4 conversion mapping per landing page
The bridge between keyword and revenue is the landing page. Search Console knows query -> landing page. GA4 knows landing page -> session -> conversion. Join on landing page. In GA4, build a custom exploration: Dimensions = Landing page; Metrics = Sessions, Conversions, Total revenue. Filter to Session source = google / medium = organic.
Expected outcome
GA4 exploration showing organic conversions and revenue per landing page.
Export Search Console data via the API for richer joins
GA4's UI caps at 1,000 rows. For real analysis, pull Search Console data via its API (or the Looker Studio connector). Endpoint: searchanalytics.query. Pull dimensions [query, page, country, device] - lets you slice by branded vs non-branded, by device, by market. Export to Google Sheets or BigQuery for the join.
// Search Console API - Node const { google } = require('googleapis'); const sc = google.searchconsole({ version: 'v1', auth }); const res = await sc.searchanalytics.query({ siteUrl: 'sc-domain:shuttergen.com', requestBody: { startDate: '2026-04-21', endDate: '2026-05-20', dimensions: ['query', 'page', 'device'], rowLimit: 25000, dataState: 'final' } });Expected outcome
Full Search Console export at the query + page + device grain ready to join.
Pull matching GA4 conversion data via Data API
GA4 Data API returns conversions, revenue, sessions per landing page. Pull the same date range. Dimensions = pagePath; Metrics = sessions, conversions, totalRevenue, engagementRate. Filter sessionDefaultChannelGroup = 'Organic Search'. Join to Search Console output on page = pagePath.
// GA4 Data API - Node const response = await analyticsDataClient.runReport({ property: 'properties/123456789', dateRanges: [{ startDate: '2026-04-21', endDate: '2026-05-20' }], dimensions: [{ name: 'landingPage' }], metrics: [ { name: 'sessions' }, { name: 'conversions' }, { name: 'totalRevenue' } ], dimensionFilter: { filter: { fieldName: 'sessionDefaultChannelGroup', stringFilter: { value: 'Organic Search' } } } });Expected outcome
Per-landing-page organic conversion and revenue data ready to join with Search Console.
Join the two datasets on landing page
In your spreadsheet or BI tool, join Search Console rows to GA4 rows on page URL. The resulting table: query | page | clicks | impressions | position | sessions | conversions | revenue. This is the analytics keywords report. Every keyword now has revenue attached, not just clicks.
TipMany queries map to the same landing page. Allocate that page's revenue proportionally to queries by clicks share - imperfect but the best approximation available.Expected outcome
Single joined table linking query-level Search Console data to landing-page-level GA4 conversion data.
Visualize in Looker Studio for ongoing access
Looker Studio has native connectors for both Search Console and GA4. Build the joined report once; refresh automatically. Standard sections: top revenue-driving queries, query-level CTR by position bucket, branded vs non-branded split, device split, week-over-week deltas. Share with the team via link; auto-updates daily.
Expected outcome
Always-on Looker Studio dashboard the team accesses directly without bothering analytics.
Build the weekly review cadence
A report no one reads is dead. Block 15 minutes weekly: scan top 20 revenue queries for week-over-week drops, scan top 20 by impressions for new query opportunities, flag landing pages with high impressions + low CTR (under-optimized titles), flag queries with high clicks + low conversion (intent mismatch). Document 2-3 actions per week.
Expected outcome
Weekly review producing 2-3 actionable items per week instead of a dashboard collecting dust.
Shuttergen
Know which keywords convert? Match them in paid.
Your analytics keywords report shows which queries convert organically. Shuttergen generates paid creative tuned to the same converting query intent - so paid and organic compound instead of duplicating.
Pitfalls
What goes wrong
Treating Search Console clicks as final attribution
Search Console clicks ≠ GA4 sessions. There's typically a 5-20% gap due to ad blockers, bot filtering differences, and cross-device. The joined report is directional, not exact. Don't argue with the discrepancy; use both as triangulation.
Ignoring landing-page-to-query attribution math
One landing page often ranks for 50+ queries. Attributing the page's full revenue to each query overstates everything. Allocate proportionally by clicks share - imperfect but the best signal you have.
Forgetting to filter to organic only
GA4's landing page reports include direct, social, email, and paid traffic. Without the Organic Search channel filter, the report mixes keyword-driven sessions with everything else and the analysis is meaningless.
Pulling 1,000-row UI exports instead of API
The GA4 UI for Search Console caps at 1,000 rows. Most domains have tens of thousands of queries. Use the API or Looker Studio connector for full data - the long tail is where 30-50% of revenue actually lives.
Building the report and never reviewing it
The dashboard is the easy part. The compounding value is the weekly 15-minute review that catches drops, opportunities, and intent mismatches in time to fix them.
Limits
When this playbook won't work
- Your conversions aren't set up correctly in GA4 (the revenue numbers will be wrong; fix conversions first)
- Search Console hasn't accumulated 90+ days of data on your domain (the sample size is too small)
- Your traffic is dominated by paid/social/direct (organic share too small to matter)
- You're on Universal Analytics still - migrate to GA4 first; UA stopped collecting data in 2023
Why this report matters more in 2026 than ever
The (not provided) era ended; the (not measured) era began. Google stopped passing keyword data to Google Analytics in 2011 (the famous 'not provided'). Search Console fills part of that gap - but only if you bridge it to your conversion data. Without that bridge, you have Search Console showing clicks and GA4 showing conversions, but no way to know which keywords drove the conversions.
AI Overviews make the bridge more important, not less. As AI Overviews compress click-through, the keywords that still produce clicks become more valuable per click. The teams that know exactly which queries convert can defend those queries; the teams that don't are flying blind.
Most analytics teams know how to build it but never do. It's not a hard technical project - 4-6 hours for a polished version. The bottleneck is prioritization, not capability. Make it a one-week sprint; the dashboard pays back monthly forever.
Know which keywords convert? Match them in paid. Your analytics keywords report shows which queries convert organically. Shuttergen generates paid creative tuned to the same converting query intent - so paid and organic compound instead of duplicating.
Looker Studio template structure
Page 1: Headline scorecard. Total organic sessions, conversions, revenue this period vs last; top 5 revenue queries; top 5 revenue landing pages; CTR by position bucket (1, 2-3, 4-10, 11+).
Page 2: Query performance. Sortable table of all queries with impressions, clicks, position, sessions, conversions, revenue. Filter widgets for branded vs non-branded, device, country, date range.
Page 3: Landing page performance. Same metrics aggregated to landing page. Pages with high impressions + low CTR are the title-tag optimization opportunities; pages with high clicks + low conversion are the intent-mismatch fixes.
Page 4: SERP feature impact. If you're pulling rank data alongside (via DataForSEO or Ahrefs API), overlay SERP feature presence on each query. Lets you see traffic dilution from AI Overviews and featured snippets you don't own.
Page 5: Weekly delta. Auto-calculated week-over-week movers - top 10 risers and top 10 fallers across the metrics. The weekly review starts here.
Internal: keyword-monitoring, keyword-analysis-in-seo, keyword-ranking-api.
FAQ
Frequently asked
What is an analytics keywords report?
How do I see keywords in GA4?
Why doesn't GA4 show keywords natively?
How do I join Search Console data with conversion data?
What's the best tool for an analytics keywords report?
How accurate is the keyword-to-revenue attribution?
How often should I refresh the report?
Related
Keep reading
Resource
Keyword monitoring
Rank tracking alongside reporting.
Resource
Keyword analysis in seo
Picking the keywords to report on.
Resource
Keyword ranking api
API-based rank data to overlay.
Resource
Seo analysis of competition
Competitive lens on the same data.
Research
Anatomy Of Good Meta Ad Library
Adjacent paid-channel reporting framework.
Know which keywords convert? Match them in paid.
Your analytics keywords report shows which queries convert organically. Shuttergen generates paid creative tuned to the same converting query intent - so paid and organic compound instead of duplicating.