Skip to content

Query Anomaly Detection: how Visqio scores

Last updated:

Interpretation note

Not ranking is not the same as being banned or penalised. Visqio reports observable signals (index status, impressions, SERP presence, regional differences) and classifies them by likelihood. Google does not expose penalty or suppression data; absence of ranking can result from competition, relevance, low quality, crawl budget, recency, or measurement gaps. Treat every status as a hypothesis to investigate, not a verdict.

1.What is a query anomaly?

A Query Anomaly is a 0–100 score and a class that tell whether a keyword underperforms relative to its own history and to its page and domain, and at which level the problem sits: NORMAL, QUERY_SPECIFIC_ANOMALY, PAGE_LEVEL_ISSUE, DOMAIN_LEVEL_ISSUE, INDEXATION_ISSUE or INSUFFICIENT_DATA. It is computed per keyword × domain from Search Console metrics, licensed SERP snapshots and URL Inspection results.

2.Windows

The current window is the last 7 days of Search Console data (ending at the latest ingested date); the baseline is the 28 days before it. SERP snapshots use the last 7 versus the previous 7. Relative change is Δ(x) = (cur − base × 7/28) / max(base × 7/28, ε), so a 28-day baseline is scaled to 7 days before comparison.

3.Data sufficiency

The class is INSUFFICIENT_DATA when baseline impressions for the query are below 30 and fewer than 3 SERP snapshots exist in the current window; when Search Console data ends more than 5 days ago; or when the domain has no Search Console connection and fewer than 3 snapshots.

4.Signal scores

Seven signals, each 0–100 with higher meaning more anomalous, are combined with fixed weights that sum to 100. Score = Σ (signal × weight) / 100, rounded.

SignalDefinitionWeight
S1 Query impressions dropclamp(−Δ(impressions_query) × 100, 0, 100); −60 % → 6025
S2 Query position lossclamp((pos_cur − pos_base) × 10, 0, 100); +5 positions → 5015
S3 SERP presence lossShare of current snapshots where the target is absent, counted only if present in ≥ 50 % of the previous 720
S4 Query-vs-page divergenceclamp((Δ(impressions_page) − Δ(impressions_query)) × 100, 0, 100) — page holds, query falls10
S5 Page-level dropclamp(−Δ(impressions_page) × 100, 0, 100)10
S6 Domain-level dropclamp(−Δ(impressions_domain) × 100, 0, 100)10
S7 Indexation100 if the latest inspection (≤ 14 d) shows not INDEXED, verdict FAIL or a canonical mismatch after previously being INDEXED; 50 if NEUTRAL; else 010

5.Classification

The first matching rule wins:

  1. INDEXATION_ISSUE — S7 = 100.
  2. DOMAIN_LEVEL_ISSUE — S6 ≥ 40 and at least 60 % of the domain's tracked keywords have S1 ≥ 40.
  3. PAGE_LEVEL_ISSUE — S5 ≥ 40 and at least 60 % of keywords targeting the same page have S1 ≥ 40, and not domain-level.
  4. QUERY_SPECIFIC_ANOMALY — score ≥ 40 and (S4 ≥ 30 or S3 ≥ 50) and S5 < 40 and S6 < 40.
  5. QUERY_SPECIFIC_ANOMALY — score ≥ 60 (fallback when no level signal explains it).
  6. NORMAL — otherwise.

Thresholds are constants; TEST domains multiply impression thresholds by 0.5 because their volumes are tiny.

6.Evidence output

Every event stores the score, the class, each rule with its value, weight and evidence (for example impressions_cur 140 versus impressions_base_scaled 500, or absent 4 of 7 snapshots), the window dates and a plain-language explanation such as: "Impressions for this query fell 72 % while the page's other queries fell 12 %; target absent in 4 of 7 SERP checks. Page and domain look stable, so the issue appears query-specific. This is not evidence of a penalty."

7.Alerts

A change from NORMAL to any issue class with score ≥ 60 raises a QUERY_ANOMALY alert (WARNING; CRITICAL for DOMAIN_LEVEL_ISSUE or INDEXATION_ISSUE). An INDEXATION_ISSUE on a URL that was previously INDEXED raises INDEXATION_LOSS (CRITICAL). When at least 25 % of a project's keywords are DOMAIN_LEVEL_ISSUE, one project-level CRITICAL alert is raised. Dedup key: type, keyword, class and week.

8.Limits

The engine compares a keyword with its own past, so seasonality and market-wide shifts can score as anomalies; the class tells you where to look, not what caused it. Search Console lags about two days and samples long-tail queries; SERP snapshots reflect the provider's vantage point. Rule parameters are versioned in every event.

Frequently asked questions

Does a high anomaly score mean Google penalised the page?

No. The score measures how much a query underperforms against its own history and its page or domain. Competition, seasonality, SERP feature changes and provider sampling all move it. Visqio never uses the words penalty, ban or sandbox in its outputs.

Why is the class INSUFFICIENT_DATA?

Baseline impressions for the query were below 30 and fewer than 3 SERP snapshots exist in the current window, or Search Console data ends more than 5 days ago, or the domain has no Search Console connection and fewer than 3 snapshots.

What is the difference between QUERY_SPECIFIC_ANOMALY and PAGE_LEVEL_ISSUE?

Query-specific means the page's other queries hold up while this one falls (signal S4) or the target disappears from SERPs (S3). Page-level means the page itself dropped (S5 ≥ 40) and at least 60% of keywords targeting it also dropped.

How often does it run?

Daily per project and on demand. Alerts are deduplicated per keyword, class and week; a repeat raises the trigger count instead of creating a new alert.

Sources: Google's URL Inspection API, Search Console Search Analytics API and spam policies documentation.