If you do SEO, you’re in GSC looking at clicks and impressions. If you work on conversions, you’re in GA4 looking at sessions and orders. The two reports live separate lives, and there’s a gap in between: what does a user actually do after clicking through from search? Nobody can tell you. Join GSC and GA4 on page URL, and that blind spot disappears.
This article walks through how to join the two datasets, two pitfalls you’ll definitely hit, and a few analysis angles you can use right away. If you have both data sources but have never combined them, you can follow along today.
Here’s the bottom line up front: the key that joins both tables is page URL. Normalize the format first (strip domain/protocol), then join. Two pitfalls to avoid: timezone mismatches that shift daily data, and GA4 Explore sampling that distorts numbers. Once joined, the most immediate use is finding queries with high clicks but low sessions — optimize the landing page, not the title. Go a step further and align queries with conversions, then use the writing style of converting queries to improve non-converting ones.
Figure: Joining GSC and GA4 on page URL (compiled by 运营GO)
The key join field
The primary key that matches both tables is page URL. Watch out for format differences: GSC pages include the domain and protocol, while GA4 page paths usually don’t. Normalize first, then join.
Why join on “page” instead of “query”? GSC has query-level data (which query drove how many clicks), but GA4 only has page-level data (how many sessions a landing page got). The granularity is naturally different. To get query-level joining, you’d first map GSC queries to landing pages (using GSC’s “query + page” two-dimensional report), then link to GA4 page sessions — that’s an extra hop, and small sites don’t need it. Starting with page-level joining solves about 80% of problems: knowing which page draws people in but can’t keep them matters more than knowing which query, because the page is what you can actually change.
| Dimension | GSC field | GA4 field |
|---|---|---|
| Page | Page (full URL) | Page path |
| Time | Day | Day |
| Metrics | Clicks / Impressions / CTR | Sessions / Engaged sessions |
How to normalize: strip https:// and trailing slashes from GSC URLs, add the domain to GA4 paths, and get both sides into “domain + path + no trailing slash” format before joining. A lot of failed joins come down to one side having www and the other not, or one side having /?ref= tracking parameters — clean all that out first. Data cleaning works a lot like keyword filtering: remove noise before analyzing (the SEO data analysis playbook has a section dedicated to field cleaning).
If you use BigQuery, the join looks like this: use GSC’s exported `page` as the primary key, left join GA4’s `page_path` table, with the condition `REGEXP_REPLACE(gsc.page, r’^https?://(www\.)?’, ”) = ga4.page_path`. You’ll get a wide table where each row is one page with both impression/click data and session/conversion data — all subsequent analysis builds on this. Small sites without BigQuery can do the same logic in Excel with VLOOKUP, just handle timezones manually.
Two common pitfalls
Timezone mismatch: GSC uses the timezone set in site settings, while GA4’s reporting timezone might have been changed in property settings. A few hours’ difference means daily joins get shifted. Align them first. One way to diagnose: pick a day with steady traffic, look at the rows where the “date” fields don’t line up — more often than not, it’s a timezone issue.
GA4 sampling: When data volume is high, GA4 Explore reports sample, and exported data might only be a subset. For large sites, BigQuery export is the right way to avoid sampling. Small sites (a few thousand sessions a day) basically don’t get sampled in Explore and can use it directly; medium-to-large sites should go through BigQuery, where raw event-level data can be joined freely without sampling dilution.
How to use the joined data
The most immediate use: find queries with “high clicks but low sessions” — meaning users saw your title in search results, clicked through, but got turned away by the landing page. For these queries, optimize the landing page content match, not the title.
Go a step further: align queries with conversion events, find the difference between “queries that bring conversions” and “queries that only bring traffic without converting,” and use the writing style of converting queries to improve the content of non-converting ones. Overall traffic quality will go up.
Join once, and you eliminate one data blind spot. From now on, when your weekly report says “traffic is up,” you can say exactly which queries drove it, which page it landed on, and how many conversions it brought — that’s a report that holds up. People who do funnel analysis will love this: break down GA4 conversion events by landing page, compare with GSC landing page clicks, and it becomes obvious which content “draws people in but doesn’t convert” (the conversion funnel analysis article covers this whole chain in depth).
Here’s a real example. One site’s GSC showed the query “seo tool recommendation” getting 1,200 clicks a month, but GA4 showed only 400 sessions on that landing page — 800 clicks bounced immediately. Pulling the path, the landing page was all about how tools work, when users wanted “which one is good” and got turned away. After changing the landing page to “Top 3 recommendations first + one-line use case for each,” sessions went from 400 to 900, and conversions doubled. This is the kind of problem you can’t see before joining, but it jumps out after — the gap between clicks and sessions is an optimization goldmine.
Different approaches for small vs. large sites
Don’t be intimidated by “you need BigQuery to be professional.” For small sites with a few thousand sessions a day, both GSC and GA4 can export CSV, and a VLOOKUP in Excel on URL takes ten minutes — completely sufficient. Medium-to-large sites (tens of thousands of sessions a day+) need BigQuery or a third-party data warehouse, because at that volume the backend exports hit limits and Explore reports start sampling. Pick the tool that matches your scale; putting a small site on BigQuery is over-engineering.
Step-by-step
- Export a “by page” date × URL table from GSC, clean out domain/protocol/trailing slashes.
- Export a “page path” sessions and conversions table from GA4, add the domain to align.
- Left join on URL, keeping all GSC rows and attaching GA4 metrics.
- Check timezone consistency, spot-check 10 rows to verify numbers, then start analyzing.
- Start with a “high clicks, low sessions” query list, and schedule landing page optimization this week.
Troubleshooting failed joins
If after joining you find a lot of pages with null values on the GA4 side, check in order: ① Are URL formats really aligned (www / trailing slash / protocol)? ② Has GA4’s page_path been modified by filters? ③ Did the page just launch, with GA4 not yet collecting data? ④ Are there low-quality pages filtered out by “indexed” status in GSC? The vast majority of join failures are item ① — five minutes of format normalization solves 90% of problems.
Next action items
- Export both GSC and GA4 page-level data today, normalize by URL.
- Confirm both timezones match; if not, align before joining.
- Medium-to-large sites: use BigQuery export to avoid GA4 sampling.
- Produce a “high clicks, low sessions” query list, hand off for landing page optimization.
- Align queries with conversion events, use converting query writing style to improve content.


