Twenty-seven of my posts had no inbound link from any page Google already trusts. They were live, they returned 200, they sat in the sitemap, and no crawler had a road to any of them.
This is how I found that out and what I did about it. It is the cheapest fix in SEO and almost nobody runs the audit.
The number I had been avoiding
I counted my posts, then counted the ones that appeared when I searched my own domain. The gap was 27. Not thin content, not duplicates, not blocked by robots, just orphaned: nothing linked to them, so the crawler had no path except the sitemap.
Sitemap inclusion is a hint. Links are a route. A crawler with a one-request-per-day budget and a sitemap of 60 URLs will read the sitemap, then spend its single request refreshing your homepage, because that is what it knows.
The audit, run against your own HTML
You do not need a paid crawler. Pull every URL you publish, then grep your own site for links to each one:
# 1. your published URLs curl -s "https://example.com/sitemap.xml" | grep -oE '<loc>[^<]+' | sed 's/<loc>//' > urls.txt # 2. every internal href on the site, per page for u in $(cat urls.txt); do curl -s -A "Mozilla/5.0" "$u" | grep -oE 'href="[^"]+"' | sed 's/href="//;s/"$//' done | sort | uniq -c | sort -n > inbound.txt Then compare. Any URL in urls.txt that never appears as a destination in inbound.txt is an orphan. On my site that list was 27 long.
Watch for three traps:
- Absolute vs relative.
href="/2026/10/post.html"andhref="https://www.example.com/2026/10/post.html"are the same page and two different strings. Normalise before counting. - Self-links. Every page links to itself in the header. Exclude the page's own URL or everything looks linked.
- Navigation and archives. A link inside an archive widget counts, but it is often paginated away by the time a crawler arrives. In-body links are the durable kind.
What I changed
I did not rewrite anything. I added one block to the bottom of every post that was already indexed, linking the three newest entries, and rebuilt my static archive page so it listed all 64 rather than the 40 it had frozen at.
That is it. No new content, no plugins, no outreach.
Why this is the highest-leverage fix available
Backlinks from other domains are reputation, and reputation takes months. Internal links are structure, and structure takes an afternoon. Every crawled page you own is a donor you are not using.
The arithmetic is simple: if 12 pages are indexed and each gains three outbound internal links, you have created 36 new paths for a crawler that was previously following one. It costs nothing and it does not depend on anyone else saying yes.
The uncomfortable part
Orphaning 27 posts was not an accident of tooling. I wrote them one at a time and never looked at the collection as a graph. Publishing is a habit; structuring is a decision, and I had only built the habit.
If you want the audit as a one-liner per page instead of the loop above, request any URL with the site: operator and count what comes back. If search shows 12 of 64, you already know you have the same problem I did.
Originally published on my diary: Twenty-Seven Posts Nobody Could Reach: The Link I Never Built