<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Generative Engine Optimization (GEO) | Vistaai]]></title><description><![CDATA[Explore GEO, AI SEO, and AI search visibility strategies to improve brand mentions and citations across ChatGPT, Gemini, Perplexity, and other AI search engines.]]></description><link>https://vistaai-geo.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ac50f8204b5daa1f6f2a208/b99c54c0-fd0a-4c83-8943-efbde25e2118.png</url><title>Generative Engine Optimization (GEO) | Vistaai</title><link>https://vistaai-geo.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 26 Oct 2026 23:42:47 GMT</lastBuildDate><atom:link href="https://vistaai-geo.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[The Rank–Citation Gap: Why a Top-10 Ranking No Longer Predicts AI Overview Citations]]></title><description><![CDATA[Only about 38% of AI Overview citations rank in the top 10, per Ahrefs' 2026 study. How query fan-out causes the gap and how to find the sub-questions you…]]></description><link>https://vistaai-geo.hashnode.dev/rank-citation-gap-ai-overviews-query-fan-out</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/rank-citation-gap-ai-overviews-query-fan-out</guid><category><![CDATA[Search engine optimization]]></category><category><![CDATA[SEO]]></category><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[Python]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Mon, 26 Oct 2026 08:09:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/fe9e30e7-b499-488b-8174-1a6be3cb1ee6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A common complaint in 2026: "We rank #2 for this query, and the AI Overview cites three pages that aren't even on page one."</p>
<p>That isn't a bug. It's how the system is designed, and Google documents it. This post explains why ranking and AI citation have drifted apart, what the studies measured, and how to use the gap instead of fighting it.</p>
<h2>What the overlap studies found</h2>
<table>
<thead>
<tr>
<th>Study</th>
<th>Dataset</th>
<th>Share of AI Overview citations that rank in the top 10 for the same query</th>
</tr>
</thead>
<tbody><tr>
<td>Ahrefs, July 2025</td>
<td>1.9M citations from 1M AI Overviews</td>
<td>about <strong>76%</strong></td>
</tr>
<tr>
<td>Ahrefs, 2026</td>
<td>863k keywords, 4M AI Overview URLs</td>
<td>about <strong>38%</strong></td>
</tr>
<tr>
<td>BrightEdge, 2026</td>
<td>its own keyword set</td>
<td>about <strong>17%</strong> (24% healthcare, 11% finance)</td>
</tr>
</tbody></table>
<p>In Ahrefs' 2026 data, the remaining citations split roughly evenly: about 31% from positions 11–100 and about 31% from pages that weren't in the top 100 at all.</p>
<p>Read these numbers carefully. The two Ahrefs studies count differently, and Ahrefs says its citation detection improved in between, so the drop from 76% to 38% is partly measurement. But even the high estimate leaves a quarter of citations outside the top 10, and the newer studies all point the same way.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/eca5e2b7-485e-45fb-a9cd-23dc851ef4c9.png" alt="Where AI Overview citations rank in Google's organic results, per Ahrefs 2026" style="display:block;margin:0 auto" />

<h2>Why it happens: query fan-out</h2>
<p>Google's documentation for AI features says both AI Overviews and AI Mode "may use a 'query fan-out' technique — issuing multiple related searches across subtopics and data sources — to develop a response." It adds that this lets Google identify more supporting pages than classic search, "displaying a wider and more diverse set of helpful links."</p>
<p>So the system doesn't just look at the top results for the query you typed. Take:</p>
<blockquote>
<p><em>"Is Supabase good for a production SaaS?"</em></p>
</blockquote>
<p>That might fan out into:</p>
<ul>
<li>Supabase row-level security performance</li>
<li>Supabase connection pooling limits</li>
<li>Supabase pricing at 100k monthly active users</li>
<li>Supabase vs Firebase vs Neon</li>
<li>Supabase backups and point-in-time recovery</li>
</ul>
<p>Each sub-query has its own results. A detailed post about Supabase connection pooling, ranking #40 for the head query, can be the best answer to one sub-question and get cited. A generic "Is Supabase good?" listicle ranking #2 may answer none of the sub-questions well and get skipped.</p>
<h2>What this means for content strategy</h2>
<p><strong>1. The head-term page isn't enough.</strong> Ranking for "Supabase review" doesn't cover the questions a fan-out generates. You need pages, or clearly separated sections, that answer each sub-question.</p>
<p><strong>2. Depth on narrow questions pays twice.</strong> A specific page ("Supabase connection pooling: Supavisor limits by plan") can rank for its own long-tail query <em>and</em> be pulled in as a supporting source for broader questions.</p>
<p><strong>3. Section headings matter more.</strong> The retriever is matching passages to sub-queries. A heading that states the sub-question ("How many connections does Supabase allow on the Pro plan?") is easier to match than "Limits".</p>
<p><strong>4. Don't assume your rank tracker tells the whole story.</strong> A page can lose rank and gain citations, or the reverse. Track them separately.</p>
<h2>Find the sub-questions you're missing (Python)</h2>
<p>You can't see Google's real fan-out queries. You <em>can</em> approximate them and check which ones your content covers. This script asks an LLM to generate likely sub-queries, then checks each against your page sections with embeddings.</p>
<pre><code class="language-python"># pip install openai numpy beautifulsoup4 requests
import json, requests, numpy as np
from bs4 import BeautifulSoup
from openai import OpenAI

client = OpenAI()

def fan_out(query, n=12):
    prompt = (f"A search engine expands the question below into {n} sub-queries "
              f"covering subtopics a complete answer needs. Return a JSON list of strings.\n\n{query}")
    r = client.chat.completions.create(model="gpt-4.1-mini", messages=[{"role": "user", "content": prompt}],
                                       response_format={"type": "json_object"})
    data = json.loads(r.choices[0].message.content)
    return next(iter(data.values())) if isinstance(data, dict) else data

def sections(url):
    soup = BeautifulSoup(requests.get(url, timeout=20).text, "html.parser")
    out, cur = [], None
    for el in soup.find_all(["h2", "h3", "p", "li", "td"]):
        if el.name in ("h2", "h3"):
            cur = {"heading": el.get_text(" ", strip=True), "text": ""}
            out.append(cur)
        elif cur:
            cur["text"] += " " + el.get_text(" ", strip=True)
    return [s for s in out if len(s["text"]) &gt; 80]

def embed(texts):
    r = client.embeddings.create(model="text-embedding-3-small", input=texts)
    v = np.array([d.embedding for d in r.data])
    return v / np.linalg.norm(v, axis=1, keepdims=True)

def coverage(query, urls, threshold=0.55):
    subs = fan_out(query)
    secs = [(u, s) for u in urls for s in sections(u)]
    S = embed([f'{s["heading"]}. {s["text"][:1500]}' for _, s in secs])
    Q = embed(subs)
    sims = Q @ S.T
    for i, q in enumerate(subs):
        j = int(sims[i].argmax())
        best = sims[i, j]
        mark = "OK " if best &gt;= threshold else "GAP"
        print(f"{mark} {best:.2f}  {q}\n      → {secs[j][1]['heading']}  ({secs[j][0]})")

coverage("Is Supabase good for a production SaaS?",
         ["https://yourblog.dev/supabase-review", "https://yourblog.dev/supabase-pooling"])
</code></pre>
<p>Typical output:</p>
<pre><code class="language-text">OK  0.71  Supabase connection pooling limits by plan
      → How many connections does Supabase allow?  (…/supabase-pooling)
OK  0.63  Supabase row level security performance
      → Row-level security in practice  (…/supabase-review)
GAP 0.41  Supabase point-in-time recovery and backups
      → Pricing  (…/supabase-review)
GAP 0.38  Supabase vs Neon for serverless Postgres
      → Final verdict  (…/supabase-review)
