Query Anomaly Detection: how Visqio scores
Last updated:
Interpretation note
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.
| Signal | Definition | Weight |
|---|---|---|
| S1 Query impressions drop | clamp(−Δ(impressions_query) × 100, 0, 100); −60 % → 60 | 25 |
| S2 Query position loss | clamp((pos_cur − pos_base) × 10, 0, 100); +5 positions → 50 | 15 |
| S3 SERP presence loss | Share of current snapshots where the target is absent, counted only if present in ≥ 50 % of the previous 7 | 20 |
| S4 Query-vs-page divergence | clamp((Δ(impressions_page) − Δ(impressions_query)) × 100, 0, 100) — page holds, query falls | 10 |
| S5 Page-level drop | clamp(−Δ(impressions_page) × 100, 0, 100) | 10 |
| S6 Domain-level drop | clamp(−Δ(impressions_domain) × 100, 0, 100) | 10 |
| S7 Indexation | 100 if the latest inspection (≤ 14 d) shows not INDEXED, verdict FAIL or a canonical mismatch after previously being INDEXED; 50 if NEUTRAL; else 0 | 10 |
5.Classification
The first matching rule wins:
- INDEXATION_ISSUE — S7 = 100.
- DOMAIN_LEVEL_ISSUE — S6 ≥ 40 and at least 60 % of the domain's tracked keywords have S1 ≥ 40.
- PAGE_LEVEL_ISSUE — S5 ≥ 40 and at least 60 % of keywords targeting the same page have S1 ≥ 40, and not domain-level.
- QUERY_SPECIFIC_ANOMALY — score ≥ 40 and (S4 ≥ 30 or S3 ≥ 50) and S5 < 40 and S6 < 40.
- QUERY_SPECIFIC_ANOMALY — score ≥ 60 (fallback when no level signal explains it).
- 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.
Related methodology
Sources: Google's URL Inspection API, Search Console Search Analytics API and spam policies documentation.