<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://mjesar.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mjesar.github.io/" rel="alternate" type="text/html" hreflang="en" /><updated>2026-10-15T22:04:18+00:00</updated><id>https://mjesar.github.io/feed.xml</id><title type="html">Mohammad Ali Jesar</title><subtitle>Software engineer for Ruby on Rails, AI and automation. AI agents, RAG and MCP, SaaS and e-commerce.</subtitle><author><name>Mohammad Ali Jesar</name></author><entry><title type="html">Should I block GPTBot in robots.txt? Search bots versus training bots</title><link href="https://mjesar.github.io/writing/should-i-block-gptbot-in-robots-txt/" rel="alternate" type="text/html" title="Should I block GPTBot in robots.txt? Search bots versus training bots" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://mjesar.github.io/writing/should-i-block-gptbot-in-robots-txt</id><content type="html" xml:base="https://mjesar.github.io/writing/should-i-block-gptbot-in-robots-txt/"><![CDATA[<p>Only if you do not want OpenAI to train on your pages. GPTBot is OpenAI’s training crawler. Blocking it does not remove you from ChatGPT search, because ChatGPT search uses a different bot, OAI-SearchBot, which you can allow separately.</p>

<p>The useful question is not “should I block AI bots?” It is “which ones, and for what?”</p>

<h2 id="three-kinds-of-ai-bots">Three kinds of AI bots</h2>

<p>AI companies run different bots for different jobs:</p>

<ul>
  <li><strong>Training bots</strong> collect pages to train AI models.</li>
  <li><strong>Search bots</strong> read pages so an AI assistant can find and cite them in answers.</li>
  <li><strong>User-triggered bots</strong> visit a page because a person asked an assistant to open it.</li>
</ul>

<table>
  <thead>
    <tr>
      <th>Bot</th>
      <th>Company</th>
      <th>Job</th>
      <th>Follows robots.txt?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>GPTBot</td>
      <td>OpenAI</td>
      <td>Training</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>OAI-SearchBot</td>
      <td>OpenAI</td>
      <td>ChatGPT search</td>
      <td>Yes, changes take about 24 hours</td>
    </tr>
    <tr>
      <td>ChatGPT-User</td>
      <td>OpenAI</td>
      <td>User-triggered</td>
      <td>May not apply</td>
    </tr>
    <tr>
      <td>ClaudeBot</td>
      <td>Anthropic</td>
      <td>Training</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>Claude-SearchBot</td>
      <td>Anthropic</td>
      <td>Search quality</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>Claude-User</td>
      <td>Anthropic</td>
      <td>User-triggered</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>PerplexityBot</td>
      <td>Perplexity</td>
      <td>Search results (not training)</td>
      <td>Yes</td>
    </tr>
    <tr>
      <td>Perplexity-User</td>
      <td>Perplexity</td>
      <td>User-triggered</td>
      <td>Generally ignores it</td>
    </tr>
  </tbody>
</table>

<p>Google works differently. <strong>Google-Extended</strong> is not a crawler. It is a token you can use in robots.txt to control whether Gemini can use your pages for training and grounding. It does not change whether your pages appear or rank in Google Search.</p>

<h2 id="what-robotstxt-can-and-cannot-control">What robots.txt can and cannot control</h2>

<p>robots.txt is a request, and each company decides how its bots treat it. For training and search bots, the companies above say they follow it. For user-triggered visits it is mixed: Claude-User honors it, OpenAI says it may not apply to ChatGPT-User, and Perplexity-User generally ignores it.</p>

<p>So robots.txt does not control every AI visit. It controls the bots that choose to follow it.</p>

<h2 id="an-example-allow-search-block-training">An example: allow search, block training</h2>

<p>If you want AI assistants to find and cite your pages but do not want them used for training, a robots.txt like this does that for the bots that follow it:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: *
Allow: /
</code></pre></div></div>

<p>OAI-SearchBot, Claude-SearchBot and PerplexityBot fall under the last rule and stay allowed.</p>

<p>Think twice before adding Google-Extended to that list. It also covers grounding, so blocking it can keep Gemini from using your pages in its answers, not just in training.</p>

<h2 id="what-i-do-on-this-site">What I do on this site</h2>

<p>This site’s robots.txt allows every crawler and points to the sitemap. I want AI assistants to find and describe my work correctly, so I do not block any of them. A store might decide differently about training, and that is a fair choice. Just do not block the search bots by accident.</p>

<p>To see what AI tools can and cannot read on your own store, see <a href="/services/ai-discoverability/">AI discoverability</a> or <a href="/writing/why-shopify-products-do-not-show-up-in-chatgpt/">why Shopify products do not show up in ChatGPT</a>.</p>]]></content><author><name>Mohammad Ali Jesar</name></author><summary type="html"><![CDATA[Blocking GPTBot stops OpenAI training on your pages, not ChatGPT search. Which AI bots train, which search, which follow robots.txt, and which may not.]]></summary></entry><entry><title type="html">Why Shopify products do not show up in ChatGPT</title><link href="https://mjesar.github.io/writing/why-shopify-products-do-not-show-up-in-chatgpt/" rel="alternate" type="text/html" title="Why Shopify products do not show up in ChatGPT" /><published>2026-10-15T00:00:00+00:00</published><updated>2026-10-15T00:00:00+00:00</updated><id>https://mjesar.github.io/writing/why-shopify-products-do-not-show-up-in-chatgpt</id><content type="html" xml:base="https://mjesar.github.io/writing/why-shopify-products-do-not-show-up-in-chatgpt/"><![CDATA[<p>Often the problem is not the product. It is what an AI assistant can read about it: a thin description, no answers to the questions buyers ask, incomplete structured data, or crawlers that are not allowed in.</p>

