causal inference seo

Causal Inference for SEO: Difference-in-Differences for Backlinks

TL;DR

—  Backlinks are a staggered treatment: links land on different pages at different times. That single fact breaks the before-and-after regression most SEOs reach for.

—  The pooled two-way fixed-effects model silently averages in “forbidden comparisons” — using an already-linked page as a control for a newly-linked one — and because link effects grow over time, that bias can shrink your estimate toward zero or flip its sign (Goodman-Bacon, 2021).

—  The fix is a clean-comparison estimator (Callaway & Sant’Anna, 2021) built on a page-week panel exported from Google Search Console into BigQuery, using never-yet-linked pages as controls.

—  Parallel trends is untestable, and the pre-trends test that everyone leans on has low power (Roth, 2022). Report a HonestDiD breakdown value instead of a green tick.

—  Link acquisition is endogenous — the PR campaign that earned the link also moved branded search — so control-group construction, not the maths, is where this design lives or dies.

—  Below ~35–40 treated pages the estimator’s variance explodes; a matched pre/post or a synthetic control is the honest fallback.

Every measurement article in this series has circled the same wound: your analytics tool reports that rankings rose after a link campaign, and you have no principled way to say the links caused it. This piece adapts the most widely-taught tool in applied causal inference — difference-in-differences — to the one thing SEOs actually control: which pages earn links, and when. It is also a warning. The obvious way to run DiD on backlinks is quietly broken, in a way econometricians spent the last decade formalising. Getting it right is not harder maths. It is a different, more honest design.

The regression that flatters your link building is the one you can’t trust

Here is the analysis almost everyone runs, whether in a spreadsheet or a notebook. Take a set of pages that acquired links this quarter. Take a set that did not. Pull average position for both, before and after, and difference the differences. If the linked pages improved more than the unlinked pages, the gap is “the link effect.” It feels like a controlled experiment. It has a control group, a treatment group, a before and an after. It is the textbook 2×2, and for a single cohort of pages linked on a single date, it is genuinely fine.

The trouble starts the moment your links arrive on a schedule rather than all at once — which is to say, always. A digital PR push places coverage over six weeks. An outreach campaign trickles placements across a quarter. Even a single big story gets picked up, syndicated, and re-linked over a fortnight. The instant treatment is staggered across time, the natural next move — pool everything into one regression with page fixed effects and week fixed effects, and read the coefficient on “has a link” — stops estimating what you think it estimates.

That pooled specification is two-way fixed effects (TWFE), and it is the workhorse that Goodman-Bacon (2021) took apart. He proved that the single TWFE coefficient is a weighted average of every possible two-group, two-period comparison the data allows. Some of those comparisons are legitimate: a newly-linked page against a not-yet-linked one. But others are not. In a staggered design, TWFE also compares a newly-linked page against a page that was linked earlier and is still responding — using the already-treated page as though it were a clean control. Those are the forbidden comparisons, and they can enter the average with negative weights (de Chaisemartin & D’Haultfœuille, 2020).

Why this is worse for links than for most things

Forbidden comparisons only do real damage when the treatment effect is heterogeneous or changes over time. Link effects are almost the purest example of a dynamic effect in all of SEO: a new referring domain does nothing until Google recrawls the linking page, then indexing and authority flow take hold over weeks, then rankings mature and clicks follow rankings.

So the exact condition that makes TWFE misbehave — effects that ramp instead of switching on — is the default state of a backlink. The naïve link-DiD is not occasionally biased. It is biased by construction, and the bias pulls toward “links did nothing.”

A three-page example you can hold in your head

Picture three comparable pages. Page A earns a link in week 2, Page B in week 6, Page C never. Suppose the true effect of a link is a steady climb — roughly one position per fortnight for twelve weeks. When TWFE evaluates the late-treated Page B, it is allowed to use Page A as a control. But by week 6, Page A is already four positions up and still rising. Subtracting Page A’s post-period trajectory from Page B’s removes real treatment effect from the estimate, because the “control” is itself treated and mid-ascent. The comparison that should anchor the counterfactual instead cancels the signal.

Run the numbers on a simulated version and the pooled coefficient can come back at half the true effect, occasionally with the wrong sign entirely (de Chaisemartin & D’Haultfœuille, 2020; Baker, Callaway, Cunningham, Goodman-Bacon & Sant’Anna, 2025). You would look at that output, see a small or null coefficient, and conclude your links underperformed — when the design, not the campaign, produced the number. This is the single most important idea in the article: a scientific-looking regression can be confidently, structurally wrong, and nothing on the surface of the output warns you.

