What is an internal link audit, and why bother?
An internal link audit is a count of every link between your own pages, read against what you want those pages to do. Internal links are how Google discovers your URLs and one of the strongest hints it gets about which pages you consider important, so the audit is the measuring half of any internal linking service: it tells you where the site's own authority is going before anyone decides where it should go.
The reason it's worth doing on WordPress specifically is that WordPress creates links for you. Menus, footers, tag archives, category widgets, related post plugins and date archives all mint links nobody planned. On most sites I audit, the most linked URLs aren't the pages that earn money; they're the blog index, a tag archive and the privacy policy. The audit makes that visible, and visible is fixable.
I run one on any site I've just taken on, after a redesign or migration, and whenever a page that should rank sits stuck while weaker pages on the same site do fine. It's diagnosis, not decoration: nothing in this post changes a single link until the counting's done.
How I set up the crawl and the exports
Three sources, because each one sees links the others miss. The crawler sees what's in the HTML today, Search Console sees what Google has kept, and the sitemap names the pages you meant to have.
- Step 01
Crawl the site with rendering on
I run Screaming Frog with JavaScript rendering enabled, the same way I set it up in my Screaming Frog crawl walkthrough. Builder sites and mega menus print links with JavaScript, and a plain HTML crawl undercounts them.
- Step 02
Export the inlinks data
The crawler's link report gives me, per URL: how many unique pages link to it, from where, and with what anchor text. That's the raw material for everything that follows.
- Step 03
Pull Search Console's Links report
Under Links, the internal links table shows Google's own count of links per target URL. When Google's count and my crawl disagree badly, something's blocking or hiding links, and I want to know what before I judge anything.
- Step 04
Compare against the sitemap
Every URL in the XML sitemap that never appeared in the crawl is an orphan candidate: a page you've published that nothing links to. Crawlers can only find orphans by comparing lists, which is why this step can't be skipped.
- Step 05
Freeze the numbers
Everything goes into one sheet dated today. The audit's value doubles the second time you run it, because then every number has a direction.
Which numbers do I pull for every page?
Five columns decide nearly everything. None of them needs a paid tool beyond the crawler.
- i.
Unique inlinks
How many different pages link here. A page in the menu gets hundreds of sitewide links, so I care most about links from inside content, where an editor chose to place them.
- ii.
Crawl depth
How many clicks from the homepage. Google's documentation treats links as its primary way of finding pages, and in practice pages four or five clicks deep get crawled less and rank worse. Money pages belong within two clicks.
- iii.
Anchor texts
The words carrying each link. Google reads anchors as context about the target, so ten links that all say 'click here' waste ten hints. I list every anchor per target, not just the count.
- iv.
Orphan flag
In the sitemap but not in the crawl means no internal path leads there. Orphans still get indexed sometimes, but they rank on scraps, and visitors can't find them at all.
- v.
Broken and redirected links
Internal links that hit 404s throw authority away; links into 301 chains leak it slowly. Both come free in the same crawl, so they go in the same sheet.
Rather have me do this? One person, whole job.
Book a call on UpworkHow I read the results before changing anything
First I sort by unique inlinks and read the top twenty. If tag archives and the blog index outrank your service pages in that list, you've found the site's real priority order, and it isn't yours. Then I sort the pages that earn enquiries by crawl depth and see how many sit three or more clicks out.
Then the anchors. Two problems show up over and over. The first is one target with twenty different anchors, none of them saying what the page is about. The second is one anchor phrase pointing at two different pages, which invites Google to swap them in results. When the Performance report shows two URLs trading places for one query, that's a job for my keyword cannibalization service, and you can see whether it's happening with the free cannibalization checker before deciding anything. Split anchors are one common reason a page collects impressions without clicks.
Last, I mark what I call false riches: pages with big inlink counts where every link comes from a menu or footer. Sitewide links aren't worthless, but a page nobody links from inside an article is a page no editor thought was worth citing, and Google can tell the difference in placement too.
How I fix what the audit finds
The fixes are boring on purpose, one finding at a time, biggest pages first.
- Step 01
Link every orphan or retire it
Each orphan gets two or three links from relevant, already ranking pages, or it gets merged and redirected if it shouldn't exist. No page stays published and unreachable.
- Step 02
Cut depth on the pages that earn
A link from the homepage or a hub page pulls a deep page up instantly. I'd rather add three links from strong pages than thirty from weak ones.
- Step 03
Rewrite the worst anchors
Descriptive, not stuffed: the anchor should say what the target page is about in words a reader would use. I vary phrasing across sources and keep exact-match anchors to a minority share.
- Step 04
Fix broken links and flatten chains
404 targets get corrected or removed; links into redirects get pointed at the final URL. Tedious, measurable, worth it.
- Step 05
Prune the automatic links
Tag archives nothing needs, footer link lists to every page, related post widgets pointing at 2019: the audit usually ends with fewer links than it started with, aimed better.
What goes in my internal link audit template?
People ask for the template more than the method, so here it is: one row per URL, eight columns, and it fits in any spreadsheet.
- i.
URL, role and target query
What the page is for and the search it should own. A page with no answer in this column is already a finding.
- ii.
Unique inlinks, content inlinks and depth
The counts from the crawl, with sitewide links separated from in-content links so false riches can't hide.
- iii.
Anchors in use
Every distinct anchor pointing at the URL, so duplicates across targets and vague phrasing jump out.
- iv.
Status, verdict and date
Orphan, buried, fine, or overlinked, plus what I did about it and when, so the next audit reads as a comparison instead of a fresh start.

