---
title: "SEO Operations"
slug: seo-operations
category: business
term_status: overlapping-synonym
evidence_status: verified
summary: "SEO Operations runs search engine optimisation as a managed programme: one intake for work, priorities set against policy and real capacity, repeatable production, and measurement that is honest about what search data cannot show."
audience: [Beginners, SEO managers and leads, Content and marketing leaders, Agency operations teams, Analysts reporting on organic search]
last_verified: 2026-10-23
key_takeaways:
  - "\"SEO operations\" is an informal label, used mostly in job titles; the practice behind it, running SEO as a programme, is real. This page owns the operating model and SEOps owns crawl, index and release engineering (an Atlas editorial split)."
  - "Send every request through one intake, apply policy gates (paid links, scaled content) before scoring, then cut the backlog to the real capacity of writers, SEOs and engineers."
  - "Search Console is the first-party source, but its tables omit anonymized queries and long-tail rows: brand plus non-brand usually falls short of the total, and average position is the topmost position averaged over impressions."
  - "Judge a change against a control group of similar pages; a plain before/after comparison mixes your change with seasonality, core updates and AI features."
  - "AI Overviews and AI Mode are counted in the Web search type; since 2026-08-31 Search Console also has a generative AI report (impressions) and a site-level opt-out control (as of October 2026)."
  - "You are responsible for what an agency does on your site: keep ownership of accounts, give auditors read-only access, and reject guaranteed rankings and paid links."
related: [seops, contentops, marketingops, analyticsops, webops, martechops, adops, releaseops]
---

## What SEO Operations is

### In 30 seconds

**SEO Operations is the way an organisation runs search engine optimisation (SEO) as a programme rather than a series of
favours.** Requests arrive through one intake, are checked against search policy, scored, and committed only when writers, SEOs
and engineers have the days to do them. Work follows written procedures and is judged by measurement that knows the limits of
search data.

When it works, anyone can see what the team is doing in search and why, and what last quarter's work changed. When it fails, an
agency reports rising "visibility" while sign-ups from search fall, and a template change ships that nobody in SEO saw.

For beginners, SEO and content leads, agencies and analysts. Sources last verified **2026-10-23**.

### At a glance

| Question | Short answer |
|---|---|
| Goal | A repeatable SEO programme whose contribution to the business is measured, not asserted |
| Primary users | SEO managers and leads, content leads, marketing leaders, agency account and delivery teams, analysts |
| In scope | Intake and prioritisation, search intent as a production input, content optimisation and internal linking as a process, SOPs, capacity, reporting and its data limits, policy governance, agency versus in-house |
| Handed off | Crawling, indexing, rendering, structured data and SEO checks in CI → [SEOps](../seops/); the content lifecycle beyond search → [ContentOps](../contentops/); Core Web Vitals measurement and fixes → [WebOps](../webops/); paid search → [MarketingOps](../marketingops/) |
| Prerequisites | [SEOps](../seops/) for the technical basics; spreadsheet skills; basic statistics help |
| Key outputs | Intake form, scored backlog, SOPs, measurement policy, monthly review, vendor policy, risk register |
| Term status | **Overlapping synonym**: an informal label for running SEO as a programme; no standard definition (evidence below) |

### The problem it solves

Most organisations already "do SEO"; the problem is unmanaged work. The "before" column is a composite of common failure
patterns, not a report about any company.

| Area | Without an operating model | With one |
|---|---|---|
| Requests | Arrive by chat, meeting and email; loudest wins | One intake; every item has an owner, a hypothesis and a size |
| Priorities | Whatever a tool's audit flagged red | Scored by expected impact, confidence and effort, cut to capacity |
| Engineering work | Tickets languish; SEO learns of template changes after release | An agreed lane in the engineering plan and a release check owned with [SEOps](../seops/) |
| Content | Volume targets; old pages decay unowned | Briefs from intent research, a refresh cycle, consolidation of overlaps |
| Reporting | Rank-tracker screenshots, total traffic | Non-brand clicks, conversions, tested changes, stated data gaps |
| Vendors | Agency holds the accounts; nobody reads its changes | You own accounts; read-only audits; change log; banned tactics written down |

The cost is real but hard to see. Google warns that hiring an SEO can "risk damage to your site and reputation" and that "you
are responsible for the actions of any companies you hire".[^hire] Changes can take hours or several months to show,[^starter] so
an unmanaged programme learns slowly from noisy data and confuses activity with results.

### What SEO Operations is not: naming, the SEOps split and boundaries

**Is the term established?** The practice is; the label is not. The US O*NET database lists "Search Marketing Strategists",
with SEO Consultant and SEO Strategist among reported job titles,[^onet] and Google publishes extensive guidance for site owners
and for people who hire SEOs.[^hire] But "SEO operations" has no standard definition or standards body. Job titles using it mean
different things: one agency's "Head of SEO Operations" led the consulting team and owned work quality,[^builtvisible] while a
2023 "SEO Operations Manager" posting described hands-on link building and keyword research.[^vv] Agencies also use "SEO ops"
for maps of the tasks, tools and skills an enterprise SEO programme needs.[^ovrdrv] This page therefore classifies the label as an **overlapping synonym** for running SEO as a
programme.

::: decision Editorial distinction: SEO Operations versus SEOps
The Atlas has two pages on one field. **SEOps** treats SEO as engineering: crawling, indexing, canonicals, structured data,
rendering, log files, CI checks. **SEO Operations** (this page) treats it as a programme: intake, prioritisation, production,
capacity, measurement, governance, agencies. This split is the Atlas's choice, not an industry standard; many practitioners use
the two names interchangeably.
:::

SEO Operations is also not:

- **Technical SEO.** This page gets a canonical fix into the engineering plan and judges its effect; diagnosing and
  implementing it is on [SEOps](../seops/).
- **Paid search.** Google says advertising "won't have any effect on your site's presence in our search results".[^hire] Paid
  search campaigns are performance marketing ([MarketingOps](../marketingops/)); [AdOps](../adops/) covers ad serving and
  programmatic display.
- **Gaming an algorithm.** Google's spam policies now include attempts to manipulate generative AI responses in Search.[^spam]
- **A promise.** "No one can guarantee a #1 ranking on Google."[^hire]

## Where it comes from and where it sits

### Origins and evolution

No documented origin exists for "SEO operations"; it appears mostly in job titles and agency material (this Atlas's reading of
the evidence above). Milestones that shape how programmes run today:

- **2015:** Google rebranded Webmaster Tools as Search Console, noting users who were marketers and SEO experts as well as
  webmasters.[^gsc-2015]
- **October 2022:** Google replaced its Webmaster Guidelines with Search Essentials;[^ser-essentials][^hire] their spam
  policies are the closest thing SEO has to a rulebook.
- **November 2023:** Google Analytics 4 removed first-click, linear, time-decay and position-based attribution.[^ga-attr]
- **2024–2026:** AI Overviews and AI Mode changed results pages;[^ai-features] on 2026-08-31 a generative AI report and an
  opt-out control reached all sites.[^genai-report][^genai-control]

### Glossary and mental model

- **Query, impression, click, CTR:** what someone searched; a link to your site was shown (for most results, on the current
  results page, even if not scrolled into view); the person left Google for your page; clicks ÷ impressions.[^metrics-def]
- **Average position:** the topmost position of your site (or page) in results, averaged over impressions; Google calls it "a
  complex metric that can be misleading".[^metrics-def]
- **Anonymized queries:** queries hidden from Search Console tables for privacy; they still count in chart totals.[^deepdive]
- **Brand / non-brand:** queries that do or do not name you; non-brand is the usual measure of demand SEO captured.
- **Search intent:** what the person wants. Google's rater guidelines use Know (including Know Simple), Do, Website and
  Visit-in-person intents.[^sqeg]
- **Cannibalisation:** several of your pages competing for one intent.
- **Content decay:** a page losing clicks because it went stale or the results page changed.
- **Core update:** a broad change to Google's ranking systems, made several times a year; broad core updates are announced on
  the ranking-updates list, smaller ones are not.[^core]
- **Manual action:** a penalty applied after a human reviewer at Google finds pages that break spam policies.[^manual]
- **E-E-A-T:** experience, expertise, authoritativeness and trust; reflected by Google's systems, not a ranking factor
  itself.[^helpful][^starter]
- **AEO / GEO:** answer engine and generative engine optimisation; for its AI features Google calls this "still SEO".[^genai-opt]

#### A mental model: a portfolio of bets read through a fogged window

1. **A portfolio of bets.** Every item (a refresh, a template fix, a new guide) is a bet with a payoff, a confidence and a cost.
   You cannot know which will pay, so you size bets, cap risky exposure and keep a flow of small, testable ones.
2. **A fogged window.** Results arrive through data that is delayed, partial (anonymized queries, row limits, declined consent)
   and moved by forces you do not control (seasonality, core updates, AI features). Clean the window where you can; state where
   you cannot.

Failed programmes forget one picture: they bet without measuring, or watch dashboards without a portfolio.

### How SEO Operations relates to other Ops

::: figure Where SEO Operations sits among its neighbours
```mermaid
flowchart TB
  SEOOPS["SEO Operations: intake, priorities, production, measurement, governance"]
  SEOPS["SEOps: crawl, index, render, CI checks"]
  CONTENT["ContentOps: content lifecycle"]
  WEB["WebOps: speed, Core Web Vitals, uptime"]
  MKT["MarketingOps: campaigns, leads, attribution"]
  ANALYTICS["AnalyticsOps: certified metrics"]
  ADS["Paid search and other advertising"]
  SEOOPS -->|"technical tickets"| SEOPS
  SEOPS -->|"index health, release checks"| SEOOPS
  SEOOPS -->|"briefs, refresh list"| CONTENT
  WEB -->|"Core Web Vitals reports"| SEOOPS
  SEOOPS -->|"organic leads and pipeline"| MKT
  ANALYTICS -->|"metric definitions"| SEOOPS
  ADS -.->|"no effect on organic ranking"| SEOOPS
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class SEOOPS core
  class SEOPS,CONTENT,WEB,MKT,ANALYTICS,ADS neutral
```
Text equivalent: SEO Operations, in the middle, swaps technical tickets for index health and release checks with SEOps,
sends briefs to ContentOps, receives Core Web Vitals reports (WebOps) and metric definitions (AnalyticsOps), and passes
organic leads to MarketingOps. A dotted line: advertising has no effect on organic ranking.
:::

