What a Broken Internal Link Costs You
Every internal link is a vote of confidence from one page to another, and it also spends a small amount of your crawl budget. When Googlebot follows a link from your /blog/technical-seo-audit to /blog/discontinued-tool-review and receives a 404, that request produces nothing indexable. On a 500-page site carrying 1,200 broken internal links, Googlebot can burn thousands of requests per month rediscovering the same missing URLs instead of re-crawling the pages you actually want to rank.
Broken links also leak link equity. Internal PageRank flows from pages that have it to pages that need it, and a 404 destination is a dead end: the equity is computed, spent, and discarded. Worse, the source page loses its strongest contextual signal. The anchor text that told Google what the destination was about now points nowhere, so the topical relationship between the two pages disappears entirely.
Users feel it immediately. A visitor reading your trail running guide who clicks "our full comparison of cushioned shoes" and lands on a 404 does not go back and keep reading. They leave. Because broken links usually cluster around deleted products, renamed categories, and retired campaigns, they tend to sit on exactly the pages that used to be your best performers.
Finding Broken Internal Links with Screaming Frog
Screaming Frog SEO Spider is the fastest complete answer. Crawl the site, then filter by Response Codes = 404 (Not Found) and 410 (Gone). The Inlinks tab on any broken URL lists every source page that points to it along with the anchor text used, so you know precisely which paragraph to edit rather than guessing from a URL list. Export both the broken URL report and the inlinks report to CSV before you start fixing.
Two filters matter beyond plain 404s. Filter for 5xx responses, because a temporarily failing page behaves like a broken link to crawlers that hit it during an outage. Then check the Redirects tab for 301 chains that terminate in a 404: those waste two requests, lose the visitor at the end of the chain, and still pass no equity. The free version of Screaming Frog crawls 500 URLs per session, enough for most small sites; the paid licence costs about $259 a year and removes the limit.
If you would rather not install a desktop crawler, our broken links checker crawls your live site and returns the same source-to-destination mapping, grouping each broken URL by the fix it needs.
Cross-Checking with Google Search Console and curl
Google Search Console reports 404s under Indexing > Pages with "Not found (404)" as the reason. That list only contains URLs Googlebot actually requested, so it misses broken links sitting on rarely crawled pages. Treat it as a second opinion, not the source of truth. The URL Inspection tool fills part of the gap: paste a suspected dead URL and Google shows the referring page that discovered it, which tells you where to start editing.
For a quick sweep without any crawler, walk your sitemap and test every URL from the terminal:
grep -oP '(?<=loc>)[^<]+' sitemap.xml | while read url; do
code=$(curl -s -o /dev/null -w "%{http_code}" "$url")
[ "$code" = "404" ] || [ "$code" = "410" ] && echo "$code $url"
done
That catches dead destinations. Finding the pages that link to them requires a crawl, which is why the inlinks report is the step most people skip and the step that actually saves time.
301, 404, or 410: Choosing the Right Status
Use a 301 when a relevant page still exists. A permanent redirect passes roughly 90 to 99 percent of link equity and preserves the anchor text relationship. Redirect /blog/running-shoes-2024 to /blog/best-running-shoes, not to the homepage. The destination must answer the same intent the original link promised.
Use a 404 when the page is gone and nothing similar remains. A 404 is honest: Google removes the URL from the index and stops spending requests on it. Confirm your server returns a real 404 status rather than a soft 404, which is an error page served with a 200 response. Soft 404s keep dead URLs in the index indefinitely because crawlers see them as successful loads.
Use a 410 (Gone) when you deliberately deleted the content and it is never returning. Google treats 410 as permanent and deindexes it faster than 404. Discontinued products, expired promotions, and time-bound landing pages are the natural candidates.
Never blanket-redirect everything to the homepage. A user following a link about cushioned trail shoes who lands on your homepage has no path back to the topic, and Google reads the intent mismatch as a quality problem. Verify each decision with our status code checker to confirm the redirect returns a single 301 hop instead of a chain.
Fixing Hundreds of Links at Once
Export the 404 report and sort by inlink count. The 20 URLs with the most internal links pointing at them usually account for most of the wasted equity. Build a redirect map with three columns: old URL, fix type (301, 410, or remove link), and destination URL. Update the link on the source page first, because that removes the internal 404 completely, then add the redirect as a safety net for external links and saved bookmarks.
For WordPress, the Redirection plugin imports the map as CSV and logs every later 404 for you. On Nginx, write the map straight into the server configuration so redirects never touch a database:
map $request_uri $fixed {
/blog/running-shoes-2024 /blog/best-running-shoes;
/products/discontinued-x /category/replacements;
}
if ($fixed) { return 301 $fixed; }
For dead paths referenced in templates, navigation menus, and sidebar widgets, edit the template instead of adding another rule. Search the codebase before deploying: grep -r "/blog/running-shoes-2024" resources/ returns every file that still references the old path, which is usually one edit rather than one more redirect to maintain forever.
Monitoring So New Breaks Surface Within a Day
Broken links are not a one-time cleanup. Every CMS migration, plugin update, slug edit, and product retirement creates new ones. Schedule a weekly crawl in Screaming Frog, which supports scheduled runs and diffs against the previous crawl, or run a lightweight script against your sitemap:
#!/bin/bash
curl -s https://example.com/sitemap.xml \
| grep -oP '(?<=loc>)[^<]+' \
| xargs -P 10 -I{} sh -c 'c=$(curl -s -o /dev/null -w "%{http_code}" {}); [ "$c" = 404 ] && echo "$c {}"' \
> /tmp/broken.txt
[ -s /tmp/broken.txt ] && mail -s "Broken links detected" [email protected] < /tmp/broken.txt
Pair that with Search Console's 404 report, which emails you when error counts spike. The combination covers URLs Google crawls and URLs that only your sitemap advertises.
Where Broken Internal Links Usually Come From
Naming the recurring root causes makes prevention possible: category and tag renames that change slugs, deleting posts without checking inlinks first, plugin migrations that rewrite permalinks, anchor links pointing at heading IDs that were later changed, and session-based URLs emitted by internal search. On e-commerce sites product discontinuation is the single largest source, so wire your catalog so that unpublishing an item creates a 301 to its replacement or to the category page in the same operation.
The Monthly 30-Minute Routine
- Run a full crawl and export 404 and 410 URLs sorted by inlink count.
- Open Search Console, Indexing, Pages and diff this month's 404 list against last month's.
- Fix the top 10 source pages by inlink count: update the anchor link in the post or template.
- Add 301s for every remaining URL that still has external backlinks, checking referring domains in Ahrefs first.
- Return 410 for intentionally deleted pages that nothing links to.
- Re-crawl to confirm zero 404s remain, then log the run in your redirect spreadsheet with date, old URL, and destination.
Run this weekly for stores with frequent inventory changes and monthly for content sites. Our broken links checker automates the crawl, the diff, and the status verification, so the routine becomes a five-minute review.
Frequently asked questions
What is the main takeaway from this guide on how to find and fix broken internal links?
The guide covers how to find and fix broken internal links end to end: what it is, why it matters, and the exact steps to apply it. Skim the key takeaways first, then follow the step-by-step parts in order — most readers can apply the first improvements the same day.
How long does it take to see results from how to find and fix broken internal links?
For most sites, changes made from this how to find and fix broken internal links guide start showing measurable movement within two to six weeks. Track the affected pages in Google Search Console to see when search engines pick up your updates.
Do I need paid tools to follow this how to find and fix broken internal links guide?
No. Every step in this how to find and fix broken internal links guide can be completed with free tools, including the free utilities on this site. Paid platforms add convenience and historical data, but they are not required to get results.