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

# Google search

> What Attensira records from Google: Search Console clicks, impressions and positions kept day by day with a 16-month backfill, and daily rank tracking with the AI Overview on each results page.

Attensira keeps two records of how your site does in Google, beside what the AI answer engines say about you:

* **Search Console**: what Google counted for your own site. Clicks, impressions and average position, per page and per search query, for every day Google reports.
* **Rank tracking**: where your site ranks for a list of tracked Google searches, read once a day. Each reading also keeps who else is on the page and whether Google showed an AI Overview.

Both are stored day by day, so you can compare a page's Google numbers with its AI citations, and both have the same rules as every other number in Attensira: a number nobody measured is `—` with a reason, never `0`. See [Reading the numbers](/measure/reading-the-numbers).

## Connecting Search Console

Search Console is a [plugin](/agent/plugins). Connect **Google Search Console** and choose the property for this workspace's site. Until it is connected, nothing is pulled and every Google column reads `—` with the reason *Search Console is not connected for this workspace*, never a zero.

### The first pull: sixteen months of history

Google keeps sixteen months of Search Console data and drops the oldest day every day. A day that falls off the end cannot be read again by anyone.

So the first time Attensira finds the connection, it pulls the whole sixteen months, one day at a time, oldest first: the oldest days are the ones about to be lost. The pull is paced at up to 30 days an hour per workspace, so a full history takes most of a day to arrive. It saves its place after every day, so an interruption costs at most the day it was on.

Once a day is stored, Attensira keeps it. Your history keeps growing past Google's own sixteen months.

If you switch the connection to a different property, the pull starts again from sixteen months back. Days from the old property are not mixed into the new one: until the new pull reaches them, they are not counted.

### Every day after that

Google reports Search Console with a lag of a few days, and a day's first figures still change for a day or two after that. Once a day Attensira pulls the day three days back and pulls the two days before it again, which is where a provisional day settles into its final numbers. A re-pull replaces the day; it never adds to it.

Days missed while the connection was broken are filled in on later passes, oldest first, up to two weeks of them per pass.

The newest days of any window are usually not reported yet. They read as *not recorded*, not as days with no clicks.

### When the connection breaks

If Google stops answering for your property, two things happen:

* An **Inbox** item, *Reconnect Search Console*, explains what is not being recorded. Reconnecting closes it, and the missed days fill in on their own.
* The Search Console lines on [Loop health](/agent/loop-health) show the pass as failed, with the reason.

Reconnect promptly. A day that falls past Google's sixteen months while the connection is broken is gone.

## Page totals and query detail

Search Console data is stored at two grains, and they are not interchangeable.

| Grain | One row per | Complete? |
| - | - | - |
| **Page totals** | page × day | Exact. Every impression Google counted for the page, including impressions for queries Google anonymises |
| **Query detail** | search query × page × day | The top 5,000 rows of each day by impressions. Anonymised queries are not in it at all |

Google leaves anonymised queries (rare or personal searches) out of any report that lists queries. Adding up query detail by page therefore **under-counts** every page that gets them, often by a large share. That is why page totals are their own pull and are never computed from query detail. Every per-page number in Attensira, including the **Google position** and **Google clicks** columns on the [Pages](/traffic/pages) grid, comes from page totals.

Query detail is what you read when you ask about a search query. When a day had more rows than are kept, that day is marked truncated, and any number by query that includes it is a floor: the queries kept are the top ones, not all of them.

### Position

Position is Google's average position, weighted by impressions: the same figure Search Console shows for the same pages and days. A row Google reported without a position adds its clicks and impressions but nothing to the average. A page with no impressions in the window has no position, `—`, never 0 or first.

### Which days count

A window counts only the days Attensira holds a pull of. Within those days, a page Google did not show at all is a measured 0 clicks and 0 impressions. Outside them (before the backfill reached them, or newer than Google has reported) the days are *not recorded*, and an answer that touches them says so.

## Rank tracking

Rank tracking reads Google's results for a list of tracked searches once a day.

### Which searches are tracked

The list is seeded from Search Console: each day, the searches that brought your site at least 10 impressions over the last four weeks of stored days, most impressions first, fill up to 50 slots. A workspace tracks at most 100 searches. Without Search Console there is nothing to seed from, so rank tracking starts once Search Console is connected and reporting.

Each search runs as a desktop Google search in your workspace's country and its language. The countries with their own location today are the US, UK, Canada, Australia, New Zealand, Ireland, India, Germany, France, Spain, Italy, the Netherlands, Sweden and Estonia. A workspace in any other country is searched from the US, in English, and every reading records the location it was searched in.