Backlinks as a treatment: defining the intervention precisely

Before any estimator, you need a definition of “treated” sharp enough to timestamp. Vague treatment is the quiet killer of causal work, because the whole method rests on knowing the exact week the intervention hit each unit. For backlinks the cleanest workable definition is: the first editorial, followed, indexable link to a target page from a new referring domain above an authority floor you set in advance. Spell out every clause, because each one is a decision that changes the answer.

  • Unit of treatment: the page. Not the domain, not the keyword. Links point at URLs, and Search Console reports at URL level, so the page is the only unit where treatment timing and outcome are both observable.
  • Treatment date: first crawl of the linking page, not go-live. A link does nothing until Google fetches the page it sits on. Approximate the crawl date from the referring page’s cache or your backlink tool’s first-seen date, and treat the go-live date as a lower bound only.
  • Authority floor, set in advance. A link from a scraper is not the same intervention as a link from a national title. Pre-register a threshold (e.g. referring-domain Domain Rating ≥ 40) so you are not tempted to move the goalposts once you see results.
  • One treatment per page. DiD wants a single switch-on. If a page earns links in weeks 2, 5 and 9, decide up front whether you are measuring the first link (cleanest) or building a dose model (harder, covered when this cluster reaches continuous-treatment designs).

This definitional discipline is not pedantry. If your treatment date is off by three weeks, your event study smears the effect across the wrong periods and understates the peak; if your authority floor drifts, treated and control groups stop being comparable. Write the definition down before you pull a single row. For a refresher on what actually counts as a link worth measuring, our guide to what backlinks are and how they carry authority is the right starting point, and the broader menu of placements sits in our 15 link building strategies hub.

Building the panel from Google Search Console

DiD needs a balanced panel: the same units observed at regular intervals across a pre-period and a post-period. For SEO, the richest free source of that panel is Search Console — but only if you have been warehousing it. The Search Console interface holds a rolling sixteen-month window and caps exports at 1,000 rows, and roughly a third to a half of impressions belong to anonymised queries that never appear at all. None of that is adequate for a page-week panel across dozens of URLs and many weeks.

The answer is the BigQuery bulk export. Once enabled, Search Console writes an unsampled daily dump into a dataset you own, including the long-tail rows the interface hides. The URL-level table, searchdata_url_impression, is the one you want: it carries clicks, impressions and a sum_position field per URL, per query, per day. Average position is reconstructed as 1 + SUM(sum_position)/SUM(impressions). Two operational warnings that catch people out, both worth internalising before you commit to this design.

The export does not backfill — this is a “turn it on today” decision

BigQuery bulk export captures data going forward from the day you enable it. It cannot recover history. Anything already inside the sixteen-month window ages out and is gone from both places.

Practically: a rigorous link-DiD needs a pre-period of at least eight to twelve weeks before your first treated page is linked. If you have not enabled the export yet, you cannot run this design on a campaign that starts next month — you can only start building the asset for the campaign after. Enable it on every property that matters now; the storage cost is trivial next to the cost of wishing you had.

Choose position, not clicks, as the primary outcome

Clicks are the tempting outcome because clicks are the business. But clicks confound two channels: where you rank, and how often people click a given rank. A link moves ranking. It does not move your click-through rate — yet CTR swings constantly as Google reshuffles SERP features, tests titles, and injects AI overviews. If you measure clicks, a title-tag test or a new snippet layout on the same day as your link lands will contaminate the estimate. Impression-weighted average position isolates the ranking channel the link plausibly acts on, so it is the cleaner primary outcome. Keep clicks and impressions as secondary outcomes to sanity-check that a ranking gain actually converted into traffic.

One subtlety that separates a careful analyst from a sloppy one: position is a weighted average across every query a page ranks for, and a page’s query mix shifts over time. Aggregate a page’s “easy” and “hard” queries together and week-to-week movement can be pure composition change rather than real re-ranking. Build the panel at query-by-URL granularity where volume allows, so you compare a page’s position for the same query over time, then aggregate up with fixed weights. It removes an entire class of phantom effects.

The anonymised-query problem is differential measurement error

