Crawl-aware SEO pages, Search Console depth, AI landing pages, and no more false empties

Your own crawl now sits beside the logs on every SEO page. Search Console performance and queries are stored daily and reconciled against what Googlebot actually fetches. Slow queries can no longer show up as an empty page.

Crawl-aware SEO pages. If you have run the Site Crawler, its findings now sit next to the log data on Sitemap Coverage, Status Consistency, Soft 404s, Crawl Budget, Path Explorer and Redirects. Each row shows what the crawler saw: redirect target and hop count, noindex, canonical pointing elsewhere, depth and inlink count. Sitemap Coverage gains three tabs, Not indexable, Redirecting and Canonical elsewhere. Soft 404s show when the crawler agrees the page is thin. Crawl Budget directories show how much of the budget is going to indexable pages, and single-page index directories are grouped so the list reads as a site, not a file system. Redirect destinations come from the crawl, since logs only record the redirect itself. Pages without a crawl show one line pointing at the Site Crawler instead of an empty table.

Search Console depth. The nightly sync now stores daily impressions, clicks, CTR and position for the site and its top pages, the top 200 site queries, and the top queries for each of the top 200 pages. A new Search Performance page shows the trend for the selected period against the previous one, and a reconciliation of what Google has indexed against what Googlebot actually fetched in your logs, bucketed so the gaps are obvious: indexed but never fetched, fetched but not indexed, and so on. Per-page queries also appear on the URL detail page. On the public API as GET /public/v1/websites/{id}/search/performance, /search/queries?path= and /search/reconcile, with matching MCP tools and loglens search CLI commands.

Crawl Join reads today's logs too. Log-seeded crawls used to stop at the compaction boundary, which could be a day or two behind. They now read the compacted archive and the live table for the gap, and each crawl records how far its log evidence reaches.

A timeout is never an answer. When an analytics query runs past its deadline, the response is now always marked as still loading and the page keeps refreshing until the warm result lands. Previously a handful of views could show zero rows for a site that had plenty of data. This is enforced once at the API boundary so it covers every page, not only the ones we remembered to fix.

AI landing pages. A new AI Landing Pages view under Bots & AI shows which of your pages people actually arrive on from ChatGPT, Perplexity, Claude, Gemini, Copilot and the rest, with visits versus the previous period, a per-assistant breakdown, each page's share of human traffic, where those visitors went next within half an hour, and a bounce estimate. Filter by assistant and by country or segment. On the public API as GET /public/v1/websites/{id}/ai-landing, the MCP tool get_ai_landing_pages, and loglens ai-landing in the CLI.

← Link Map: your internal links as a map, crossed with what Google fetchesGoogle Analytics as a connected source: human outcomes next to your logs, and the measurement gap between them →
← All changelog entries