A Link Row Records One Rendering of the Page

A row in a backlink export reads like a statement about a page: this URL links to you, with this anchor, from this position in the document. It is actually a statement about a fetch — one request, from one IP in one region, with one user-agent string, at one moment, rendered one way. The page has no obligation to hand the next requester the same document.

Most of the time this doesn’t matter, and that’s why it’s easy to forget. It starts mattering the moment someone opens the referring page, sees something different from what the report said, and asks which one is wrong.

The same URL, more than one document

There are ordinary, non-adversarial reasons one URL produces different link markup on different requests.

Template variants by device. A mobile template routinely drops modules a desktop one keeps — sidebars, “related reading” blocks, footer link lists. If your link lives in one of those modules, whether it exists in the fetched HTML depends on which template the requester got.

Region-conditional content. Geo-routing, region-specific editions, and consent interstitials all mean the document served to a crawler in one country may not be the document served in another. A cookie wall that returns an interstitial instead of the article means the crawler got a page with no article links on it at all.

Position-based modules that move. “Recent posts”, “trending”, and paginated archive listings genuinely contained your link when they were crawled and genuinely don’t now, because newer entries pushed it off. Nothing was removed; the module simply holds N items and yours aged out.

Links that only exist after JavaScript runs. If the anchor is injected client-side, whether it appears depends entirely on whether the fetcher executed scripts. Two crawlers with different rendering policies will disagree about whether the link exists at all, and both will be reporting honestly.

Anything split-tested or personalised. A page running a layout experiment serves different documents to different requesters by design.

The field the export doesn’t have

Look at what a link row carries: source URL, target URL, anchor, attributes, first seen, last seen, sometimes a link position label. Now look at what it doesn’t carry: the vantage point. There is no column telling you the region the fetch came from, the user-agent it presented, or whether scripts were executed.

The contrast with live-observation tooling is instructive, because there the vantage is a first-class part of the request. Serply documents location and device headers on its Google search endpoint, set per request, with the response echoing a device_region and device_type back — the observation ships with a label saying where and how it was taken.

An index row has no such label. That isn’t a vendor failing so much as a consequence of scale: a standing crawl fetches from wherever its infrastructure happens to be, and recording a per-row vantage would be a column of nearly constant values right up until the day it isn’t. But it does mean the row cannot be reproduced, only re-observed — and a re-observation is a new fetch with its own vantage, not a check of the old one.

What this does to anchor data

An anchor report is a frequency table over the anchors your vendor’s crawler rendered. That is not the same population as the anchors currently rendered to a reader, and the gap is largest precisely where the modules are most dynamic.

This is one of the quieter reasons two tools produce different anchor tables for the same site — not just different index sizes, the mechanism covered in why two tools report different backlink counts, but different fetch profiles producing different documents to extract from. The cleaning and bucketing discipline in anchor text distribution as a dataset still applies; it just operates on a sample whose provenance has one more dimension than most people assume.

A worked example

Suppose a report lists 40 referring domains using a descriptive anchor and 6 using your brand name. You spot-check twelve of the descriptive ones in a browser and find that four of them show your brand name instead. Nothing is broken. Those four sites changed a template between the crawl and your check, and the four rows are accurate records of a document that no longer exists. (Illustrative figures, not measurements.)

The mistake would be reporting “40 descriptive anchors” as a present-tense fact about the web. The defensible version is “40 rows recorded a descriptive anchor, last seen on these dates” — which is what the data actually is, and which carries the timestamp semantics discussed in what first seen and last seen mean.

How to check without fooling yourself

Fetch the referring URL yourself and write down how. Country, device user-agent, whether you executed JavaScript. Those three facts are the difference between a reproducible check and an anecdote.

Expect to agree with your vendor for the wrong reason. If you fetch without running scripts and the vendor did the same, you will both miss the same client-side links and you will both be confident. Agreement between two fetchers with the same blind spot is not corroboration.

Compare against what a reader sees, not just what a fetcher sees. Opening the page in a normal browser is a different observation from a scripted request, and for pages that assemble themselves client-side it’s the more relevant one.

Sample, don’t audit. Checking twelve rows tells you whether the profile is broadly consistent. Checking all four hundred is a project, and the population will have drifted before you finish it — the ordinary churn described in lost link reports and index churn.

What nobody outside the vendor knows

Which user-agent a given crawler presents, whether it renders JavaScript and under what conditions, which regions its fetches originate from, and whether any of that changed between two crawls of the same page. None of it is published in enough detail to reconstruct a fetch, which is why the honest reading of a link row is the modest one: at some point, one fetcher received a document containing this anchor. Everything past that is inference.