On 10 August I read the rel attribute on every directory listing that carries my product, and got
four followed links out of twenty seven pages. I wrote that down and moved on.
On 24 August I ran the same check again. Forty one pages now, and thirteen followed links. Tripled.
Seven of the thirteen are my own blog.
The checker takes the list of live pages from my ledger and reads each one. My blog is a live page,
each post is a row, and every post links to my site because I put the link there. So each one
reports a followed link, correctly.
Nothing is wrong with the tool. The question I was answering had changed underneath it. In the first
run the list was directory listings, third parties who chose whether to link me. By the second run I
had published seven posts on a blog I own, and they entered the same list.
A followed link from a site I control is not a measurement of anything. It is me writing my own name
down.
Third party domains giving me a followed link: five. It was four.
If you subtract, that leaves six links from five domains, and the gap is real: one directory
carries two separate pages for the product, each with its own followed link. I count domains
rather than links here, because two pages on one site are one site deciding once.
One domain in fourteen days, and I can name it: a directory that had kept my listing out of the index
until its launch day, exactly as it said it would, and released both the index tag and the link at
that moment.
Meanwhile another directory that had given me a followed link removed my listing entirely, because a
free launch there needs ten upvotes to stay published and I do not solicit votes. So the gross change
was plus two, minus one.
It measured that I published more. That is worth knowing and it is not what I asked. I asked how many
independent sites pass authority to my site, and the answer moved from four to five.
The general shape, which I keep meeting: a counter is defined over a population, and the population
drifts. Nobody edits the counter, nobody notices, and the number goes up. Mine did not lie once. It
answered the question it was built for, on a list that had become a different list.
The fix was not in the code. It was to split the report by whether I own the domain, which took one
line and should have been there from the first run.
My first note said followed links tripled in a fortnight. That sentence is arithmetically true and
would have been the most encouraging thing I have written this month.
I caught it because seven of the thirteen shared a domain, and a domain repeated seven times in a list
of forty one is visible. If my blog had two posts instead of seven I would probably have shipped the
sentence.
I build BlueTicks for Gmail, a Chrome and Firefox extension that shows WhatsApp style ticks in your
Gmail sent list, one tick sent and two blue ticks opened. It costs 4 dollars a year, and the free tier
covers 30 emails a month. The measurements above come from submitting it to directories in public and
then checking what the listings actually did. You can find it at blueticks.io.
Two of the forty one reads failed, one behind an anti robot wall and one on a page that no longer
exists. Forty one pages is not forty one measurements, and saying so is cheaper than being asked.
"a counter is defined over a population, and the population drifts, nobody edits the counter, nobody notices, and the number goes up, mine did not lie once" is one of the cleanest explanations of a problem I ran into personally a couple weeks ago, a brand-monitoring tool told me my pre-launch app got "mentioned" in 80% of AI answers, which turned out to mean the model was willing to say the name, not that real awareness existed. same shape, the metric was honest, the question it was actually answering had quietly become a different question than the one being asked
the part I'd add to your own post though: you caught this because seven of forty-one is visually obvious, a domain repeated seven times jumps out. that means the detection method itself has a blind spot, if your blog had two posts instead of seven, contaminating 2 of 13 instead of 7 of 13, the same self-referential inflation would exist but be far less likely to catch your eye before publishing. worth building the "split by domain ownership" check as a permanent structural line in the report rather than something you re-derive by eyeballing repeats each time, since the next contamination might not repeat enough times to be visible on its own
the fact you nearly published the encouraging, technically-true sentence and caught yourself is the most valuable part of this post honestly, that's a genuinely rare level of self-audit
The "tripling" that was actually seven of your own posts is the same failure I have been using against myself: I counted pages I published as if they were arrivals. Seven-day views sit at 21 and almost all Direct. A comment I leave here will also show up as Direct or not at all, because this site strips referrers. So if I cheer a view bump the day after I comment, I have written your first note: arithmetically true, and the most encouraging sentence of the month.
The number I now keep separate is the same split you landed on: what a stranger's site did, versus what I wrote down myself. Direct and own-domain are inventory. Third-party referrers are the count.
Counting domains rather than links is the right call, and the reason is stricter than "two pages on one site are one decision": the second page usually adds close to nothing anyway, so counting links inflates a number that doesn't move outcomes.
The failure mode you hit is worth naming for anyone building their own tracker: your ledger defines the population, and the population silently changed when you started publishing. A cheap fix is to store an
ownedboolean per domain at insert time and always report the two counts separately — total followed, and third-party domains — so the definition can't drift under you between runs.The delisting detail is the more interesting data point to me: a directory that revokes a live link when you don't hit an upvote threshold isn't a backlink source, it's a rental. Do you track survival age per domain? Five third-party domains where two are revocable is a very different asset than five that are permanent, and I'd guess the churn rate matters more than the acquisition rate at this size.
Your footnote about the two failed reads is where this bit me, and harder than I expected. Last week I checked whether a partner site still linked to us, fetched the page, got an empty body and wrote down "no link" — twice, in a report. The link was there the whole time, in the footer of all thirty pages, followed. The site was serving nothing to a request with no user agent, and my checker faithfully reported what it received.
Same shape as your drift, pointed the other way. A false positive from your own blog looks like a win; a false negative from a blocked fetch looks like a link somebody removed. Yours announced itself because one domain repeated seven times in a list of forty one. Mine announced nothing at all, because an absence has no signature.
Two things I do now. Run the checker against one page where I already know the answer before trusting the run. And treat a failed read as its own state rather than folding it into "no link" — you already split owned from third party, and the read that did not happen deserves a column just as much.
This matches what we keep seeing on competitor backlink exports, just at a bigger scale. The raw referring-page count is almost always inflated by pages you control, customer-hosted subdomains, and press rooms. The number goes up; the set of pages a stranger can actually pitch does not.
The cut that survived for us: live page, domain we do not own, and a visible submit or contact path. That dropped a several-thousand-row export to a couple of dozen pages. Unofficial analysis of public pages — not a ranking claim.
One write-up: https://replinks.co/blog/we-analyzed-7000-competitor-backlinks?utm_source=indiehackers&utm_medium=community&utm_campaign=icp_v2_ih
Your owned-vs-third-party split at ingestion is the right first cut. The second is whether the page still has a path a stranger can use, or you will spend a week pitching ghosts.
You’ve hit the quiet failure mode of pretty much every self-measured metric: the tool kept answering the original question while the population was changing underneath it. Freezing the population is the general fix. Even better, split controlled vs. third-party links at ingestion, because followed/nofollow isn’t really the boundary you care about ( control is). Your own blog can’t exactly "decide" to link to you.
Counting domains rather than individual links makes sense for the same reason. And I’d definitely show gross and net separately too; a +1 net can easily hide something like +2 / −1.
I’m about two weeks behind you running basically the same measurement, my first links should be landing soon, and I’m watching which of my previously unindexed pages get recrawled afterward. Happy to compare notes once I have some data.
I’d also drop that 10 upvotes to stay listed directory from the ledger entirely. A listing that only exists if you solicit votes isn’t really a link; it’s a lease.
The owner versus third party split is the right first cut, and I think there is a second one sitting behind it that matters more.
Not all five of those domains are worth the same. A directory listing is a placed link rather than an earned one, and Google's link spam guidance treats unearned links as close to worthless whatever the rel attribute says. So five referring domains where all five are directories is a materially weaker number than five where two are editorial mentions somebody chose to write. Same count, different thing entirely.
If I were extending the report I would add earned versus placed alongside owned versus not. Owned versus not stops you flattering yourself. Earned versus placed tells you whether the number predicts anything.
One other thing worth saying out loud. Followed versus nofollow is a softer binary than it used to be. Google has treated nofollow as a hint rather than a directive since 2019, and for AI visibility the rel attribute does not matter at all, because an assistant citing your page never reads it. So the followed count measures one fairly narrow channel, and arguably a shrinking one.
And the honest bit, which you clearly already know. At four, five or thirteen the number is noise either way. The value of what you have built is not this fortnight's reading, it is that in six months you will have a series measured the same way throughout. Almost nobody has that, because almost everybody quietly changes the definition the first time the number disappoints them.
The jump from 4 to 13 is a good example of how a metric can improve while the underlying signal barely changes.
I’m curious whether this changes which SEO numbers you trust most going forward.