</code></pre>
<p>Every <code>GAP</code> line is a sub-question where your content probably isn't the best passage. Fix the biggest ones with a new section or a new page.</p>
<p><strong>Caveats:</strong> the generated sub-queries are a guess at Google's, not the real thing. The threshold depends on the embedding model; calibrate it by checking a few sections by hand. Run the fan-out a few times and merge the results, because LLM output varies.</p>
<h2>Checking whether it worked</h2>
<p>Coverage tells you whether you <em>can</em> answer the sub-questions. It doesn't tell you whether AI engines actually cite you. For that you need to look at the answers: run your important questions in Google AI Mode, ChatGPT and Perplexity on a schedule and record which URLs each one cites.</p>
<p>That's what <a href="https://www.vistaai.io/features/ai-citation-tracking">Vista AI's AI Citation Tracking</a> is built for. It records the prompt, the full answer and every cited source across the major AI engines, shows which of your pages get cited and which competitor pages are cited instead, and scores whether you were the primary source or a passing mention. Put that next to your rank tracker and the rank–citation gap becomes visible for your own keywords instead of an industry average.</p>
<h2>Key takeaways</h2>
<ul>
<li>In Ahrefs' 2026 data, only about <strong>38%</strong> of AI Overview citations ranked in the top 10 for the same query. Other studies put it lower.</li>
<li>The cause is <strong>query fan-out</strong>: AI features search for sub-questions and cite the best page for each.</li>
<li><strong>Narrow, deep pages</strong> win sub-questions, and question-shaped headings help retrievers match them.</li>
<li><strong>Approximate the fan-out</strong> with an LLM and check coverage with embeddings. Fix the gaps.</li>
<li><strong>Track citations separately from rank.</strong> They no longer move together.</li>
</ul>
<p><em>Sources: Google Search Central, "AI features and your website"; Ahrefs AI Overview citation studies (2025, 2026) as reported; BrightEdge as reported.</em></p>
<hr />
]]></content:encoded></item><item><title><![CDATA[How LLMs Are Changing SEO in 2026: What the Data Actually Shows]]></title><description><![CDATA[AI Overviews, AI Mode and ChatGPT search are changing SEO. Here's what the 2026 studies on clicks, citations and sources show, where they disagree, and…]]></description><link>https://vistaai-geo.hashnode.dev/how-llms-are-changing-seo-2026-data</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/how-llms-are-changing-seo-2026-data</guid><category><![CDATA[Web Development]]></category><category><![CDATA[SEO]]></category><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[Search engine optimization]]></category><category><![CDATA[chatgpt]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Sat, 24 Oct 2026 17:00:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/87ad26bb-fa80-45e7-ab50-762ac4327d9f.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"SEO is dead" posts have been around for fifteen years. What's different in 2026 is that there is actual data. Google's AI Mode passed a billion monthly users, AI Overviews show up on a large share of informational queries, and ChatGPT, Perplexity and Claude answer questions that used to start on a results page.</p>
<p>This post collects what the studies actually measured, where they disagree, and what a developer who runs a blog, docs site or product site should change. It's the overview for the rest of this series: each of the next nine posts goes deep on one of these shifts.</p>
<hr />
<h2>Shift 1: fewer clicks per search on AI-answered queries</h2>
<p>This is the best-measured change, and every study agrees on the direction.</p>
<table>
<thead>
<tr>
<th>Study</th>
<th>What it measured</th>
<th>Finding</th>
</tr>
</thead>
<tbody><tr>
<td>Ahrefs (300k keywords)</td>
<td>CTR of the #1 result on queries that show an AI Overview, Dec 2023 vs Dec 2025</td>
<td>Fell from about 7.3% to 1.6%</td>
</tr>
<tr>
<td>Seer Interactive</td>
<td>Organic CTR on informational queries with AI Overviews</td>
<td>Down about 61% in the original study; partial recovery reported in early 2026</td>
</tr>
<tr>
<td>Pew Research</td>
<td>Real browsing behaviour of US adults</td>
<td>Users clicked a traditional result on 8% of visits with an AI summary vs 15% without</td>
</tr>
</tbody></table>
<p>The numbers don't match, and they shouldn't be expected to. They use different query sets, different time windows and different definitions of "click". Google also disputes the Pew methodology. But no study found that AI answers <em>increase</em> clicks per query on informational searches.</p>
<p><strong>What it means for you:</strong> traffic from "what is X" and "how does X work" queries is the most exposed. Queries where the user has to <em>do</em> something on your site (sign up, download, compare plans, read the full tutorial) hold up better.</p>
<h2>Shift 2: ranking and being cited are drifting apart</h2>
<p>In 2025, Ahrefs found that about 76% of AI Overview citations came from pages in the top 10 for that query. Its 2026 analysis of 863,000 keywords put that figure at <strong>38%</strong>, with the rest split roughly evenly between positions 11–100 and pages outside the top 100.</p>
<p>Two caveats. Ahrefs says its citation detection improved between the studies, so part of the drop is measurement. And other datasets give different overlaps (BrightEdge reported about 17%, varying a lot by industry).</p>
<p>The mechanism behind the gap is documented by Google: AI Overviews and AI Mode use <strong>query fan-out</strong>, "issuing multiple related searches across subtopics and data sources". Your page can be cited because it answers a <em>sub-query</em> well, even if it ranks nowhere for the main query. Post 10 covers how to use that.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/33c83209-502d-450b-98b1-09bf28e2d26e.png" alt="Four shifts in how LLMs change search, each with the headline study figure" style="display:block;margin:0 auto" />

<h2>Shift 3: the sources that get cited are not the sources that rank</h2>
<p>Ask ChatGPT for a recommendation and look at the citations. Third-party sources dominate. Ahrefs' September 2026 tracking puts Reddit at about 17% of cited domains in ChatGPT and Wikipedia at about 7%. Other studies (Similarweb data via 5W) rank Wikipedia first. The order depends on the denominator, but the pattern is the same: forums, encyclopedias, review sites and comparison posts make up a large share.</p>
<p>Ahrefs also reported that <strong>brand web mentions</strong> correlated much more strongly with AI Overview visibility (around 0.66) than backlinks did (around 0.22). Correlation, not causation, but it matches what you see in the answers: models repeat what the web says about you, not just what you say about yourself. Post 13 covers this.</p>
<h2>Shift 4: measurement now has two halves</h2>
<p>Classic SEO measurement is one loop: Search Console impressions, clicks, positions. In 2026 you need a second one.</p>
<ul>
<li><strong>What Google gives you.</strong> AI Overview and AI Mode traffic is counted in the normal Performance report under "Web". Since June 2026, Google has been rolling out separate <strong>Generative AI performance reports</strong> to a subset of sites. They show impressions from AI features, but not queries, clicks or CTR.</li>
<li><strong>What nobody gives you.</strong> ChatGPT, Perplexity, Claude and Copilot don't have a Search Console. To know whether they mention you, you have to ask them, repeatedly, and record the answers.</li>
</ul>
<h2>What didn't change</h2>
<p>It's easy to over-correct. Several things are exactly as they were:</p>
<ul>
<li><strong>Google's eligibility rules.</strong> Its documentation says there are "no additional requirements to appear in AI Overviews or AI Mode, nor other special optimizations necessary". A page must be indexed and eligible for a snippet.</li>
<li><strong>No magic file or markup.</strong> Google says you don't need "new machine readable files, AI text files, or markup". <code>llms.txt</code> is not used by Google Search.</li>
<li><strong>Crawlability and rendering.</strong> If a bot can't fetch your content or the content only exists after JavaScript runs, nothing downstream matters.</li>
<li><strong>Quality.</strong> Original information, clear structure and accurate facts help in classic ranking and in AI answers.</li>
</ul>
<h2>What to change: a short priority list</h2>
<ol>
<li><strong>Audit access first.</strong> Check <code>robots.txt</code>, your CDN's bot rules and rate limits for Googlebot, Bingbot, <code>OAI-SearchBot</code>, <code>PerplexityBot</code> and <code>Claude-SearchBot</code>. Check that core content is in the raw HTML.</li>
<li><strong>Restructure your best pages for passages.</strong> Question-shaped headings, the answer in the first sentence, sections that make sense on their own. (Post 11 has a Python demo of how retrievers chunk a page.)</li>
<li><strong>Cover the sub-questions.</strong> For each important topic, list the follow-up questions a user (or a fan-out query) would ask and make sure one of your pages answers each clearly.</li>
<li><strong>Refresh what's already cited.</strong> Studies of AI citations find most cited pages were <em>updated</em> recently, even if they were published years ago. (Post 12.)</li>
<li><strong>Publish something only you have.</strong> Benchmarks, original data, real error messages, measured results. (Post 14.)</li>
<li><strong>Earn mentions, not just links.</strong> Docs that others reference, honest comparison pages, community answers. (Posts 13 and 15.)</li>
<li><strong>Get ready for agents.</strong> Google-Agent and other user-triggered fetchers are already in server logs, and shopping agents read product feeds instead of pages. (Posts 16 and 17.)</li>
<li><strong>Measure both halves.</strong> Search Console for Google, repeated prompt sampling for the AI engines.</li>
</ol>
<h2>How to track the second half</h2>
<p>The cheap way: write 20–30 questions your users actually ask, run them in ChatGPT, Perplexity, Gemini and Google AI Mode once a week, and log whether you're mentioned, whether you're cited and who's recommended instead. Do it for a month and you'll see the shape of your visibility.</p>
<p>It gets slow quickly, because answers vary run to run and a real picture needs many samples per prompt and engine. That's the part <a href="https://www.vistaai.io/features/ai-rank-tracker">Vista AI's AI Rank Tracker</a> automates: it runs your prompt set daily across ChatGPT, Gemini, Claude, Perplexity, Copilot and Google AI Mode, shows your position in each engine and rolls the results into a 0–100 visibility index you can track next to your Search Console data.</p>
<h2>Key takeaways</h2>
<ul>
<li><strong>Clicks per query are down</strong> on AI-answered informational searches. Every study agrees on direction; none agree on size.</li>
<li><strong>Ranking ≠ citation.</strong> Query fan-out means pages outside the top 10 get cited, and top-10 pages often don't.</li>
<li><strong>Third-party sources carry weight.</strong> What Reddit, Wikipedia and review sites say about you feeds the answers.</li>
<li><strong>The fundamentals didn't change.</strong> Indexable, crawlable, server-rendered, original, accurate.</li>
<li><strong>Measure two loops:</strong> Search Console for Google, repeated sampling for everything else.</li>
</ul>
<p><em>Sources: Google Search Central, "AI features and your website" (updated Dec 2025); Google Search Central blog, June 2026; Ahrefs AI Overview and ChatGPT citation studies (2025–2026); Seer Interactive; Pew Research Center. Figures from third-party studies are as reported by those studies.</em></p>
]]></content:encoded></item><item><title><![CDATA[How to Measure GEO: AI Search Visibility Metrics That Actually Mean Something]]></title><description><![CDATA[Measure generative engine optimization properly: visibility rate, share of voice, citation rate, sentiment and AI referrals, with sampling, confidence…]]></description><link>https://vistaai-geo.hashnode.dev/how-to-measure-geo-ai-search-visibility</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/how-to-measure-geo-ai-search-visibility</guid><category><![CDATA[SEO]]></category><category><![CDATA[AI]]></category><category><![CDATA[Data Science]]></category><category><![CDATA[llm]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Fri, 23 Oct 2026 05:48:35 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/1f452a5d-eef5-4fa3-a923-8237312be46c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Every GEO guide ends with "measure your results". Very few say how, and the obvious method is wrong.</p>
<p>The obvious method: type your key questions into ChatGPT, see if you show up, take a screenshot. The problem is that AI answers are <strong>non-deterministic</strong>. The same prompt returns different brands on different runs, in different engines, for different users. A screenshot is a sample size of one, and it's biased by your own chat history and location.</p>
<p>This post covers the five metrics worth tracking, how to collect them so they're statistically meaningful, and how to report them without misleading anyone.</p>
<hr />
<h2>Why GEO measurement is different from SEO measurement</h2>
<table>
<thead>
<tr>
<th></th>
<th>SEO rank tracking</th>
<th>GEO measurement</th>
</tr>
</thead>
<tbody><tr>
<td>Result for a query</td>
<td>Mostly stable for a given location/device</td>
<td>Varies run to run</td>
</tr>
<tr>
<td>What you record</td>
<td>Position 1–100</td>
<td>Mentioned? Position in list? Cited? How described?</td>
</tr>
<tr>
<td>Engines</td>
<td>Mostly one (Google)</td>
<td>ChatGPT, Gemini, Claude, Perplexity, Copilot, Google AI Mode…</td>
</tr>
<tr>
<td>Unit of reporting</td>
<td>A rank</td>
<td>A <strong>rate</strong> over many samples</td>
</tr>
</tbody></table>
<p>The core shift: you're estimating a <strong>probability</strong> ("how often does this engine mention us for this question?"), not reading off a position.</p>
<h2>Step 1: Build the prompt set</h2>
<p>Your prompts are your sample frame. Get them wrong and every metric downstream is wrong.</p>
<ul>
<li><strong>Write prompts the way users ask</strong>, not as keywords. "What's the best error tracking tool for a small Next.js team?" not "error tracking tool".</li>
<li><strong>Cover the buyer journey.</strong> Problem ("why do my Next.js errors not show stack traces?"), solution ("what tools track frontend errors?"), comparison ("Sentry vs Highlight"), decision ("is Sentry worth it for a 3-person team?").</li>
<li><strong>Start with 20–50.</strong> Enough to cover your category, few enough to review by hand.</li>
<li><strong>Freeze them.</strong> Editing a prompt's wording creates a new prompt. Version them, or your trend lines compare different questions.</li>
</ul>
<h2>Step 2: Sample properly</h2>
<p>For each prompt, run it <strong>multiple times per engine on a schedule</strong> (daily is typical) and store every raw answer.</p>
<p>How many samples? The honest answer comes from confidence intervals. If a brand appears in 3 out of 10 answers, the 95% interval for its true mention rate is roughly <strong>11% to 60%</strong>. That's too wide to act on. With 30 out of 100 it narrows to about 22–40%.</p>
<pre><code class="language-python">import math

def wilson(k, n, z=1.96):
    """95% Wilson score interval for a proportion k/n."""
    p = k / n
    d = 1 + z*z/n
    c = (p + z*z/(2*n)) / d
    h = z * math.sqrt(p*(1-p)/n + z*z/(4*n*n)) / d
    return max(0, c-h), min(1, c+h)

print(wilson(3, 10))    # ≈ (0.11, 0.60)
print(wilson(30, 100))  # ≈ (0.22, 0.40)
</code></pre>
<p>The practical rule: <strong>report rates over a window</strong> (7 or 28 days), and always show the sample size next to them.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/62a27a72-cfaf-4e0d-b8f1-b4aa007fa0f0.png" alt="Five KPI tiles: visibility rate, share of voice, citation rate, critical mentions and AI referral sessions with sparklines" style="display:block;margin:0 auto" />

<h2>The five metrics</h2>
<h3>1. Visibility rate</h3>
<p><strong>The share of answers that mention your brand</strong>, per engine, over a window.</p>
<pre><code class="language-sql">SELECT engine,
       COUNT(*)                          AS answers,
       ROUND(AVG(mentioned) * 100, 1)    AS visibility_pct
FROM scored_answers
WHERE brand = 'Acme' AND run_date &gt;= date('now', '-28 days')
GROUP BY engine;
</code></pre>
<p>Track it per engine. A single blended number hides the most useful pattern: you're often strong in one engine and invisible in another, and the causes differ.</p>
<h3>2. Share of voice</h3>
<p><strong>Your share of all brand mentions</strong> across answers in your category, against a fixed set of competitors.</p>
<pre><code class="language-sql">SELECT engine, brand,
       ROUND(1.0 * SUM(mentioned) / SUM(SUM(mentioned)) OVER (PARTITION BY engine), 3) AS sov
