000%

Updated

NOTES · SEO / GEO / AEO15 · 2026.10

Observe search registration, indexing, impressions, and visits

After ownership verification and sitemap submission, read indexing state for each URL. Compare search impressions, clicks, and landing pages under the same conditions, alongside crawl logs and visit records.

§ 01SEO / GEO / AEO

Define the site scope managed by search tools

Even if the live URL opens a new notice, Google may still hold the previous document. Search tools compare what you changed on the server with what search actually processed. Indexing and canonical selection show processing state; impressions and clicks show which questions led to discovery and selection. These are different values and call for different fixes.

A Search Console domain property covers protocols and subdomains and uses DNS ownership verification. A URL-prefix property covers its specified protocol, host, and path prefix. Choose a property containing the actual live address and apply the provided ownership-verification value.

Ownership verification confirms site-management authority. Then submit a sitemap and read actual indexing state in URL Inspection. Record domain connection, ownership verification, sitemap processing, and document indexing separately to see which stage remains. The property setup guide provides the basis for defining the operational scope.

§ 02SEO / GEO / AEO

Check indexing state by URL in search tools

Google Search Console lets operators check search crawling, indexing, and impressions. A property is the site scope managed in the tool. Select the verified domain’s property, submit a sitemap, and check processing status and last-read time. Inspect important detail URLs and record Google’s known indexing state, selected canonical URL, and last crawl time. Live testing checks current accessibility; record it separately from stored index state.

Request indexing of important modified pages when needed. Record submission or request completion separately from actual indexing. Group exclusion reasons in the page-indexing report by shared template to find common problems. For example, investigate access settings for robots blocks, and canonical URLs, redirects, and duplicate content for duplicate canonical selection. The URL Inspection guide provides the basis for interpreting each result.

Do not use the result count for site:example.com as the baseline total indexed count. Use the maintained list of public canonical URLs as the denominator and aggregate the checked URLs’ indexing states. If coverage is partial, state it, such as “15 of 20 URLs inspected.” Record other engines using their own tools and actual results separately.

For example, if fixing the detail canonical also changes Google’s selected canonical to the detail URL, you have confirmed a change in URL processing. If it still chooses the homepage, recheck the last crawl date, detail body, and URLs in internal links and sitemaps. If indexed but still without impressions for the target question, examine content answering that question and actual search demand.

§ 03SEO / GEO / AEO

Read impressions, clicks, and generative search reports

Impressions count appearances of a page in search results; clicks count visits through those results. Export impressions, clicks, queries, and landing pages for identical date ranges, search types, countries, and devices. Examine page values and topic-level changes together. If impressions rise while clicks stay flat, inspect the information shown in results, titles and summaries, and their relationship to search intent. Comparing the same page’s impressions, clicks, and queries reveals which questions changed.

As of October 2026, Google’s generative AI performance report provides impressions for AI Overviews and AI Mode. Record its date, page, country, and device filters and keep it separate from ordinary search reports. If unavailable, check eligibility, sufficient impressions, and generative-feature inclusion settings. Do not enter a missing menu as zero.

Record each tool’s reporting scope. Generative impressions in Google Search, citations in other AI services, and the quality of answers to directly run questions are different observations. Missing-value symbols may become zero on download, so compare the original display with the exported data’s meaning. Generative search inclusion settings also require checking where property settings apply and are inherited.

§ 04SEO / GEO / AEO

Read referrals and bot logs as supporting evidence

A referrer identifies the page or service visited immediately before arrival. Analytics tools show referrers, landing pages, and subsequent behavior for visits from search and AI services. A citation may not cause a visit, and referrers may be missing. Count visits in analytics and citations in collected answers separately. A conversion is a desired action such as an inquiry or application. An event records that action in analytics. Decide which action sends an event, then compare with actual submissions and completions.

Server logs combine request time, path, status, response volume, and user agent to investigate collection problems. Bot names can be spoofed, so verify against the operator’s IP ranges or verification method. Successful bot requests prove a collection path; check stored AI answers for citations. The OpenAI bot guide distinguishes search, training, and user-request purposes when reading logs.

§ 05SEO / GEO / AEO

Calculate CTR and conversions in code and compare equivalent scopes

Use the following metrics.mjs with Node.js 22. ratio takes confirmed numerator and denominator values. It returns a rate from 0 to 1; multiply by 100 for a percentage. A zero denominator returns null because there is no measurement. Negative values, fractions, and numerators larger than denominators are rejected as aggregation errors.