Because Search Console filters anonymised queries — disproportionately long-tail and sensitive ones — your panel is a non-random sample of a page’s true search footprint. That is not merely missing data; it is measurement error that can correlate with treatment. A digital-PR link often lifts a page into new, broader, higher-volume queries, precisely the ones most likely to clear the anonymisation threshold and appear in your data for the first time. If new queries pop into existence in the post-period on treated pages, part of your measured “improvement” is queries becoming visible, not a page climbing. Guard against it by fixing the query set to those present in the pre-period, or by modelling entry explicitly, and by reporting how much of the effect survives on the stable query set.

Assembling the page-week panel (illustrative SQL)

— Weekly page-level panel from the GSC BigQuery bulk export.

— Outcome: impression-weighted average position (1-based).

— Query set frozen to queries seen in the pre-period to avoid

— rewarding a page merely for surfacing on NEW queries post-link.

WITH base AS (

  SELECT

    url,

    DATE_TRUNC(data_date, WEEK(MONDAY))      AS wk,

    query,

    SUM(impressions)                         AS impr,

    SUM(clicks)                              AS clk,

    SUM(sum_position)                        AS sum_pos

  FROM `proj.searchconsole.searchdata_url_impression`

  WHERE NOT is_anonymized_discover

    AND query IS NOT NULL

  GROUP BY url, wk, query

),

frozen AS (                       — queries present before any treatment

  SELECT DISTINCT url, query FROM base

  WHERE wk < DATE(“2026-03-02”)   — earliest treatment week

)

SELECT

  b.url,

  b.wk,

  1 + SAFE_DIVIDE(SUM(b.sum_pos), SUM(b.impr)) AS avg_position,

  SUM(b.impr) AS impressions,

  SUM(b.clk)  AS clicks

FROM base b

JOIN frozen f USING (url, query)

GROUP BY b.url, b.wk

ORDER BY b.url, b.wk;

Join that outcome table to a treatment table — one row per treated URL with its first-link week — and to your control set, and you have the panel. Everything downstream is bookkeeping and estimator choice.

The hard part: a control group that isn’t a lie

The maths of DiD is the easy 20%. The control group is the other 80%, and for backlinks it is genuinely difficult, because link acquisition is not random. Pages earn links for reasons — they are better, they cover trending topics, they belong to campaigns, they already have traffic that makes them worth citing. Every one of those reasons is also a reason the page might have risen anyway. This is endogenous treatment, and it is the deepest threat to any observational link study.

The most dangerous version is specific to digital PR. The campaign that earns you a national link also generates branded search, direct visits and social chatter in the same window — and those brand signals correlate with ranking movement through Google’s engagement and brand-authority pathways. So the treated page was very likely already bending upward when the link landed, for reasons entangled with the link but not caused by its equity. A control group of random unlinked pages makes that pre-existing lift look like a treatment effect. Your job is to build controls that would have moved the same way absent the link.

Three defensible ways to construct controls

  1. Never-yet-linked siblings, matched on pre-trend. From the same site and topic cluster, select pages that had no qualifying link during the study and whose pre-period position trajectory most closely tracks each treated page. Matching on the pre-trend, not just the level, is what buys you credibility: you want controls that were already moving in parallel.
  2. Not-yet-treated pages as controls. In a staggered rollout, pages linked later serve as clean controls for pages linked earlier — but only in the window before they themselves get linked. This is the backbone of the modern estimator below and it uses your own campaign timing as the experiment.
  3. A placebo cohort. Hold out a set of pages you could have linked but deliberately did not (a genuine holdout, the discipline covered in the geo-holdout and incrementality pieces in this cluster). If the holdout shows no jump at the fake “treatment” dates you assign it, your design is not manufacturing effects out of noise.

The one-line test for any proposed control group

Ask: “Is there a story where these control pages would have followed the same path as my treated pages if no link had ever arrived?” If the honest answer is “no, my treated pages were special,” your control group is a lie and no estimator will rescue it. Fix the design, not the model.

Placement types behave differently and it is worth separating them: an earned editorial mention arrives with a brand-signal bundle, whereas a guest-posted link usually does not. Where you can, stratify treated pages by placement type and estimate effects separately; pooling a brand-heavy PR link with a plain contributed link averages two different interventions and hides both.

The estimator: clean comparisons, group-time effects, event study

