Skip to content
Fenn

All posts

How to Join Search Console Queries to the Pages That Answer Them

6 min readSEOSearch ConsoleMeasurement

Filter by page first, then read the query list — that is the only join Search Console supports directly, and it answers 'which queries brought impressions to this URL'. The reverse join people want, 'which page ranks for this query', is available by filtering to the query and reading the pages list, but the totals will not reconcile with the unfiltered report because Search Console anonymises rare queries and applies limits per report. Three joins are safe: page to its queries, query to its pages, and either one compared to itself across periods. Adding page-level and query-level totals together is not safe, and the gap it produces is anonymisation, not an error in your export.

Almost every 'my Search Console numbers do not add up' question is this: the sum of per-query impressions is lower than the reported total for the property. Nothing is broken. Queries issued by very few people are withheld to protect the people who issued them, so they contribute to totals without appearing as rows.

The three safe joins

JoinHowAnswers
Page to queriesFilter to the URL, open the Queries tabWhat brought impressions to this page
Query to pagesFilter to the query, open the Pages tabWhich URL Google chose for this query
Either, across periodsSame filter, compare date rangesWhether this specific thing moved

Why the totals do not reconcile

Two mechanisms, and both are by design. Anonymisation withholds queries below a usage threshold, so those impressions exist in the property total and in no query row. And each report has its own row limit, so a long tail is truncated rather than summed. The practical rule: totals come from the unfiltered report, breakdowns come from filtered reports, and you never construct one from the other.

What to do with the joined data

The useful pattern is a per-page query profile: for each important URL, the queries it receives impressions for, sorted by impressions. Read it for mismatch rather than for volume. A page receiving impressions for queries it does not actually answer is a targeting problem that no amount of on-page optimisation fixes, and it is invisible in any report that looks only at totals.

The trap in the Pages tab

Filtering to a query and reading the Pages tab tells you which URLs received impressions for it, which is not the same as which URL you intended to rank. Two of your own pages appearing for one query is the signal worth acting on — it usually means the two pages overlap enough that the search engine is choosing between them, and the fix is consolidation or differentiation rather than more links.

Doing this outside the interface

The API returns the same data with the same anonymisation, and requesting query and page dimensions together gives you the pairs directly. That is genuinely more convenient than the interface, and it does not remove the reconciliation gap — an export that appears to add up is usually one that dropped the long tail before you looked.

FAQ

Why is my query total lower than my property total? — Anonymised queries and per-report row limits. Both are expected. Use unfiltered totals for totals and filtered reports for breakdowns.

Can I see every query a page ranks for? — No. You see the queries that produced impressions, above the anonymisation threshold, up to the row limit. Treat the list as a large sample rather than a census.

Does this apply to the API as well? — Yes. The API applies the same anonymisation; it removes the interface's convenience limits, not the privacy ones.

Put this to work on your own website.

Fenn finds what your customers ask, drafts the articles and site fixes, and measures what ChatGPT, Claude, Gemini, Perplexity and Grok say about you — with every change waiting for your approval.