River
Y CombinatorBacked by Y Combinator

Marketing & GrowthFree

Search Console Export and Keyword Map

The full query set mapped to the page that should own each one, with the split terms and the ones no page targets named.

Start here

River's Search Console export and keyword map takes the rows you pulled and turns them into a map of which page owns which query. Every term is assigned to the page that actually earns its clicks, and anything without a clear owner is listed on its own. What comes back is a sheet you can sort by clicks, impressions or position, plus a short document naming the pages that have no primary query and the queries currently split across several URLs.

Unlike the workaround listicles that rank for this search, this does not stop at getting the data out. Those hand you a Python snippet and leave you holding a fifty thousand row CSV, which is the same problem in a larger file. Extraction is the easy half. The map is the part that tells you which page to change this week. Once it names a page's real primary query, the meta description writer can rewrite the snippet to match what people actually typed.

This is for in-house SEOs and content leads auditing a site they inherited, agency strategists building a keyword map for a new client, and founders trying to work out why traffic is flat while rankings look fine. Use it after a migration, before planning a quarter of content, or when two pages keep trading places for the same term. Where the map turns up a query earning impressions with no page targeting it, the SEO blog post writer can write that page. Terms you draw no impressions for live in the competitor content gap.

The row cap is not the only thing distorting your export

The 1,000 row limit gets the attention, but the worse problem is that the number at the top of the report is not calculated from the rows below it. Google's documentation is explicit that the export is truncated to 1,000 rows of representative examples and that report totals include the truncated data. So the clicks you screenshot for a board deck and the clicks you get by summing your CSV differ, and the second is always smaller. Anyone who wrote that gap off as rounding has been reading a partial dataset as a complete one.

The arithmetic is worth doing once, on your own property. Say the Performance report shows 42,000 clicks for the quarter. Export the queries tab, sum the clicks column, and the 1,000 rows come to 24,000. The missing 18,000 are real clicks from real queries, spread across thousands of terms that each sent a handful of visits. That tail is usually where the unclaimed opportunity sits, and it is precisely the part the interface drops. On a small site the cap never bites; the larger the footprint, the more sits below the line.

Two more things before trusting any map built from exports. Google's own API reference states that the Search Analytics endpoint does not guarantee to return all data rows but rather top ones, so even paging to the 25,000 row per-request ceiling is not a promise of completeness. And queries and pages are aggregated differently, by property for queries and by page for pages, which is why a query export and a page export never reconcile against each other. Pull both together in one request rather than joining two separate exports afterwards.

How it works

  1. Paste the export

    Your Search Console rows with query, page, clicks, impressions and position, plus one line on the site.

  2. River builds the map

    Each query assigned to its best-performing page, then splits, orphans and unclaimed terms separated out.

  3. Get the keyword map

    A sortable query-to-page map, and a short document naming what to fix and in what order.

  4. Keep working in chat

    Ask for one section of the site only, or paste next month's export and see which gaps actually closed.

What you get

  • Every query assigned to the single page that should own it, with clicks, impressions, CTR and position
  • Queries split across two or more URLs flagged, with which page is currently winning the term
  • Pages that rank for traffic but have no clear primary query, usually thin or drifting
  • Queries earning impressions with no page targeting them, ranked by the impressions already there
  • High impression and low click terms separated out, where the ranking exists and the snippet is losing
  • A note on where your export is likely incomplete, so the map is read with the right confidence

Common questions

Do I need the API, or can I just paste the CSV export?

Paste whatever you have. A 1,000-row interface export still produces a usable map of your top terms, and the output tells you where the cap has clipped it. If you can run the API or a BigQuery export, the map gets materially better, mostly because the unclaimed queries you are hunting for live in the tail the interface removes.

Why does the total in Search Console not match the sum of my export?

Because they are calculated over different things. Google states that report totals include the truncated data while the table itself is cut to 1,000 rows, so the total is computed across everything and your CSV is not. The two are meant to disagree on any site with real query volume, and the gap is roughly the size of your long tail.

How does it decide which page should own a query?

Clicks first, then impressions and position as tiebreakers, then whether the page's actual subject matches the intent behind the query. A page winning the clicks on a poor topical match gets flagged rather than confirmed, because the right page usually does not exist yet. Where the owner exists and earns nothing, take the map into a technical audit ranked on traffic lost.

Will it find keyword cannibalization?

It finds the version that shows up in your data: one query where two or more of your URLs both draw impressions, with the page currently ahead and the traffic the second is holding. Pages that never appear for the same query are not competing. Deciding which one survives, and writing the redirect map, is the cannibalization and consolidation review.

Does it work for a Domain property with several subdomains?

Yes, and the page column keeps them apart, so a query split across a subdomain and the main site shows up as a split rather than quietly averaging. That case is worth looking for specifically, since a documentation or help subdomain competing with a marketing page is common and rarely intentional.

How much data should I paste in?

Enough to be representative, and more is better. A single month of queries and pages is a reasonable start. Sixteen months is the furthest Search Console goes, and pulling the whole window makes seasonal terms visible that a single month would show as noise. Then feed the gaps into a content calendar, or into a cluster map that turns them into pages.

Search Console Export and Keyword Map

Fill in the form and your workspace opens with the work already underway.