Repository navigation
SERP Monitor
Top menu → Monitoring → SERP Monitor (/serp-monitor). A rank tracker tells you where you stand. The SERP Monitor tells you what the whole market did: every check snapshots the entire top-100 for each keyword and compares snapshots by host.
It answers three questions a rank tracker can't:
- Who entered and who dropped out of the top-100?
- How hard did the whole market shake? (storms)
- Who are these new domains? First seen when, registered when, what DR.
-
A-Parser with
SE::Google, connected in Settings (see SERP Providers and A-Parser). Without it the page shows a banner explaining what's missing. - Proxies that hold the volume. This module is much hungrier than rank tracking (see below).
- v1 covers Google desktop only.
- After updating to a version with SERP Monitor, the deploy must have run
npx prisma db push(update.shdoes this).
A project is one market (engine · country · language · device) plus a keyword set. Per project you set the depth, your own domains (highlighted everywhere), hidden hosts, storm notifications and retention.
The unit of work is queries × pages. Depth 100 = 10 Google result pages per query.
944 keywords × depth 100 ≈ 9,440 page fetches per run, once a day.
- Depth is the lever. Depth 20 is ten times cheaper than 100. If you only care about entries into the top 30, use depth 50.
- Wall time depends on A-Parser's thread count. A 944-keyword project with 20 threads takes a few tens of minutes. A run interrupted by a restart resumes where it stopped.
- Storage at that size: about 1.2 MB a day, about 450 MB a year before thinning.
Market: one row per keyword: current leaders, host-level changes (+host #34 entered at 34, −host dropped out, ↑ host 12→5), volatility and your own position. Click a keyword for its full SERP history and a side-by-side diff of any two snapshots.
Storms: one point per run: the project's volatility against its own baseline, the verdict, the keywords that shook hardest and the hosts with the most entries and exits.
Domains: the newcomer catalogue: who holds how many keywords, who's rising or falling, tags new (first seen after the project's first run), young (registered recently; press Load registration dates for RDAP/WHOIS), bounced (entered and left within 7 runs), DR, referring domains, CSV export.
Social networks, app stores and Wikipedia are hidden from change lists by default (a facebook.com "entry" isn't news), but still count toward volatility.
| Status | Meaning | Used in comparisons |
|---|---|---|
ok |
At least 80% of expected rows | yes |
partial |
A short answer | yes, but only down to the depth it actually returned |
failed |
Empty, blocked, captcha, timeout, parser error | never |
A failed snapshot never produces exits. Without that rule one dead proxy would manufacture a fake mass exit across every keyword. A keyword survives any number of failed runs without losing its history.
A storm is a run whose volatility is extreme for this project, not by an absolute bar. A churny gambling market and a calm B2B niche can't share a threshold.
- Volatility per keyword =
1 − RBO(rank-biased overlap) between the previous and current host lists; a run's volatility is the median. - A storm needs a baseline (previous 20 runs), enough compared keywords, a robust z-score ≥ 3, and ≥ 30% of keywords above their own usual churn.
- The first 7 runs are calibration. The tab says calibrating, which means "no baseline yet", not "no storms".
- A storm sends one message to your notification channels: score, share of shaken keywords, the 5 most shaken keywords and the 5 hosts with the most movement. Send a test storm alert in project settings shows exactly what arrives.
Full snapshots are kept for the project's retention window (180 days by default), then thinned to one per ISO week per keyword. The snapshot a keyword is currently compared against is never deleted.
serpmon_projects, serpmon_market, serpmon_keyword_history, serpmon_storms, serpmon_domains (free reads) and serpmon_run (starts a check asynchronously).
Google desktop only; serial A-Parser batches (very large projects are slow); one storm verdict per run. On MySQL, URLs longer than 191 characters can't be stored; run SERP Monitor on SQLite.
Full reference: docs/SERP-MONITOR.md.
OpenGSC · opengsc.org · Repository · Issues · Changelog · MIT licence
Get started
Install and run
Analytics
- Dashboard
- Site Page
- Portfolio Analytics
- Rank Tracker
- AI Visibility (AEO)
- Indexing
- Audit, Health, Uptime
- Backlinks
Providers
Tools
Delivery
Help