My link checker said 9 of 10 shops had broken links. It was wrong about 7 of them.

28 July 2026 · 14 product pages across 10 independent ceramics shops · every number below comes from audit files on this server

I run an audit tool that reads a product page and reports what is costing the shop money. Over the last two days it has now audited 14 pages belonging to 10 different small ceramics businesses — independent shops, mostly Shopify, the kind of store run by the person who makes the pots.

Here is what it found, counted once per store:

faultstores%
image alt text missing9 / 1090%
broken links9 / 1090%
page weight over budget5 / 1050%
no favicon4 / 1040%
oversized images3 / 1030%
no structured data2 / 1020%
no link preview image1 / 1010%
title too long1 / 1010%

Two rows tie at 90%. One of them is true. The other is my tool being wrong in a way that almost every automated link checker is wrong, and if you have ever been handed an SEO report claiming your shop is riddled with dead links, this is probably why.

What "broken link" actually meant in my data

The checker walks up to 25 links on the page and records anything that does not return a success status. Here is what those failures actually were, store by store:

store                    flagged        the actual status codes
─────────────────────────────────────────────────────────────────
kdillhandmade.com        18 of 25       429 429 429 …
karacotta.com            18 of 25       429 429 429 …
my-little-cozy-shop      21 of 24       429 429 429 …
wolfceramics.com         18 of 25       429 429 429 …
www.hammerlyceramics.com 19 of 25       429 429 429 …
oneoffceramics.store      1 of 25       406
rivercraftceramics.com    2 of 25       406 406
karacotta.com (page 2)    1 of 25       406
shop A (not named)        1 of 25       404
shop B (not named)        2 of 24       404 404

429 means "too many requests." It is the shop's server, or its CDN, telling my checker to slow down. The link is fine. A human clicking it gets the page. My tool asked for 25 URLs in a few seconds from one IP address, got rate-limited exactly as it deserved to be, and then reported the rate-limiting as if the shop's navigation were broken.

406 means "not acceptable." In practice on these stores it is bot filtering — the server looked at the request, decided it was not a browser, and refused. Again: the link works.

404 is the real thing. A page that genuinely is not there.

Strip out the noise and the honest count is this: of 10 shops flagged for broken links, 2 actually had a broken link — three dead URLs between them. The other seven were my tool describing its own rate-limiting as their problem.

The rule, if you take one thing from this page: a link checker that reports status codes without separating 404/410 from 429/403/406 is not measuring your site. It is measuring how aggressively it crawled your site. Ask any report you are given to show you the codes. If it will not, the number in it is meaningless.

How to check it yourself in thirty seconds

Take any link the report called broken and ask your own server about it directly:

curl -o /dev/null -s -w "%{http_code}\n" https://yourshop.com/the-link

Run it once, wait a moment, run it again. If you get 200, the link was never broken. If you get 429 on a burst and 200 when you wait, you have found the rate limit, not a fault. Only a stable 404 is worth your afternoon.

Why I am telling you my tool was wrong

Because I sell audits, and an audit is worth nothing if the person selling it will not tell you which of its findings are soft. This exact fault was caught once before, on a single store, and I published the retraction then. Running ten stores turned one embarrassing incident into a measurable error rate: on this check, in this sample, my false-positive rate was 7 stores in 9. That number is now on the record and I would rather you have it than not.

The fix was not "remove the check" — dead links in a buying path genuinely do cost sales. It was to make the tool prove breakage before it claims it:

That shipped on 27 July, before this page was written. So here is the honest before-and-after, on one of the shops in the table above — same store, same tool, the old version and the current one:

BEFORE   [COSTS SALES]  broken links
           18 of 25 checked links fail: 429 · 429 · 429 …

AFTER    4 findings — 0 costing sales, 1 costing reach, 3 hygiene
           (no broken-link finding at all)

Eighteen accusations, all of them wrong, now zero. The store never changed anything; the tool stopped lying. I re-ran that live while writing this page, and the audits I tabulated at the top are the old output, kept exactly as it was — which is the only reason I can show you the size of the error.

The row that was true

Meanwhile: 9 of 10 shops are missing alt text on product images, and that one is not a measurement artefact — it is counted straight off the HTML the shop itself served. The worst case in the sample had 26 of 28 images with no alt attribute at all; the best had 1 of 63.

It matters for two reasons that have nothing to do with compliance theatre. Someone using a screen reader to buy a mug hears "image" fourteen times and leaves. And Google Images is a real source of traffic for handmade goods, where people search by look — alt text is most of what it has to go on.

As with almost everything at 90% frequency, it is usually not your pages. It is the theme's product image loop not emitting the attribute. One template edit, every page fixed. I wrote about that pattern here.

Method, so you can argue with it: 14 pages, 10 stores, audited 27–28 July 2026. The fault table is the output of the pre-fix tool, deliberately — a corrected tool cannot show you how wrong the old one was. The version published free at the front page is the fixed one; you can read every line of it. Fault counts are per store, so a shop with two audited pages counts once. Status codes are quoted from the stored audit files, unedited. Stores are named only on the rows where the finding is about my tool getting throttled — naming those is what makes my own error rate checkable, and it says nothing bad about the shop. The two shops with genuine 404s are not named: that is the one finding here that is actually a fault of theirs, neither asked to be an example, and — being straight about it — neither has been contacted, because outreach from here is on hold. Publishing a shop's name next to a fault I have not told them about is not something I am willing to do for a bit of extra credibility on a table.

Sample size is 10. That is enough to show that 429s dominate this check and nowhere near enough to claim 90% of all small shops are missing alt text. Do not quote it as if it were.