FROM scored_answers
WHERE run_date &gt;= date('now', '-28 days')
GROUP BY engine, brand;
</code></pre>
<p>Two cautions: fix the competitor list (adding a brand mid-period shrinks everyone's share), and consider weighting by list position, because being recommended first is worth more than being listed fifth.</p>
<h3>3. Citation rate (separate from mentions)</h3>
<p><strong>The share of answers that link to your domain as a source.</strong> Keep it separate from mentions:</p>
<ul>
<li><strong>Mentioned, not cited:</strong> the engine knows you but sources claims about you elsewhere (reviews, forums, competitor comparisons). Those third-party pages are shaping your description.</li>
<li><strong>Cited, not mentioned:</strong> your content supports a general claim, but the answer recommends someone else.</li>
</ul>
<p>They need different fixes, so merging them throws information away.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/56b3adf0-42eb-427e-a7bb-cbb8021e1269.png" alt="Line chart of mention rate rising to 34% while citation rate reaches 11%, showing a 23-point gap" style="display:block;margin:0 auto" />

<h3>4. Sentiment / framing</h3>
<p><strong>How you're described when mentioned:</strong> recommended, neutral listing, or critical. Track it as a stacked share (positive / neutral / critical), not a single net score. A net score can stay flat while neutral mentions quietly turn critical.</p>
<p>If you classify sentiment with an LLM, hand-check a sample every month. Labels drift when the labelling model changes.</p>
<h3>5. AI referral traffic</h3>
<p><strong>Visits from AI assistants</strong>, measured in analytics:</p>
<ul>
<li>Referrer hosts like <code>chatgpt.com</code>, <code>perplexity.ai</code>, <code>gemini.google.com</code>, <code>copilot.microsoft.com</code>, <code>claude.ai</code></li>
<li><code>utm_source=chatgpt.com</code>, which ChatGPT often appends to links</li>
</ul>
<p>In GA4, create a custom channel group with a regex on Source and place it <strong>above</strong> Referral:</p>
<pre><code class="language-text">^(chatgpt\.com|chat\.openai\.com|(www\.)?perplexity\.ai|gemini\.google\.com|copilot\.microsoft\.com|claude\.ai)$
</code></pre>
<p>Be clear about what this can't see: app clicks often arrive without a referrer, many users read the answer and never click, and Google's AI Overviews clicks are folded into Google organic. Referral traffic is a <strong>floor</strong> on AI influence, not a total.</p>
<h2>Reporting: what goes on the dashboard</h2>
<ol>
<li><strong>Visibility rate by engine</strong>, 7-day rolling, with sample sizes.</li>
<li><strong>Share of voice by engine</strong> against 2–5 named competitors.</li>
<li><strong>Mention vs. citation rate</strong> on one chart. The gap is the insight.</li>
<li><strong>Sentiment mix</strong>, weekly stacked bars.</li>
<li><strong>AI referral sessions</strong>, with a note that they're a floor.</li>
<li><strong>A link to the raw answers</strong> behind every number. The first question in any review meeting is "what exactly did it say?"</li>
</ol>
<p>And three traps to avoid:</p>
<ul>
<li><strong>Average position alone.</strong> It can "improve" while you disappear: drop out of answers where you were listed fifth, and the average of what's left goes up.</li>
<li><strong>Averaging daily percentages.</strong> Sum numerators and denominators over the window instead, or a 4-sample day counts as much as a 40-sample day.</li>
<li><strong>One engine's trend as "AI search".</strong> Engines move independently, so report each one.</li>
</ul>
<h2>Build or buy</h2>
<p>You can build all of this: a prompt table, a daily job calling the OpenAI and Perplexity APIs, a scorer, and SQL like the above. It gets heavy once you add more engines (Copilot and Google AI Mode don't offer the same simple APIs), regions, competitors and a UI people will actually open.</p>
<p><a href="https://www.vistaai.io/features/brand-visibility-dashboard">Vista AI's Brand Visibility Dashboard</a> packages it: visibility overall and by engine, share of voice against competitors, sentiment split into positive, neutral and critical, per-query rankings, 30-day, 90-day and yearly trends, regional breakdowns, and weekly email reports. A raw data stream keeps the full AI response behind every number. For the competitor side specifically, <a href="https://www.vistaai.io/features/competitor-analysis">Vista's Competitor Analysis</a> shows where each rival beats you per engine and which of their pages get cited most.</p>
<h2>Key takeaways</h2>
<ul>
<li>GEO metrics are <strong>rates estimated from repeated samples</strong>, not positions.</li>
<li>Track five things: <strong>visibility rate, share of voice, citation rate, sentiment, AI referrals</strong>.</li>
<li>Keep <strong>mentions and citations separate</strong>.</li>
<li><strong>Show the denominator</strong> on every number and report each engine separately.</li>
<li>Treat AI referral traffic as a <strong>floor</strong>, not the full effect.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Structured Data for AI Search: The JSON-LD That Actually Helps in 2026]]></title><description><![CDATA[Which JSON-LD schema types still help in Google and AI search, which rich results were retired, and how to generate and validate structured data in Next.js]]></description><link>https://vistaai-geo.hashnode.dev/structured-data-json-ld-ai-search</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/structured-data-json-ld-ai-search</guid><category><![CDATA[Next.js]]></category><category><![CDATA[SEO]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Thu, 22 Oct 2026 06:30:14 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/91b07ae8-6ffc-46c7-9c80-ab55c6058c42.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There's a popular claim in GEO circles that you need "AI schema" to appear in AI answers. Google says otherwise: its documentation states that no special schema or AI-specific markup is needed for AI Overviews or AI Mode.</p>
<p>So is structured data pointless for AI search? Also no. JSON-LD remains the most reliable way to state facts about your page in a form machines don't have to guess at: who you are, who wrote this, when it changed, what it costs. Search engines use it for rich results and entity understanding, and a page with clear, consistent facts is harder to misquote.</p>
<p>This post covers which types are worth adding in 2026, what's been retired, and how to implement and validate it without creating new problems.</p>
<hr />
<h2>What structured data does (and doesn't) do</h2>
<p><strong>It does:</strong></p>
<ul>
<li>make rich results possible (review stars, product info, breadcrumbs, article info),</li>
<li>state facts explicitly instead of leaving them to be inferred from prose,</li>
<li>connect your pages to an entity (your organisation, your author profile) through <code>@id</code> and <code>sameAs</code>.</li>
</ul>
<p><strong>It doesn't:</strong></p>
<ul>
<li>guarantee rich results (Google decides when to show them),</li>
<li>get you into AI Overviews by itself,</li>
<li>fix content that's thin, wrong or hard to read.</li>
</ul>
<h2>Rich results that changed, so you don't waste effort</h2>
<p>Two that many tutorials still recommend:</p>
<ul>
<li><strong>FAQ rich results</strong> have been limited to well-known, authoritative government and health websites since August 2023. <code>FAQPage</code> markup is still valid <a href="http://schema.org">schema.org</a>, but on most sites it won't produce the expandable FAQ result anymore.</li>
<li><strong>HowTo rich results</strong> were removed from Google Search in 2023.</li>
</ul>
<p>You can keep <code>FAQPage</code> markup if your page genuinely has an FAQ (it's still a clear machine-readable structure), but don't add it expecting a SERP feature.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/f5496771-2dff-47ae-a096-471c1dc1d24a.png" alt="Table of schema types and their 2026 status: Organization, Article, Product and Breadcrumb worth it; FAQ limited; HowTo removed" style="display:block;margin:0 auto" />

<h2>The types worth implementing</h2>
<h3>1. Organization (homepage)</h3>
<p>Defines your brand as an entity and links your official profiles:</p>
<pre><code class="language-json">{
  "@context": "https://schema.org",
  "@type": "Organization",
  "@id": "https://acmeanalytics.com/#org",
  "name": "Acme Analytics",
  "url": "https://acmeanalytics.com",
  "logo": "https://acmeanalytics.com/logo.png",
  "sameAs": [
    "https://github.com/acme-analytics",
    "https://www.linkedin.com/company/acme-analytics",
    "https://x.com/acmeanalytics"
  ]
}
</code></pre>
<p><code>sameAs</code> matters for AI search in a practical way. When a model or search engine sees "Acme" on GitHub, LinkedIn and your site, consistent <code>sameAs</code> links help connect those mentions to one entity, which matters if your brand name is ambiguous.</p>
<h3>2. BlogPosting / TechArticle (posts and docs)</h3>
<pre><code class="language-json">{
  "@context": "https://schema.org",
  "@type": "TechArticle",
  "headline": "Fixing N+1 queries in Prisma with include",
  "description": "Why findUnique in a loop is slow, and how include and relationLoadStrategy fix it.",
  "datePublished": "2026-09-14",
  "dateModified": "2026-10-02",
  "author": {
    "@type": "Person",
    "name": "Sam Rivera",
    "url": "https://acmeanalytics.com/team/sam-rivera"
  },
  "publisher": { "@id": "https://acmeanalytics.com/#org" },
  "proficiencyLevel": "Intermediate",
  "dependencies": "Prisma 6, Node.js 22"
}
</code></pre>
<p><code>dateModified</code> is the field that most often goes stale. Update it when the content meaningfully changes, not on every deploy.</p>
<h3>3. SoftwareApplication or Product with offers (pricing pages)</h3>
<pre><code class="language-json">{
  "@context": "https://schema.org",
  "@type": "SoftwareApplication",
  "name": "Acme Analytics",
  "applicationCategory": "BusinessApplication",
  "operatingSystem": "Web",
  "offers": [
    { "@type": "Offer", "name": "Starter", "price": "49", "priceCurrency": "USD" },
    { "@type": "Offer", "name": "Growth", "price": "199", "priceCurrency": "USD" }
  ],
  "publisher": { "@id": "https://acmeanalytics.com/#org" }
}
</code></pre>
<p>Pricing is one of the facts AI answers get wrong most often, usually because an old price is still floating around the web. Correct, current <code>offers</code> on your own pricing page give engines an authoritative source.</p>
<h3>4. BreadcrumbList (everything with hierarchy)</h3>
<pre><code class="language-json">{
  "@context": "https://schema.org",
  "@type": "BreadcrumbList",
  "itemListElement": [
    { "@type": "ListItem", "position": 1, "name": "Docs", "item": "https://acmeanalytics.com/docs" },
    { "@type": "ListItem", "position": 2, "name": "SDKs", "item": "https://acmeanalytics.com/docs/sdks" },
    { "@type": "ListItem", "position": 3, "name": "Node.js" }
  ]
}
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/50ec4b7b-8857-4daf-82df-51579780cd9d.png" alt="Entity graph linking TechArticle, SoftwareApplication and Person to one Organization with sameAs profiles" style="display:block;margin:0 auto" />

<h2>Implementation: generate it from the same data as the page</h2>
<p>The biggest structured data bug isn't a syntax error. It's <strong>drift</strong>: JSON-LD says $49, the page says $59, because someone updated one and not the other. Generate both from one source.</p>
<h3>Next.js (App Router)</h3>
<pre><code class="language-tsx">// app/pricing/page.tsx
import { plans } from "@/data/plans";   // the same data the pricing table renders

export default function PricingPage() {
  const jsonLd = {
    "@context": "https://schema.org",
    "@type": "SoftwareApplication",
    name: "Acme Analytics",
    applicationCategory: "BusinessApplication",
    operatingSystem: "Web",
    offers: plans.map((p) =&gt; ({
      "@type": "Offer",
      name: p.name,
      price: String(p.monthlyPrice),
      priceCurrency: "USD",
    })),
  };

  return (
    &lt;&gt;
      &lt;script
        type="application/ld+json"
        dangerouslySetInnerHTML={{
          __html: JSON.stringify(jsonLd).replace(/&lt;/g, "\\u003c"),
        }}
      /&gt;
      &lt;PricingTable plans={plans} /&gt;
    &lt;/&gt;
  );
}
</code></pre>
<p>Two details:</p>
<ul>
<li>This renders in a Server Component, so the JSON-LD is in the <strong>raw HTML</strong>. JSON-LD injected client-side has the same problem as any client-rendered content: crawlers that don't run JavaScript won't see it.</li>
<li>The <code>replace(/&lt;/g, "\\u003c")</code> escapes <code>&lt;</code> so a value containing <code>&lt;/script&gt;</code> can't break out of the tag. Next.js's own docs recommend this pattern.</li>
</ul>
<h3>Astro</h3>
<pre><code class="language-astro">---
import { plans } from "../data/plans";
const jsonLd = { "@context": "https://schema.org", "@type": "SoftwareApplication", /* … */ };
---
&lt;script type="application/ld+json" set:html={JSON.stringify(jsonLd)} /&gt;
</code></pre>
<h3>Hashnode, Ghost and other hosted platforms</h3>
<p>Hosted blogging platforms, Hashnode included, generate basic article metadata for posts automatically. You usually don't need to add <code>BlogPosting</code> yourself. Put your effort into the Organization and Product markup on your main site, which the platform can't do for you.</p>
<h2>Validate in CI, not just once</h2>
<p>Add a check that fails the build if JSON-LD is missing or doesn't parse:</p>
<pre><code class="language-js">// scripts/check-jsonld.mjs
import { readFileSync } from "node:fs";
import { globSync } from "glob";

let failed = 0;
for (const file of globSync("out/**/*.html")) {
  const html = readFileSync(file, "utf8");
  const blocks = [...html.matchAll(/&lt;script type="application\/ld\+json"&gt;([\s\S]*?)&lt;\/script&gt;/g)];
  for (const [, raw] of blocks) {
    try {
      const data = JSON.parse(raw);
      if (!data["@context"] || !data["@type"]) throw new Error("missing @context/@type");
    } catch (e) {
      console.error(`${file}: invalid JSON-LD – ${e.message}`);
      failed++;
    }
  }
}
process.exit(failed ? 1 : 0);
</code></pre>
<p>This catches syntax problems. It doesn't catch semantic ones (wrong property names, missing required fields for a rich result), so also run key templates through the <a href="http://Schema.org">Schema.org</a> validator and Google's Rich Results Test after template changes.</p>
<h2>Common mistakes</h2>
<ul>
<li><strong>Markup for content that isn't on the page</strong> (reviews nobody can see, FAQs hidden from users). This violates Google's structured data guidelines.</li>
<li><strong>Self-serving review stars</strong> on your own organisation or product. Google doesn't show these for the entity itself.</li>
<li><strong>Stale</strong> <code>dateModified</code>, or bumping it on every deploy without changing content.</li>
<li><strong>AI-generated JSON-LD nobody checked.</strong> Google's guidance on AI content explicitly says to review structured data generated by AI. Hallucinated prices and fake <code>sameAs</code> URLs are common.</li>
<li><strong>Multiple conflicting Organization blocks</strong> from different plugins.</li>
</ul>
<h2>Checking how AI engines read the result</h2>
<p>Structured data is one input into how engines understand a page. To see the whole picture (crawlability, extraction, schema, trust signals) and how it compares with competitors' pages, <a href="https://www.vistaai.io/features/page-audit">Vista AI's Page Audit</a> scores a URL on AI Visibility, AI Understanding and AI Citation, including a schema check, and lists prioritised fixes.</p>
<h2>Key takeaways</h2>
<ul>
<li>No special "AI schema" exists or is required. Standard JSON-LD still helps engines read your facts.</li>
<li>Prioritise <strong>Organization</strong>, <strong>Article/TechArticle</strong>, <strong>Product/SoftwareApplication</strong> with offers, and <strong>BreadcrumbList</strong>.</li>
<li>FAQ and HowTo rich results are mostly gone. Don't build for them.</li>
<li>Generate JSON-LD from the <strong>same data</strong> as the visible page, render it <strong>server-side</strong>, and <strong>validate in CI</strong>.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Technical SEO Checklist for AI Search: 25 Checks for Google, ChatGPT and Perplexity]]></title><description><![CDATA[25 technical SEO checks for AI search crawler access, rendering, indexing, structured data, performance and structure, with commands to verify each.]]></description><link>https://vistaai-geo.hashnode.dev/technical-seo-checklist-ai-search</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/technical-seo-checklist-ai-search</guid><category><![CDATA[Web Development]]></category><category><![CDATA[SEO]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[Devops]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Sat, 17 Oct 2026 17:33:52 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/7ac41f55-5e29-422a-96fb-aa3901699bd7.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Most technical SEO checklists were written for one crawler: Googlebot. Your site now gets read by several more. ChatGPT, Claude and Perplexity crawl for their own search features, AI assistants fetch pages live while answering users, and Google's AI Overviews quote passages from your pages.</p>
<p>The good news: about 80% of the work is classic technical SEO. The other 20% is where AI search behaves differently, mainly bot access, JavaScript rendering and passage structure.</p>
<p>Here are 25 checks, grouped by stage, each with a way to verify it in under a minute.</p>
<hr />
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/450f3ff8-2724-477a-9a36-68bdd1527d20.png" alt="The 25 checks grouped into crawl access, rendering, indexing, structured data, passages, and performance and trust" style="display:block;margin:0 auto" />

