River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Technical SEO Audit Template

Every finding classified by what it can actually do to a page, joined to what Google indexes, and grouped into tickets by template.

Free download  ·  No account needed

Developer Ticket Set  ·  Thornbury Supply  ·  ticket 1 of 6

T1. Category template emits noindex on eighty-four live categories

Filetemplates/category.html
IntroducedRelease of 18 February 2026
EffortXS. One line.
BandR, realised loss

Current behaviour

The conditional that adds <meta name="seo-ticket-t1-peek__robots" content="noindex"> for discontinued ranges also matches eighty-four live categories. It tests the category's legacy_range flag, set on anything created before the 2024 catalogue migration, rather than is_discontinued.

Expected behaviour

The noindex is emitted only where is_discontinued is true. Live categories emit no robots meta tag at all.

Examples

/c/hex-bolts-a2-stainless
/c/threaded-rod-metric
/c/washers-din-125
/c/socket-cap-screws
/c/nyloc-nuts

Why this one is first

These eighty-four pages earned 4,180 clicks in the twenty-eight days before the release and zero since. It is the only ticket in the set whose return is known rather than estimated.

Verification

DeploymentNo robots meta tag on the five examples, and the live inspection test reports each as indexable
SearchClicks against the eighty-four URLs at 14 and 28 days

Ranked by URL count, this finding sits thirteenth of the fifteen counted findings in the register. Ranked on what it cost, it is first.

Every technical SEO audit template on offer is a checklist. Fifty checks, eighty-seven checks, a severity dropdown and a notes column, and every one of them starts from a blank sheet you fill in by hand. The crawl you actually have already contains forty or fifty findings, pre-sorted by a priority column. Screaming Frog's own issues reference says that column is not a rule for what should be prioritised, because it lacks context.

The missing context is two facts no crawl holds: whether Google has the URL indexed, and what the URL earns. This pack adds both, then classifies every finding by what it can mechanically do. Suppressing findings can keep a URL out of results and are ranked on clicks. Presentational findings change how a result looks and cannot remove it, so they are ranked on impressions and their traffic at risk is zero. Structural findings get no click figure at all.

The worked example runs a fastener distributor's crawl of 31,912 URLs and 47 issue names down to six tickets. The two largest rows in that export are worth nothing, and the finding worth 4,180 clicks a month is eighty-four pages sitting thirteenth of fifteen by URL count. Pair it with the full Search Console export past the thousand-row cap, and with the read on pages competing with each other. The marketing workspace holds the register and the template map between crawls, so the next audit starts from the map.

Forty-seven issue names, six tickets, and the sheet that says why the rest were dropped

The Issue Register, the Priority Matrix and the Discarded Findings sheet.

Issue Register

Thornbury Supply, a fictional fastener distributor. Crawl of 31,912 URLs run 3 March 2026, joined to Search Console for 1 to 28 February 2026.

IDCrawler issue nameIts priorityURLsIndexedClassTraffic at riskVerdict
F-01Directives: NoindexHigh840Suppressing4,180 realisedTicket T1
F-02Canonicals: Non-Indexable CanonicalHigh906141Suppressing1,870 exposedTicket T2
F-05Meta Description: MissingHigh6,9124,455Presentational0Ticket T3
F-06H1: MissingHigh6,9124,455Presentational0Bundled into T3
F-07Page Titles: Over 60 CharactersLow6,9124,455Presentational0Bundled into T3
F-08Links: Pages With High Crawl DepthMedium5,3401,204Structuraln/a by designTicket T4
F-09Canonicals: CanonicalisedMedium11,9080Suppressing0Discarded
F-10Page Titles: DuplicateHigh4,4060Presentational0Discarded
F-12XML Sitemap: Orphan URLsHighcolumn emptyunknownStructuralunknownBlocked, recrawl
F-16Images: Missing Alt TextMedium22,304 imagesn/aPresentational0Routed away

What the three classes decide

ClassWhat the finding can doWhat it is ranked on
SuppressingKeep the URL out of results altogetherClicks, exposed or already lost
PresentationalChange how the result looks. It cannot remove itImpressions. Traffic at risk is zero
StructuralChange how crawl attention and internal authority moveIndexable URLs behind one change. No click figure

The crawler ranked F-07 Low and F-05 High. They are the same head block in the same file, so they are one ticket. It ranked F-09 and F-10 as real findings on 16,314 URLs between them, and Google has none of those URLs indexed.

Priority Matrix

Six tickets, in the order a developer should take them. One ticket per template edit.

#BandTemplateFindingsURLsFigure behind itFix shapeEffort
1RCategoryF-01844,180 clicks already lostDelete one lineXS
2ABrand hubF-029061,870 clicks exposedRestore one field defaultXS
3PProduct detailF-05 F-06 F-076,912214,000 impressions exposedRewrite one head blockM
4SProduct detailF-085,3405,340 indexable URLs behind one changeCategory pagination and a sibling blockL
5CProduct detailF-044170 clicksRepoint 1,902 internal linksS
6CCategory facetedF-0330 clicksGuard three sort valuesXS

The queue order, and why P sits above C

BandApplies toThreshold
RSuppressing, already lostAny loss already taken
ASuppressing, exposed1,000 clicks or more
BSuppressing, exposed100 to 999 clicks
PPresentational10,000 impressions or more
SStructural1,000 or more indexable URLs behind one change
CSuppressing, exposed1 to 99 clicks
DAnythingZero indexed URLs, or out of scope. Never queued

A template edit touching 214,000 impressions beats a suppressing finding worth eleven clicks. Ordering it the other way is how an audit loses the people who have to schedule it.

