A technical SEO checklist we run before writing a single word of content
Ten checks that decide whether content has any chance at all — found the hard way on our own site, where the blog served 15 indexed pages from 8 articles and hreflang promised translations that did not exist.
Most SEO advice starts with content. That order is wrong when the site itself is telling search engines something false — then better content just gets indexed under the wrong address, or not at all.
This checklist is not theory. Every item on it is something we found on a live site, several of them on our own, which is the least flattering and most useful kind of example.
1. One real page, one URL
The single most damaging class of bug, and the hardest to see. On our own site the blog produced fifteen indexed pages out of eight articles: the route generator multiplied every article slug by every locale, and when a translation did not exist it quietly served the original text under the foreign address.
Seven of those addresses were the same article twice. For a search engine that is duplicate content plus a lie in the markup — and the lie was ours, not an accident of crawling.
The check: count the pages you believe exist, then count what the sitemap and the build actually produce. If the numbers differ, find out why before anything else.
The fix that stuck was not a redirect. We made the mismatch fail the build: the file declaring which languages each article exists in is compared against the articles themselves, and a discrepancy stops the deployment. A guard that a human has to remember is not a guard.
2. hreflang promises only what exists
hreflang tells Google "the French version of this page lives here". If that address returns the English text, or a 404, the whole cluster gets less trustworthy — including the versions that were fine.
The check: for every alternate you declare, open it and confirm the content is genuinely in that language.
3. The sitemap lists only live URLs, with real dates
Two failures show up constantly. The sitemap advertises pages that no longer exist, and every entry carries the build timestamp as its last-modified date.
The second one is subtle: if a rebuild says "everything changed today", the signal stops meaning anything and gets discounted. Last-modified should be the date of the material, not the date of the deploy.
4. Empty sections are not indexable
A section with no content still gets crawled, and a thin page drags the assessment of the whole site. Our French blog had no articles yet, so the section returns noindex until it does — and drops out of the sitemap automatically rather than by someone remembering.
5. Retired URLs are redirected, not deleted
When a deploy removes pages, whatever Google already indexed starts returning 404. Every removal needs a redirect to the nearest surviving page, added in the same change — not "later", because later never comes and the 404s are already being served.
6. The site is fast on a phone, not on your laptop
Test on a mid-range phone over mobile data, not on a desktop over office fibre. The gap between those two measurements is where most "but it feels fast" arguments die.
The usual culprits, in order: uncompressed images, web fonts loaded from a third-party domain, and client-side JavaScript doing work the server could have done at build time.
7. One H1, headings that describe the section
Unglamorous and still wrong on most sites. Headings are the outline of the page for both the reader skimming it and the engine parsing it. "Our approach" describes nothing; the test is whether a competitor could use the same heading word for word.
8. Structured data is connected, not scattered
Three unconnected Organization blocks on three pages get merged by the search engine on its own, usually incorrectly. Declare the organisation once with a stable identifier and have the other markup reference it.
Beyond that: breadcrumbs, article markup on articles, FAQ markup where there genuinely is a FAQ. Markup describing something that is not on the page is worse than no markup.
9. Internal links say where they go
"Read more" and "click here" tell nobody anything. The anchor text is half the signal about what sits at the other end, and it is free to get right.
This one compounds: a page that nothing links to with a descriptive anchor is a page the engine has to guess about.
10. Something checks all of this without you
Every item above will regress. The only checks that survive are the ones that run automatically and fail loudly — a build that stops, not a document someone is supposed to reread quarterly.
In short
Content cannot rescue a site that duplicates itself, promises translations it does not have, or advertises dead URLs. Fix the plumbing first, then write — and turn every fix you care about into something that fails the build when it breaks.
What we cover on a technical audit is on the SEO page. If you want a look at your own site before committing to anything, describe the situation — if the site cannot carry traffic yet, we will say so before the contract rather than three months in.