Ranks 4.2 on 246 impressions but draws 0.21× the clicks typical for that position
9,461 impressions and no internal links pointing here
285 pages under /resource-center/ and nothing at /resource-center in your exports
Drop in the CSVs you already download from Search Console and Analytics. Searchbench tells you what they say, shows the arithmetic behind every claim, and writes the pages worth writing. Your exports stay on your machine; only what you explicitly send for writing ever leaves it.
Ranks 4.2 on 246 impressions but draws 0.21× the clicks typical for that position
9,461 impressions and no internal links pointing here
285 pages under /resource-center/ and nothing at /resource-center in your exports
One real path through the tool, start to finish, with the arithmetic shown at the point it happens.
Search Console pages and queries, plus GA4 if you have it. Each file is classified from its column headings, cleaned, and reported back: 345 pages, 978 queries, three breakdowns, two files tidied.
A page ranks 4.2 on 246 impressions and draws 8 clicks. The click-through rate typical for position 4.2 is about 15%, so it should be drawing closer to 37. It is at 0.21× what the position is worth.
No score, no grade. The impressions, the position, the curve and the shortfall all sit beside the finding, labelled counted rather than rule of thumb, so you can verify it against the same export in a spreadsheet if you want to.
Every query mapped to that page, each marked measured or inferred. What is wrong with it, a checklist of specific instructions, and whatever the crawler read from the page itself. Free to open, and nothing in it is generated.
The queries it already earns clicks on are named in the prompt and preserved. Research and draft run as separate calls, your brand kit is applied while writing and verified afterwards by counting, and internal links are checked against pages that exist.
It lands in a library. A blocking issue refuses approval outright. What you approve exports as Markdown or Word, and you publish it yourself. Total spend for that page: about $0.05.
Every number comes from a row in a file you uploaded or a page the crawler read. No model touches the analysis, so nothing has to be taken on trust.
Fourteen kinds of export recognised from their column headings, not their filenames. Thousands separators, totals rows and percentages written as less-than are cleaned, with a note saying exactly what changed.
14 file kindsThirty-odd checks counting and comparing. Each one carries the rows it came from, how it was reached, and a rough size in clicks so the list can be ordered by what it recovers.
Counted, not judgedMeasured pairs where the export carries them, stemmed overlap where it does not, and a pin when you disagree. Your answer overrules the tool from then on.
Measured before guessedOne request a second, robots.txt obeyed and fetched under the tool's own name, only the pages you tick. The whole readable text is kept, which is what lets a check look past the opening paragraph.
Or import a crawlEach row becomes a page. Patterns build the title and address, the tool fills columns in for you, research and drafting split into separate calls, and conditions skip steps a row cannot support.
A model per stepRows with nothing to say, rows nearly identical to one another, addresses clashing with a real page and steps no row satisfies are all caught before the first call is made.
PreflightTone, banned words, reading level and sentence length applied while the page is written, then verified afterwards by counting rather than by opinion.
Brand kitTargets chosen by the mapper from your real pages, the page itself excluded by comparing final segments, and anything the model invents flagged before you publish it.
Verified after writingSet a budget and the run stops at it. Pause and resume without paying twice for steps already done. Every call recorded with its model, its tokens and its cost.
Per-model ledgerThe searches a page already earns clicks on are named in the prompt and kept, because a rewrite that forgets them trades a position you have for one you only hope for.
Keeps what ranksPaste the table again when your figures move. Rows that did not change keep their pages; only the ones that did are rewritten, and you read the plan before anything runs.
ResyncEverything written waits in a library for you to read. Blocking issues refuse approval outright. It exports as Markdown or Word for you to publish yourself; the tool never touches your site.
Approve and exportNo configuration and no mapping wizard. Every screen ends by naming what comes next.
Each file is classified from its headings and cleaned. Pages, queries, devices, countries, appearance, dates, Analytics, a crawler export, or a page-and-query pair file. Anything still missing says which export it needs and where to get it.
Minutes, not setupEvery search matched to the page that should answer it. Every page compared against the click-through rate typical for where it ranks. Structure, decay, cannibalisation and thin content all surfaced, ranked by what they recover.
No model calledResearch, outline and draft as separate calls. Your tone and banned words applied while writing and checked after by counting. Internal links chosen from pages that exist. Everything waits in a library until you approve it.
Your own API keyA normal crawler checks whether a title exists. This checks whether the page can be extracted, quoted and reconstructed by something that is not a browser, which is what decides whether you get cited rather than merely indexed.
GPTBot, ClaudeBot and PerplexityBot are checked separately. A site can be open to Google and closed to everything that answers questions about it.
Retrieval reads passages, not pages. If the answer only emerges over three scrolls there is nothing clean to lift, however good the page is.
Answers get built from specifics. A page of general advice has nothing a model can attribute, so it tends to get read and not credited.
The readable body is kept, so a check can look past the first paragraph and the rewrite has the page to work from instead of asking you to paste it.
Or skip the crawl entirely and import an export from the crawler you already use.
The same exports and the same crawl feed all of these. Nothing is a separate product or a separate upload.
The ordinary work, done against your own numbers rather than a third party's estimate of them.
Whether an answer engine can reach your page, lift a passage from it, and have something worth attributing.
The structural problems that hold a whole section back at once, rather than one page at a time.
Hundreds of pages from one table, with the checks that stop programmatic SEO becoming programmatic duplication.
Each of these closed a door on purpose. The costs are as interesting as the benefits.
A tool that asks a model to judge your pages gives a different answer on Tuesday, cannot show its working, and costs money every time you look. Nobody can audit a finding they cannot reproduce.
Every check is arithmetic: stemmed matching, shingled similarity, a click-through curve by position. No model is called to produce a finding, ever.
Reading costs nothing and runs offline. Each finding carries the rows it came from. The cost is that it cannot make judgements a human would, so it does not pretend to.
Connecting to Search Console, Analytics and a keyword API means OAuth, stored credentials, rate limits, a server to hold them, and three paid subscriptions before the tool does anything.
You export the CSVs you already download and drop them in. Fourteen kinds are recognised from their column headings rather than their names.
No account, no credentials, no subscription, no data on anyone else's server. The cost is a minute of exporting and no scheduled runs, which is the right trade for a tool you own.
Programmatic SEO fails by writing four hundred near-identical pages at cost, then discovering the rows were thin, duplicated, or clashing with pages that already existed.
Preflight reads every row before a single call. Thin rows, near-duplicates and address clashes are flagged for free. Budgets stop a run; a resume does not pay twice.
The expensive mistake becomes a free one. Writing fifty pages costs a few dollars because the rows that were never worth writing got caught before they were.
Figures from a 345-page site with 1,300 queries, which is 448,500 comparisons every time the mapping is built.
The problems that took the longest, and what each one actually turned out to be.
Search Console will give you a list of queries and a list of pages, but not which query belongs to which page unless you export per page. Stemmed lexical overlap with a confidence score handles the rest, measured pairs always win over inferred ones, and a pin lets you overrule both. The lesson was to label the difference on screen rather than blend them into one number.
An export only lists pages that earned an impression, so a page that ranks for nothing looks identical to a page that was never built. Eight separate places in the codebase made that leap independently. A test now walks every file and fails if a ninth appears.
345 pages against 1,300 queries re-tokenised the same strings three million times, and three endpoints each rebuilt the same mapping in parallel. Caching the stemmer and building the mapping once behind a lock took the post-crawl reload from 21.7 seconds to 0.1.
It is tempting to let a model summarise a finding or guess a mapping, and every time it would have been easier. Holding that line is what makes a finding checkable, and it is why reading costs nothing. The separation had to be structural rather than a convention, or it would have eroded.
Each one counts and compares. Every finding carries the rows it came from, so any of them can be verified against your own export.
One command starts it. The workspace is plain files on your own disk, readable without the tool. The only thing that ever leaves the machine is a page you explicitly ask a model to write.
No model is involved in reading your exports, mapping queries, running the checks or building a brief, so all of that costs nothing however many times you do it. Only writing calls a model, through your own key, and you can see the sum.
A worked example, not a price list. The real figure depends on which models you pick and how long your pages are, and the tool shows the running total per page and per model as it goes. Set a ceiling and the run stops at it.
Hosted platforms bill whether you opened them or not. This bills nothing to look, and only what the model actually charged to write.
Writing fifty location pages the usual way is a quote with a comma in it. Here it is the model's own token cost and nothing on top.
A run that fails halfway resumes from where it stopped. Steps already paid for are not repeated, and a changed instruction is the only thing that forces a redo.
Preflight runs over every row for free and tells you what is thin, duplicated or clashing before a single call is made.
Open any page and the tool assembles what it knows: how it performs, what is wrong with it, what to do, the searches it should own, and what is actually on it. Nothing in it is generated, and it costs nothing to open.
Position, impressions, clicks, and how that compares to the rate typical for where it ranks. A page at 4.2 drawing a fifth of the usual clicks says so plainly.
Each item is a specific instruction, not a theme. Rules of thumb are separated from counted facts and labelled, so you know which to check yourself.
Every query mapped to this page, with its clicks, position, and whether that mapping was measured by Search Console or inferred by the tool.
A page absent from an export has not necessarily been deleted; it may simply rank for nothing. The brief tells those two apart instead of guessing.
Ranks 3.0 on 9,461 impressions for 792 clicks. 0.77× the clicks typical for that position. Five queries land here.
Four questions a tool like this should have to answer, and what backs each answer. Every one of these can be checked against your own files rather than taken on trust.
Does it identify genuinely useful SEO opportunities?
Every finding is counted from your own rows, not scored by a model. A page ranking 4.2 and drawing a fifth of the clicks typical for that position is a fact about your export, and the impressions, the position and the curve all sit beside the claim. Findings are ordered by what they could recover, so the list starts where the clicks are.
Does it reduce the time spent researching and planning?
A brief assembles everything known about a page in one place: how it performs, what is wrong, a checklist of specific instructions, the searches it should own, and what the crawler actually read. It costs nothing to open and nothing to open again. The work that usually means four tabs and a spreadsheet is one screen.
Does it prevent inaccurate, repetitive or weak programmatic pages?
This is what most of the machinery is for. Preflight reads every row before a penny is spent and flags the thin ones, the ones nearly identical to each other, and the addresses that clash with pages you already have. After writing, the brand kit is verified by counting, internal links are checked against pages that exist, and a page with a blocking issue refuses approval outright.
Does it make managing hundreds of pages practical?
345 pages and 1,300 queries is the shape it was built against. Filter and sort the sheet, rewrite one field across every row at once, pause a run and resume without paying twice, and paste the table again when your data moves so only the rows that changed are rewritten. The mapping view went from 1,340 kB to 55 kB specifically so a site that size stays usable.
Not a criticism of hosted platforms, which do several things this cannot. A different trade: you give up the integrations and keep the data, the arithmetic and the bill.
| Hosted platform | Searchbench | |
|---|---|---|
| Where your site data lives | Their server | Your machine |
| Cost to read and check | Monthly, either way | Nothing |
| Every figure traceable to a row | ✗ | ✓ |
| Analysis works with no internet | ✗ | ✓ |
| Connects to Search Console directly | ✓ | ✗ |
| Scheduled, unattended runs | ✓ | ✗ |
| Rank tracking over time | ✓ | ✗ |
| Backlink index | ✓ | ✗ |
| Writes the pages, not just the list | ✗ | ✓ |
| Hundreds of pages from one table | ✗ | ✓ |
| A spending ceiling you set | ✗ | ✓ |
| Seats, tiers and account limits | Yes | None |
Analysis runs offline because no model is involved; crawling your pages and writing with one both need a connection. A hosted platform is the better answer if you need scheduling, rank tracking or a backlink index. This is the better answer if you want to see the arithmetic and keep the data where it is.
No. You export the CSVs and drop them in, which takes about a minute. That is the trade for keeping the data on your own machine.
Reading, checking and mapping cost nothing at all, because no model is involved in any of it. Writing pages goes through your own API key, with the running total on screen and a ceiling you set.
It tells you where you already rank and what is costing you clicks there. No tool can honestly promise the rest, and one that does is selling you something.
Python 3.11 or newer. No database, no node_modules, no build step. Unzip it, run one command, and open the page it gives you.
No. Everything written waits in a library until you have read it. A page with a blocking issue refuses approval outright, and what you approve exports as Markdown or Word.
The arithmetic does. The word matching is English only, so query-to-page mapping will be weaker elsewhere and is worth checking by hand.
Unzip it, run one command, and open the page it gives you. Your exports, your machine, no account to open.