Google Search Console shows the exact queries driving impressions and clicks to your site, which makes it a better keyword source than any third-party tool guessing at your traffic. This guide covers a repeatable workflow: joining queries to pages, filtering with regex, diagnosing CTR versus ranking problems, catching cannibalization, and exporting data to prioritize content refreshes.
To use Google Search Console for keyword research, open Performance under the Search results view, then check all four metrics: clicks, impressions, CTR, and average position. Most people stop at clicks. The impressions column is where the real research happens, because it shows every query that triggered your site in results, including ones you rank for on page two or three. Set the date range to at least 90 days, ideally the last 6 months, so seasonal noise does not skew what looks like a pattern. Then switch to the Pages tab, click into a single URL, and flip back to Queries. This shows you every term that page already earns impressions for, which is the fastest way to find keywords you're accidentally ranking for. Do this across your top 10-20 pages by impressions before touching any third-party tool. You'll often find you're one content edit away from ranking for terms you never wrote a single sentence targeting.
The single most useful move in GSC keyword research is comparing the query list for a page against what that page actually says. Pull the query list for a URL, sort by impressions, and read down the list looking for terms the page doesn't explicitly answer. If a service page for bookkeeping shows impressions for 'bookkeeping vs accounting' but the page never distinguishes the two, that's a content gap with existing demand behind it, not a guess. This query-to-page join also reveals mismatched intent: a blog post ranking for a commercial, buy-now query, or a service page pulling informational queries it can't satisfy. Export this pairing for every page that gets meaningful impressions and you have a prioritized list of edits, not a wishlist of keywords with no evidence behind them. This is the core difference between GSC-based research and traditional keyword tools: every term on the list is already connected to a real page and real search behavior on your site.
The default query filter (contains, exact match) works for one-off checks, but regex filtering is what makes GSC usable at scale. Switch the query filter to 'Custom (regex)' and you can group queries by pattern in one pass. A filter like ^(how|what|why|when) isolates informational queries across your whole site. A filter such as \b(near me|ottawa|canada)\b surfaces local intent. Excluding your brand name with a negative regex (a query that does not match your business name) separates branded search, which is usually inflated and low-effort, from non-branded search, which reflects genuine discovery. Combine a regex query filter with a page filter for a section of the site, like /blog/ or /services/, to audit intent coverage for that content type specifically. This is slower to set up than a basic filter but far more useful, because it turns hundreds of individual queries into a handful of readable clusters you can act on.
Average position and CTR get treated as one problem, but they need different fixes. A query with strong impressions, a good position (top 5), and a CTR well below what's typical for that position points to a title tag or meta description that isn't earning the click, not a content or ranking issue. Rewrite the title to match the query's actual phrasing and add a concrete detail, like a number, timeframe qualifier, or specific outcome, then monitor for a few weeks. A query with strong impressions and a weak position (11+) is a different problem entirely: no title tweak fixes a page that Google doesn't consider strong enough to rank higher. That requires content depth, internal linking, or added evidence and specificity. Sorting your query export by impressions descending, then eyeballing position and CTR side by side, takes minutes and immediately splits your keyword list into 'fix the snippet' and 'fix the content' buckets.
Cannibalization shows up in GSC as a query where the ranking page changes over time, or where two URLs both pull impressions for the same term without one clearly dominating. To check, filter Performance by a specific query and look at the Pages tab underneath it: if more than one URL shows meaningful impressions for the same query, they're competing against each other, which usually caps both below where a single consolidated page could rank. This is common on sites with overlapping blog posts and service pages written at different times without checking what already exists. The fix is rarely to delete content outright; it's usually to pick the stronger page, expand it to fully cover the query, then redirect or de-index the weaker duplicate and adjust internal links to point at the winner. Run this check quarterly, not once, since new content added over time reintroduces the same overlap.
The Search Console interface caps most tables at 1,000 rows, which hides real opportunity on any site with meaningful query volume. For full coverage, use the Search Console API, connect GSC to Looker Studio for a query-and-page report with no row cap, or use the built-in CSV/Google Sheets export for smaller pulls. Once exported, the useful analysis is impression-weighted, not click-weighted: sort by impressions to find where search demand already exists regardless of whether it's converting to clicks yet. Pair this with a position column filter to isolate the 8-20 range, which is typically where the highest number of quick-win opportunities live, since those pages are already relevant enough to rank but not yet strong enough to convert impressions into top positions. Rebuild this export on a recurring schedule, monthly or quarterly depending on site size, so you're tracking movement rather than working from a single stale snapshot.
Turn all of the above into a standing process instead of a one-time audit. Export query and page data monthly, filter to position 5-20, sort by impressions, and flag anything with a CTR noticeably below the norm for its position band. Score each row simply: high impressions plus poor position or CTR gets priority over low impressions regardless of position, since the ceiling on a low-demand term is small no matter how well it's optimized. Work through the top 10-15 flagged pages per cycle, applying the specific fix the data points to, whether that's a title rewrite, added section, internal link, or cannibalization cleanup. Log what changed and the date, then check that page's numbers again after 4-6 weeks before deciding whether it worked. This turns GSC from a report you glance at into an ongoing keyword research and content refresh system, which is the actual value of the tool over a static keyword list.
Open the Performance report, view queries and pages together, and sort by impressions rather than clicks. Filter individual pages to see every query they already earn impressions for, use regex filters to group queries by intent, then prioritize edits based on where position or CTR is underperforming relative to the demand already showing up in the data.
Third-party tools estimate search volume and rankings using their own crawl and click models, which are approximations. Search Console shows your site's actual impressions, clicks, and positions as measured by Google itself. It won't estimate volume for terms you don't already show up for, but everything it does show is real, verified behavior tied to your pages.
They measure different things. Search Console tracks impressions and clicks from Google Search results before a visit happens. Analytics tracks sessions and behavior after someone lands on your site, filtered through its own attribution and bot-filtering rules. Some clicks in Search Console won't appear in Analytics due to redirects, consent settings, or ad blockers, so the two will rarely match exactly.
Filter the Performance report by a specific query, then check the Pages tab beneath it. If two or more URLs both show meaningful impressions for the same query, they're likely competing. Confirm by checking if the top-ranking page for that query has changed over recent weeks or months, which is a strong signal of internal competition rather than stable ranking.
The web interface caps most query and page tables at 1,000 rows per view. For full-site coverage, use the Search Console API, connect your property to Looker Studio for an uncapped report, or export in smaller filtered batches (by date range or page section) through the built-in CSV and Google Sheets options.
Queries sitting at position 8 through 20 typically offer the best return, since the page is already relevant enough to appear but not strong enough to convert impressions into consistent clicks. Position 1-5 queries are usually about protecting CTR, while anything past position 30 often needs new content rather than an optimization of what exists.