With a defensible panel and control group, swap the broken pooled regression for an estimator built only from clean comparisons. The standard modern choice is Callaway & Sant’Anna (2021). Rather than forcing one coefficient, it estimates a separate effect for each treatment cohort at each point in event time — the group-time average treatment effect, ATT(g,t) — using only never-treated or not-yet-treated pages as controls. No already-treated page is ever used as a counterfactual, so the forbidden comparisons that wreck TWFE simply cannot enter.

Those building blocks are then aggregated into whatever summary you actually want. Four are standard: a simple overall ATT, a dynamic (event-study) profile by weeks-since-link, a by-cohort breakdown, and a calendar-time view. For link building the dynamic aggregation is not just a robustness check — it is the deliverable. The event-study curve tells you the shape of a link’s effect: how many weeks of nothing while Google recrawls, when the ramp begins, where it plateaus. That curve is more useful to a campaign than any single number, because it tells you how long to wait before judging a placement.

What the event-study curve typically shows for links

Weeks 0–2: flat. The linking page has not been recrawled and reindexed; expect no movement and do not panic.

Weeks 3–8: the ramp. Position improves as authority propagates and the target is recrawled in its new link context.

Weeks 8–16: plateau. The effect matures and stabilises; this is where your “overall ATT” should be read from, not week 2.

If your event study shows a jump in the pre-period (before week 0), stop. That is evidence your parallel-trends assumption is already failing and your control group needs rebuilding.

Illustrative estimator call

# R, using the did package (Callaway & Sant’Anna).

# gname = first-link week (0 for never-linked controls).

# Controls restricted to not-yet-treated pages.

library(did)

atts <- att_gt(

  yname   = “avg_position”,   # lower is better; sign accordingly

  tname   = “wk_index”,       # integer week index

  idname  = “url_id”,

  gname   = “first_link_wk”,

  data    = panel,

  control_group = “notyettreated”,

  est_method    = “dr”,       # doubly robust

  clustervars   = “url_id”

)

es <- aggte(atts, type = “dynamic”, na.rm = TRUE)  # event study

summary(es)   # read the plateau (wks 8-16), not the week-2 point

Sun & Abraham (2021) and Borusyak, Jaravel & Spiess (2024) are close alternatives that solve the same forbidden-comparison problem with different machinery; the 2026 practitioner’s guide by Baker and co-authors is the current reference for choosing among them. For a link-building panel of the size most sites can assemble, the practical differences between these estimators are small compared with the difference between any of them and the broken pooled regression. Pick one, pre-register it, and move on to the assumption that actually decides whether your number means anything.

Parallel trends is untestable — so stop pretending the pre-trends test saves you

Every DiD estimate rests on one assumption: absent the link, treated and control pages would have followed parallel paths. It cannot be proven. The universal habit is to run a pre-trends test — check whether the pre-period event-study coefficients are statistically indistinguishable from zero — and, if they pass, declare parallel trends satisfied. Roth (2022) showed why that habit is dangerous. Conventional pre-trends tests have low statistical power: they only catch violations large enough to be obvious, and they wave through the smaller, plausible violations that can still overturn your conclusion. Worse, conditioning your analysis on having passed the pre-test distorts the estimates that follow. A green tick is a false comfort.

The modern replacement, and the single upgrade that would move most SEO measurement from “trust me” to “defensible,” is a sensitivity analysis: HonestDiD (Rambachan & Roth, 2023), now recommended as a standard step in the 2025 practitioner’s guide. Instead of asking the yes/no question, it asks a quantitative one: how large would a violation of parallel trends have to be before my conclusion flips? Under the relative-magnitude version, a parameter M bounds how big the post-period trend violation can be relative to the worst violation you actually observed before treatment. M = 0 is exact parallel trends; M = 1 allows a post-period drift as large as your largest pre-period wobble; higher M allows proportionally more.

Report a breakdown value, in language a client understands

Instead of “parallel trends holds (p = 0.31)”, report: “Our estimated 4.1-position gain stays significant for M up to 1.0.”

Translated: the link effect survives unless the treated pages were secretly already drifting upward, on their own, by more than the biggest pre-period wobble we ever saw. That is a claim a sceptical stakeholder can actually reason about — and if your breakdown value is M = 0.3, you have learned, honestly, that your result is fragile and you should not bill a client on it.

# Sensitivity of the event-study effect to parallel-trend violations.

library(HonestDiD)

sens <- createSensitivityResults_relativeMagnitudes(

  betahat = es$att.egt, sigma = es$V.egt,

  numPrePeriods  = 4, numPostPeriods = 8,

  Mbarvec = c(0, 0.5, 1, 1.5, 2)   # find where CI first includes 0

)