### What one reading holds

* **Your position**: the best organic position of any page on your domain in the first 30 results. Subdomains count (`blog.example.com` counts for `example.com`); a lookalike domain does not. If you are not in the first 30, there is no position: `—`, never 0.
* **Your ranking page**: the URL that held that position.
* **The top ten**: the first ten organic results, with each one's domain, URL and title, so you can see who outranks you.
* **The AI Overview**: whether Google showed one, which pages it cited, and whether any of them is yours.

### When a reading fails

A search that fails, is refused, or has not come back within 24 hours is stored as **unavailable**, with the reason in words. It has no position and no AI Overview reading. A missing reading is never written as a position, and it is never read as "not ranking".

### AI Overview: present, absent or unknown

Whether Google showed an AI Overview has three values, because "there was none" and "we could not see one" are different findings.

| Value | Meaning |
| - | - |
| `true` | Google showed an AI Overview. Its cited pages are kept |
| `false` | We asked Google's results to load the AI Overview, and none came back |
| `unknown` | The reading cannot say. Every unavailable day is `unknown` |

The share of days with an AI Overview counts only `true` and `false` days. Days that are `unknown` are left out of the share, not counted as absent, and the answer says how many there were.

## Day basis

Google's numbers and the AI answer engines' numbers are counted on different calendars, and every answer from `query_evidence` names which one in `day_basis`:

| `day_basis` | Calendar | Used by |
| - | - | - |
| `slot_day` | Your workspace's own day, the local day a prompt is read on | Share of voice, citations, positions in answers, deciding sources, claims |
| `search_console` | Google's own report day. Google counts Search Console days in Pacific Time | `gsc_clicks`, `gsc_impressions`, `gsc_position` |
| `utc` | The UTC calendar day | Rank tracking, AI traffic |

The same date label on two bases does not cover the same 24 hours. Compare trends across them by week or by window, not day against day.

## Asking for these numbers

The agent, and you over [MCP](/mcp/tools#query_evidence) or the [REST API](/api/endpoints#post-v1evidencequery), read the stored history with `query_evidence`:

| Metric | Value | `n` is | Group by |
| - | - | - | - |
| `gsc_clicks` | Clicks, a count | Impressions | `day`, `week`, `page`, `keyword` |
| `gsc_impressions` | Impressions, a count | Impressions | `day`, `week`, `page`, `keyword` |
| `gsc_position` | Average position | Impressions that carried a position | `day`, `week`, `page`, `keyword` |
| `serp_position` | Average of your daily positions | Days you ranked | `day`, `week`, `keyword`, `page` |
| `ai_overview_presence` | Share of days with an AI Overview, 0 to 1 | Days with a known answer | `day`, `week`, `keyword`, `page` |

For the Search Console metrics, `keyword` is the search query and reads query detail; without it, totals come from page totals. For rank tracking, `keyword` is the tracked search and `page` is your ranking page. A `page` key is the URL without its scheme, a leading `www.` or a trailing slash (`acme.com/pricing`), so the spellings Google and your site use for one page land on one row. These metrics take no filters other than the window.

What could not be measured comes back in `gaps`, by reason:

| Reason | Meaning |
| - | - |
| `not_connected` | Search Console is not connected for this workspace |
| `not_recorded` | These days have not been pulled yet: Google has not reported them, or the backfill has not reached them |
| `truncated_day` | Query detail on this day kept only the top rows, so numbers by query are a floor |
| `truncated` | The question had more groups than one answer reads; the ones with the most impressions are kept |
| `no_impressions` | A Search Console position over no impression that carried one |
| `not_populated` | No tracked search was read in this window |
| `not_ranked` | You were not in the results read, so there is no position |
| `unavailable` | Rank-tracking days that could not be read |
| `ai_overview_unknown` | Days that could not say whether an AI Overview was shown, left out of the share |

The agent's own live Search Console look-up, through the plugin, reads at most 100 rows a call. The daily pull and the backfill are not something an agent runs: they are the stored history, and `query_evidence` is how an agent reads it.

## Related

<Columns cols={2}>
  <Card title="Pages" href="/traffic/pages">
    Every page across AI answers and Google, side by side.
  </Card>

  <Card title="Before and after" href="/measure/before-and-after">
    How a shipped change is re-read, and the labels its result reads in.
  </Card>

  <Card title="Reading the numbers" href="/measure/reading-the-numbers">
    Why `—` and `0` are different findings.
  </Card>

  <Card title="Loop health" href="/agent/loop-health">
    Where a failed or blocked pull shows up.
  </Card>
</Columns>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.