Rankings: See Exactly What You Rank For
Rankings Page
A new page at /rankings with two tabs:
Keywords: Every keyword your site ranks for, with position, which page ranks for it, impressions, clicks, and CTR. Position changes show inline (▲/▼). Sortable by position, clicks, or impressions. Filterable by position bracket (Top 3, Top 10, 11-50, 51+) and direction (Improving, Declining).
Pages: Every page with search visibility, showing average position, how many keywords it ranks for, total impressions, clicks, and CTR.
Data comes from query_page_mappings, the same query-page cross-reference already synced daily from GSC. No new API calls.
For properties with limited data, the page falls back to ranking_summaries and marks early positions as “Testing” with a tooltip explaining that Google is still evaluating placement.
Free: first 100 rows. Pro: all data.
Bottom Bar
The old floating section navigator (up/down arrows) has been replaced with a bottom bar:
[7d] [28d] [90d] | Section ▼ | ⋮
- Date range pills on every data page, desktop and mobile. Replaces the desktop-only header picker.
- Section dropdown lists all page sections for quick jumping. Hides on single-section pages.
- 3-dot menu with Share, Pages, and Keywords links.
Navigation
The hamburger menu now shows on all screen sizes (was mobile-only). Rankings added to the menu between Shifts and Opportunities.
Performance
Added covering indexes on daily_rankings and ranking_summaries for dashboard queries. Dashboard load time for VPN (108K rows) dropped from 5.4s to 1.5s. getQuickWins() results cached for 5 minutes.
Chart Improvements
Dashboard charts now fill the full date range with zeros for missing days. Previously, low-traffic properties showed 3 data points on a 7-day view. Now you always see the full period.
Horizontal bar chart tooltips trigger on the full row, not just the bar itself. Minimum bar width set to 6px so tiny values are still visible and hoverable.