A stability gauge for your organic-search presence: it tracks how much your average position moves day to day, so a calm site stays calm and a turbulent one shows up before clicks fall.
At a glance
Ranking Volatility is a time-series measure of how much your Google Search Console average position swings from one day to the next across your tracked query set. It is plotted as a line over the selected period. A flat line near zero means your rankings are stable; a rising or spiky line means positions are churning, which is the earliest behavioural tell that a Google core update, a technical regression, or a content change is reshaping your organic footprint. The card answers “is my SEO stable right now?” before any clicks or impressions card visibly moves.
Calculation
Calculated automatically from your Google Search Console data. The detail backing this card is “Ranking Volatility over time”, and the line is built as follows:- We pull the Search Analytics API with
dimensions = [date, query]and thepositionmetric across the selected period, plus one extra leading day so the first plotted day has a prior-day baseline. - For every query present on both consecutive days, we compute the absolute position change
abs(position_D − position_D-1). A query that moved from 4.2 to 7.9 contributes 3.7; a query that held at 5.1 contributes 0. - Each day’s volatility score is the impression-weighted mean of those per-query deltas. Weighting by impressions stops a single near-zero-traffic query that bounces between page 8 and page 9 from dominating the signal.
- Queries that appear on only one of the two days (genuinely new or genuinely dropped) are excluded from the delta mean so they do not register as infinite movement; they surface instead on Queries Entering Top 10 and Queries Dropping from Top 10.
- The per-day scores are plotted as a single line over the period. Higher equals more turbulence.
Worked example
A UK outdoor-furniture retailer, Google Search Console connected, tracking roughly 1,800 queries that earn impressions in a typical week. The team is watching the volatility line across two weeks in May 26.
Three observations:
- Volatility moved first. On 09 May the score jumped from ~0.19 to 0.94 (roughly 5x baseline) while average position had barely shifted (11.5 to 11.9) and clicks were still near baseline. The line gave the team a two-day head start before the click dip on 10 to 11 May. That window is exactly when you want to know “do not push the planned template change this week”.
- The plateau told the team it was external, not self-inflicted. The deploy log was clean across 09 to 12 May, and the spike lined up with a widely reported core-update window. Had the spike instead matched a Friday template release, the read would have been “we caused this, roll back and re-test”, and the team would have paired this card with Pages Losing Traffic to find the affected URLs.
- The settle level matters more than the peak. By 13 May volatility was back near baseline (0.34), but average position settled at 12.1 versus the pre-update 11.4, a small net loss. The correct action was not to react during the turbulent days but to wait for the line to calm, then assess the new baseline against Position Trend and decide whether a targeted content refresh was worth it.
Sibling cards merchants should reference together
Reconciling against the source
Google Search Console has no native “volatility” line: this is a derived metric Vortex IQ builds on top of the daily position series. To sanity-check it against Google’s own tooling: In the Search Console Performance report:- Open Performance → Search results, enable the Average position metric, and set the date range to match the dashboard. Switch the chart to a daily view. A turbulent stretch in our volatility line should correspond to a visibly jagged or stepping average-position line in the native chart.
- Use the Compare mode (for example, the spike week vs the prior week) and sort the Queries tab by position change. The queries with the largest swings are the ones driving our impression-weighted score.
- Query
searchanalytics.querywithdimensions = ["date", "query"]and thepositionmetric for the same window. Reconstruct the per-query day-over-day deltas yourself; the impression-weighted mean of the absolute deltas should match our daily score within rounding. - Remember Google caps each API response at 1,000 rows per request by default, so a full reconstruction of a large site needs pagination via
startRow. Our pipeline paginates; a quick manual check that pulls only the top 1,000 queries will under-count long-tail churn slightly.
The Search Console UI is the source of truth for the underlying positions; the volatility line is our reading of how much those positions are moving.