DEV Community

Daniel Pertu
Daniel Pertu

Posted on

Nineteen links leave our website, and no two groups of them are treated the same way

I pulled every anchor off all 72 pages of pub-trivia.app for a different piece of work, and noticed a small number at the bottom of the list. Of 2,433 anchors on the site, 19 point at a domain that is not ours. Fourteen distinct URLs.

Nineteen is few enough to read individually, so I did, with their rel and target attributes attached. They sort themselves into three groups, and the three groups have nothing in common.

rel="nofollow noopener"   target=_blank   x12   competitors
rel=(none)                target=(none)   x4    our own other apps
rel="noopener noreferrer" target=_blank   x3    a regulator and a payment processor
Enter fullscreen mode Exit fullscreen mode

Three groups, three treatments, and the awkward part is that each one is defensible on its own.

Group one: the competitors

Twelve anchors, seven URLs, five domains. They all live on the comparison cluster, where a page like the SpeedQuizzing comparison names another product and says what it costs.

<a href="https://www.speedquizzing.com/pricing/"
   rel="nofollow noopener" target="_blank">...</a>
Enter fullscreen mode Exit fullscreen mode

nofollow is the deliberate bit. A comparison page cites a competitor's own pricing page as the source for a claim about their pricing. That is a citation, not a recommendation, and nofollow is the attribute that says so to a search engine. Writing a comparison and then passing ranking signal to the thing you are comparing yourself against is a well-known way to do a lot of work for someone else.

What is not there is noreferrer.

So when a reader follows one of those links, their browser sends Referer: https://pub-trivia.app/compare/speedquizzing-alternative to the competitor's server, and it appears in their analytics. We have told Google not to read the link as an endorsement, and told the competitor exactly which page of ours is sending them traffic and, by implication, what we rank for on their brand name.

I am honestly not sure that is wrong. There is an argument that a referrer is good manners, and an argument that a competitor's dashboard is the last place your page paths belong. What I am sure of is that nobody decided it. noopener is there because noopener is what you type with target="_blank", and noreferrer is a separate thought that never happened.

Group two: our own other apps

Four anchors, all on the about page, to four sibling products from the same publisher. Bare:

<a href="https://nakodo.app">Nakodo</a>
Enter fullscreen mode Exit fullscreen mode

No rel, no target. Dofollow, same tab. Treated exactly like an internal link, which is the point: as far as a search engine should be concerned, these sites share a publisher, and the page says so in structured data as well as in prose.

{
  "@type": "Organization",
  "@id": "https://pub-trivia.app/#organization",
  "name": "PubTrivia",
  "parentOrganization": {
    "@type": "Organization",
    "@id": "https://cogniprep.app/about#cogniprep-ltd",
    "name": "CogniPrep Ltd"
  }
}
Enter fullscreen mode Exit fullscreen mode

Note the @id of the parent. It is a node on another domain, and so are the five entries in the AboutPage node's mentions array. The graph is deliberately spread over five sites that each declare the same parent, which only means anything to a crawler that has seen more than one of them.

One detail I had not spotted until I lined the links up against the JSON-LD: the mentions array has five organizations in it, and the fifth is PubTrivia. The page mentions itself. There are four visible links because the fifth product is the one you are already reading about. Harmless, and a nice illustration of how structured data drifts away from the page it describes the moment it is generated from a list rather than from the markup.

Group three: the regulator and the processor

Three anchors, on the three legal documents: the ICO from the privacy policy, and Stripe's agreement and privacy policy from the terms and the cookie policy.

<a href="https://ico.org.uk" rel="noopener noreferrer" target="_blank">...</a>
Enter fullscreen mode Exit fullscreen mode

noreferrer here, and no nofollow. Which says: we vouch for these destinations and we send them nothing. For a data protection regulator that combination is almost poetic, and I would like to claim it was intentional. It was almost certainly whichever snippet the person writing legal copy had closest to hand.

The matrix

Line the three up and you get three of the four possible positions on the two axes that matter:

                 passes ranking signal    sends referrer
competitors            no                      yes
sibling apps           yes                     yes
regulator, Stripe      yes                     no
Enter fullscreen mode Exit fullscreen mode

The missing combination is the cautious one: nofollow and noreferrer together, which is what you would pick if you wanted to link to something without endorsing it or announcing it. Those are the competitor links, and they are the group that got the other combination.

The thing that is not there at all

While I was reading the comparison pages I checked for a disclaimer, because pages that name five competing products by brand usually carry one. There is no "trademarks are the property of their owners", no "not affiliated with", nothing of the kind, anywhere on the site.

What is there instead is a provenance line at the foot of each comparison:

Everything on this page about the other product was read off their own pages in September 2026. Products change and prices change, so check the current position before you decide anything on the strength of it, and tell us if we have got something wrong.

I would rather have that than a boilerplate disclaimer, because it is the sentence that actually helps a reader: it dates the claims and tells them what to do about it. But "we nofollow the link so search engines do not read it as endorsement" and "we never say in words that we are not affiliated" are two halves of the same decision, and only one half got made.

Worth ten minutes on your own site

Outbound links are the shortest list in your HTML and nobody ever reads it. Mine was 19 entries and took a minute to produce:

# every anchor leaving your domain, with its rel and target
curl -s https://pub-trivia.app/compare/sporcle-live-alternative \
  | grep -o '<a [^>]*href="https\?://[^"]*"[^>]*>' \
  | grep -v 'pub-trivia.app'
Enter fullscreen mode Exit fullscreen mode

Run it across your sitemap and group by rel. If you get more than two groups, at least one of them is an accident, and the fastest way to find out which is to try to say out loud what each group means. "Cite but do not endorse" and "same publisher, treat as internal" are both sentences. "noopener because I typed target=_blank" is not.

The pages all of this is measured from are public: the comparison hub, the about page and the privacy policy. The product behind them has a free tier that needs no card, at pub-trivia.app.

Top comments (0)