How to Find Broken Links on Your Own Site

Crawl your own site. A desktop crawler like Screaming Frog (free to 500 URLs) reports every internal and outbound link returning a 4xx or 5xx, and tells you which page contains each one. Google Search Console's Pages report catches internal 404s for free but won't check the outbound links you've published.
First, know which "broken link" you mean
Three different problems share the name, and they have different fixes:
- Internal links to your own dead URLs. You renamed a post, deleted a product, or mistyped a path. This is the one that hurts most โ it wastes crawl budget, strands internal authority, and sends readers to a dead end.
- Outbound links to other people's dead pages. Link rot. A source you cited three years ago moved or shut down. Low-grade damage, but it's a visible quality signal on a page you're asking people to trust.
- Inbound backlinks pointing at URLs you removed. Someone else's link now hits your 404. That's a recovery job rather than an audit job โ covered separately in do backlinks to a 404 page still count.
This guide covers the first two. You want a method that finds both in one pass.
Method 1 โ Google Search Console (free, five minutes)
If the site is verified, you already have a partial answer.
Open Indexing โ Pages, then look under "Why pages aren't indexed" for Not found (404). That list is every URL Google tried to fetch and couldn't. Click any URL and use Inspect to see the referring page that led Google there.
Two limits worth knowing before you rely on it:
- It only shows URLs Google has discovered. A broken link buried in a page Google hasn't recrawled recently may not appear.
- It reports nothing about outbound links. Search Console cares about your URLs, not the ones you link to.
Use it as the free first look and as ongoing monitoring, not as the audit.
Method 2 โ Crawl the site (the thorough way)
A crawler follows every link on every page the way a search engine would and reports the response code for each one. This is the method that finds everything.
| Tool | Cost | Notes |
|---|---|---|
| Screaming Frog SEO Spider | Free to 500 URLs; paid above | Desktop app, the standard for this job |
| Ahrefs Webmaster Tools | Free for sites you verify | Hosted crawl, includes a broken-links report |
linkinator (npm) |
Free | npx linkinator https://example.com --recurse |
lychee |
Free | Fast Rust checker, good in CI |
wget --spider -r |
Free | Already installed on most systems; crude but works |
In Screaming Frog specifically, the sequence is short:
- In Configuration โ Spider, confirm Check External Links is enabled โ this is what catches outbound link rot.
- Enter your domain and crawl.
- Go to Response Codes and filter to Client Error (4xx).
- Select any broken URL and open the Inlinks tab at the bottom. That's the list of your pages containing the link โ the part you need in order to fix anything.
That last step is the one people skip. A list of dead URLs isn't actionable; a list of your pages that link to dead URLs is.
If you'd rather stay on the command line, npx linkinator https://example.com --recurse --skip "linkedin|twitter" gets you most of the way in one command. Skipping the big social domains is worth doing โ they routinely return 999 or 403 to automated checkers even though the links work fine in a browser.
Method 3 โ CMS plugins, with a caveat
WordPress has broken-link plugins that scan continuously. They're convenient, but the classic on-server versions are known for adding real load, because checking thousands of external URLs from your web host is expensive. If you use one, prefer a version that runs the checks on the vendor's infrastructure rather than yours, and turn it off between audits.
Reading the results: not every 4xx matters
A raw crawl report will overstate the problem. Before you start fixing, sort:
- 403 and 999 from large platforms โ usually bot-blocking, not a broken link. Open a sample in a browser to confirm.
- Links inside old comment threads โ real, but very low priority.
- URLs that 404 only for the crawler โ check whether the page requires a login or a cookie.
- Soft 404s โ a page returning 200 with "this product is no longer available" is broken in every way that matters to a reader, and a crawler filtering on status codes will miss it entirely.
Then fix in this order: internal links first, outbound links on your most-visited pages second, everything else when there's time.
The right fix for each case
| Situation | Fix |
|---|---|
| Internal link to a page you moved | Update the link to the new URL, and make sure the old URL 301 redirects |
| Internal link with a typo | Fix the link. Don't add a redirect for a mistake |
| Internal link to a page you deleted deliberately | Point it at the closest live equivalent, or remove the link and rewrite the sentence |
| Outbound link, page moved | Update to the new URL |
| Outbound link, site gone entirely | Remove it, or swap in a live source. An archived copy is acceptable for a citation you can't replace |
| Deleted page that has backlinks | 301 to the closest relevant live page โ see how to recover lost backlinks |
One rule that saves trouble later: don't redirect everything to the homepage. Google's documentation is explicit that a redirect to an irrelevant page is treated as a soft 404, so a bulk homepage redirect throws away the equity you were trying to keep. Redirect to the closest genuine match or let the URL 404 honestly.
And while you're in there, check for redirect chains. Fixing a broken link by pointing it at a URL that itself redirects twice solves the error and creates a slower one.
How often to run it
Quarterly is enough for most sites. Run it immediately after a migration, a URL structure change, or a CMS upgrade โ those are when internal links break in bulk rather than one at a time. If your site is large or changes weekly, put lychee or linkinator in your build pipeline and let a broken internal link fail the build.
The other side of this
Everything above treats broken links as your problem. They're also someone else's opportunity โ the whole premise of broken link building is finding dead links on other people's pages and offering a working replacement. Running the audit on your own site teaches you exactly what that outreach looks like from the receiving end, which makes it easier to write a pitch that doesn't get deleted.
Both sides of it come down to the same thing: links decay, and the sites that stay strong are the ones actively maintaining and adding them. If you'd rather add links on a predictable schedule than chase them, Backlinkster handles the adding part โ 1-for-1 in-content swaps with real site owners, verified live by code, so you know a placement is still there. See the plans.
Frequently asked questions
Do broken links hurt SEO? Internal ones do, indirectly. They waste crawl budget, strand internal link equity on pages that no longer exist, and worsen the reader experience. Outbound links to dead pages aren't a direct ranking penalty but they signal a page that isn't maintained.
What's the fastest free way to find broken links on my site?
Screaming Frog's free tier if your site is under 500 URLs, or npx linkinator https://yoursite.com --recurse if you're comfortable in a terminal. Both check internal and outbound links in one pass.
Does Google Search Console show broken outbound links? No. Search Console reports on your own URLs, so it will show pages of yours returning 404 but nothing about the external links you've published. You need a crawler for those.
Should I redirect every broken URL or just delete the link? Redirect when the URL has backlinks or traffic and a genuine equivalent exists. Delete or rewrite the link when the target was simply wrong or the content has no replacement. Avoid redirecting unrelated URLs to the homepage โ Google treats that as a soft 404.
How often should I check for broken links? Quarterly for a typical site, and always right after a migration or URL change. Large or frequently-updated sites are better served by an automated check in the build pipeline.
Why do some working links show as broken in my crawler? Large platforms often block automated requests, returning 403 or 999 to a crawler while serving the page normally to a browser. Always spot-check a sample in a browser before mass-editing links.
The bottom line
One crawl with external link checking enabled finds both kinds of broken link, and the Inlinks view tells you where each one lives. Fix internal links first, spot-check the false positives before you edit anything, and redirect only where there's a genuine equivalent. It's an hour a quarter that quietly protects everything else you've built.
Related: What is broken link building? ยท Do backlinks to a 404 page still count? ยท What is a 301 redirect? ยท What is a redirect chain? ยท How to recover lost backlinks