Discarded Findings

Longer than the ticket queue, which is the normal result. Every row keeps the reason and the source that settled it.

IDCrawler issue nameIts priorityURLsRank by countWhy it was dropped
F-16Images: Missing Alt TextMedium22,3041Counts images rather than pages, so it cannot be ranked against page traffic at all
F-09Canonicals: CanonicalisedMedium11,9082Every URL is a product variant correctly pointing at its parent SKU
F-10Page Titles: DuplicateHigh4,4067Faceted URLs noindexed by design. Google has zero of them indexed
F-11Meta Description: DuplicateHigh4,4068Same URL set as F-10. Two issue names, one non-problem
F-14Directives: NofollowMedium1,18010Nofollow sits on outbound datasheet links and was applied deliberately in 2024
F-13H1: MultipleMedium6114Article heading plus a hidden breadcrumb heading. Both intentional

The two calls worth showing your work on

FindingWhat settled it
F-09Google's page indexing documentation states that a page marked duplicate or alternate is usually a good thing, because it means the canonical was found and indexed
F-10, F-11The join. Zero indexed URLs behind either finding, so neither can cost a click whatever the label says

Six discarded findings cover 44,265 flagged rows against 27,486 across the six that were ticketed. Both of the two largest rows in the export are here.

What you get

01

Issue Register

One row per crawler finding, with its issue name and priority kept verbatim as evidence, then the three columns the crawl cannot hold: the class, the indexed count, and the traffic figure the class allows. Keeping the crawler's own label in its own column is what lets somebody check the reclassification against what the tool actually said.

02

Template Map

The URL pattern behind every template, its URL and indexed counts, its clicks and impressions, and the file your engineers would name. That last column is the half a crawl cannot give you, and it is what turns a finding into a ticket rather than a report.

03

Priority Matrix

The ordered queue with a band on every row, sized on the figure its class allows rather than on a severity label. Presentational work sits above suppressing findings worth under a hundred clicks, deliberately, and the band key on the sheet says why.

04

Discarded Findings

Every dropped finding with the reason, the source that settled it, and the condition under which it comes back. Usually longer than the queue. It exists so the person who ran the crawl can see their finding was read and rejected rather than missed.

05

Developer Ticket Set

Six tickets naming a file each, stating the current behaviour as a fact about the code, carrying at most five example URLs, and never using the words severity or priority. A ticket carrying four thousand rows gets closed as unactionable, and correctly so.

06

Ranking Method

The classification, the bands and the traffic definitions written out, including why a missing description scores zero: Google's snippet documentation says snippets are automatically created from page content, so no click was ever at risk. Written so a developer argues with the method rather than with you.

07

Retest Plan and Export Checklist

The two-stage check on every ticket, one for the markup and one for the search outcome, with a control group where one exists. Plus the crawl settings to switch on before the next crawl, because link score and the orphan filters arrive empty without them.

How it works

  1. 1

    Send the crawl

    The URL inventory, plus the bulk issues folder if you have it. Then Search Console performance by page and the page indexing report. An export an agency ran and handed over is the normal case.

  2. 2

    River classifies before it ranks

    Every finding gets a class from what it can mechanically do to a page, and the class fixes which number may rank it. Findings with no indexed URLs behind them go straight to Discarded.

  3. 3

    Findings collapse into templates

    URLs cluster by path shape, you name the file behind each pattern, and findings group onto the file that generates them. This is the step where three issue names on 6,912 URLs become one edit.

  4. 4

    Take the tickets to engineering

    Six tickets in order, each with the file, the current behaviour, five example URLs and its verification. Then the retest reads what the release actually did, at fourteen and twenty-eight days.

Frequently asked questions

Is it free, and what format are the downloaded files?

Free, and no account needed for the download. Documents arrive as .docx and every sheet as .csv, so they open directly in Word, Pages, Google Docs, Excel, Numbers and Sheets with no conversion step. The register and the ticket set are the two files most people open first.

What does Edit with AI actually do?

It installs this pack as a private Space and River fills it from your own exports. It classifies your findings, joins them to your indexed counts and clicks, groups them onto your templates, ranks them, and writes your tickets. The worked example gets replaced by your audit.

Why does a missing meta description have zero traffic at risk?

Because it cannot remove a URL from the index. Google's documentation says snippets are created automatically from page content, and that the description element is used only when it describes the page better. So the finding is ranked on impressions instead, which is real and much smaller.

My crawl came from an agency and half the columns are empty. Is it usable?

Yes. Link score and the orphan filters only populate when crawl analysis runs after the crawl, and orphan discovery also needs the integration connected first. Findings needing those columns are marked Blocked with the setting for a recrawl. Every suppressing finding works without them.

Does it work with a crawl from something other than Screaming Frog?

Yes. Sitebulb, Semrush, Ahrefs and a custom crawler all produce the same three things: a URL inventory, a set of named findings, and a severity label. The classification reads the finding rather than the label, so the tool that produced it does not change the method.

Does this decide which of two competing pages survives?

No, deliberately. This space prioritises and writes up technical findings. Choosing a survivor between two of your own URLs ranking for one query is a separate job, and the cannibalization review does that one, including the redirect map that comes out of it.

Why does the page indexing report show fewer affected URLs than my crawl?

Because it samples. Google's documentation says the per-issue example list is limited to 1,000 rows and does not necessarily show all URLs with that issue. So the crawl is the URL inventory, Search Console is the diagnosis, and the join runs at template level.

Find out which of your High priority findings are worth nothing

Send the crawl and your Search Console data. River classifies every finding, joins it to what Google indexes, and comes back with the tickets in order.

Edit with AI