<p>I built an AI agent, <a href="/projects/product_geo_agent/">product_geo_agent</a>, that checks these things on a Shopify product and scores it from 0 to 100. Here is what it found on three products, and how you can check your own store.</p>

<h2 id="what-an-ai-assistant-needs-from-a-product-page">What an AI assistant needs from a product page</h2>

<p>Before anything else, the page has to be reachable. If a store’s robots.txt blocks OAI-SearchBot, the crawler OpenAI uses for ChatGPT search, that crawler will not read those pages. <a href="/writing/should-i-block-gptbot-in-robots-txt/">My post on GPTBot and robots.txt</a> covers which bots do what.</p>

<p>After that, my agent looks at seven things. The weights are my own choice, not a published standard:</p>

<table>
  <thead>
    <tr>
      <th>What it checks</th>
      <th>Points</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Does the description answer common buyer questions?</td>
      <td>20</td>
    </tr>
    <tr>
      <td>Description quality and length</td>
      <td>15</td>
    </tr>
    <tr>
      <td>FAQ content (a store FAQ page, or a product FAQ)</td>
      <td>15</td>
    </tr>
    <tr>
      <td>Complete <code class="language-plaintext highlighter-rouge">Product</code> structured data</td>
      <td>15</td>
    </tr>
    <tr>
      <td>Is the product named when an AI model is asked for a recommendation?</td>
      <td>15</td>
    </tr>
    <tr>
      <td>Clear specs and variants</td>
      <td>10</td>
    </tr>
    <tr>
      <td>Image alt text</td>
      <td>10</td>
    </tr>
  </tbody>
</table>

<p>The AI model judges the writing. Plain Ruby code does the math, so the score is the same sum every time for the same judgments.</p>

<h2 id="three-real-audits-70-33-and-10-out-of-100">Three real audits: 70, 33 and 10 out of 100</h2>

<p>These are single runs on a Shopify development store with Shopify’s sample snowboard products, recorded on 2 October 2026.</p>

<table>
  <thead>
    <tr>
      <th>Product</th>
      <th>Score</th>
      <th>Where it lost points</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>The Complete Snowboard</td>
      <td><strong>70 / 100</strong></td>
      <td>Complete <code class="language-plaintext highlighter-rouge">Product</code> schema. No FAQ (15) and not recommended by the AI model (15).</td>
    </tr>
    <tr>
      <td>The Videographer Snowboard</td>
      <td><strong>33 / 100</strong></td>
      <td><code class="language-plaintext highlighter-rouge">Product</code> schema present, but the text left out buyer details like sizing and binding compatibility (20). No FAQ (15), not recommended (15).</td>
    </tr>
    <tr>
      <td>The Out of Stock Snowboard</td>
      <td><strong>10 / 100</strong></td>
      <td>Empty description, so it lost points for that and for unanswered buyer questions. <code class="language-plaintext highlighter-rouge">Product</code> schema present but incomplete. No FAQ.</td>
    </tr>
  </tbody>
</table>

<p>Two honest notes. First, single runs move a little: across five evaluation runs, the complete snowboard scored between 65 and 70, because the model rated its specs “fair” three times and “good” twice. Second, the recommendation check is simple. The agent picks a buyer-style category, asks a Gemini model one general question, and checks whether the product name appears in the answer. In a run on 29 September 2026 the question was “What’s a good all mountain snowboard you’d recommend?”, and the answer named well-known brands instead. Sample products on a test store were never going to be named, so all three lost those 15 points.</p>

<h2 id="the-fixes-that-matter-most">The fixes that matter most</h2>

<p>Going by where these three products lost points:</p>

<ol>
  <li><strong>Put the buyer’s questions into the description.</strong> Sizing, materials, compatibility, what is included. This was the biggest single loss for the middle product.</li>
  <li><strong>Add FAQ content.</strong> A store FAQ page, or FAQs on the product itself.</li>
  <li><strong>Make the structured data complete.</strong> The <code class="language-plaintext highlighter-rouge">Product</code> block needs a real description and offer details, not just a name.</li>
  <li><strong>Write alt text</strong> for product images.</li>
  <li><strong>Check robots.txt</strong> so the search crawlers you want can reach your pages.</li>
</ol>

<h2 id="what-nobody-can-promise">What nobody can promise</h2>

<p>Fixing these does not guarantee that ChatGPT, Perplexity or Google AI will recommend a product. Each assistant decides on its own. The fixes remove what stops them from reading and understanding the product.</p>

<h2 id="how-to-check-your-own-store">How to check your own store</h2>

<ol>
  <li><strong>Open <code class="language-plaintext highlighter-rouge">yourstore.com/robots.txt</code></strong> and look for AI bot names such as OAI-SearchBot, GPTBot or PerplexityBot, and whether they are disallowed.</li>
  <li><strong>Read one product page as a buyer.</strong> Write down five questions a buyer would ask, and check whether the page answers each one in text.</li>
  <li><strong>Run the product URL through Google’s Rich Results Test</strong> and check that the <code class="language-plaintext highlighter-rouge">Product</code> data has a description and an offer.</li>
  <li><strong>Ask ChatGPT or Perplexity</strong> the question your buyer would ask, and note whether your store appears and how it is described.</li>
</ol>

<p>If you want this done for you, see <a href="/services/ai-discoverability/">AI discoverability</a> and a <a href="/services/ai-discoverability/sample-report/">sample report</a>.</p>]]></content><author><name>Mohammad Ali Jesar</name></author><summary type="html"><![CDATA[Often the AI assistant cannot read enough about the product to recommend it. What my audit agent found on three Shopify products, and how to check your own store.]]></summary></entry></feed>