> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aigrowthagent.co/llms.txt
> Use this file to discover all available pages before exploring further.

# How is my content performing in Google search?

> Read real Google Search Console performance — clicks, impressions, CTR, position — with the assumptions behind the numbers made explicit.

Ask your client:

> How is my AGA content performing in Google search over the last 28 days?

**Prerequisite:** `agent@aiseoagent.co` must be added to the site's Google
Search Console property with **Full** access (Search Console → **Settings** →
**Users 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, downloadable via the returned `downloadUrl` (capped
   pulls are auto-partitioned and reconciled, so the dataset 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

* [Search Console performance and the AGA split](/concepts#search-console-performance-and-the-aga-split)
  — property resolution, segmentation, and recency lag
* [Reading Search Console data correctly](/concepts#reading-search-console-data-correctly)
  — the full list of assumptions behind the numbers
* [Available MCP tools](/tools#google-search-console-gsc) — full
  input and output reference
