Free tool · no account · runs in your browser

Striking distance queries

Upload the Queries export from Search Console and get the queries whose average position sits in a band you choose, 8 to 20 to start with, ranked by impressions, with their clicks, CTR and position. It says what the file cannot: a position is an average, the table stops at 1,000 rows, rare queries are left out, and a query is not a page.

Your file never leaves your browser. It is read by JavaScript in this tab; there is no upload, and this page's security policy blocks fetch, XHR, WebSocket, EventSource and beacon calls and form posts.

The ZIP from the Export button, or its Queries file. You can drop files here.

Both ends of the band count. Change any of the three after the result appears and it updates without reading the file again.

What it tells you

The queries just outside your best positions, read carefully

Ranked by what is seen

Queries in your band, biggest by impressions first, so the ones with the most people looking come before the ones seen a handful of times. A query under the minimum impressions is counted, not listed.

Averages called averages

Google's position is an average over every time the query showed your site. A query at 12.4 may have been near the top half the time and far down the rest, and the file cannot say which. Every position here is labelled as an average.

Queries, not pages

A Queries export has no page column, so this names queries. The page for each one is two clicks away in Search Console, and the result says which two.

What to upload

In Search Console, choose your property, open Performance, then Search results, and pick a date range. A longer range gives each query more impressions to average over. Open the Queries tab, make sure Clicks, Impressions, CTR and Average position are switched on (click a metric's tile above the chart to show it), and use the Export button, then Download CSV. Upload the ZIP, or the Queries file inside it. Google says a value shown as ~ or - in the report is a zero in the download.

Google's page on the report's dimensions says the queries dimension is not available when the multimodal search type is selected, because multimodal searches mostly use images rather than text. A table with a Page column as well as a Query column is not read here: its positions cannot be added up by query.

Finding the page for a query. This file names queries, not pages. In the Performance report, click the query in the Queries table, which filters the whole report to it, then open the Pages tab to see which URLs were shown for it. Google assigns clicks, impressions and position to the canonical URL, so the page you find may not be the address you expected.

What the file cannot tell you

  • Position is an average. Google's help page says the report shows average position, which averages the position value over all impressions, and that each appearance counts the topmost position your site held in that set of results. Position also varies with the searcher's history and location. An average of 12 can be a mix of 3 and 30, and a query's range is not in this file.
  • The table is cut at 1,000 rows. Google says the download is "truncated to 1,000 rows of representative examples of your data" and that Search Console "stores and shows only the most important data rows". It does not say which rows, so a query with many impressions and few clicks, exactly the kind this tool looks for, can be among those left out. A table of exactly 1,000 rows may have been cut, and the file cannot say whether it was. A report filtered to part of the site (a country, a device, a page folder) is its own table of up to 1,000 rows.
  • Rare queries are missing. Google omits anonymized (rare) queries from the Queries table and counts them in the chart totals, so the table's impressions are fewer than the chart's.
  • Queries, not pages. There is no page column in this export, so two pages ranking for one query, or a page that changed, cannot be seen here.
  • Zeros and missing positions. A position of 0 is "no position recorded", so a row with one is counted and left out of the band. CTR is clicks divided by impressions, worked out here from the two counts and not read from the file's rounded percentage.
  • One range, averaged. The figures cover the whole date range you exported. A query that climbed or fell during it shows a position in the middle. Dates in Search Console are Pacific Time.
  • "Striking distance" is a rule of thumb, not a Google measure. A query in the band is not promised to move, and a query outside it may be worth the work. The band and the minimum impressions are settings you can change and heuristics, not findings.

Sources, read on 21 Oct 2026: Google's help pages Export data directly from a Search Console report, What are impressions, position, and clicks?, Troubleshooting data discrepancies, Common tasks and use cases and Dimensions and data groupings.

What happens to your file

Nothing leaves your browser. The file is read by JavaScript running in this tab and parsed in memory; it is not uploaded, there is no copy on a server, and nothing from it is written to a cookie or to local storage (the theme switch remembers light or dark and nothing else). The page loads no analytics and no third-party scripts.

You do not have to take our word for it. Open your browser's developer tools, choose the Network tab, run an analysis, and watch it make no request. Two things back that up. This page carries a content security policy, readable in its source, that blocks fetch, XHR, WebSocket, EventSource and beacon calls (connect-src 'none') and form posts (form-action 'none'), and allows images only as inline data: URIs. A content security policy does not cover every browser feature (WebRTC, for one), so the second check matters: the project's tests read this page's own script and every module it imports, and fail on any of the browser's network APIs.

The site-wide script penlid.js, which every page loads, contains network calls for the signed-in app's account switcher. This page never calls it, and a test checks that those calls sit only inside the switcher.

The one thing that leaves this page's memory is what you ask for by clicking: the CSV of the queries you see.

Methods: the rules and thresholds

Each number below is a constant in public/assets/lib/queries.js (the read-size limit is in tool-ui.js). The project's tests compare the numbers quoted here with those constants; that is a check on the numbers, and not on every sentence. They are judgement calls, and they are the owner's to change.

Reading the file
A table is recognised by its columns, not its name: a column of queries, and columns of clicks, impressions and position. Only a Queries table is read. A Queries table taken with Compare, or a table with a Page column, is refused with what it was found to be. A choice of files totalling more than 64 MB is not opened. A row with a negative or fractional clicks or impressions value, or with more clicks than impressions, is not used, and is counted. A row with an empty clicks or impressions cell is not used either, and is counted: Search Console writes 0 and never a blank, and reading a blank as 0 would make a query look as though nobody clicked it. A row whose position or CTR is not a number (a "-" or "~" copied from the screen) keeps its clicks and impressions and has no position. Every row not used is counted in a sentence at the top of the result. A row with no query text is skipped, and so is a row labelled "Grand total", which a spreadsheet or Data Studio (formerly Looker Studio) adds. A query that appears more than once, ignoring case because Google says the table is not case-sensitive, has its rows added together and is named at the top, because Search Console lists a query once and a repeat usually means a table pasted twice; the position of a merged query is its rows' positions weighted by their impressions.
The band
A query is in the band when its average position is from 8 to 20 inclusive. Both numbers are defaults the visitor can change, and a position of 20.4 is outside a band that ends at 20. Position values below 1 are not positions and are not placed in any band.
The minimum
A query in the band is listed only with at least 10 impressions, a default the visitor can change. Queries in the band under the minimum are counted in a sentence above the list. The minimum is there because an average over a handful of impressions says very little; it is a judgement call, not a statistical bound.
Ranking
By impressions, largest first; ties by clicks, then by the query's text. The columns can be sorted. The page shows 100 rows at a time and up to 2,000 on request; the CSV has every listed query.
Where the table's queries sit
Every query with a usable position is counted under the band, over it or under it, whatever its impressions, so the list can be read against the whole table. The share of impressions is the listed queries' impressions over the impressions of every query that has a position.
The 1,000-row table
A table of exactly 1,000 rows (Google's documented maximum) gets the warning that it may have been cut off, and that the file cannot say whether it was. The rows counted are the rows the table had, so a skipped "Grand total" row neither creates nor hides the warning. A table with more than 1,000 rows, which a Data Studio or API export can be, is not called cut off.