# The largest Mbar whose interval excludes 0 is your breakdown value.

Seven SEO-specific confounders that will still kill a clean estimate

A robust estimator and an honest sensitivity analysis handle the econometrics. They do not handle the things that make search different from a policy rollout. Each of the following can masquerade as a link effect; each has a design fix.

1.  A core or spam update lands mid-window

Updates hit pages unevenly. If treated pages skew toward a category the update favoured, you will read an algorithm gain as a link gain. Fix: mark every known update date, and either drop cohorts whose event window straddles a major update or add update-by-category controls. Volatile weeks are contamination, not data.

2.  A content refresh coincides with the link

Teams often refresh a page and pitch it in the same sprint. The refresh alone can move rankings. Fix: log content-change dates and exclude pages edited within the event window, or treat “refresh” as a separate treatment arm.

3.  Internal linking changed

Adding the new page to a hub or nav reshuffles internal authority independently of the external link. Fix: freeze internal-link structure for the study window, or record internal-link changes as covariates.

4.  Keyword cannibalisation and spillover

A link that lifts one page can demote a sibling competing for the same query, or lift the whole cluster via topical authority. Both violate the assumption that control pages are unaffected by treatment. Fix: choose controls from unrelated clusters, and inspect sibling pages for displacement.

5.  Seasonality and demand shocks

A category surging for reasons unrelated to links (a season, a news event) moves treated and control pages differently if they are not demand-matched. Fix: match controls on query intent and seasonality, and include calendar-week effects.

6.  Anonymised-query drift

As covered above, new post-period queries appearing in the data can inflate the effect. Fix: freeze the query set to the pre-period and report the stable-set effect alongside the full one.

7.  SERP-feature and layout changes

AI overviews, featured snippets and other features change both position semantics and click behaviour. Fix: prefer position over clicks as primary outcome, and flag weeks with known SERP-layout shifts for the outcome you do use.

None of these is exotic. They are the everyday texture of running a website, which is why a method borrowed from economics cannot be applied to SEO on autopilot. The estimator assumes a clean, isolated switch; your job is to engineer the study window so the switch really is close to clean. When you cannot — during a volatile update, on a heavily cannibalised cluster — the correct answer is to narrow the claim, not publish a tidy number you do not believe.

Cost, failure modes, and when to abandon the design

Cost at volume

The BigQuery bulk export itself is close to free for a normal site: storage of Search Console rows runs to a few pence a month, and the first terabyte of query processing each month is free, which covers most panel builds comfortably. Costs only appear at genuine enterprise scale — millions of URL-by-query-by-day rows — where partition pruning and pre-aggregating into a weekly table before you query keeps you inside the free tier. The estimator runs on a laptop: a panel of a few hundred pages across forty weeks is trivial for the did package. The expensive resource here is not compute; it is the eight-to-twelve-week pre-period you must have banked in advance, and the analyst hours to build a defensible control group.

Production failure modes

  • Silent treatment-date error. Using go-live instead of first-crawl shifts every event window and flattens the peak. Symptom: an implausibly slow or absent ramp. Cross-check dates against crawl logs.
  • Unbalanced panel from sparse pages. Low-impression URLs have weeks with zero rows; naïve joins drop them and bias the sample toward already-strong pages. Symptom: your treated set is all high-traffic pages. Impute or restrict to pages above an impression floor, chosen in advance.
  • Position volatility swamping the signal. Average position for thin pages swings wildly week to week. Symptom: enormous confidence intervals. Aggregate to the query set with the most stable coverage, or move to a monthly panel.
  • Pre-test worship. Treating a passed pre-trends test as proof. Symptom: no sensitivity analysis in the readout. The fix is the HonestDiD breakdown value, every time.

Reproducibility metadata to record with every readout

A link-DiD result is only defensible if someone else can rebuild it. Store, alongside the estimate: the exact treatment definition and authority floor; the first-link week for every treated URL and its provenance; the control-selection rule and matching variables; the frozen query set; the estimator, control-group option and clustering; the list of known update and refresh dates excluded; and the software versions. Without this, a number that says “+4.1 positions” is an opinion wearing a lab coat.

Failure threshold and the cheaper fallback

When NOT to run DiD

Below roughly 35–40 treated pages, or fewer than 6–8 clean pre-period weeks, the group-time estimator’s variance explodes and confidence intervals become uselessly wide. You will get a point estimate, but it will not support a decision.

