Skip to main content
Ask your client:
How is my AGA content performing in Google search over the last 28 days?
Prerequisite: [email protected] must be added to the site’s Google Search Console property with Full access (Search Console → SettingsUsers and permissions). Without it, the gsc_* tools cannot resolve a GSC property.

What the agent does

  1. gsc_get_context — confirms where the account publishes and which GSC properties hold its data (reverse-proxy URL wins over the CMS URL), plus the segmentation strategy used for the AGA-vs-main-domain split and a maturity block (how long the account has been publishing) that decides the comparison cadence.
  2. gsc_get_overview — site totals (clicks, impressions, CTR, position) and the daily trend for the last 28 days, split into AGA content vs the main domain with click/impression shares. Impressions lead — they are the AI-visibility signal; clicks are the human-traffic read — and interpretationHints carries the deterministic readings to state as findings.
  3. gsc_compare_periods with periodPreset"wow" while the account is in its first ~8 weeks publishing, "mom" or "qoq" after — for the period-over-period read, with growth shares for both impressions (impressionGrowthShare) and clicks (growthShare).
  4. Optionally, gsc_query_analytics with dimensions: ["page"] or ["query"] to drill into the pages or queries behind the totals.
Read impressions before clicks: AI traffic doesn’t click, so impressions measure AI visibility while clicks and CTR measure human traffic. A click decline is not an AI-visibility decline. For indexing coverage — what percent of published slugs have any impressions — the agent joins articles_search (statuses ["published"]) against a ["page"]-dimension pull or export on the slug. Pages published long ago with persistent zero impressions are retire candidates, diagnosed with gsc_inspect_url and gsc_list_sitemaps. For a deeper dive — for example, “which pages win impressions but no clicks?” — the agent switches to the export pipeline:
  1. gsc_export_dataset with dimensions: ["page", "query"] — pulls the full dataset to a local file (capped pulls are auto-partitioned and reconciled, so the file is complete by construction).
  2. gsc_query_export with groupBy: "page" — slices the file locally with no new API call, free to repeat with different groupings and filters.

How to read the result

Every performance response carries a meta block stating the assumptions behind its numbers. Check it before quoting a figure:
  • meta.aggregationFrame — which grouping the totals came from. gsc_get_overview answers in the property frame (the true site total); a ["page"] query runs about 5% higher by construction; a ["query"] query covers only named queries. Never compare totals across frames — pick one per analysis and name it.
  • meta.complete and meta.coverageRatio — whether the pull covered the whole named universe. When the API’s row cap was hit, the tools partition and re-pull automatically; coverageRatio (union ÷ an uncapped denominator) near 1 means full coverage. Gate impression-based claims on this; click counts survive capping either way.
  • meta.incompleteDays — the trailing ~3 days of the window, which always revise upward as GSC finalizes data. Never trend on them.
  • segments — the AGA-content vs main-domain split, with its strategy and confidence. When the split is unavailable the tools say so — never estimate it yourself.
Rows in query and export responses are pre-tagged so you can slice without parsing:
  • tags.queryShape classifies queries by length into human, ambiguous, and ai_shaped (natural-language prompts issued by AI systems — long, zero-click, and overwhelmingly desktop). Never blend the shapes into one CTR: AI-shaped zero-click means “no human present”, human-shaped zero-click means “ranked too low” — different problems, different fixes.
  • tags.pageClass separates canonical content pages from main_site (brand-query-driven, a different population), cms_origin (the CMS host indexed alongside the reverse proxy — a duplicate-content split worth escalating), and tenant_subdomain (other customers’ sites inside a sc-domain: property — exclude these).
  • tags.isWebStory marks Web Story twins of articles — AGA ships a Web Story per article under /web-stories/, so the same slug appears twice. Analyze Web Story URLs separately from the article URLs.
  • On ["page", "query"] pulls, meta.anonymization shows how much traffic has no visible query at all — typically 35–50% of impressions, with a higher CTR than named queries.
A CTR is a fraction (0.0028 = 0.28%), and position is impression-weighted within a row — re-weight by impressions when you aggregate, never average positions.

See also