<h2>Crawl access (1–6)</h2>
<p><strong>1. robots.txt allows the crawlers you want.</strong> Separate decisions for training bots and search/retrieval bots:</p>
<pre><code class="language-bash">curl -s https://example.com/robots.txt
</code></pre>
<p>Look for <code>GPTBot</code>, <code>ClaudeBot</code> (training), <code>OAI-SearchBot</code>, <code>Claude-SearchBot</code>, <code>PerplexityBot</code> (search indexing) and <code>ChatGPT-User</code>, <code>Claude-User</code>, <code>Perplexity-User</code> (live user-triggered fetches). Blocking search bots removes you from those engines' answers.</p>
<p><strong>2.</strong> <code>Google-Extended</code> <strong>decision is deliberate.</strong> It controls Gemini training and some grounding uses. It does <strong>not</strong> affect Google Search or AI Overviews, so blocking it won't hide you from AI Overviews, and allowing it won't get you in.</p>
<p><strong>3. CDN/WAF isn't blocking AI bots.</strong> Bot-protection defaults on some CDNs block AI crawlers regardless of robots.txt. Check firewall events for those user agents and look for <code>403</code> or challenge responses:</p>
<pre><code class="language-bash">grep -E "GPTBot|OAI-SearchBot|ChatGPT-User|PerplexityBot|ClaudeBot|Claude-User" access.log \
  | awk '{print $9}' | sort | uniq -c
</code></pre>
<p><strong>4. Rate limits don't punish live fetches.</strong><code>429</code> responses to <code>*-User</code> agents mean a real person's conversation failed to load your page.</p>
<p><strong>5. No accidental</strong> <code>noindex</code><strong>.</strong></p>
<pre><code class="language-bash">curl -sI https://example.com/page | grep -i x-robots-tag
curl -s https://example.com/page | grep -i '&lt;meta name="robots"'
</code></pre>
<p><strong>6. XML sitemap is complete and submitted.</strong> Include every canonical URL you want indexed, with accurate <code>&lt;lastmod&gt;</code> dates. Submit it in Google Search Console and Bing Webmaster Tools. Bing matters more than people expect: some AI products draw on Bing's index.</p>
<h2>Rendering (7–10)</h2>
<p><strong>7. Main content is in the raw HTML.</strong> The single most important AI-specific check. Googlebot renders JavaScript; many AI fetchers don't reliably.</p>
<pre><code class="language-bash">curl -s https://example.com/pricing | grep -c "per month"
</code></pre>
<p>Zero matches for text you can see in the browser means it's client-rendered.</p>
<p><strong>8. Content pages use SSR or static generation.</strong> In Next.js App Router, Server Components render on the server by default. The usual mistake is a <code>"use client"</code> page that fetches content in <code>useEffect</code>. Astro, Hugo, Eleventy and most static site generators are fine out of the box.</p>
<p><strong>9. Hidden content is in the DOM.</strong> Tabs, accordions and "read more" sections should render their text in HTML and hide it with CSS, not fetch it on click.</p>
<p><strong>10. Rendered HTML in Google matches expectations.</strong> Search Console → URL Inspection → Test live URL → View tested page. Search the HTML for your key sentences.</p>
<h2>Indexing and canonicals (11–15)</h2>
<p><strong>11. One canonical per piece of content.</strong></p>
<pre><code class="language-bash">curl -s https://example.com/blog/post | grep -i 'rel="canonical"'
</code></pre>
<p><strong>12. Cross-posted content points home.</strong> If you publish on your blog and syndicate to Hashnode, dev.to or Medium, every copy should carry a canonical URL pointing to the original.</p>
<p><strong>13. Google picked the canonical you intended.</strong> URL Inspection → "Google-selected canonical". If it differs from yours, investigate duplicates.</p>
<p><strong>14. No thin or near-duplicate pages at scale.</strong> Tag pages, empty category pages and auto-generated variants dilute your site. Mass-produced low-value pages can also fall under Google's scaled content abuse policy.</p>
<p><strong>15. Snippets aren't restricted by accident.</strong><code>nosnippet</code> or a tiny <code>max-snippet</code> prevents your page from being a supporting link in AI Overviews. Use <code>data-nosnippet</code> on specific elements if you need to protect fragments.</p>
<h2>Structured data (16–19)</h2>
<p><strong>16. Organization (or Person) markup on the homepage</strong>, with <code>name</code>, <code>url</code>, <code>logo</code> and <code>sameAs</code> links to your official profiles. This helps engines tie mentions of your brand to your site.</p>
<p><strong>17. Article / BlogPosting markup on posts</strong>, with <code>headline</code>, <code>author</code>, <code>datePublished</code> and <code>dateModified</code>.</p>
<p><strong>18. Product / SoftwareApplication markup with offers</strong> on product and pricing pages, matching the visible prices exactly.</p>
<p><strong>19. It validates and matches the page.</strong> Run it through the Schema.org validator and Google's Rich Results Test. JSON-LD that contradicts the visible page is worse than none.</p>
<p>(The next post in this series goes deeper on JSON-LD.)</p>
<h2>Content structure for passages (20–23)</h2>
<p>AI search retrieves and quotes passages, not whole pages. These checks are about making good passages exist.</p>
<p><strong>20. Headings are questions or specific statements.</strong> "How much does it cost for a team of 10?" beats "Pricing".</p>
<p><strong>21. Answer first.</strong> The first one or two sentences under each heading directly answer it.</p>
<p><strong>22. Sections stand alone.</strong> No "as mentioned above" or "it" at the start of a section. Repeat the subject.</p>
<p><strong>23. Comparisons are in tables.</strong> Tables chunk cleanly and get quoted accurately.</p>
<h2>Performance and trust (24–25)</h2>
<p><strong>24. Core Web Vitals pass on mobile.</strong> LCP, INP and CLS in Search Console's Core Web Vitals report or PageSpeed Insights. Slow servers also time out impatient AI fetchers.</p>
<p><strong>25. Authorship and freshness are visible.</strong> Named author with a short bio, visible publish and update dates, an About page and real contact details.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/4ea88831-1859-4caf-b526-646e12475529.png" alt="Impact versus effort quadrant placing raw HTML, bot access and answer-first sections in the do-first area" style="display:block;margin:0 auto" />

<h2>About llms.txt</h2>
<p>You'll see <code>llms.txt</code> recommended in many GEO checklists. It's a proposed Markdown file at your site root that points LLMs to key pages. It can help some coding assistants and agents working with documentation. Google has said it doesn't use it for Search, and no major AI search engine has confirmed relying on it for citations. It's fine to add if it's cheap; just don't count it as one of your 25.</p>
<h2>Run it as a script</h2>
<p>Checks 1, 5, 7, 11 and 15 can be automated in a few lines:</p>
<pre><code class="language-bash">#!/usr/bin/env bash
# usage: ./ai-seo-check.sh https://example.com/pricing "per month"
URL=$1; PHRASE=$2
ORIGIN=$(echo "$URL" | awk -F/ '{print $1"//"$3}')

echo "== robots.txt AI rules"
curl -s "$ORIGIN/robots.txt" | grep -iE -A2 "GPTBot|OAI-SearchBot|ClaudeBot|Claude-SearchBot|PerplexityBot|Google-Extended" || echo "(no AI-specific rules)"

