Method
We don't estimate visibility. We measure it.
Most agencies buy a third-party tool, export its estimates, and put them in a slide. We built the measurement layer instead — so the numbers we show you come from your own properties, and every score has a formula behind it you can check.
The stance
No resold estimates. We do not use Ahrefs or Semrush. Keyword demand comes from your Search Console, behaviour from your Clarity, and AI visibility from a pixel we run on your site. If a number cannot be sourced to one of those, we do not publish it.
Unknown and zero are different answers. When a keyword has no first-party footprint, we return "unknown" and mark it for verification. We never dress an estimate up as a measurement.
We say what we cannot measure. We have no first-party backlink data. So we do not sell backlink analysis, and when a head term needs links to win, we say so instead of selling content that cannot get there.
What we actually measure
- Search Console, daily — Every query, page, position and click for your property — pulled daily, kept as history, not sampled.
- Microsoft Clarity — Which sections of a page people actually read, and where they stop.
- AI crawler logs — Whether GPTBot, ClaudeBot, PerplexityBot and Google-Extended actually fetched your pages — and whether they succeeded.
- AI referral pixel — Humans arriving from ChatGPT, Perplexity, Gemini and Copilot, logged first-party on your own domain.
- Lead attribution — WhatsApp clicks and form submits traced back to the page, and the page back to the keyword.
- Full-site content index — Every article on your site parsed and searchable, so gap analysis compares against what you actually published — not a guess.
The maths we score with
These are the formulas used on real client work, with the thresholds we act on. They are here so you can argue with them.
Statistical Drift Score
SDS = |clicks_now − clicks_before| / √clicks_before
Whether a traffic change is real or noise. Below 1.65 we do nothing — on low-traffic pages a ±30% swing is usually random. Above 2.0 is significant at 95%, above 3.0 at 99%. This is why we do not panic-email you about a bad week.
Content decay
V(t) = V₀ · e^(−λt)
Content loses value at different rates: news λ≈0.50 (half-life ~1.4 months), pricing 0.25, guides 0.13, evergreen 0.05 (~14 months). Below V=0.60 a page needs refreshing; below 0.40 it needs rewriting. It tells us what to refresh before traffic drops, not after.
Ranking Opportunity Score
ROS = CTR_gap × log₁₀(impressions+1) × intent_fit
Which position 4–20 keyword is worth the next hour. The CTR gap is adjusted for what actually sits on that SERP — an AI Overview takes roughly 35% of the clicks, a featured snippet 25%. Ranking #4 under an AI Overview is worth less than #6 on a clean result.
Recovery Probability
RPS = 0.25·technical + 0.25·content + 0.20·links + 0.15·signals + 0.15·geo
When a page drops, whether it is worth saving. Above 0.7 we fix in place; 0.4–0.7 needs a deep rewrite; below 0.4 the honest answer is consolidate and redirect. It stops us billing you for a rescue that was never going to work.
Cannibalisation overlap
overlap = |top10_A ∩ top10_B| / |top10_A ∪ top10_B|
Two of your own pages competing for one query. Above 0.70 they must be consolidated; below 0.40 they are safe to keep apart.
Bayesian confidence
P(issue) = P_prior × ∏(multipliers)
Every finding we report carries a confidence label, and the label has a rule behind it. Confirmed ≥0.85 means direct data. Likely 0.60–0.84 means two signals agreeing. Hypothesis 0.35–0.59 means one signal and needs checking. Below 0.35 we do not report it at all.
How often it runs
Not a monthly PDF. These regenerate on a schedule, per client:
- Every 3 hours — Content priorities, paid-search plan, retargeting audiences
- Nightly — Full technical audit, new-keyword ideas, signal classification
- Weekly — Competitor keyword intelligence, Core Web Vitals, index coverage
One measurement you will not get elsewhere
On 12 August 2026 we read the AI-crawler log for this site: ChatGPT-User made 339 requests and 247 of them failed. ClaudeBot 131 requests, 90 failed. Meanwhile Googlebot failed 14 of 78 and Bingbot 5 of 121. That gap told us AI crawlers were being blocked at the CDN while search crawlers were not — a problem no ranking report would ever surface. We can run the same read on your site.
The short version
Other agencies send you a ranking report. We show you the crawler log, the AI referral, and the enquiry it produced — and the formula that decided what to do next.