Fallback in that regime: a single-cohort matched pre/post. Pick a handful of never-linked controls matched tightly on pre-trend, run the plain 2×2 (which is unbiased when treatment is not staggered), and report it with honest, wide intervals. For a single flagship placement, a synthetic control — a weighted blend of control pages built to track the treated page pre-link — is the more powerful option, and is the subject of its own article later in this cluster.

The discipline is the same either way: match the method to the data you actually have, and never let the sophistication of the tool outrun the strength of the design.

An anonymised worked example

The following is a composite, its figures illustrative, but the structure mirrors a real B2B SaaS engagement. The client ran a six-week digital-PR campaign that earned qualifying links to nineteen product and resource pages, with placements landing on different weeks — a textbook staggered rollout. They had, crucially, enabled the BigQuery export eleven months earlier, so a clean pre-period existed.

  • Treatment: first followed editorial link from a referring domain rated 45+, dated to the linking page’s first-crawl week. Nineteen treated URLs across five treatment weeks.
  • Controls: sixty-one never-linked pages from the same clusters, matched on twelve-week pre-period position trend; plus not-yet-treated pages used as controls within the staggered window.
  • Outcome: impression-weighted average position on a query set frozen to the pre-period. Clicks tracked as a secondary check.

The naïve pooled TWFE regression returned +1.9 positions and a coefficient that was barely significant — the kind of underwhelming number that gets a link campaign quietly defunded. The Callaway–Sant’Anna event study told a different story. Weeks 0–2 were flat, exactly as the recrawl-lag logic predicts. The ramp began around week 3 and the effect plateaued near +4.3 positions by weeks 9–12. The pooled number had been diluted by forbidden comparisons and by averaging in the dead early weeks; the clean estimator recovered an effect more than twice as large and correctly located in time.

Two honesty checks kept it defensible. A core update landed in week 7; the three treated URLs whose event windows straddled it were dropped, and the effect held on the remainder. The HonestDiD sensitivity analysis gave a breakdown value of M ≈ 1.1 — the +4.3 gain survived parallel-trend violations slightly larger than the worst pre-period wobble, a genuinely reassuring rather than spectacular result. The readout was not “links work.” It was “these links moved these pages by roughly four positions, the effect took two to three months to mature, and the conclusion is robust unless the pages were already climbing on their own faster than they ever visibly did before.” That sentence is worth more than any dashboard.

A pre-registration checklist for a defensible link-DiD

Decide all of this before you see any outcome data. Pre-registration is what stops the analysis drifting toward the answer you hoped for.

  1. Treatment definition: link type, followed/indexable status, authority floor, and the rule for dating first-crawl.
  2. Unit and outcome: page-week panel, impression-weighted position primary, query set frozen to the pre-period.
  3. Control rule: source of never-linked controls, matching variables, and use of not-yet-treated pages.
  4. Estimator: Callaway–Sant’Anna with not-yet-treated controls, doubly-robust, clustered by URL; dynamic aggregation as the headline.
  5. Robustness: HonestDiD breakdown value reported as standard; placebo cohort at fake treatment dates.
  6. Exclusions: known update, refresh and internal-link-change dates flagged in advance, with the drop rule stated.
  7. Stop rule: if treated N < ~35 or clean pre-weeks < 6, switch to matched pre/post or synthetic control instead.

This is more work than pulling a before-and-after chart, and that is the point. Doing causal inference on backlinks honestly is genuinely demanding, which is exactly why the practitioner-level guide has never existed. But the payoff is the one thing the industry keeps asking for and rarely earns the right to say: not “rankings went up after we built links,” but “these links caused this lift, here is how long it took, and here is how wrong the world would have to be for us to be wrong.” When domain authority is the constraint on growth, proving which links moved the needle is not a reporting nicety — it is how you decide where the next budget goes.

Keep going: this is one of six pieces in our causal-measurement cluster. For the data behind the 2026 link-building landscape, see our link building statistics for 2026; to choose the platforms that assemble the panels and backlink data this method depends on, see our roundup of the best link building tools; and for the foundations, start with what link building is.

Leave a Reply

Your email address will not be published. Required fields are marked *

mmm link building Previous post Media-Mix Modelling for Earned Links and Digital PR
bayesian link forecasting Next post Bayesian Forecasting of Link Building Outcomes