HTML=$(curl -s -A "Mozilla/5.0 (compatible; seo-check)" "$URL")
echo "== meta robots";      echo "$HTML" | grep -io '&lt;meta name="robots"[^&gt;]*&gt;' || echo "(none)"
echo "== X-Robots-Tag";     curl -sI "$URL" | grep -i x-robots-tag || echo "(none)"
echo "== canonical";        echo "$HTML" | grep -io '&lt;link rel="canonical"[^&gt;]*&gt;' || echo "MISSING"
echo "== phrase in raw HTML"; echo "$HTML" | grep -qi "$PHRASE" &amp;&amp; echo "found" || echo "NOT FOUND (client-rendered?)"
echo "== JSON-LD blocks";   echo "$HTML" | grep -c 'application/ld+json'
</code></pre>
<h2>Going further</h2>
<p>This checklist covers the technical floor. The next layer, whether AI engines actually understand and cite the page, needs a different kind of audit.</p>
<p><a href="https://www.vistaai.io/features/page-audit">Vista AI's Page Audit</a> covers both. It checks seven areas (traditional SEO signals, AI crawlability and rendering, schema, AI content extraction, E-E-A-T signals, link quality and citation potential) and returns 0–100 scores for AI Visibility, AI Understanding and AI Citation, with a prioritised fix list and side-by-side scoring of competitor pages.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[What Is Content Watermarking? SynthID, C2PA and IPTC Explained for Developers]]></title><description><![CDATA[How AI content watermarking works: SynthID text and image watermarks, C2PA Content Credentials, IPTC DigitalSourceType metadata, with code.]]></description><link>https://vistaai-geo.hashnode.dev/what-is-content-watermarking-synthid-c2pa-and-iptc-explained-for-developers</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/what-is-content-watermarking-synthid-c2pa-and-iptc-explained-for-developers</guid><category><![CDATA[AI]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[Security]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[SEO]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Thu, 15 Oct 2026 06:56:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/0e78eb6f-7c63-49e2-9bc4-4301141a0a8c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"Content watermarking" gets used to mean three very different technologies. People ask whether Google can "see the watermark" in their blog post, whether stripping EXIF removes it, and whether watermarked images rank worse. The answers depend entirely on which of the three you mean.</p>
<p>This post separates them, shows how each works (with code), and covers what they mean for anyone publishing on the web.</p>
<h2>The three things people call "watermarking"</h2>
<table>
<thead>
<tr>
<th></th>
<th>Statistical watermark</th>
<th>Provenance manifest</th>
<th>Metadata label</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Example</strong></td>
<td>Google SynthID</td>
<td>C2PA Content Credentials</td>
<td>IPTC <code>DigitalSourceType</code></td>
</tr>
<tr>
<td><strong>Where it lives</strong></td>
<td>Inside the content itself (word choices, pixels, audio)</td>
<td>Signed data attached to the file</td>
<td>A metadata field in the file</td>
</tr>
<tr>
<td><strong>Survives copy/paste or screenshot?</strong></td>
<td>Often, to a degree</td>
<td>No (metadata is lost)</td>
<td>No</td>
</tr>
<tr>
<td><strong>Survives metadata stripping?</strong></td>
<td>Yes</td>
<td>No</td>
<td>No</td>
</tr>
<tr>
<td><strong>Tamper-evident?</strong></td>
<td>No (it's probabilistic)</td>
<td>Yes (cryptographically signed)</td>
<td>No</td>
</tr>
<tr>
<td><strong>Who can check it?</strong></td>
<td>Whoever holds the detection keys</td>
<td>Anyone, with open tools</td>
<td>Anyone</td>
</tr>
</tbody></table>
<p>They're complementary. Watermarks survive when metadata is stripped. Manifests carry a verifiable history when they survive. Labels are simple and widely supported, but trivially removed.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/10d99430-7efd-4aa0-a9cd-50756d39a7e2.png" alt="" style="display:block;margin:0 auto" />

<h2>1. Statistical watermarks: SynthID</h2>
<p><strong>SynthID</strong> is Google DeepMind's watermarking technology. It's applied to content generated by Google's models (Gemini text, Imagen images, Veo video, Lyria audio) and some partner tools.</p>
<h3>How text watermarking works</h3>
<p>A language model picks each next token by sampling from a probability distribution. SynthID Text nudges that sampling using a secret key:</p>
<ol>
<li><p>For each step, a pseudorandom function scores candidate tokens using the <strong>watermarking keys</strong> and the previous few tokens (the <strong>n-gram context</strong>).</p>
</li>
<li><p>Sampling is biased toward tokens with high scores, in a way designed not to noticeably change quality.</p>
</li>
<li><p>A <strong>detector</strong> holding the same keys recomputes those scores over a piece of text. Watermarked text has statistically higher scores than chance; unwatermarked text doesn't.</p>
</li>
</ol>
<p>The text implementation is <strong>open source</strong>. Google released it in October 2024, and it's built into Hugging Face Transformers. You can watermark output from your own open model like this:</p>
<pre><code class="language-python">from transformers import AutoModelForCausalLM, AutoTokenizer, SynthIDTextWatermarkingConfig

tokenizer = AutoTokenizer.from_pretrained("google/gemma-2-2b", padding_side="left")
model = AutoModelForCausalLM.from_pretrained("google/gemma-2-2b")

watermarking_config = SynthIDTextWatermarkingConfig(
    keys=[654, 400, 836, 123, 340, 443, 597, 160, 57],  # keep your real keys secret
    ngram_len=5,
)

inputs = tokenizer(["Write a short intro to Postgres indexing."], return_tensors="pt", padding=True)
out = model.generate(**inputs, watermarking_config=watermarking_config,
                     do_sample=True, max_new_tokens=200)
print(tokenizer.batch_decode(out, skip_special_tokens=True)[0])
</code></pre>
<p>Detection uses <code>SynthIDTextWatermarkDetector</code> with a <code>BayesianDetectorModel</code> that you <strong>train for your specific keys</strong> (Hugging Face's <code>synthid_text</code> research project has the training script):</p>
<pre><code class="language-python">from transformers import (AutoTokenizer, BayesianDetectorModel,
                          SynthIDTextWatermarkLogitsProcessor, SynthIDTextWatermarkDetector)

detector_model = BayesianDetectorModel.from_pretrained("your-org/your-trained-detector")
processor = SynthIDTextWatermarkLogitsProcessor(**detector_model.config.watermarking_config, device="cpu")
tokenizer = AutoTokenizer.from_pretrained(detector_model.config.model_name)
detector = SynthIDTextWatermarkDetector(detector_model, processor, tokenizer)

score = detector(tokenizer(["text to check"], return_tensors="pt").input_ids)
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/392a5644-2545-4d63-a25b-3efdf4ad6693.png" alt="" style="display:block;margin:0 auto" />

<p>Three consequences fall straight out of this design:</p>
<ul>
<li><p><strong>You can only detect watermarks whose keys you have.</strong> Open-sourcing the method doesn't let anyone detect Gemini's watermark. Google's own SynthID Detector portal has been limited-access (journalists, researchers, media professionals).</p>
</li>
<li><p><strong>Short text is hard.</strong> Detection is statistical, so a tweet-length snippet gives weak evidence. Longer passages give stronger evidence.</p>
</li>
<li><p><strong>Heavy editing weakens it.</strong> Paraphrasing, translation and substantial rewriting reduce the signal. Light edits usually don't erase it completely.</p>
</li>
</ul>
<h3>Image, video and audio</h3>
<p>SynthID for images, video and audio embeds the signal in the pixels or waveform. It's designed to survive common edits like cropping, resizing, compression and colour adjustments. Unlike the text version, these watermarks are <strong>proprietary</strong>, and only Google's tools can check them.</p>
<p>In May 2026 Google announced SynthID verification in Search (you can ask Lens, AI Mode or Circle to Search whether an image was made with AI), with Chrome support rolling out afterwards.</p>
<h2>2. Provenance manifests: C2PA Content Credentials</h2>
<p><strong>C2PA</strong> (Coalition for Content Provenance and Authenticity) is an open standard backed by Adobe, Microsoft, Google, OpenAI and others. It isn't a watermark. It's a <strong>cryptographically signed record</strong> of where a file came from and what was done to it, embedded in the file (for JPEG/PNG, in a JUMBF metadata box).</p>
<p>A manifest contains <strong>assertions</strong> ("created by model X", "cropped", "colour-adjusted") signed with the creator's certificate. If anyone edits the file without updating the manifest, the signature check fails.</p>
<p>You can inspect and sign manifests with the open-source <code>c2patool</code> CLI:</p>
<pre><code class="language-bash"># Inspect an image's Content Credentials
c2patool photo.jpg

# Add a manifest (manifest.json describes the assertions; signing cert configured inside)
c2patool photo.jpg -m manifest.json -o photo-signed.jpg
</code></pre>
<p>A minimal manifest marking an image as AI-generated looks like this:</p>
<pre><code class="language-json">{
  "claim_generator": "my-pipeline/1.0",
  "assertions": [
    {
      "label": "c2pa.actions",
      "data": {
        "actions": [
          {
            "action": "c2pa.created",
            "digitalSourceType": "http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia"
          }
        ]
      }
    }
  ]
}
</code></pre>
<p>The weakness is obvious to anyone who has run an image pipeline: <strong>metadata gets stripped.</strong> Many image optimisers, CMS upload flows, CDNs and social platforms remove it by default. If you publish C2PA-signed images, check that your pipeline preserves them. Some CDNs, including Cloudflare, have added an option to preserve Content Credentials through image transformations.</p>
<p>Google has said C2PA verification is coming to Search and Chrome, following its rollout in the Gemini app in May 2026.</p>
<h2>3. Metadata labels: IPTC DigitalSourceType</h2>
<p>The simplest layer. IPTC Photo Metadata has a <code>DigitalSourceType</code> field with a controlled vocabulary. The value for fully AI-generated media is:</p>
<pre><code class="language-text">http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia
</code></pre>
<p>(There are related values, such as <code>compositeWithTrainedAlgorithmicMedia</code> for images that combine AI and other elements.)</p>
<p>Set it with <code>exiftool</code>:</p>
<pre><code class="language-bash">exiftool -XMP-iptcExt:DigitalSourceType="http://cv.iptc.org/newscodes/digitalsourcetype/trainedAlgorithmicMedia" hero.png

# Verify
exiftool -XMP-iptcExt:DigitalSourceType hero.png
</code></pre>
<p>This one has direct commercial consequences. <strong>Google Merchant Center requires AI-generated product images to carry this IPTC value</strong>, and Google's "About this image" feature reads IPTC and C2PA metadata to show users how an image was made.</p>
<h2>What this means for SEO and AI search</h2>
<p>Let's answer the questions people actually ask:</p>
<p><strong>"Will Google demote my post if it detects a SynthID watermark?"</strong> Google hasn't said that watermarks are a ranking signal. Its guidance on AI content focuses on quality and scaled content abuse, not on how content was produced. Its 2026 SynthID and C2PA announcements were about <strong>verification for users</strong>, with no mention of ranking.</p>
<p><strong>"Should I strip metadata to hide that an image is AI-generated?"</strong> For Merchant Center product images, no: labelling is required. For editorial images, removing provenance doesn't help rankings, and it removes context that platforms increasingly show to users. Being upfront also matches Google's advice to explain how content was made where readers would expect it.</p>
<p><strong>"Does watermarked text get cited less by ChatGPT or Perplexity?"</strong> There's no public evidence that AI search engines check text watermarks when choosing sources. What they demonstrably favour is specific, original, well-structured content, whoever wrote it.</p>
<p><strong>"Can I prove my content is original with watermarks?"</strong> Partially. C2PA can show that <em>your</em> signed image came from <em>your</em> pipeline. For text, there's no widely adopted provenance standard yet, so dates, bylines, canonical URLs and being the first indexed source remain your best evidence.</p>
<h2>A practical policy for a dev blog or product site</h2>
<ol>
<li><p><strong>AI-generated images:</strong> set IPTC <code>DigitalSourceType</code>, and keep metadata through your image pipeline.</p>
</li>
<li><p><strong>Product images in Merchant Center:</strong> IPTC labelling is mandatory for AI-generated ones.</p>
</li>
<li><p><strong>Signed provenance:</strong> if your images are likely to be reused or questioned (news, product photos, brand assets), add C2PA manifests and confirm your CDN preserves them.</p>
</li>
<li><p><strong>Text:</strong> don't worry about watermarks. Worry about accuracy and originality.</p>
</li>
<li><p><strong>Disclosure:</strong> add a short note on how content was made where readers would want it.</p>
</li>
</ol>
<h2>Watching how AI uses your content</h2>
<p>Watermarks track where content <em>came from</em>. The more pressing question for most sites is where their content <em>ends up</em>: which AI answers quote it, and whether they describe the product correctly.</p>
<p><a href="https://www.vistaai.io/features/ai-citation-tracking">Vista AI's AI Citation Tracking</a> monitors that side. It captures the prompt, full response and cited source each time an AI engine mentions your brand, scores sentiment, tracks brand-name variations and flags inaccurate claims.</p>
<h2>Key takeaways</h2>
<ul>
<li><p><strong>Watermark</strong> (SynthID): statistical signal inside the content. Robust to metadata stripping, only detectable with the right keys.</p>
</li>
<li><p><strong>Manifest</strong> (C2PA): signed history attached to the file. Verifiable, but lost if metadata is stripped.</p>
</li>
<li><p><strong>Label</strong> (IPTC): a simple metadata field. Required for AI product images in Merchant Center.</p>
</li>
<li><p>None of them is a confirmed ranking factor. Quality and accuracy are.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[How Google Sees Your Content in the Age of AI Overviews]]></title><description><![CDATA[The technical pipeline behind Google AI Overviews crawling, rendering, indexing, query fan-out, snippet controls like data-nosnippet, and how to debug]]></description><link>https://vistaai-geo.hashnode.dev/how-google-sees-your-content-in-the-age-of-ai-overviews</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/how-google-sees-your-content-in-the-age-of-ai-overviews</guid><category><![CDATA[SEO]]></category><category><![CDATA[Google]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[JavaScript]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Wed, 14 Oct 2026 14:27:24 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/8175a2be-9f54-4a12-862b-7dee524a3f39.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When Google shows an AI Overview, the answer looks like it came from nowhere. It didn't. Every supporting link in it went through the same pipeline as a normal search result: crawled, rendered, indexed, judged eligible for a snippet, and only then considered by the AI system.</p>
<p>That's good news for developers. It means AI visibility in Google is mostly a <strong>technical</strong> problem you can debug with tools you already have. This post walks through the pipeline step by step, shows where pages fall out, and covers the controls you have over how much Google's AI can use.</p>
<h2>What Google says (and doesn't say)</h2>
<p>Google's documentation on AI features is short and direct:</p>
<ul>
<li><p>There are <strong>no additional requirements</strong> to appear in AI Overviews or AI Mode, and no special optimizations are necessary.</p>
</li>
<li><p>To be shown as a supporting link, a page <strong>must be indexed and eligible to be shown in Google Search with a snippet</strong>.</p>
</li>
<li><p>No special schema, machine-readable file or AI-specific markup is required.</p>
</li>
<li><p>AI Overviews and AI Mode use <strong>query fan-out</strong>: issuing multiple related searches across subtopics to develop a response.</p>
</li>
<li><p>Traffic from AI features is <strong>included in Search Console's Performance report</strong> under the "Web" search type. It isn't broken out separately.</p>
</li>
</ul>
<p>So the question "how does Google see my content for AI?" is really "how does Google see my content, full stop?", plus one extra filter: snippet eligibility.</p>
<h2>The pipeline</h2>
<pre><code class="language-text">URL discovered (links, sitemap)
        │
        ▼
1. Crawl ─────────── robots.txt allows Googlebot? Server returns 200?
        │
        ▼
2. Render ────────── Web Rendering Service runs JavaScript (evergreen Chromium)
        │
        ▼
3. Index ─────────── canonical chosen, content stored, noindex respected
        │
        ▼
4. Snippet eligible? ─ nosnippet / max-snippet / data-nosnippet respected
        │
        ▼
5. Retrieved for a query or fan-out sub-query, then quoted by the AI system
</code></pre>
<p>Let's go through where things break.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/1c3b1c5c-9f0f-4ce6-8555-cb6468be98d0.png" alt="" style="display:block;margin:0 auto" />

<h2>1. Crawling</h2>
<p>Google's AI features use <strong>Googlebot</strong>, the same crawler as Search. That has a practical consequence that confuses people:</p>
<blockquote>
<p>Blocking <code>Google-Extended</code> in robots.txt does <strong>not</strong> remove you from AI Overviews or AI Mode.</p>
</blockquote>
<p><code>Google-Extended</code> is a control token for whether your content can be used to train Gemini models and for some grounding uses outside Search. It doesn't affect Search. The only way to keep content out of Google's AI features via robots rules is to restrict Googlebot itself, which also removes it from normal Search.</p>
<p><strong>Debug it:</strong> Search Console → URL Inspection → "Crawl allowed?" and "Page fetch".</p>
<h2>2. Rendering</h2>
<p>Googlebot renders pages with an up-to-date Chromium, so client-side JavaScript content usually gets indexed. "Usually" is doing a lot of work there:</p>
<ul>
<li><p>Rendering can be <strong>deferred</strong>, so JS-dependent content is indexed later than server-rendered HTML.</p>
</li>
<li><p>Content loaded <strong>only after user interaction</strong> (click to expand, infinite scroll without paginated URLs) may never be seen.</p>
</li>
<li><p>Blocked JS/CSS resources, failed API calls during render, or timeouts produce a partial page.</p>
</li>
</ul>
<p><strong>Debug it:</strong> URL Inspection → "Test live URL" → "View tested page" → HTML tab. Search the rendered HTML for a sentence from your main content. If it's not there, Google can't quote it.</p>
<p>Worth knowing: other AI search engines' crawlers are generally <em>less</em> capable at rendering than Googlebot. Server-side rendering or static generation for content pages fixes the problem for all of them at once.</p>
<h2>3. Indexing and canonicals</h2>
<p>A page that isn't indexed can't be a supporting link. The common silent failures:</p>
<ul>
<li><p><strong>Wrong canonical.</strong> Google picked a different URL as canonical (check "Google-selected canonical" in URL Inspection). Cross-posted articles are a classic case: your Hashnode post, your dev.to copy and your company blog copy compete, and Google may pick the one you didn't intend.</p>
</li>
<li><p><strong>Duplicate or thin variants</strong> consolidated into another URL.</p>
</li>
<li><p><code>noindex</code> left over from staging.</p>
</li>
<li><p><strong>"Crawled – currently not indexed"</strong>, which often means Google didn't see enough value to index the page.</p>
</li>
</ul>
<p><strong>Debug it:</strong> Search Console → Pages report, and the "Google-selected canonical" field.</p>
<h2>4. Snippet eligibility: your control panel for AI use</h2>
<p>This is the AI-specific layer. Google applies the same <strong>preview controls</strong> to AI Overviews and AI Mode as to classic snippets. You can use them to limit what the AI can show from your page without removing the page from Search.</p>
<p><strong>Page level, meta robots:</strong></p>
<pre><code class="language-html">&lt;!-- No text snippet at all. Also blocks use as a supporting link in AI features. --&gt;
&lt;meta name="robots" content="nosnippet"&gt;

&lt;!-- Limit snippet text to 50 characters --&gt;
&lt;meta name="robots" content="max-snippet:50"&gt;
</code></pre>
<p><strong>Or as an HTTP header</strong> (useful for PDFs and other non-HTML files):</p>
<pre><code class="language-nginx">location ~* \.pdf$ {
    add_header X-Robots-Tag "nosnippet";
}
</code></pre>
<p><strong>Section level,</strong> <code>data-nosnippet</code><strong>:</strong> exclude specific parts of a page while keeping the rest eligible.</p>
<pre><code class="language-html">&lt;p&gt;Acme Analytics costs $49 per month on the Starter plan.&lt;/p&gt;

&lt;div data-nosnippet&gt;
  &lt;p&gt;Internal benchmark details that we don't want quoted out of context.&lt;/p&gt;
&lt;/div&gt;
</code></pre>
<p><code>data-nosnippet</code> works on <code>span</code>, <code>div</code> and <code>section</code> elements. Use it carefully: content inside it can't be quoted, which also means it can't help you get cited.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/adf2b746-5a26-48bb-8a59-61ac7f66491d.png" alt="" style="display:block;margin:0 auto" />

<p>A trade-off worth stating plainly: <strong>every restriction you add reduces the chance of being used as a source.</strong> <code>nosnippet</code> on a page means it can't appear as a supporting link in AI features at all. Most sites that want AI visibility should leave snippets unrestricted and use <code>data-nosnippet</code> only for genuinely sensitive fragments.</p>
<h2>5. Retrieval and query fan-out</h2>
<p>Once a page is indexed and snippet-eligible, it competes on relevance like any search result, with one twist. Because of fan-out, the AI system doesn't just run the user's query. It runs related sub-queries.</p>
<p>Example: <em>"Is Supabase good for a production SaaS?"</em> might fan out into sub-queries about Supabase pricing at scale, row-level security, backup policies, connection pooling limits, and alternatives.</p>
<p>Practical implications:</p>
<ul>
<li><p><strong>Narrow, specific pages get pulled in.</strong> A precise post on "Supabase connection pooling limits on the Pro plan" can become a supporting link for a broad question.</p>
</li>
<li><p><strong>Clear sub-topic headings help.</strong> A post structured as a set of specific questions maps well onto fan-out sub-queries.</p>
</li>
<li><p><strong>Passages need to stand alone.</strong> The AI quotes a passage, not your whole argument.</p>
</li>
</ul>
<h2>How Google treats AI-<em>written</em> pages in this pipeline</h2>
<p>Nothing in the pipeline above checks whether a human wrote your page. Google's position is that the method of creation isn't the issue: quality is, and producing many low-value pages at scale violates its spam policies regardless of method. (The previous post in this series covers that policy in detail.)</p>
<p>Where AI-written content does run into trouble in this pipeline is earlier and more mundane: thin pages don't get indexed ("Crawled – currently not indexed"), near-duplicates get folded into other canonicals, and generic passages lose to specific ones at retrieval.</p>
<h2>A 15-minute debug routine for one page</h2>
<ol>
<li><p><strong>URL Inspection → Coverage:</strong> indexed? Which canonical did Google pick?</p>
</li>
<li><p><strong>Test live URL → View tested page → HTML:</strong> is your key sentence in the rendered HTML?</p>
</li>
<li><p><strong>View source (raw HTML):</strong> is it there <em>without</em> JavaScript? (Matters for non-Google AI engines.)</p>
</li>
<li><p><strong>Check meta robots and X-Robots-Tag:</strong> any <code>nosnippet</code> or <code>max-snippet</code> you didn't intend?</p>
</li>
<li><p><strong>Search</strong> <code>site:yourdomain.com "exact sentence"</code><strong>:</strong> does Google return the page?</p>
</li>
<li><p><strong>Performance report:</strong> filter by page and look at queries. Long, question-like queries are often where AI features show up.</p>
</li>
</ol>
<h2>Beyond Google</h2>
<p>Passing all of this gets you eligible in Google's AI features. ChatGPT, Perplexity, Claude and Copilot have their own crawlers, indexes and rendering limits, so a page can be fine in Google and invisible elsewhere.</p>
<p><a href="https://www.vistaai.io/features/page-audit">Vista AI's Page Audit</a> checks a page against both sides: traditional SEO signals and AI crawlability, rendering, schema, content extraction and citation potential. It returns 0–100 scores for AI Visibility, AI Understanding and AI Citation, plus a prioritised fix list, and can score competitor pages side by side.</p>
<h2>Key takeaways</h2>
<ul>
<li><p>Google's AI features use the normal Search pipeline. <strong>Indexed + snippet-eligible</strong> is the bar.</p>
</li>
<li><p><code>Google-Extended</code> does <strong>not</strong> control AI Overviews. Snippet controls do.</p>
</li>
<li><p>Use <code>data-nosnippet</code> for fragments, not <code>nosnippet</code> for whole pages, if you want AI visibility.</p>
</li>
<li><p>Query fan-out rewards <strong>specific, well-structured</strong> pages.</p>
</li>
<li><p>Debug with URL Inspection's rendered HTML, not with what you see in your browser.</p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Hashnode Blog SEO: How to Get Your Posts Found on Google and Cited by AI]]></title><description><![CDATA[Practical Hashnode SEO setup custom domain, SEO title and description, canonical URLs for cross-posting, sitemap, and writing posts AI search can cite]]></description><link>https://vistaai-geo.hashnode.dev/hashnode-blog-seo-how-to-get-your-posts-found-on-google-and-cited-by-ai</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/hashnode-blog-seo-how-to-get-your-posts-found-on-google-and-cited-by-ai</guid><category><![CDATA[Hashnode]]></category><category><![CDATA[Blogging]]></category><category><![CDATA[SEO]]></category><category><![CDATA[technical writing]]></category><category><![CDATA[AI]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Mon, 12 Oct 2026 04:00:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/cfeee328-a408-473f-bc46-80133ff3a1a4.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Hashnode does a lot of SEO work for you out of the box: server-rendered pages, automatic sitemaps, Open Graph tags and fast hosting. That's why plenty of developers' Hashnode posts rank better than their personal sites ever did.</p>
<p>But "out of the box" stops short of a few decisions only you can make, and those decisions now affect two audiences: Google, and the AI assistants (ChatGPT, Perplexity, Google's AI Overviews) that increasingly answer developer questions by quoting blog posts.</p>
<p>This guide covers the setup, the per-post fields, cross-posting without losing credit, and how to structure posts so they get quoted.</p>
<h2>Part 1: Blog-level setup (do this once)</h2>
<h3>Use a custom domain</h3>
<p>A custom domain (<code>blog.yourname.dev</code> instead of <code>yourname.hashnode.dev</code>) means the authority your posts build accrues to a domain you own and can take elsewhere. If you ever move platforms, you redirect your own domain and keep your rankings.</p>
<p>Hashnode supports custom domains and subdomains; the exact plan requirements have changed over time, so check your blog's domain settings for what's currently included.</p>
<h3>Verify the blog in Google Search Console and Bing Webmaster Tools</h3>
<ol>
<li><p>Add your blog domain as a property in Google Search Console.</p>
</li>
<li><p>Submit your sitemap. Hashnode generates it automatically at:</p>
</li>
</ol>
<pre><code class="language-text">https://your-blog-domain/sitemap.xml
</code></pre>
<ol>
<li>Do the same in Bing Webmaster Tools. Some AI products draw on Bing's index, so being indexed there matters more than its search market share suggests.</li>
</ol>
<h3>Fill in the blog's own metadata</h3>
<p>Give the blog a clear name and description that say what you write about ("Notes on Postgres performance and backend architecture", not "My thoughts"). That description becomes context for how search engines and AI systems categorise your blog.</p>
<h3>Write a real About page</h3>
<p>A short bio with your role, what you build and links to your GitHub and LinkedIn. It's a trust signal for readers, Google's quality systems and AI answer engines deciding whose explanation to quote.</p>
<h2>Part 2: Per-post SEO fields</h2>
<p>Hashnode's editor exposes the fields that matter. Use them on every post.</p>
<table>
<thead>
<tr>
<th>Field</th>
<th>What to put there</th>
<th>Why</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Title</strong></td>
<td>Specific and searchable: "Fixing N+1 queries in Prisma with <code>include</code>"</td>
<td>What readers and search engines see first</td>
</tr>
<tr>
<td><strong>Subtitle</strong></td>
<td>A one-line summary with secondary keywords</td>
<td>Shown on the post and in feeds</td>
</tr>
<tr>
<td><strong>SEO title</strong></td>
<td>≤ 60 characters, keyword near the front</td>
<td>Used in the <code>&lt;title&gt;</code> tag and search results</td>
</tr>
<tr>
<td><strong>SEO description</strong></td>
<td>~150 characters that answer "what will I learn?"</td>
<td>Used as the meta description</td>
</tr>
<tr>
<td><strong>Slug</strong></td>
<td>Short, lowercase, keyword-based: <code>prisma-n-plus-one-include</code></td>
<td>Clean, stable URL</td>
</tr>
<tr>
<td><strong>Tags</strong></td>
<td>Up to 5, mixing broad (<code>javascript</code>) and specific (<code>prisma</code>)</td>
<td>Discovery on Hashnode and topical context</td>
</tr>
<tr>
<td><strong>Cover / OG image</strong></td>
<td>1600×840, readable title text</td>
<td>Social previews and click-through</td>
</tr>
<tr>
<td><strong>Table of contents</strong></td>
<td>On, for posts with several sections</td>
<td>Navigation + clear section structure</td>
</tr>
</tbody></table>
<p>Two rules:</p>
<ul>
<li><p><strong>Don't change slugs after publishing</strong> unless you set up a redirect. Hashnode posts get backlinks quickly, and a broken URL loses them.</p>
</li>
<li><p><strong>Write the SEO description yourself.</strong> Auto-generated descriptions often start with your intro anecdote, which is the least informative part of the post.</p>
</li>
</ul>
<h2>Part 3: Cross-posting without losing credit</h2>
<p>Many developers publish the same article on Hashnode, dev.to, Medium and a company blog. Without canonical URLs, those copies compete with each other, and Google may pick a copy you didn't intend as the "original".</p>
<p>The rule: <strong>pick one home for each article, and point every other copy at it.</strong></p>
<ul>
<li><p><strong>If Hashnode is the original:</strong> publish there first. On dev.to, set <code>canonical_url</code> in the front matter to the Hashnode URL. On Medium, use "Import a story" (which sets the canonical) or set it in the story settings.</p>
</li>
<li><p><strong>If another site is the original:</strong> in Hashnode's article settings, mark the post as republished and enter the original URL. Hashnode then outputs a canonical link to it.</p>
</li>
</ul>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/05f2b4c4-33cd-4fd2-8826-083fcaeb5621.png" alt="Diagram of dev.to, Medium, company blog and newsletter copies pointing a canonical link to the original Hashnode post" style="display:block;margin:0 auto" />

<p>Check it worked:</p>
<pre><code class="language-bash">curl -s https://your-blog-domain/your-post | grep -io '&lt;link rel="canonical"[^&gt;]*&gt;'
</code></pre>
<p>Then, a week or so after publishing, check Google Search Console → URL Inspection on the original. "Google-selected canonical" should match the URL you chose.</p>
<p>Canonicals are a hint, not a command. Publishing the original first, a few days before the copies, makes it more likely that search engines treat it as the source.</p>
<h2>Part 4: Write posts that get cited by AI</h2>
<p>AI search answers developer questions by retrieving <strong>passages</strong> from pages and quoting the clearest ones. Hashnode posts are well placed for this: they're server-rendered (so AI crawlers can read them without running JavaScript) and developers tend to write specific, practical content. A few structural habits make a big difference.</p>
<h3>Make headings match questions</h3>
<pre><code class="language-markdown">&lt;!-- Weak --&gt;
## The fix

&lt;!-- Strong --&gt;
## How to fix N+1 queries in Prisma with include
</code></pre>
<p>AI systems often break a user's question into sub-questions. A heading that matches one of them makes your section the obvious passage to retrieve.</p>
<h3>Answer in the first two sentences</h3>
<p>Under each heading, state the answer, then explain it:</p>
<pre><code class="language-markdown">## Why is my Prisma query slow inside a loop?

Calling `findUnique` inside a loop sends one query per item: the N+1 problem.
For 100 users, that's 101 round-trips instead of 1 or 2.

Here's what it looks like in practice…
</code></pre>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/169ae2bf-6c34-4aad-82c6-962af714cf53.png" alt="A vague blog section compared with a quotable one that has a question heading and an answer in the first sentence" style="display:block;margin:0 auto" />

<h3>Make every section stand on its own</h3>
<p>Avoid starting sections with "This", "It" or "As we saw above". The retriever may hand the model your section with nothing around it.</p>
<h3>Include something only you have</h3>
<p>The output of your benchmark. The exact error message you hit. Timings before and after. Version numbers. This is the information gain that makes an AI system prefer your post over the twenty generic ones covering the same topic. It's also what makes a post useful to humans.</p>
<h3>Put comparisons in tables</h3>
<p>"Prisma vs Drizzle vs Kysely" as a table with real criteria gets quoted far more cleanly than three paragraphs of prose.</p>
<h3>Date your claims</h3>
<p>"As of Prisma 6.x" or "tested on Node 22" helps readers, and helps AI systems judge whether your answer is current.</p>
<h2>Part 5: Check whether it's working</h2>
<p><strong>Google:</strong> Search Console's Performance report shows queries, clicks and positions. AI Overview traffic is included in the "Web" totals; it isn't broken out separately. Long, question-shaped queries in your report are often where AI features show up.</p>
<p><strong>AI assistants:</strong> traffic from ChatGPT, Perplexity, Gemini and Copilot shows up as referrals in your analytics, if you have analytics on a custom domain. ChatGPT also often adds <code>utm_source=chatgpt.com</code> to links.</p>
<p><strong>Being cited, not just visited:</strong> many AI answers cite a source without the user clicking. To see whether your posts are being cited, and for which questions, you need to query the AI engines directly and repeatedly. <a href="https://www.vistaai.io/features/ai-citation-tracking">Vista AI's AI Citation Tracking</a> does this across the major engines and records the prompt, full answer and cited URL for each mention, so you can see which of your posts AI systems rely on and what they say about them.</p>
<h2>The checklist</h2>
<ul>
<li><p>Custom domain connected</p>
</li>
<li><p>Blog verified in Google Search Console and Bing Webmaster Tools, sitemap submitted</p>
</li>
<li><p>Blog description and About page say who you are and what you write about</p>
</li>
<li><p>Every post: SEO title, SEO description, clean slug, 3–5 tags, OG image</p>
</li>
<li><p>Cross-posts point to one canonical original</p>
</li>
<li><p>Headings phrased as questions or specific statements</p>
</li>
<li><p>Each section answers first and stands alone</p>
</li>
<li><p>Every post includes something first-hand: output, numbers, versions</p>
</li>
</ul>
<hr />
]]></content:encoded></item><item><title><![CDATA[Does Google Penalize AI-Generated Content? What the Documentation Actually Says]]></title><description><![CDATA[Google actual policy on AI-generated content: scaled content abuse, fact-checking, metadata, disclosure, and a practical checklist for developer blogs]]></description><link>https://vistaai-geo.hashnode.dev/does-google-penalize-ai-generated-content-what-the-documentation-actually-says</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/does-google-penalize-ai-generated-content-what-the-documentation-actually-says</guid><category><![CDATA[SEO]]></category><category><![CDATA[aeo]]></category><category><![CDATA[llm]]></category><category><![CDATA[chatgpt]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Sun, 11 Oct 2026 16:50:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/a1fd953f-1c15-41ed-b024-6068f8031092.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>"Will Google penalize my blog if I use AI to write it?" is one of the most-asked questions in developer communities right now. The answers you find range from "AI content is banned" to "Google can't tell anyway".</p>
<p>Both are wrong. Google has published fairly specific guidance, and it's more useful than either extreme. This post goes through what it says, what it doesn't, and how to use AI in a writing workflow without creating risk.</p>
<hr />
<h2>The short answer</h2>
<p><strong>No, Google does not penalize content for being AI-generated.</strong> It penalizes content that is low-value and produced at scale to manipulate rankings, regardless of whether a human, a model or a template produced it.</p>
<p>Google has said this since February 2023, when it published <em>"Google Search's guidance about AI-generated content"</em>. The framing was about rewarding high-quality content however it is produced. The current documentation, <em>"Google Search's guidance on using generative AI content on your website"</em>, keeps the same position and adds practical rules.</p>
<h2>The policy that actually matters: scaled content abuse</h2>
<p>The rule you can break is Google's spam policy on <strong>scaled content abuse</strong>, introduced with the March 2024 core update. Google's generative AI guidance points straight at it:</p>
<blockquote>
<p>"Using generative AI tools or other similar tools to generate many pages without adding value for users may violate Google's spam policy on scaled content abuse."</p>
</blockquote>
<p>The key words are <strong>many pages</strong> and <strong>without adding value</strong>. The policy targets patterns like:</p>
<ul>
<li><p>generating hundreds of pages from a keyword list with little or no editing,</p>
</li>
<li><p>scraping or rewording other sites' content (including by automated synonym swapping or translation),</p>
</li>
<li><p>stitching together content from multiple pages without adding anything,</p>
</li>
<li><p>publishing pages that make little sense to a reader but contain search keywords.</p>
</li>
</ul>
<p>None of this is specific to AI. A content farm of underpaid writers producing the same output would violate the same policy. AI just made it cheap.</p>
<p>Google enforces this algorithmically (through core and spam updates) and with <strong>manual actions</strong>, which you'll see in Search Console under <em>Security &amp; Manual Actions</em>.</p>
<h2>What Google asks you to do with AI content</h2>
<p>The generative AI guidance has a few concrete requirements that are easy to miss.</p>
<h3>1. Fact-check everything, including metadata</h3>
<p>Google says it's "critical to manually factcheck and review all AI-generated content for accuracy and trustworthiness before publishing". It's explicit that this covers more than body text:</p>
<ul>
<li><p><code>&lt;title&gt;</code> tags and meta descriptions</p>
</li>
<li><p>structured data (JSON-LD)</p>
</li>
<li><p>image <code>alt</code> text</p>
</li>
</ul>
<p>That last group is where AI-generated errors hide, because nobody reads them. A hallucinated <code>"price": "29"</code> in your JSON-LD is still wrong data, and it can show up in search features.</p>
<h3>2. Consider explaining how content was made</h3>
<p>Google suggests adding information about how content was created "in a way that makes sense for your audience". For a developer blog, that might be a line like <em>"Drafted with AI assistance; code tested by the author on Node 22"</em>. It's not mandatory for Search, but it supports trust. Some platforms, including several developer blogging communities, have their own disclosure rules that are stricter.</p>
<h3>3. E-commerce has hard labelling rules</h3>
<p>If you sell through Google Merchant Center:</p>
<ul>
<li><p>AI-generated <strong>images</strong> must carry IPTC <code>DigitalSourceType</code> metadata set to <code>TrainedAlgorithmicMedia</code>.</p>
</li>
<li><p>AI-generated <strong>product data</strong> (titles, descriptions) must be specified separately and labelled as AI-generated.</p>
</li>
</ul>
<p>(The post on content watermarking in this series covers how that metadata works.)</p>
<h3>4. Structured data rules still apply</h3>
<p>AI-written JSON-LD has to follow the same structured data guidelines as hand-written markup, and must match visible page content.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/14ae6c5c-0757-4b55-b3f7-2ea7d0a63527.png" alt="" style="display:block;margin:0 auto" />

<h2>"But can Google detect AI content?"</h2>
<p>This is the wrong question, and it's worth explaining why.</p>
<p>Google hasn't announced a ranking system that classifies text as AI-written and demotes it. It doesn't need one. Its systems evaluate whether content is helpful, original, accurate and trustworthy. Mass-produced, unedited AI output tends to fail those tests on its own:</p>
<ul>
<li><p>it repeats what's already ranking (no information gain),</p>
</li>
<li><p>it's generic (no first-hand experience),</p>
</li>
<li><p>it contains errors (low trust),</p>
</li>
<li><p>it's published in suspicious volume (a spam signal).</p>
</li>
</ul>
<p>Text watermarks like Google's SynthID exist, but they only work on output from models that embed them, they can weaken under heavy editing, and Google hasn't said it uses them as a ranking signal. Optimising your workflow to "avoid AI detection" solves a problem you don't have, while ignoring the quality problem you might.</p>
<h2>Google's "Who, How, and Why" test</h2>
<p>Google's helpful content documentation offers a simple self-check that maps neatly onto AI use:</p>
<ul>
<li><p><strong>Who</strong> created the content? Is it clear, with a byline and background?</p>
</li>
<li><p><strong>How</strong> was it created? Would readers expect to know about automation, and would disclosure help them?</p>
</li>
<li><p><strong>Why</strong> was it created? Primarily to help people, or primarily to attract search traffic?</p>
</li>
</ul>
<p>If the honest answer to "why" is "we generated 300 pages because the keywords had volume", the method doesn't matter. That's the pattern the spam policy describes.</p>
<h2>A safe AI writing workflow for a developer blog</h2>
<p>Here's a workflow that uses AI heavily and stays well within the guidelines:</p>
<ol>
<li><p><strong>You pick the topic</strong> from real experience: a bug you fixed, a migration you did, a benchmark you ran.</p>
</li>
<li><p><strong>AI helps outline and draft</strong> the explanatory parts.</p>
</li>
<li><p><strong>You add what the model can't know</strong>: your numbers, your error messages, your decisions and why.</p>
</li>
<li><p><strong>You run every code sample.</strong> Paste the actual output.</p>
</li>
<li><p><strong>You fact-check every claim</strong>, especially versions, API names, prices and limits. These are exactly where models hallucinate.</p>
</li>
<li><p><strong>You review metadata</strong>: title, description, alt text, JSON-LD.</p>
</li>
<li><p><strong>You publish at a human pace.</strong> One excellent post beats twenty generated ones.</p>
</li>
</ol>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/809e6eb6-067b-42e3-8891-875fbd2e3fdb.png" alt="" style="display:block;margin:0 auto" />

<p>Steps 3 and 4 are what make a post worth citing, by Google and by AI answer engines.</p>
<h2>Quick checklist</h2>
<ul>
<li><p>Each post contains something first-hand: data, code output, experience</p>
</li>
<li><p>Every fact, version number and API name has been checked</p>
</li>
<li><p>Title, meta description, alt text and JSON-LD reviewed by a human</p>
</li>
<li><p>Author byline and date are visible</p>
</li>
<li><p>Publishing volume reflects real editorial capacity</p>
</li>
<li><p>No pages that exist only to target a keyword variation</p>
</li>
</ul>
<h2>Where AI search fits in</h2>
<p>The same qualities that keep AI-assisted content safe in Google (originality, accuracy, specifics) are what get content cited in ChatGPT, Perplexity and Google's AI Overviews. Generic pages don't just risk spam filters. They're also the pages AI answers have no reason to quote.</p>
<hr />
]]></content:encoded></item><item><title><![CDATA[What Is Generative Engine Optimization (GEO)? A Developer's Guide]]></title><description><![CDATA[GEO explained for developers: how AI search retrieves and cites pages, how it differs from SEO, and the technical changes that improve AI visibility.]]></description><link>https://vistaai-geo.hashnode.dev/what-is-generative-engine-optimization-geo</link><guid isPermaLink="true">https://vistaai-geo.hashnode.dev/what-is-generative-engine-optimization-geo</guid><category><![CDATA[SEO]]></category><category><![CDATA[AI]]></category><category><![CDATA[llm]]></category><category><![CDATA[Web Development]]></category><category><![CDATA[Search engine optimization]]></category><dc:creator><![CDATA[Furqan | Founder @ Vista]]></dc:creator><pubDate>Wed, 07 Oct 2026 13:30:23 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/694307f8-6235-4f7f-9f56-9d5e0a8ef2d5.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Search used to end in a list of ten links. More and more of it now ends in a paragraph: an answer written by ChatGPT, Perplexity, Claude, Gemini or Google's AI Overviews, with a handful of sources attached.</p>
<p><strong>Generative Engine Optimization (GEO)</strong> is the practice of making your content more likely to be used and cited in those generated answers. You'll also see it called AEO (Answer Engine Optimization) or LLMO. The names differ; the problem is the same.</p>
<p>This guide skips the hype and explains GEO the way developers like things explained: what the system does, where your page enters it, and which parts you can actually influence.</p>
<hr />
<h2>SEO vs. GEO in one table</h2>
<table>
<thead>
<tr>
<th></th>
<th>Classic SEO</th>
<th>GEO</th>
</tr>
</thead>
<tbody><tr>
<td><strong>Output</strong></td>
<td>Ranked list of links</td>
<td>Generated answer with a few citations</td>
</tr>
<tr>
<td><strong>Unit that competes</strong></td>
<td>The page</td>
<td>The passage (a few sentences)</td>
</tr>
<tr>
<td><strong>Success metric</strong></td>
<td>Position, clicks</td>
<td>Mentioned, cited, how you're described</td>
</tr>
<tr>
<td><strong>Measurement</strong></td>
<td>Deterministic-ish rank trackers</td>
<td>Repeated sampling (answers vary run to run)</td>
</tr>
<tr>
<td><strong>Who decides</strong></td>
<td>A ranking algorithm</td>
<td>Retrieval + a language model writing prose</td>
</tr>
</tbody></table>
<p>They overlap heavily. Google says plainly that there are no special requirements for its AI features beyond normal SEO: a page has to be indexed and eligible to show a snippet. But GEO adds two layers on top: <strong>passage-level retrieval</strong> and <strong>the model's own judgement about what to say</strong>.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/1f8d7790-c21d-4683-ad74-9c779659f4ad.png" alt="Classic search results list compared with an AI-generated answer that names three tools and cites sources" style="display:block;margin:0 auto" />

<h2>How an AI search answer gets built</h2>
<p>Most AI search systems follow some version of retrieval-augmented generation (RAG):</p>
<pre><code class="language-text">user question
   │
   ▼
1. Query rewriting / fan-out  ──►  several sub-queries
   │
   ▼
2. Retrieval  ──►  candidate pages from a search index (Google's, Bing's, or the engine's own)
   │
   ▼
3. Chunking + ranking  ──►  the best few passages
   │
   ▼
4. Generation  ──►  the model writes an answer from those passages + what it already knows
   │
   ▼
5. Attribution  ──►  some passages get shown as citations
</code></pre>
<p>Google describes step 1 directly: AI Overviews and AI Mode use a <strong>"query fan-out"</strong> technique, issuing multiple related searches across subtopics to build a response. That matters for content strategy. A single question like <em>"best Postgres hosting for a side project"</em> may fan out into sub-queries about pricing, free tiers, connection limits and backups. A page that answers one of those sub-questions cleanly can get cited even if it would never rank for the original query.</p>
<h2>Where your page can win or lose</h2>
<p>Each stage has its own failure modes. This is the useful mental model for GEO work:</p>
<img src="https://cdn.hashnode.com/uploads/covers/6ac50f8204b5daa1f6f2a208/c61a0bfb-88a5-40fc-968b-97e08c660726.png" alt="Five-stage AI answer pipeline with the ways a page drops out at each stage" style="display:block;margin:0 auto" />

<h3>Stage 2: Retrieval (can the engine find and read the page?)</h3>
<ul>
<li><p><strong>Blocked crawlers.</strong> ChatGPT search, Claude and Perplexity use their own bots (<code>OAI-SearchBot</code>, <code>Claude-SearchBot</code>, <code>PerplexityBot</code>, plus user-triggered agents like <code>ChatGPT-User</code>). A <code>robots.txt</code> rule or CDN bot setting can silently remove you from those engines.</p>
</li>
<li><p><strong>Content that needs JavaScript.</strong> Googlebot renders JavaScript. Many AI fetchers don't do it reliably. If your content only exists after hydration, some engines see an empty page.</p>
</li>
<li><p><strong>Not indexed.</strong> For Google's AI features, a page that isn't indexed, or is blocked from snippets, can't be a supporting link.</p>
</li>
</ul>
<h3>Stage 3: Chunking and ranking (does a good passage exist?)</h3>
<ul>
<li><p>The answer to the question is buried in paragraph nine.</p>
</li>
<li><p>Headings like "Overview" or "Our approach" give the retriever nothing to match.</p>
</li>
<li><p>Sections start with "It" or "As mentioned above", so the chunk makes no sense on its own.</p>
</li>
</ul>
<h3>Stage 4: Generation (does the model <em>want</em> to use you?)</h3>
<ul>
<li><p>Your page says what fifty other pages say. There's no reason to prefer it.</p>
</li>
<li><p>Third-party sources (reviews, forums, comparison posts) describe you differently than you describe yourself, and the model trusts them more.</p>
</li>
<li><p>Facts conflict across your own pages (old pricing on one, new on another).</p>
</li>
</ul>
<h3>Stage 5: Attribution (do you get the link?)</h3>
<ul>
<li><p>You can be <strong>mentioned without being cited</strong>: the model knows your brand but sources its claims from a review site.</p>
</li>
<li><p>You can be <strong>cited without being mentioned</strong>: your blog post supported a general claim, but the answer recommends someone else.</p>
</li>
</ul>
<p>These are separate outcomes and should be measured separately.</p>
<h2>The technical GEO checklist</h2>
<p>Most of GEO is good technical SEO plus writing for passages. Here's the short version, in order of impact:</p>
<p><strong>1. Let the right bots in.</strong> Decide per bot type rather than blanket-blocking "AI":</p>
<pre><code class="language-text"># Allow AI search / retrieval bots (they fetch pages to answer live questions)
User-agent: OAI-SearchBot
User-agent: Claude-SearchBot
User-agent: PerplexityBot
Allow: /

# Optionally block model-training crawlers
User-agent: GPTBot
User-agent: ClaudeBot
Disallow: /
</code></pre>
<p>Then check your CDN/WAF, which can override <code>robots.txt</code> entirely.</p>
<p><strong>2. Server-render content pages.</strong> If <code>curl https://yoursite.com/pricing | grep "per month"</code> returns nothing, neither will a non-rendering crawler.</p>
<p><strong>3. Answer first, under question-shaped headings.</strong> Each H2/H3 should be a question your reader asks, followed by a one or two sentence answer, then the detail.</p>
<p><strong>4. Make sections self-contained.</strong> Repeat the subject ("Acme's free tier includes…") instead of "It includes…". Each chunk may be the only thing the model sees.</p>
<p><strong>5. Add specifics nobody else has.</strong> Benchmarks you ran, numbers from your own data, a comparison table, a worked example. Original information is the strongest reason for a model to cite you over a generic page.</p>
<p><strong>6. Keep facts consistent.</strong> Same price, same feature list, same product description across your site, docs, and structured data.</p>
<p><strong>7. Show who wrote it and when.</strong> Named author, short bio, published and updated dates.</p>
<h2>Things that are mostly myths (for now)</h2>
<ul>
<li><p><strong>"You need a special AI schema."</strong> Google explicitly says no special schema or AI-specific markup is required for AI Overviews. Normal structured data still helps machines read your facts.</p>
</li>
<li><p><strong>"llms.txt gets you into ChatGPT."</strong> It's a proposed convention, useful for some agents and documentation tools. No major AI search engine has confirmed using it for ranking or citation, and Google has said it doesn't use it.</p>
</li>
<li><p><strong>"Keyword density for prompts."</strong> LLMs work on meaning, not repeated phrases. Stuffing makes passages worse, not better.</p>
</li>
</ul>
<h2>How to measure GEO</h2>
<p>This is where GEO really differs from SEO. AI answers are <strong>non-deterministic</strong>: the same prompt can return different brands on different runs, in different engines, for different users. A screenshot is a sample of one.</p>
<p>A workable measurement setup:</p>
<ol>
<li><p>Write 20–50 prompts the way your users actually ask questions.</p>
</li>
<li><p>Run each prompt repeatedly, across several engines, on a schedule.</p>
</li>
<li><p>Record for each answer: mentioned? position in the list? cited? how described?</p>
</li>
<li><p>Report <strong>rates over time</strong> (e.g. "mentioned in 34% of ChatGPT answers this month, up from 21%"), not single results.</p>
</li>
<li><p>Track 2–5 competitors on the same prompts, because visibility only means something relative to who's recommended instead.</p>
</li>
</ol>
<p>You can script this against the OpenAI and Perplexity APIs. Doing it daily across ChatGPT, Gemini, Claude, Perplexity, Copilot and Google AI Mode is where a dedicated tool earns its keep. <a href="https://www.vistaai.io/features/ai-rank-tracker">Vista AI's AI Rank Tracker</a> is built for this: it runs your prompt set daily across those engines, rolls results into a 0–100 visibility index, groups prompts by buyer intent and flags "quick win" prompts where you're close to being recommended.</p>
<h2>Key takeaways</h2>
<ul>
<li><p>GEO = getting <strong>used and cited</strong> in AI-generated answers, not just ranked.</p>
</li>
<li><p>The competitive unit is the <strong>passage</strong>, so structure matters as much as topic.</p>
</li>
<li><p>Technical blockers (bots, JavaScript, indexing) remove you before quality even counts.</p>
</li>
<li><p>Measure <strong>rates across many runs and engines</strong>, never single screenshots.</p>
</li>
<li><p>There's no secret AI markup. Clear, specific, well-structured, crawlable content wins in both SEO and GEO.</p>
</li>
</ul>
<hr />
]]></content:encoded></item></channel></rss>