| Neighbour | Shared scope | Their focus | This page's focus |
|---|---|---|---|
| [SEOps](../seops/) | Search Console, spam policies, Core Web Vitals | Index coverage, crawl diagnostics, CI checks, staying compliant release by release | Performance reporting and its limits, governance, which technical work gets done |
| [ContentOps](../contentops/) | Briefs, refreshes, governance | Content models, workflow, reuse, localisation, retirement | Search inputs: intent, demand map, internal links, refresh priority |
| [WebOps](../webops/) | Core Web Vitals | Measuring and fixing them (see its [Core Web Vitals playbook](../webops/#playbook-fixing-core-web-vitals)) | Reporting them alongside search results |
| [MarketingOps](../marketingops/) | Attribution, lead flow, search results pages | Campaigns including paid search, scoring, the funnel contract | Organic search as a source of demand |
| [AnalyticsOps](../analyticsops/) | Dashboards, metric definitions | Certifying metrics (see its [certification playbook](../analyticsops/#playbook-certifying-a-metric)) | Search-specific metric rules |
| [MarTechOps](../martechops/) | Tags, consent mode | Stack and tag infrastructure | What consent loss does to organic numbers |
| [AdOps](../adops/) | Pages that carry both content and display ads | Ad serving, programmatic supply chain | Organic only |

Core Web Vitals show the split: Google says good scores align "with what our core ranking systems seek to reward";[^cwv]
WebOps fixes them, SEOps explains their search role, this page reports them beside search outcomes.

## Principles and operating model

### Charter and principles

No official manifesto for SEO operations exists. The following charter is **this Atlas's proposal**.

> **Mission.** Grow the value the organisation gets from organic search, within search-engine policies, by running SEO as a
> measured portfolio of work the business can see and steer.
>
> **Non-goals.** No promised rankings, no links bought to pass ranking credit, no pages made mainly for search engines, no
> numbers we cannot reproduce.

1. **People-first content, then SEO.** Google says SEO "can be a helpful activity when it is applied to people-first content,
   rather than search engine-first content".[^helpful] Trade-off: you decline topics where you have nothing useful to say.
2. **Policy before priority.** Items that conflict with spam policies are rejected before scoring, so a high score cannot
   smuggle them in.
3. **One backlog, real capacity.** Commitments never exceed the days writers, SEOs and engineers actually have.
4. **Hypothesis, then evidence.** Each item says what should change and how you will know.
5. **Own the accounts and the data.** The organisation, not a vendor, owns Search Console, analytics and the change log.
6. **Report the fog.** Every report states what data is missing and how big the gap is.
7. **Maintain what you publish.** Each page has an owner and a review date.

### Building blocks

| Block | What it is | Why it matters |
|---|---|---|
| Search demand map | Topics and queries by intent, each mapped to one target page | Prevents cannibalisation and orphan topics |
| Page inventory | Indexable pages with owner, intent, last substantive update | Makes decay and ownership visible |
| Intake and backlog | One form, one scored list, explicit cut line | Turns requests into decisions |
| SOPs | Procedures for briefs, refreshes, merges, technical hand-off, reporting | Repeatable quality across people and vendors |
| Measurement policy | Metric definitions, the brand rule, segments, gaps, test rules | Ends arguments about whose number is right |
| Governance pack | Banned tactics, vendor rules, access register, AI content rule | Limits policy and legal risk |

### Roles, ownership and RACI

Titles vary; the jobs below exist in any working programme, even when one person holds several.

| Activity | SEO lead | Content lead | Engineering (with [SEOps](../seops/)) | Analyst | Marketing leader |
|---|---|---|---|---|---|
| Intake and scoring | A/R | C | C | C | I |
| Demand map and briefs | A | R | I | C | I |
| Content refresh and consolidation | A | R | C (redirects) | C | I |
| Technical items (templates, canonicals) | A | I | R | I | I |
| Measurement policy and reports | A | I | I | R | C |
| Policy and vendor governance | R | C | C | I | A |
| Quarterly plan and budget | R | C | C | C | A |

R = responsible, A = accountable, C = consulted, I = informed. Key skills: intent analysis, editorial judgement, enough
technical literacy to write a good ticket, basic statistics, and saying "not this cycle" with reasons.

### Lifecycle of an SEO work item

Every item moves through the same states: **proposed**, **gated** (policy and duplicate check), **scored**, **committed** or
**parked**, **in production**, **shipped** (dated and annotated), **measuring** (a fixed window of several weeks, given Google's
advice on timing[^starter]) and **closed** with a verdict: worked, no detectable effect, or harmed. "No detectable effect" still
calibrates future confidence scores.

### Operating model and governance

| Cadence | Who | Inputs | Outputs |
|---|---|---|---|
| Weekly triage (30 min) | SEO, content and engineering leads | New intake | Gated, scored items |
| Cycle planning (2–4 weeks) | Same plus analyst | Backlog, capacity | Committed list, cut line |
| Monthly review | SEO lead, analyst, marketing leader | Measurement pack | Verdicts, decay list, risks |
| Quarterly planning | Leadership | Results, budget | Themes, capacity split, vendors |
| Event-driven | SEO lead, SEOps | Traffic alert, core update, manual action | [Runbook](#worked-runbook-organic-clicks-fell-by-a-third) |

Escalation: policy questions go to the accountable marketing leader (and legal where law applies); a release that may harm
search goes to its engineering owner through the gate defined with [SEOps](../seops/) and [ReleaseOps](../releaseops/).

## Architecture and workflow

### Reference architecture: the programme as a system

For a business function the architecture is a process: where work comes from, the gates it passes, its production lanes, and
the loop that feeds results back.

::: figure Process architecture of an SEO programme
```mermaid
flowchart TB
  IN["Signals: demand research, Search Console, requests, audits"]
  INTAKE["One intake form"]
  GATE{"Policy and duplicate gate"}
  REJ["Rejected with reason"]
  SCORE["Score and cut to capacity"]
  C["Content lane: briefs, refresh, merge"]
  T["Technical lane: engineering tickets"]
  L["Earned links and digital PR"]
  SHIP["Ship with date and annotation"]
  MEAS["Measure against control"]
  REV["Monthly review: verdicts"]
  IN --> INTAKE --> GATE
  GATE -->|"fails"| REJ
  GATE -->|"passes"| SCORE
  SCORE --> C
  SCORE --> T
  SCORE --> L
  C --> SHIP
  T --> SHIP
  L --> SHIP
  SHIP --> MEAS --> REV
  REV -.->|"calibrate scores, update demand map"| IN
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class INTAKE,SCORE,SHIP,MEAS,REV core
  class GATE decision
  class REJ risk
  class IN,C,T,L neutral
```
Text equivalent: Signals (demand research, Search Console, requests, audits) feed one intake form. A policy and duplicate
gate rejects an item with a reason or passes it to scoring and the capacity cut. Work goes to the content, technical or
earned-links lane, ships with a date, is measured against a control and judged at the monthly review, which feeds calibrated
scores and an updated demand map back into the signals.
:::

Three design choices carry most of the weight:

- **The gate comes before the score.** Otherwise an attractive estimate ("500 city pages") pushes people into tactics the spam
  policies name.[^spam]
- **The technical lane is a contract.** Engineering agrees a standing share of capacity and SEOps defines release checks;
  without it, the backlog fills with tickets nobody builds.
- **Earned links are a lane, bought links are not.** Paid placements are fine only when qualified with `rel="sponsored"` or
  `rel="nofollow"`; links that pass ranking credit for money are link spam.[^spam]

### End-to-end workflow: a content refresh from signal to verdict

::: figure Handoffs in one content refresh
```mermaid
sequenceDiagram
  participant AN as Analyst
  participant SEO as SEO lead
  participant CL as Content lead
  participant EN as Engineering
  AN->>SEO: Decay alert: guide lost 35% clicks
  Note over SEO: Check dates, seasonality, cannibalisation
  SEO->>CL: Brief: intent, gaps, merge two pages
  CL->>SEO: Draft for search review
  SEO->>CL: Approved, with redirect map
  CL->>EN: Publish merge, redirect old URL
  EN->>CL: Redirect live, release noted
  CL->>SEO: Shipped, with date
  SEO->>AN: Annotate, start 6-week window
  AN->>SEO: Verdict versus control pages
```
Text equivalent: The analyst flags a guide that lost 35% of its clicks. The SEO lead checks dates, seasonality and
cannibalisation, briefs the content lead, reviews the draft and approves it with a redirect map. The content lead has
engineering publish the merge and redirect; engineering confirms. The SEO lead annotates the ship date and starts a six-week
window; the analyst returns a verdict against control pages.
:::

**Happy path.** The merge and redirect ship in one cycle and six weeks later the page beats its control group.

**Exception paths.** *Seasonal:* sixteen months of data show the same dip last year;[^debug] close the alert. *Core update
rolling out:* wait at least a full week after it completes;[^core] re-check. *Redirect cannot ship:* hold the merge too. *No detectable effect:* record it and lower
confidence for similar refreshes.

## Practices, frameworks and tools

### Core practices and playbooks

#### Playbook: intake and triage

1. Every request uses the [intake form](#artefact-1-the-intake-form); chat requests get a link to it.
2. **Gate** within a week: spam policy conflict, duplicate page or queued item, legal or brand review. Rejections get a reason.
3. **Score** passing items (see [prioritisation](#methods-standards-and-frameworks)).
4. **Cut** to capacity at planning; parked items are re-scored when data changes.
5. **Accept** only items with an owner, ship date, hypothesis and measurement window.

#### Playbook: keyword research and search intent as a production input

Keyword research feeds the demand map; it is not a deliverable in itself.

1. Collect queries from your Search Console data, from customer language in sales and support, and from keyword tools.
2. Treat volumes as rough: Keyword Planner shows estimates averaged over 12 months by default, including close variants;[^kp]
   Google Trends is a sample normalised to 0–100, with noise added and low-volume terms shown as zero.[^trends] Rank options
   with them, and do not turn them into point forecasts: if leaders need a forecast, give a range with stated assumptions and
   compare it with the verdicts each quarter.
3. Classify intent (Know, Do, Website, Visit-in-person)[^sqeg] from the current results page, not just the words.
4. Map each intent cluster to **one** page; two pages for one intent is a merge candidate.
5. Write down why you can serve the intent better than current results. If you cannot, do not write the page.

#### Playbook: briefs, optimisation and internal linking

A brief states the reader, intent, questions to answer, evidence and first-hand experience to show, and the pages that should
link to it. Google's "Who, How, and Why" questions (who made it, how, including automation, and why) make a good
checklist.[^helpful] On internal links, Google's rule of thumb is: "Every page you care about should have a link from at least
one other page on your site."[^links] Review against the brief, not a keyword-density score: Google has no preferred word count
and ignores the meta keywords tag.[^starter][^helpful]

#### Playbook: refresh, consolidate or prune

| Signal | Likely action | Check first |
|---|---|---|
| Clicks falling, content outdated | Refresh substantially | Seasonality; a core update in progress |
| Two pages ranking for one intent | Consolidate into one, redirect the other | Which page has the links and conversions |
| Page cannot meet any real need | Prune or exclude from Search | Whether it serves users who arrive directly |
| Impressions steady, clicks falling | Rewrite title and snippet | AI features or rich results on the results page |

Google calls deleting content "a last resort"; wanting to delete whole sections suggests they were made for search engines
first.[^core]

#### Playbook: handing technical work to engineering

Write tickets as engineers want them: template or URL pattern, evidence, expected behaviour, acceptance test, risk.
[SEOps](../seops/) owns diagnosis and release checks; this page owns getting the work into the plan. Agree in advance which
search signals can block a release ([ReleaseOps](../releaseops/)), not on launch day.

#### Playbook: capacity planning

Count person-days per lane after meetings, maintenance and support. Two Atlas heuristics, not benchmarks: reserve a fixed share
of content capacity for refreshes before planning new pages, because every page creates maintenance work; and if completed days
fall below about 80% of committed days for three cycles, you are planning against imaginary capacity.

### Methods, standards and frameworks

There is **no standard** for running an SEO programme. What exists:

| Kind | Example | Status |
|---|---|---|
| Search-engine rules | Google Search Essentials and spam policies[^spam] | Mandatory to appear in Google; enforced by demotion or manual action |
| Search-engine guidance | Helpful content, SEO Starter Guide, generative AI guidance[^helpful][^starter][^genai-opt] | Recommendations from the engine itself |
| Rater guidelines | Search Quality Evaluator Guidelines[^sqeg] | Evaluate Google's systems; ratings do not directly change rankings[^genai-content] |
| Prioritisation | RICE: "total impact per time worked"[^rice] | Product method, adapted here |
| Experimentation | Page-bucket tests;[^searchpilot] CausalImpact[^causalimpact] | Established statistics; tools differ |
| Law | Consumer rules on fake reviews (for example the US FTC rule[^ftc]) | Mandatory in their jurisdiction |

**Prioritisation in practice.** RICE uses impact steps of 3, 2, 1, 0.5 and 0.25 and confidence of 100%, 80% or 50%.[^rice]
[Artefact 2](#artefact-2-the-scoring-rubric) adapts each field to SEO. The score ranks; it does not forecast
([Lab 1](#lab-1-beginner-score-and-cut-a-backlog-to-capacity)).

### Tooling landscape

Named tools are examples, not endorsements. Google says third-party tools "don't have access to our internal ranking data"
and that it does not evaluate them.[^thirdparty]

| Category | Job | Examples | Selection criteria and risks |
|---|---|---|---|
| First-party search data | Clicks, impressions, index status | Google Search Console; Bing Webmaster Tools | Row limits, anonymization |
| Web analytics | Organic sessions and conversions | Google Analytics 4 or similar | Consent loss, attribution model |
| Demand research | Query ideas, relative volume | Keyword Planner, Google Trends, keyword tools | Estimates differ; ranges, not point forecasts |
| Crawlers and auditors | Broken links, orphan pages, missing tags | Desktop or cloud crawlers | Red flags are not priorities |
| Rank tracking | Positions for a fixed query set | Commercial trackers | Results vary by time, place and device;[^perf] trends only |
| Workflow | Intake, backlog, briefs | Issue trackers, shared docs | Link items to ship dates and outcomes |
| Warehouse and BI | Long history, joins, segments | BigQuery bulk export, BI tools | Bulk export excludes anonymized queries[^bulk] |

### Automation and AI

Automate data work (API pulls, decay alerts, orphan-page checks, report assembly); keep judgement human.

Generative AI fits inside the policy. Google says AI can help with research and structure, but generating many pages without
added value may violate the scaled content abuse policy, and all AI-generated content, including titles, meta descriptions,
structured data and alt text, should be fact-checked by a person.[^genai-content] Scaled content abuse applies "no matter how
it's created".[^spam] A workable rule: AI drafts and suggests; a named human approves and owns every published page.

On AI search features, Google says (as of October 2026) there are no extra requirements, no special files or schema, and that
llms.txt files neither help nor harm in Google Search.[^ai-features][^genai-opt]

## Measuring SEO honestly

### What Search Console data can and cannot tell you

Search Console's documented limits:

- **Anonymized queries.** Queries not issued by "more than a few dozen users over a two-to-three month period" are hidden from
  tables but counted in chart totals. When you filter by query, they disappear, so "contains brand" plus "does not contain
  brand" adds up to less than the total.[^deepdive]
- **Row limits.** The interface table and export show up to 1,000 rows; the API returns up to 25,000 rows per request and, per
  Google's 2022 explanation, up to 50,000 rows per day per site per search type.[^deepdive][^api] The BigQuery bulk export
  gives all available rows except anonymized queries.[^bulk]
- **Aggregation.** By property, several results from your site for one query count as one impression at the topmost position;
  by page, each URL counts separately. CTR and position are "generally higher when aggregating by property".[^about-data]
- **Average position:** a knowledge panel at position 6 can be more prominent than a link at 3, so watch changes, not
  absolutes.[^metrics-def]
- **Time.** Data usually arrives in two to three days; days are labelled in Pacific Time; the newest data can be
  preliminary.[^discrep][^about-data] Search Console keeps 16 months, so store your own history if you need longer.[^ga-gsc][^debug]
- **AI features.** AI Overviews and AI Mode count in the Web search type; an AI Overview occupies one position shared by its
  links, and an AI Mode follow-up is a new query.[^ai-features][^metrics-def] The generative AI performance report (all sites
  since 2026-08-31) shows impressions by page, country, device and date; its help page describes no clicks metric.[^genai-report]
- **Other engines.** Search Console covers Google only. Bing Webmaster Tools reports Bing clicks, impressions and CTR;[^bing-perf]
  its AI Performance report (public preview since February 2026) counts citations in Copilot and Bing's AI summaries.[^bing-ai]
  An Atlas rule for multi-market programmes: report each engine that matters, regional ones included, from its own data, side
  by side, not summed.

### Joining search data to business outcomes

Search Console stops at the click; outcomes live in analytics and CRM systems, which see a different slice of reality.

::: figure From search demand to revenue, and where the data leaks
```mermaid
flowchart TB
  Q["Searches for your topics"]
  IMP["Impressions"]
  CLK["Clicks to your site"]
  SES["Organic sessions in analytics"]
  CONV["Conversions"]
  REV["Pipeline or revenue"]
  L1["Leak: anonymized queries, row limits"]
  L2["Leak: AI answers, rich results, zero-click"]
  L3["Leak: declined consent, blocked scripts"]
  L4["Leak: attribution model choices"]
  Q --> IMP --> CLK --> SES --> CONV --> REV
  IMP -.-> L1
  CLK -.-> L2
  SES -.-> L3
  CONV -.-> L4
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  class Q,IMP,CLK,SES,CONV,REV core
  class L1,L2,L3,L4 risk
```
Text equivalent: Searches lead to impressions, clicks, sessions, conversions and revenue. Data leaks at impressions
(anonymized queries, row limits), clicks (AI answers, rich results), sessions (declined consent) and conversions
(attribution choices).
:::

Practical rules:

1. **Right number, right question.** Search Console for visibility and clicks; analytics for behaviour and conversions. Google
   cites privacy, processing, time lag, time zones and JavaScript-only tracking as reasons they differ.[^discrep]
2. **Know your channel definition.** GA4's default "Organic Search" channel includes visits from AI Overviews and AI Mode,
   while visits from assistants such as ChatGPT, Gemini or Copilot fall in a separate "AI Assistant" channel; the default
   channel group cannot be edited (as of October 2026).[^ga-channels] Report assistant referrals next to organic search, not
   inside it.
3. **Know your consent gap.** Analytics misses users who decline cookies; modelling fills it only above documented thresholds
   (for example, 1,000 events a day with analytics storage denied for 7 days).[^ga-consent]
4. **Know your attribution model.** GA4 offers data-driven and last-click models; an allocation rule is not proof of
   cause[^ga-attr] (see [MarketingOps on attribution](../marketingops/#what-attribution-models-do-and-do-not-tell-you)).
5. **Segment brand from non-brand,** and report the share that could not be segmented, as
   [Lab 2](#lab-2-intermediate-read-a-search-console-export-without-fooling-yourself) shows.

### Proving a change worked

A before/after chart of one page is common and weak evidence: seasonality, core updates, competitors and AI features move
the same line.

Compare **groups of similar pages** instead: change one, leave a control alone. User-level A/B tests do not work for SEO because
a crawler is effectively one visitor, so specialist tools split pages into similar buckets and forecast what the changed group
would have done without the change.[^searchpilot] The idea comes from counterfactual methods such as CausalImpact, a Bayesian
structural time-series model.[^causalimpact] [Lab 3](#lab-3-advanced-measure-a-change-with-a-control-group) shows a simple
version. Variants on separate URLs follow Google's testing rules: no cloaking, `rel="canonical"` to the original, 302 not 301,
and end promptly.[^abtest]

### AI features and zero-click searches

Expect fewer clicks per impression on some queries. In a Pew Research Center analysis of the browsing of 900 US adults in March
2025, users clicked a traditional result in 8% of visits to results pages with an AI summary versus 15% without one, and clicked
a link inside the summary in 1% of visits.[^pew] Google said the study used "a flawed methodology and skewed queryset that is not
representative of Search traffic" and that it had not seen significant drops in aggregate web traffic;[^register] Google also
says clicks from results pages with AI Overviews are "higher quality".[^ai-features] Both are claims about averages; your site's
effect depends on your queries: track CTR by intent group, watch the generative AI report, and value clicks by conversion.

Since 2026-08-31 owners can exclude a site from AI Overviews, AI Mode and Discover's generative AI features in Search Console.
That removes links and grounding there; Google says it is not a ranking signal elsewhere and does not affect AI training, which
Google-Extended governs.[^genai-control] It is a business decision with a measurable cost, not a technical toggle.

## SEO Operations in practice

### Reference implementation: operating artefacts

A minimal working set for a team of three to ten people. Adapt the fields; keep the gates.

#### Artefact 1: the intake form

_Example status: YAML syntax-checked by the validator; field names are this page's proposal._

```yaml
# seo-intake.yaml - one file (or form submission) per request
id: SEO-2026-118
requested_by: product-marketing
date: 2026-10-20
title: Refresh "CRM pipeline stages" guide and merge the duplicate article
lane: content            # content | technical | links | reporting
target_pages:
  - https://www.example.com/guides/sales-pipeline-stages
  - https://www.example.com/blog/pipeline-stages-explained   # merge, then redirect
intent: Know             # Know | Do | Website | Visit-in-person
hypothesis: >
  One stronger page for the intent will recover the 35% click loss since June
  without losing the conversions the blog post currently drives.
evidence:
  - Search Console pages report, last 3 months vs previous period
  - both URLs receive impressions for the same top 20 queries
policy_check:
  spam_policies_reviewed: true
  paid_or_exchanged_links: false
  ai_generated_drafting: assisted   # none | assisted | generated
  legal_review_needed: false
estimates:
  reach_monthly_impressions: 42000
  impact: 2            # 0.25, 0.5, 1, 2, 3
  confidence: 0.8      # 0.5, 0.8, 1.0
  effort_days: {content: 3, seo: 1, engineering: 0.5}
measurement:
  metric: non-brand clicks to the surviving URL
  control: 20 guides in the same section, untouched this cycle
  window_weeks: 6
owner: content-lead
```

#### Artefact 2: the scoring rubric

| Field | How to estimate | Guardrail |
|---|---|---|
| Reach | Monthly impressions of affected pages (Search Console), or estimated searches for new pages | New-page estimates come from ranges in tools; mark them low confidence |
| Impact | 3 = transforms the page's usefulness; 1 = clear improvement; 0.25 = cosmetic | No impact score above 1 without a stated reason |
| Confidence | 1.0 = tested on similar pages; 0.8 = documented by Google or strong evidence; 0.5 = hunch | Hunches can be tested cheaply first |
| Effort | Person-days across all lanes, including review and redirects | Engineering days count even if "small" |
| Gate (before scoring) | Spam policies, duplicates, legal and brand review | A failed gate is a rejection, not a low score |

#### Artefact 3: the weekly non-brand query pull

_Example status: JSON syntax-checked; fields checked against the Search Analytics API reference (updated 2026-08-11);
not sent (needs a verified property and OAuth with the `webmasters.readonly` scope)._[^api]

```json
{
  "startDate": "2026-10-12",
  "endDate": "2026-10-18",
  "dimensions": ["query", "page"],
  "type": "web",
  "dimensionFilterGroups": [
    {
      "groupType": "and",
      "filters": [
        {
          "dimension": "query",
          "operator": "excludingRegex",
          "expression": "(?i)\\bacme(crm)?\\b"
        },
        {"dimension": "country", "operator": "equals", "expression": "gbr"}
      ]
    }
  ],
  "aggregationType": "auto",
  "rowLimit": 25000,
  "startRow": 0,
  "dataState": "final"
}
```

POST it to the property's `searchAnalytics/query` method (a Domain property's site URL is `sc-domain:example.com`). The
brand rule is the one stored in the measurement policy and reused in Lab 2: RE2 is case-sensitive unless the expression
starts with `(?i)`,[^re2] and `\b` stops "acme" matching inside other words. The query filter drops anonymized queries, so the
result is a lower bound; pull the unfiltered total too, so reports can show the gap.[^deepdive]

#### Artefact 4: the vendor and access policy

```text
SEO VENDOR AND ACCESS POLICY (one page)
1. Ownership: our organisation owns Search Console, analytics, tag manager and
   the domain. Vendors get named user accounts, never shared logins.
2. Audits: prospective vendors get a Search Console restricted user (view
   only), never owner, until a contract is signed.
3. Changes: every change a vendor makes is logged (date, URL or template, why)
   and reviewed by our SEO lead before release.
4. Tag manager: vendors get Edit or Approve rights, never Publish; our owner
   reviews and publishes every container version.
5. Banned: guaranteed rankings; links that pass ranking credit in exchange for
   money, goods or services; link exchanges of any size (house rule); private
   blog networks; doorway or scaled pages without user value; fake or
   incentivised reviews.
6. Required: vendors cite official search-engine documentation or their own test
   data for recommendations, and label AI-drafted content.
7. Offboarding: remove the vendor's accounts and verification tokens within one
   working day of contract end; review the change log.
```

Sources for each line: Google advises read-only Search Console access for audits and says you should never have to link to
an SEO;[^hire] a former verified owner can regain access until their token is removed;[^perms] in Tag Manager, Edit and
Approve cannot publish, and only Publish pushes changes live;[^gtm-perms] buying or selling links for ranking purposes is link
spam, and Google names "excessive" link exchanges, so banning all exchanges is stricter than Google;[^spam] the US FTC's Consumer Reviews and Testimonials Rule (in effect since 2024-10-21) covers buying and selling fake
reviews, and courts can impose civil penalties for knowing violations.[^ftc] Other jurisdictions differ; ask counsel.

### Hands-on labs

Three labs on **synthetic data**, Python 3.8+ standard library only: no accounts, cost or personal data. Each was run on
2026-10-23 exactly as printed (Python 3.8.10, Ubuntu Linux); expected outputs are copied from those runs.

#### Lab 1 (beginner): score and cut a backlog to capacity

**Objective.** Apply policy gates before scoring, rank with a RICE-style score, and commit only what capacity allows.
**Prerequisites.** Python 3.8+. **Time.** 20 minutes. **Risk.** None.

1. Create `~/seo-ops-labs/lab1` and save this as `backlog.csv`:

```csv
id,title,lane,reach,impact,confidence,effort_days,notes
S-101,Refresh pricing guide (stale 2024 figures),content,42000,2,0.8,3,
S-102,Merge three overlapping onboarding articles,content,18000,1,0.8,4,
S-103,Fix internal links to orphaned integration pages,seo,9000,1,1.0,1,
S-104,Template: add product FAQ section to category pages,eng,120000,0.5,0.5,6,
S-105,Buy 40 guest-post links from vendor list,links,60000,2,0.5,2,paid links
S-106,New comparison page for top competitor query,content,15000,2,0.5,5,
S-107,Rewrite title tags on 25 low-CTR pages,seo,80000,0.5,0.8,2,
S-108,Fix canonical tags on faceted category URLs,eng,95000,1,0.8,4,
S-109,Generate 500 city landing pages with AI,content,200000,1,0.5,3,scaled ai pages
S-110,Annual refresh of top 10 how-to guides,content,30000,1,0.8,6,
```

2. Save the script as `triage.py`.

_Example status: verified by execution on 2026-10-23 (Python 3.8.10, standard library)._

```python
"""Score an SEO backlog, apply policy gates, and cut it to team capacity."""
import csv
import sys

CAPACITY = {"content": 10, "seo": 4, "eng": 5}  # person-days available this cycle
BLOCKED = {
    "paid links": "link spam policy (paid links must not pass ranking credit)",
    "scaled ai pages": "scaled content abuse: near-identical pages, no user value",
}


def load(path):
    with open(path, newline="") as f:
        return list(csv.DictReader(f))


def main(path):
    items, rejected = [], []
    for row in load(path):
        reason = BLOCKED.get(row["notes"].strip())
        if reason:
            rejected.append((row["id"], reason))
            continue
        reach, impact = float(row["reach"]), float(row["impact"])
        conf, effort = float(row["confidence"]), float(row["effort_days"])
        row["score"] = reach * impact * conf / effort
        items.append(row)
    items.sort(key=lambda r: r["score"], reverse=True)
    left = dict(CAPACITY)
    print(f"{'id':6} {'lane':8} {'score':>8} {'days':>4}  decision")
    for r in items:
        lane, days = r["lane"], float(r["effort_days"])
        if lane not in left:
            decision = "no capacity defined for lane"
        elif days <= left[lane]:
            left[lane] -= days
            decision = "COMMIT"
        else:
            decision = f"next cycle ({lane}: {left[lane]:g} day(s) left)"
        print(f"{r['id']:6} {lane:8} {r['score']:8.0f} {days:4g}  {decision}")
    for rid, reason in rejected:
        print(f"{rid:6} rejected before scoring: {reason}")
    print("unused days:", ", ".join(f"{k}={v:g}" for k, v in left.items()))


if __name__ == "__main__":
    main(sys.argv[1] if len(sys.argv) > 1 else "backlog.csv")
```

3. Run `python3 triage.py backlog.csv`.

**Expected output:**

```text
id     lane        score days  decision
S-101  content     22400    3  COMMIT
S-108  eng         19000    4  COMMIT
S-107  seo         16000    2  COMMIT
S-103  seo          9000    1  COMMIT
S-104  eng          5000    6  next cycle (eng: 1 day(s) left)
S-110  content      4000    6  COMMIT
S-102  content      3600    4  next cycle (content: 1 day(s) left)
S-106  content      3000    5  next cycle (content: 1 day(s) left)
S-105  rejected before scoring: link spam policy (paid links must not pass ranking credit)
S-109  rejected before scoring: scaled content abuse: near-identical pages, no user value
unused days: content=1, seo=1, eng=1
```

**Validation.** The two highest-reach items (S-109, S-105) never reach scoring: the gate decides. S-109 is rejected for being
500 near-identical pages, not for using AI. S-104 waits because
engineering has one day left. **Troubleshooting.** `KeyError: 'notes'` means a missing column; `ValueError` means a stray space
or thousands separator. **Extension.** Set `CAPACITY["eng"] = 0`: every technical item waits forever. **Teardown.**
`rm -r ~/seo-ops-labs/lab1`.

#### Lab 2 (intermediate): read a Search Console export without fooling yourself

**Objective.** Split brand from non-brand, measure how much of the total the rows do not explain, and compute an
impression-weighted position. **Prerequisites.** Lab 1's setup. **Time.** 25 minutes. **Risk.** None.

1. In `~/seo-ops-labs/lab2`, save the query rows as `queries.csv` and the chart totals as `totals.json`:

```csv
query,clicks,impressions,position
acme crm,4200,9800,1.1
acme crm login,3100,5200,1.0
acme pricing,900,2600,1.4
crm for small business,610,41000,7.9
best crm software,240,52000,11.6
crm pipeline template,520,8800,4.2
what is a crm,380,30500,6.8
crm vs spreadsheet,150,4100,5.5
acme vs examplesoft,300,1900,2.3
sales pipeline stages,410,12600,5.1
```

```json
{"clicks": 12600, "impressions": 236000}
```

2. Save the script as `read_export.py`.

_Example status: verified by execution on 2026-10-23 (Python 3.8.10, standard library)._

```python
"""Read a Search Console query export honestly: brand split, missing rows, position."""
import csv
import json
import re
import sys

BRAND = re.compile(r"\bacme(crm)?\b", re.IGNORECASE)  # same rule as the API pull


def main(rows_path, totals_path):
    with open(rows_path, newline="") as f:
        rows = list(csv.DictReader(f))
    with open(totals_path) as f:
        totals = json.load(f)
    seg = {"brand": [0, 0, 0.0], "non-brand": [0, 0, 0.0]}
    for r in rows:
        key = "brand" if BRAND.search(r["query"]) else "non-brand"
        clicks, impr = int(r["clicks"]), int(r["impressions"])
        seg[key][0] += clicks
        seg[key][1] += impr
        seg[key][2] += float(r["position"]) * impr
    row_clicks = sum(s[0] for s in seg.values())
    row_impr = sum(s[1] for s in seg.values())
    for name, (clicks, impr, pos_x_impr) in seg.items():
        print(f"{name:9} clicks={clicks:6} impressions={impr:7} "
              f"ctr={clicks / impr:6.2%} weighted_position={pos_x_impr / impr:5.1f}")
    gap_clicks = totals["clicks"] - row_clicks
    gap_impr = totals["impressions"] - row_impr
    print(f"rows sum   clicks={row_clicks:6} impressions={row_impr:7}")
    t_clicks, t_impr = totals["clicks"], totals["impressions"]
    print(f"chart total clicks={t_clicks:6} impressions={t_impr:7}")
    print(f"not in rows: {gap_clicks} clicks ({gap_clicks / totals['clicks']:.1%}), "
          f"{gap_impr} impressions ({gap_impr / totals['impressions']:.1%})")
    naive = sum(float(r["position"]) for r in rows) / len(rows)
    print(f"unweighted mean of row positions={naive:.1f} (do not report this)")
    share = seg["non-brand"][0] / row_clicks
    print(f"non-brand share of itemised clicks={share:.1%}")


if __name__ == "__main__":
    main(*(sys.argv[1:] or ["queries.csv", "totals.json"]))
```

3. Run `python3 read_export.py queries.csv totals.json`.

**Expected output:**

```text
brand     clicks=  8500 impressions=  19500 ctr=43.59% weighted_position=  1.2
non-brand clicks=  2310 impressions= 149000 ctr= 1.55% weighted_position=  8.4
rows sum   clicks= 10810 impressions= 168500
chart total clicks= 12600 impressions= 236000
not in rows: 1790 clicks (14.2%), 67500 impressions (28.6%)
unweighted mean of row positions=4.7 (do not report this)
non-brand share of itemised clicks=21.4%
```

**Validation.** Brand gives 8,500 of 10,810 itemised clicks, so a sitewide total mostly measures brand demand. 14.2% of
clicks are in no row, so the non-brand share is of *itemised* clicks. The unweighted mean position (4.7) flatters; weighting by
impressions approximates Search Console's average (8.4 for non-brand).[^metrics-def]
**Troubleshooting.** If "acme vs examplesoft" is a competitor query, add a segment and write the rule into the measurement
policy. **Extension.** Run it on your own export (confidential business data). **Teardown.** `rm -r ~/seo-ops-labs/lab2`.

#### Lab 3 (advanced): measure a change with a control group

**Objective.** See how a before/after comparison misleads; estimate the effect against a control group with a placebo check.
**Prerequisites.** Lab 1's setup. **Time.** 30 minutes. **Risk.** None.

1. In `~/seo-ops-labs/lab3`, save this generator as `make_data.py`: 56 days of clicks for a changed and a control page group,
   with a weekday pattern, falling demand and a true +8% effect from day 28.

_Example status: verified by execution on 2026-10-23 (Python 3.8.10, standard library)._

```python
"""Generate 56 days of synthetic daily clicks for a test and a control page group."""
import csv
import math

with open("daily.csv", "w", newline="") as f:
    w = csv.writer(f)
    w.writerow(["day", "period", "control_clicks", "test_clicks"])
    for day in range(56):
        weekly = 1 + 0.15 * math.sin(2 * math.pi * day / 7)   # weekday pattern
        season = 1 - 0.004 * day                              # demand slowly falling
        noise_c = 1 + 0.03 * math.sin(day * 12.9898)          # deterministic noise
        noise_t = 1 + 0.03 * math.sin(day * 78.233)
        lift = 1.08 if day >= 28 else 1.0                     # true effect: +8%
        control = round(1000 * weekly * season * noise_c)
        test = round(950 * weekly * season * noise_t * lift)
        w.writerow([day, "pre" if day < 28 else "post", control, test])
```

2. Save the analysis as `measure.py`, then run `python3 make_data.py && python3 measure.py daily.csv`.

_Example status: verified by execution on 2026-10-23 (Python 3.8.10, standard library)._

```python
"""Compare a naive before/after with a control-adjusted estimate of a page change."""
import csv
import sys


def total(rows, period, column, days=None):
    picked = [r for r in rows if r["period"] == period]
    if days is not None:
        picked = [r for r in picked if int(r["day"]) in days]
    return sum(int(r[column]) for r in picked)


def main(path):
    with open(path, newline="") as f:
        rows = list(csv.DictReader(f))
    t_pre, t_post = total(rows, "pre", "test_clicks"), total(rows, "post", "test_clicks")
    c_pre = total(rows, "pre", "control_clicks")
    c_post = total(rows, "post", "control_clicks")
    naive = t_post / t_pre - 1
    adjusted = (t_post / t_pre) / (c_post / c_pre) - 1
    print(f"test pages    pre={t_pre} post={t_post} naive change={naive:+.1%}")
    print(f"control pages pre={c_pre} post={c_post} change={c_post / c_pre - 1:+.1%}")
    print(f"control-adjusted effect on test pages={adjusted:+.1%}")
    # Placebo check: pretend the change happened halfway through the pre-period.
    a, b = set(range(0, 14)), set(range(14, 28))
    test_ratio = (total(rows, "pre", "test_clicks", b)
                  / total(rows, "pre", "test_clicks", a))
    ctrl_ratio = (total(rows, "pre", "control_clicks", b)
                  / total(rows, "pre", "control_clicks", a))
    print(f"placebo effect inside the pre-period={test_ratio / ctrl_ratio - 1:+.1%}"
          " (should be near 0)")


if __name__ == "__main__":
    main(sys.argv[1] if len(sys.argv) > 1 else "daily.csv")
```

**Expected output:**

```text
test pages    pre=25191 post=23958 naive change=-4.9%
control pages pre=26538 post=23413 change=-11.8%
control-adjusted effect on test pages=+7.8%
placebo effect inside the pre-period=+0.2% (should be near 0)
```

**Validation.** The naive comparison says the change *lost* 4.9%; against the control it gained +7.8%, close to the true +8%.
The near-zero placebo shows the groups moved together beforehand. **Troubleshooting.** A large placebo means the groups are not
comparable; rebuild them by traffic, template and seasonality. **Limits.** One ratio has no uncertainty interval; for big
decisions use more pages and a method with intervals.[^causalimpact] **Extension.** Set `lift` to `1.0`: the adjusted effect
falls to about zero (−0.2%). **Teardown.** `rm -r ~/seo-ops-labs`.

### Use cases and scenarios

All four are **illustrative scenarios**, not reports about real organisations.

| Scenario | Context | Operating approach | Trade-off | Success measure |
|---|---|---|---|---|
| B2B software, content-led | 400 guides, half stale; writers measured on new posts | Decay list; refresh capacity; merges; briefs | Fewer new posts | Non-brand clicks and sign-ups versus control |
| Retailer, template-led | 80,000 URLs; gains need engineering | Engineering lane; acceptance tests; [SEOps](../seops/) release checks; page-bucket tests | SEO waits for release trains | Tested lift per template change |
| Multi-market publisher with an agency | Agency runs six countries, holds the accounts | Vendor policy, ownership transfer, shared change log | Short-term friction | No shared logins; every change logged |
| Local services firm | Ten pages, one marketer | Google says a small local business can do much itself;[^hire] a quarterly checklist | Risk of neglect | Enquiries from search tracked |

## Measure, govern, pay

### Metrics and KPIs

| KPI | Definition / formula | Source | Pitfall | Cadence |
|---|---|---|---|---|
| Non-brand clicks | Clicks from queries not matching the brand rule | Search Console API | Excludes anonymized queries: a lower bound | Weekly |
| Unsegmented share | (Chart total clicks − sum of itemised clicks) ÷ chart total | Search Console | Rising share hides changes | Monthly |
| Organic conversions | Key events in the Organic Search channel | Analytics | Consent loss; model choice | Monthly |
| AI-assistant referrals | Sessions and conversions in GA4's AI Assistant channel | Analytics | Not organic search; reported separately | Monthly |
| Value per organic click | Organic conversion value ÷ Search Console clicks | Both | Mixes two sources; trend only | Quarterly |
| Commitment completion | Items shipped ÷ items committed per cycle | Backlog | Gaming by committing small items | Per cycle |
| Verdict rate | Closed items with a measured verdict ÷ items shipped | Backlog | "No effect" is still a verdict | Monthly |
| Decay backlog | Pages flagged for refresh and not yet handled | Inventory | Grows silently | Monthly |
| Policy incidents | Manual actions, rejected vendor tactics, AI content defects | Search Console, logs | Zero is the target, not a quota | Monthly |

**Worked calculation (illustrative).** From Lab 2: unsegmented share = (12,600 − 10,810) ÷ 12,600 = 14.2%. The honest
statement is "non-brand clicks were at least 2,310 (21.4% of itemised clicks); 14.2% could not be segmented". If analytics
records organic sign-ups worth 9,200 that week, value per organic click = 9,200 ÷ 12,600 ≈ 0.73; track its trend, not its
level, because the systems count differently.[^discrep]

**Vanity traps.** Rank screenshots (results vary by time, place and device[^perf]), total impressions, third-party "visibility
scores" (no access to Google's data[^thirdparty]), pages published.

### Quality, policy and compliance

- **Search policy:** link spam, scaled content abuse, doorways and cloaking can demote or remove pages.[^spam] In the version
  updated 2026-08-28, the site reputation policy works differently inside the European Economic Area: affected pages "may be
  categorized as separate from the main domain" instead of receiving a manual action.[^spam]
- **Consumer law** covers fake reviews and testimonials; the US FTC rule is one example.[^ftc] This page is not legal advice.
- **AI content**: human fact-check before publishing; consider telling readers how automation was used.[^genai-content]
- **YMYL topics** (health, finance, safety) get extra review; Google gives strong E-E-A-T more weight there.[^helpful]
- **Access**: few named owners; vendors are users; leavers' tokens removed.[^perms] Tag manager is the larger exposure:
  a Publish right pushes container changes, including scripts, live on every page that loads the container, a security and
  privacy risk far beyond search, so keep Publish in-house.[^gtm-perms]

### Cost, capacity and sustainability

Costs are people, tools and vendors. Two unit measures help: **cost per shipped item** (cycle cost ÷ items shipped) and
**cost per measured gain** (cost of tested items ÷ conversions gained versus control). The hidden cost is maintenance: content
made to chase volume becomes a liability you may later have to prune.[^core] Sustainability mostly means not publishing pages
nobody needs; hosting impacts belong to [WebOps](../webops/) and [GreenOps](../greenops/).

### Assurance of the operating model

Each quarter, run the [governance checklist](#checklists), reconcile report totals with Search Console, match the vendor
change log to releases and re-read the spam policies (last updated 2026-08-28 when checked).[^spam]

## When things go wrong

### Common failures and troubleshooting

| Symptom | Likely cause | Diagnosis | Remediation | Prevention |
|---|---|---|---|---|
| Report totals disagree with Search Console | Filters drop anonymized queries; different aggregation | Compare unfiltered chart total; check aggregation type[^about-data] | Show both numbers and the gap | Measurement policy |
| Clicks fall, impressions stable | Titles/snippets, rich results, AI features | Query-level CTR by intent[^debug] | Rewrite titles; test | CTR watch on top queries |
| Backlog grows, nothing technical ships | No engineering lane | Committed vs shipped by lane | Agree capacity with engineering | Lane in the plan |
| Sudden sitewide drop | Technical error, manual action, security issue | Page indexing, Manual actions, Security issues reports[^debug] | Fix and request review if needed | Release checks with SEOps |
| Agency reports growth, sign-ups fall | Vanity metrics; brand mixed with non-brand | Segment brand; check conversions | Change reporting contract | Vendor policy |

### Worked runbook: organic clicks fell by a third

::: figure Diagnosing an organic traffic drop
```mermaid
flowchart TB
  S["Clicks down 33%"]
  D1{"Data anomaly?"}
  D2{"Seasonal or demand shift?"}
  D3{"Manual or security action?"}
  D4{"Indexing errors or site move?"}
  D5{"Core update running?"}
  D6{"Impressions flat?"}
  A1["Fix tracking"]
  A2["Demand fell: no page fix, reset targets"]
  A3["Fix, request review"]
  A4["Hand to SEOps"]
  A5["Wait a week, compare"]
  A6["Test titles, snippets"]
  A7["Self-assess pages"]
  S --> D1
  D1 -->|"yes"| A1
  D1 -->|"no"| D2
  D2 -->|"yes"| A2
  D2 -->|"no"| D3
  D3 -->|"yes"| A3
  D3 -->|"no"| D4
  D4 -->|"yes"| A4
  D4 -->|"no"| D5
  D5 -->|"yes"| A5
  D5 -->|"no"| D6
  D6 -->|"yes"| A6
  D6 -->|"no"| A7
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
  class D1,D2,D3,D4,D5,D6 decision
  class A1,A2,A5,A6,A7 core
  class S,A3,A4 risk
```
Text equivalent: After clicks fall 33%, ask in order and stop at the first yes: data anomaly (fix tracking); seasonal dip or
demand shift (no page fix, reset targets); manual action or security issue (fix, request review); indexing errors or a site
move (hand to SEOps); core update rolling out (wait a week after it ends, compare); impressions flat (test titles and
snippets). If all are no, self-assess the pages.
:::

**Illustrative incident.** Monday 09:00: the weekly report shows non-brand clicks down 33%.

1. **Data (15 min).** Search Console's data anomalies notes and the analytics tag; Google lists logging errors as a possible
   cause.[^debug] Normal.
2. **Seasonality and demand (15 min).** 16 months, year on year, and the lost queries in Google Trends to see whether demand
   fell across the web.[^debug] No dip last year; demand steady.
3. **Penalties and security (10 min).** Manual actions and Security issues reports: clean.[^manual]
4. **Technical (30 min).** No site move or URL change was planned (moves cause fluctuations while Google
   recrawls[^debug]). Page indexing shows 1,200 product guides newly excluded by `noindex` since Thursday's release. Hand
   to [SEOps](../seops/) and engineering with the URL pattern and release ID; they follow
   [SEOps' runbook](../seops/#worked-runbook-a-release-adds-noindex-to-product-pages) and roll the template back the same day.
5. **Recovery.** Annotate; recovery depends on recrawling, so expect days to weeks.[^starter]
6. **Post-incident.** Add a `noindex` check for that template to the SEOps release gate; log detection time in the monthly
   review.

For a small drop (position 2 to 4), Google advises against radical changes to pages that already perform well.[^debug]

### Anti-patterns and myths

| Anti-pattern or myth | Why it fails | Instead |
|---|---|---|
| "Publish more pages" as the target | Invites thin and scaled content; maintenance debt | Target useful coverage of the demand map |
| Changing dates to look fresh | Google names it a warning sign[^helpful] | Update substantively or leave it |
| Disavowing links routinely | "most sites will not need" it; misuse can harm[^disavow] | Only after a manual action or clear risk |
| Buying "AEO/GEO" hacks or llms.txt services | Google Search ignores llms.txt; optimising for AI features is SEO[^genai-opt] | Same fundamentals, measured |
| Tool audit = roadmap | Third-party tools lack Google's data[^thirdparty] | Gate and score every finding |
| Agency owns the accounts | You stay responsible for its actions[^hire] | Ownership and access policy |

## Deciding and adopting

### When to use and when not to use

**Use a formal model when** organic search is a material source of customers, more than two or three people (or a vendor)
touch search work, technical changes need engineering capacity, or leadership asks what SEO returns.

**Do not build one when** one person can follow Google's starter guidance;[^hire] customers do not come from search; or the real
problem is elsewhere: no useful content, a broken site ([WebOps](../webops/), [SEOps](../seops/)), or no content process
([ContentOps](../contentops/)). The hidden responsibility is permanent: someone owns the backlog, measurement policy and vendor
access every quarter.

### Decision framework: in-house, agency or hybrid

::: figure Choosing who runs the SEO programme
```mermaid
flowchart TB
  Q1{"Is organic search a material channel?"}
  N1["Checklist only: one owner, quarterly review"]
  Q2{"Do most gains need engineering or deep product knowledge?"}
  Q3{"Fund a full in-house team?"}
  Q4{"Fund one senior in-house lead?"}
  Q5{"Fund in-house writers?"}
  IC["In-house writers; agency for gaps"]
  H["Hybrid: in-house lead, specialist vendors"]
  I["In-house team"]
  AG["Agency, with your accounts and policy"]
  FR["Agency or fractional consultant, overseen by a named internal owner"]
  Q1 -->|"no"| N1
  Q1 -->|"yes"| Q2
  Q2 -->|"yes"| Q3
  Q2 -->|"no"| Q5
  Q5 -->|"yes"| IC
  Q5 -->|"no"| AG
  Q3 -->|"yes"| I
  Q3 -->|"no"| Q4
  Q4 -->|"yes"| H
  Q4 -->|"no"| FR
  classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
  classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
  classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
  class Q1,Q2,Q3,Q4,Q5 decision
  class I,H,IC,AG,FR core
  class N1 neutral
```
Text equivalent: Not a material channel: a checklist with one owner. Material, but gains do not need engineering or product
knowledge: in-house writers, with an agency for specialist gaps, if you can fund them; otherwise an agency in your
accounts under your policy. Gains need them: a full in-house team if you can fund one; a hybrid
if you can fund only a senior lead; otherwise an agency or fractional consultant overseen by a named internal owner.
:::

The tree is an editorial, coarse filter: no independent study comparing agency and in-house outcomes was found. Work closest
to engineering and product is hardest to outsource; vendors add specialist and market depth (Google lists expertise in
specific markets among useful SEO services[^hire]). In every branch you keep the accounts and the policy. The table shows the
reasoning for one branch: a mid-sized software company whose gains need engineering and which can fund one senior SEO but not
a full team. Hybrid wins because it keeps most in-house access and continuity and adds depth one lead cannot cover.

| Criterion (weight) | In-house | Agency | Hybrid |
|---|---|---|---|
| Access to engineering and product (30%) | 5 | 2 | 4 |
| Specialist depth and market breadth (20%) | 2 | 5 | 4 |
| Cost predictability at small scale (20%) | 2 | 4 | 3 |
| Continuity and knowledge retention (20%) | 5 | 2 | 4 |
| Speed to start (10%) | 2 | 5 | 3 |
| **Weighted score (out of 5)** | **3.5** | **3.3** | **3.7** |

_Illustrative scores for that company. In-house = 0.3×5 + 0.2×2 + 0.2×2 + 0.2×5 + 0.1×2 = 3.5. With a full team, in-house
would score higher on specialist depth._

### Maturity model

This is **the Atlas's proposed model**, not an industry standard.

| Level | Observable behaviour | Exit criteria |
|---|---|---|
| 1. Ad hoc | Requests by chat; rank screenshots; vendor owns accounts | One intake; organisation owns Search Console and analytics |
| 2. Managed | Scored backlog; SOPs for briefs and refreshes | Policy gate in use; brand/non-brand reporting with stated gaps |
| 3. Measured | Every shipped item has a hypothesis and verdict window | Most shipped items closed with a verdict; control groups for major changes |
| 4. Integrated | Engineering lane; SEOps release checks; refresh capacity reserved | No surprise template regressions for two quarters |
| 5. Learning | Confidence scores calibrated from past verdicts | Playbooks retired when evidence changes |

### Adoption roadmap: 30/60/90 days

| Window | Actions | Milestone |
|---|---|---|
| Days 1–30 | Move account ownership in-house; vendor and access policy; intake form; store 16 months of data | All requests through intake |
| Days 31–60 | Demand map for top topics; page inventory; scoring rubric; measurement policy; first cycle cut to capacity | First monthly review |
| Days 61–90 | Engineering lane; first control-group test; decay list; quarterly plan | First verdicts; plan approved |

Quick win: separating brand from non-brand often changes the story leadership hears.

## Toolkit

### Checklists

**Quick start**

- [ ] Organisation is a verified owner of every Search Console property; vendors are users
- [ ] Intake form live; chat requests redirected to it
- [ ] One brand regex agreed, stored in the measurement policy and used in every report
- [ ] 16 months of data exported to your own storage

**Before committing a cycle**

- [ ] Every item passed the policy and duplicate gate
- [ ] Every item has an owner, hypothesis, measurement window
- [ ] Committed days ≤ available days per lane

**Before publishing a page**

- [ ] One target intent; no existing page serves it
- [ ] Human fact-check, including titles, descriptions and alt text
- [ ] At least one internal link to it from a relevant page
- [ ] Date changes only for substantive updates

**Quarterly governance**

- [ ] Access review (people and vendors; leftover verification tokens)
- [ ] Spam policy and Search Console changes reviewed
- [ ] Ten shipped items sampled for hypothesis and verdict

### Templates

**One-page SEO charter**

```text
Programme: Organic search for <product/site>        Owner: <name>    Review: <quarter>
Mission: <one sentence on the value organic search should create>
Scope: <sites, markets, languages>   Out of scope: <technical owner, paid search owner>
Outcomes (12 months): <non-brand clicks to X pages>, <organic conversions>, <verdict rate>
Capacity: content <n> days/cycle, SEO <n>, engineering <n> (agreed with <team>)
Policies: vendor and access policy v<n>; AI content rule; measurement policy v<n>
Non-goals: guaranteed rankings, paid links, pages without a user need
Risks: <top three>   Escalation: <name> for policy, <name> for releases
```

**Monthly review form**

```text
Period: <month>     Prepared by: <analyst>     Data gaps this month: <unsegmented %>
1. Outcomes: non-brand clicks, organic conversions, value per click (trend)
2. Verdicts: items closed (worked / no effect / harmed) with links to evidence
3. Decay: pages added to and removed from the refresh list
4. Incidents: drops, manual actions, policy issues, release regressions
5. Market: core updates, AI feature changes, Search Console changes
6. Decisions needed: <capacity, vendor, policy>
```

The intake form and vendor policy are in the [reference implementation](#reference-implementation-operating-artefacts).

### Deep comparisons

| Approach | Best when | Weak when |
|---|---|---|
| SEO as a campaign (project bursts) | Launches, migrations, one-off fixes | Content decays between bursts |
| SEO as a programme (this page) | Search is a lasting channel | Small sites: overhead outweighs value |
| SEO embedded in product teams | Template-heavy sites with strong engineering | No one owns cross-team priorities |
| SEO folded into [ContentOps](../contentops/) | Publishers where content is the product | Technical debt has no owner |

### FAQ

**Do we need a separate team?** Usually not; an SEO lead can own the backlog, measurement policy and vendor access.

**Why does our brand plus non-brand not equal total clicks?** Query filters remove anonymized queries, which still count in the
chart total.[^deepdive]

**Should we block AI features to protect clicks?** Only after measuring: exclusion removes your links from those features
entirely and, Google says, does not affect AI training.[^genai-control] Compare the generative AI report with conversions first.

**How long before we see results?** Hours to several months, says Google; wait a few weeks before assessing.[^starter]

**Is AI-written content against the rules?** Not by itself. Pages generated mainly to manipulate rankings without adding value
are, however they were made.[^spam][^genai-content]

## Going further

### Advanced topics and emerging direction

- **Established:** page-bucket experiments, counterfactual models,[^searchpilot][^causalimpact] warehouse reporting from the
  bulk export.[^bulk]
- **Changing quickly (as of October 2026):** generative AI reporting and controls;[^genai-report][^genai-control] browser agents
  acting for users, which Google's guide treats as optional.[^genai-opt]
- **Open question:** what clicks are worth as AI answers absorb simple queries. Evidence is one panel study and a disputed
  response;[^pew][^register] measure your own.

### Learning path

| Stage | Do this | Output |
|---|---|---|
| Prerequisites | Read Google's SEO Starter Guide and the [SEOps](../seops/) page | Shared vocabulary |
| 1-day primer | Read this page's measurement part; run Lab 2 on your own export | A brand rule and a gap figure |
| 1-week practice | Build the intake form and score your current backlog (Lab 1) | A committed cycle |
| 30 days | Run the 30-day roadmap; write the vendor policy | Access register, measurement policy |
| Advanced | Run a control-group test (Lab 3); study CausalImpact | A tested verdict |
| Portfolio project | A one-quarter plan with capacity, gates and tests for a real site | A plan a leader could approve |

## Wrap-up

### Executive recap and cheat sheet

- **Decide:** is organic search material enough for a programme, and who runs it?
- **Do:** one intake; policy gate before scoring; cut to capacity; engineering lane; refresh share; verdicts.
- **Measure:** non-brand clicks (a lower bound), unsegmented share, organic conversions, verdict rate, decay backlog.
- **Avoid:** guaranteed-ranking vendors, paid links, scaled pages, date-only refreshes, rank screenshots as evidence.
- **Next action:** move account ownership in-house and write the brand rule this week.

### A judgement call: 2,000 AI-drafted location pages or 60 refreshes?

**Situation (illustrative).** A home-services company has a quarterly target of +20% organic leads. The growth team proposes
2,000 AI-drafted city pages ("Plumber in <city>") with the same services text, ready in two weeks. The SEO lead proposes
refreshing 60 decaying service guides and adding real local detail (technicians, response times, prices) for the 40 cities the
company serves. **Assumptions:** similar cost; 40 real cities; fixed target.

**Why the first option is attractive.** Fast, large and easy to report.

**Why it is probably wrong.** Pages "generated for the primary purpose of manipulating search rankings and not helping users"
are scaled content abuse whether or not AI wrote them,[^spam] and near-identical city pages for places the company does not serve
resemble doorway abuse, a separate policy on the same page whose examples include pages "targeted at specific regions or
cities that funnel users to one page".[^spam] The downside is not just zero gain: it is demotion risk for the whole site
and a large pruning job later.[^core] The second option is slower and smaller on paper, but each page serves a real need and can
be tested against a control group.

**Decision.** Refresh the 60 guides and build 40 genuinely local pages, test them in two waves, and report the expected
shortfall against the target early. **Uncertainty.** The refresh may not reach +20% in one quarter; say so, rather than buying
the number with risk.

### Learning objectives and mastery check

You should now be able to separate SEO Operations from SEOps, design intake, gate and scoring, state Search Console's data
limits, judge a change against a control group, choose a sourcing model and write a vendor policy.

::: answer 1. A stakeholder asks why brand plus non-brand clicks are 15% below the total. What do you say?
Query filters exclude anonymized queries, which are counted in the chart total but never shown as rows. The gap is expected;
report it as the "unsegmented share" and treat non-brand clicks as a lower bound.
:::

::: answer 2. Where does a request for 300 AI-drafted comparison pages go first, and why?
To the policy gate, before scoring. Scaled content abuse is judged by purpose and value, not by tool; a high reach estimate must
not carry the item past the gate.
:::

::: answer 3. A refreshed page gained 10% clicks in six weeks. Is the refresh a success?
Not yet. Compare with a control group of similar pages over the same weeks; if controls also rose 10%, the refresh had no
detectable effect. Also check whether a core update or seasonal change overlapped.
:::

::: answer 4. An agency asks for owner access to Search Console to run an audit. What do you grant?
A restricted user, not owner. Google advises read-only access for audits; a restricted user has view rights on most data,
while a full user can take some actions and owners can add and remove users.
:::

::: answer 5. Clicks fell 30% but impressions are flat. Name two likely causes and one test.
Titles or snippets that no longer attract clicks, or results-page changes such as AI Overviews or competitors' rich results.
Test rewritten titles on one group of pages against a control group.
:::

::: answer 6. Why is the unweighted mean of row positions misleading?
It treats a query with 100 impressions like one with 50,000. Search Console averages the topmost position over impressions, so
weight by impressions, and watch trends rather than absolute values.
:::

### Conclusion

SEO Operations is not a discipline with its own standard; it is what SEO looks like when an organisation runs it deliberately.
The work is unglamorous: one intake, a gate that says no, a backlog that respects capacity, and reports that admit what the data
hides. Its value shows up as fewer wasted quarters, not a sudden jump. AI answers are changing search fast; the programmes that
cope are those that measured honestly before the change, so they can tell what the change did.

## Sources and further reading

Most sources are Google's, the most detailed public documentation for site owners; Bing's cover its own tools. All
were opened on 2026-10-23; the evidence ledger is `research/seo-operations-ledger.md`.

[^onet]: [Search Marketing Strategists (13-1161.01)](https://www.onetonline.org/link/summary/13-1161.01) — O*NET OnLine, updated 2026. Checked 2026-10-23.
[^builtvisible]: [Are you our new Head of SEO Operations?](https://builtvisible.com/?p=34988) — Builtvisible, 2021-04-13. Checked 2026-10-23.
[^vv]: [SEO Operations Manager (expired posting)](https://www.virtualvocations.com/job/seo-operations-manager-928483.html) — VirtualVocations, reviewed 2023-09-04. Checked 2026-10-23.
[^ovrdrv]: [SEO Ops Map](https://www.ovrdrv.com/insights/seo-ops-map) — Overdrive Interactive, undated. Checked 2026-10-23.
[^hire]: [Do you need an SEO?](https://developers.google.com/search/docs/fundamentals/do-i-need-seo) — Google Search Central, updated 2026-06-05. Checked 2026-10-23.
[^thirdparty]: [Guidance on using third-party SEO tools, services, and advice](https://developers.google.com/search/docs/fundamentals/third-party-seo) — Google Search Central, updated 2026-06-05. Checked 2026-10-23.
[^starter]: [SEO Starter Guide](https://developers.google.com/search/docs/fundamentals/seo-starter-guide) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^helpful]: [Creating helpful, reliable, people-first content](https://developers.google.com/search/docs/fundamentals/creating-helpful-content) — Google Search Central, updated 2026-10-05. Checked 2026-10-23.
[^spam]: [Spam policies for Google web search](https://developers.google.com/search/docs/essentials/spam-policies) — Google Search Central, updated 2026-08-28. Checked 2026-10-23.
[^genai-content]: [Guidance on using generative AI content on your website](https://developers.google.com/search/docs/fundamentals/using-gen-ai-content) — Google Search Central, updated 2026-10-01. Checked 2026-10-23.
[^genai-opt]: [Optimizing your website for generative AI features on Google Search](https://developers.google.com/search/docs/fundamentals/ai-optimization-guide) — Google Search Central, updated 2026-07-10. Checked 2026-10-23.
[^ai-features]: [AI features and your website](https://developers.google.com/search/docs/appearance/ai-features) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^genai-control]: [Search generative AI control](https://support.google.com/webmasters/answer/16908024) — Search Console Help, rollout note dated 2026-08-31. Checked 2026-10-23.
[^genai-report]: [Generative AI performance report (Search)](https://support.google.com/webmasters/answer/16984139) — Search Console Help, rollout note dated 2026-08-31. Checked 2026-10-23.
[^links]: [Link best practices for Google](https://developers.google.com/search/docs/crawling-indexing/links-crawlable) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^debug]: [Debugging drops in Google Search traffic](https://developers.google.com/search/docs/monitor-debug/debugging-search-traffic-drops) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^core]: [Google Search's core updates and your website](https://developers.google.com/search/updates/core-updates) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^perf]: [Performance report (Search results): Overview and basic setup](https://support.google.com/webmasters/answer/7576553) — Search Console Help, undated. Checked 2026-10-23.
[^about-data]: [Performance report (Search results): About the data](https://support.google.com/webmasters/answer/17011364) — Search Console Help, undated. Checked 2026-10-23.
[^discrep]: [Performance report (Search results): Troubleshooting data discrepancies](https://support.google.com/webmasters/answer/17010575) — Search Console Help, undated. Checked 2026-10-23.
[^metrics-def]: [What are impressions, position, and clicks?](https://support.google.com/webmasters/answer/7042828) — Search Console Help, undated. Checked 2026-10-23.
[^deepdive]: [A deep dive into Search Console performance data filtering and limits](https://developers.google.com/search/blog/2022/10/performance-data-deep-dive) — Google Search Central Blog (Daniel Waisberg), 2022-10-19. Checked 2026-10-23.
[^bulk]: [About bulk data export of Search Console data to BigQuery](https://support.google.com/webmasters/answer/12918484) — Search Console Help, undated. Checked 2026-10-23.
[^api]: [Search Analytics: query](https://developers.google.com/webmaster-tools/v1/searchanalytics/query) — Google for Developers, updated 2026-08-11. Checked 2026-10-23.
[^perms]: [Managing owners, users, and permissions](https://support.google.com/webmasters/answer/7687615) — Search Console Help, undated. Checked 2026-10-23.
[^manual]: [Manual actions report](https://support.google.com/webmasters/answer/9044175) — Search Console Help, undated. Checked 2026-10-23.
[^disavow]: [Disavow links to your site](https://support.google.com/webmasters/answer/2648487) — Search Console Help, undated. Checked 2026-10-23.
[^abtest]: [Minimize A/B testing impact in Google Search](https://developers.google.com/search/docs/crawling-indexing/website-testing) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^ser-essentials]: [Google Search Essentials Replaces Google Webmaster Guidelines](https://www.seroundtable.com/google-search-essentials-replaces-google-webmaster-guidelines-34243.html) — Search Engine Roundtable (Barry Schwartz), 2022-10-14, citing Google's update log entry of 2022-10-13. Checked 2026-10-23.
[^re2]: [RE2 regular expression syntax](https://github.com/google/re2/wiki/Syntax) — Google RE2 project wiki, undated. Checked 2026-10-23.
[^gtm-perms]: [User permissions (Tag Manager)](https://support.google.com/tagmanager/answer/6107011) — Tag Manager Help, undated. Checked 2026-10-23.
[^gsc-2015]: [Announcing Google Search Console - the new Webmaster Tools](https://developers.google.com/search/blog/2015/05/announcing-google-search-console-new) — Google Search Central Blog, 2015-05-20. Checked 2026-10-23.
[^cwv]: [Understanding Core Web Vitals and Google search results](https://developers.google.com/search/docs/appearance/core-web-vitals) — Google Search Central, updated 2025-12-10. Checked 2026-10-23.
[^ga-gsc]: [Connect Search Console to Google Analytics](https://support.google.com/analytics/answer/10737381) — Analytics Help, undated. Checked 2026-10-23.
[^ga-channels]: [Default channel group](https://support.google.com/analytics/answer/9756891) — Analytics Help, undated. Checked 2026-10-23.
[^ga-attr]: [Get started with attribution](https://support.google.com/analytics/answer/10596866) — Analytics Help, undated. Checked 2026-10-23.
[^ga-consent]: [Behavioral modeling for consent mode](https://support.google.com/analytics/answer/11161109) — Analytics Help, undated. Checked 2026-10-23.
[^kp]: [About Keyword Planner forecasts](https://support.google.com/google-ads/answer/3022575) — Google Ads Help, undated. Checked 2026-10-23.
[^trends]: [FAQ about Google Trends data](https://support.google.com/trends/answer/4365533) — Google Trends Help, undated. Checked 2026-10-23.
[^sqeg]: [Search Quality Evaluator Guidelines (General Guidelines), section 12.7](https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf) — Google, 2025-09-11. Checked 2026-10-23.
[^pew]: [Google users are less likely to click on links when an AI summary appears in the results](https://www.pewresearch.org/short-reads/2025/07/22/google-users-are-less-likely-to-click-on-links-when-an-ai-summary-appears-in-the-results/) — Pew Research Center, 2025-07-22. Checked 2026-10-23.
[^register]: [Google AI Overviews are killing the web, Pew study shows (again)](https://www.theregister.com/2025/07/22/google_ai_overviews_suppress_search/) — The Register (Thomas Claburn), 2025-07-22, quoting a Google spokesperson. Checked 2026-10-23.
[^rice]: [RICE: Simple prioritization for product managers](https://www.intercom.com/blog/rice-simple-prioritization-for-product-managers/) — Intercom (Sean McBride), 2018-01-05. Checked 2026-10-23.
[^searchpilot]: [The math behind SearchPilot: how SEO A/B testing actually works](https://www.searchpilot.com/resources/blog/the-math-behind-searchpilot-how-seo-a/b-testing-actually-works) — SearchPilot (Will Critchlow), updated 2026-10-05; vendor describing its own method. Checked 2026-10-23.
[^causalimpact]: [Inferring causal impact using Bayesian structural time-series models](https://research.google/pubs/inferring-causal-impact-using-bayesian-structural-time-series-models/) — Brodersen et al., Annals of Applied Statistics 9 (2015). Checked 2026-10-23.
[^bing-perf]: [Unlocking insights with the new Bing Webmaster Tools Performance Report](https://blogs.bing.com/webmaster/september-2023/Unlocking-insights-with-the-new-Bing-Webmaster-Tools-Performance-Report) — Microsoft Bing (Fabrice Canel, Saral Nigam), 2023-09-21. Checked 2026-10-23.
[^bing-ai]: [Introducing AI Performance in Bing Webmaster Tools Public Preview](https://blogs.bing.com/webmaster/February-2026/Introducing-AI-Performance-in-Bing-Webmaster-Tools-Public-Preview) — Microsoft Bing (Krishna Madhavan et al.), 2026-02-10. Checked 2026-10-23.
[^ftc]: [The Consumer Reviews and Testimonials Rule: Questions and Answers](https://www.ftc.gov/business-guidance/resources/consumer-reviews-testimonials-rule-questions-answers) — US Federal Trade Commission, November 2024. Checked 2026-10-23.

**Further reading:** the Atlas pages [SEOps](../seops/), [ContentOps](../contentops/), [WebOps](../webops/) and
[AnalyticsOps](../analyticsops/).

**Changelog.** 2026-10-23 — r0: first version (research, ledger, draft, three executed labs, six diagrams).
2026-10-23 — r1: after independent review: coherent sourcing decision tree, paid search to MarketingOps, GA4 AI Assistant
channel, one brand rule, Tag Manager rights, demand shifts in the runbook, wording fixes.
2026-10-23, post-score polish: EEA wording quoted, capacity heuristics labelled, Bing data, budget question in the sourcing tree.