// Node.js 22. Aggregate judgments entered by an evaluator who read the originals. export function ratio(numerator, denominator) { if (![numerator, denominator].every(n => Number.isSafeInteger(n) && n >= 0) || numerator > denominator) throw new Error('Invalid counts'); return { numerator, denominator, rate: denominator === 0 ? null : numerator / denominator }; } export const keys = ['cited', 'supported', 'accurate', 'timely', 'relevant', 'complete']; function allClaims(values) { return values.includes(false) ? false : values.includes(null) ? null : true; } export function evaluate(rows) { const completed = rows.filter(r => r.status === 'complete'); for (const row of rows) { if (!['complete', 'failed'].includes(row.status)) throw new Error('Invalid status'); for (const key of ['questionId', 'questionVersion', 'service', 'mode', 'rawPath']) if (typeof row[key] !== 'string' || !row[key]) throw new Error('Missing context: ' + key); if (row.status === 'failed' && !row.failure) throw new Error('Missing failure'); } for (const row of completed) { for (const key of keys) { if (![true, false, null].includes(row[key])) throw new Error('Missing assessment: ' + key); if (!row.reasons?.[key]) throw new Error('Missing reason: ' + key); } if (!row.claims?.length) throw new Error('Missing claims'); for (const claim of row.claims) { if (!claim.text || !claim.reason) throw new Error('Missing claim evidence'); for (const key of ['supported', 'accurate']) if (![true, false, null].includes(claim[key])) throw new Error('Invalid claim'); if (claim.supported === true && (!claim.sourceUrl || !claim.quote)) throw new Error('Supported claim needs source and quote'); } for (const key of ['supported', 'accurate']) if (row[key] !== allClaims(row.claims.map(c => c[key]))) throw new Error('Claim summary mismatch'); } function metric(key) { const assessed = completed.filter(r => r[key] !== null); return { ...ratio(assessed.filter(r => r[key] === true).length, assessed.length), unknown: completed.length - assessed.length }; } return { attempts: rows.length, completed: completed.length, failed: rows.length - completed.length, metrics: Object.fromEntries(keys.map(key => [key, metric(key)])) }; } export function grouped(rows) { const groups = new Map(); for (const row of rows) { const id = JSON.stringify([row.questionId, row.questionVersion, row.service, row.mode, row.model ?? null]); groups.set(id, [...(groups.get(id) ?? []), row]); } return [...groups].map(([group, items]) => ({ group: JSON.parse(group), ...evaluate(items) })); }

In the same folder, run node --input-type=module -e "import {ratio} from './metrics.mjs'; console.log(ratio(50,1000),ratio(4,40),ratio(0,0))". The resulting rates are 0.05, 0.1, and null. The first two are fictional CTR and session conversion rates. Do not reuse this ratio function unchanged for separate measures that can exceed 100%, such as applications divided by visits.

evaluate and grouped are used in the following AI assessment installment. Import the fictional examples from its assessment-fixture.mjs. status indicates response completion; the six judgments cover citation, support, accuracy, timeliness, relevance, and sufficiency. Failure counts and unknowns for each judgment are output separately.

Align date range, country, device, and landing page in analytics before comparing. Account for visits without referrers, visits untracked because consent was withheld, and people who got the answer in search and never visited. To attribute an aggregate change to one code change, check simultaneous seasonality, advertising, new content, and external coverage.

ratio returns null for a zero denominator because showing 0% CTR for a page with no impressions can misleadingly suggest a title problem. Zero impressions calls first for investigating discovery, indexing, and demand. Zero clicks in 1,000 impressions calls for examining result titles, answers, and question fit. Separate the two in calculation to choose different next fixes.

§ 06SEO / GEO / AEO

Align report dates, canonical URLs, and aggregation units

Search Console’s generative search performance report covers AI Overviews and AI Mode impressions. The page dimension assigns performance mostly to canonical URLs, and dates use Pacific Time (PT). Summing server-log request URLs and Korean dates directly can assign the same visit to a different day or URL. Report definitions

For example, October 24, 2026 in PT uses daylight time, UTC−07:00. In Korea, it runs from October 24 at 16:00 to just before October 25 at 16:00. PT winter standard time is UTC−08:00, seventeen hours behind Korea. Do not add a fixed sixteen hours to every date; use that date’s boundaries in America/Los_Angeles.

Suppose one results screen shows links to pages A and B in the same property. A property chart may count one impression while a page table counts one each for A and B. Page rows sum to two while the property chart shows one. They use different aggregation units; align units before comparing.

If server logs retain UTM-tagged URLs while the search report aggregates to canonical URLs, preserve both request and canonical addresses. Read campaign conversions from campaign values in logs, and search performance by the report’s canonical URLs. Also compare original displays when unknown markers become zeros during export.

If image responses became smaller on October 24, first record that day’s file bytes and loading results. Compare later search reports for the same page, query, device, and country. If titles or campaigns changed around the image change, those changes also affect impressions and clicks. Separate response-file changes, page-experience changes, and search-traffic changes into columns to read the evidence for the next revision precisely.

— FIN —