<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Ievgenii Gryshkun</title>
    <description>The latest articles on DEV Community by Ievgenii Gryshkun (@angeo).</description>
    <link>https://dev.to/angeo</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3580569%2F169d293e-1a42-4bef-b904-4e3aaaca6513.jpeg</url>
      <title>DEV Community: Ievgenii Gryshkun</title>
      <link>https://dev.to/angeo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/angeo"/>
    <language>en</language>
    <item>
      <title>llms.txt v2: What the Spec Says, and What 137,000 Domains Show</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Sun, 20 Sep 2026 19:17:36 +0000</pubDate>
      <link>https://dev.to/angeo/llmstxt-v2-what-the-spec-says-and-what-137000-domains-show-48bh</link>
      <guid>https://dev.to/angeo/llmstxt-v2-what-the-spec-says-and-what-137000-domains-show-48bh</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://angeo.dev/llms-txt-v2-spec-and-evidence/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Checked against llmstxt.org v2, revised 10 August 2026, and against the published request data as of September 2026.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We shipped a validator that could certify a broken llms.txt file as valid.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The bug was simple. The spec recommends a short summary in a blockquote under the title. Our checker looked for a line starting with &lt;code&gt;&amp;gt;&lt;/code&gt;. It never looked at what came after it. A store with no meta description produced a bare &lt;code&gt;&amp;gt;&lt;/code&gt; and nothing else, and our tool ticked the box.&lt;/p&gt;

&lt;p&gt;Fixing it sent us back to two things we had not read carefully enough. The specification had been revised on 10 August 2026, quietly, without a corresponding launch announcement. And Ahrefs had published server-log data from 137,210 domains showing that almost nobody requests these files at all.&lt;/p&gt;

&lt;p&gt;Both matter, and most writing about llms.txt engages with neither. This article covers the evidence first, then the spec, then four claims about the spec that do not survive a check against the source. One of those four was ours.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the request data shows
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;97%&lt;/strong&gt; — of valid llms.txt files received zero requests in May 2026&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;137,210&lt;/strong&gt; — domains in the Ahrefs sample&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;19.5%&lt;/strong&gt; — of the fetches that did happen came from named AI tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;~55%&lt;/strong&gt; — of live files have the recommended shape (separate sample)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In June 2026 Ahrefs &lt;a href="https://ahrefs.com/blog/llmstxt-study/" rel="noopener noreferrer"&gt;published a study&lt;/a&gt; of every domain in its Web Analytics data that received traffic in May 2026 — 137,210 of them. It checked each domain root for an llms.txt returning HTTP 200, confirmed the file was real Markdown rather than an HTML error page, and then looked at every request to those paths in its bot analytics.&lt;/p&gt;

&lt;p&gt;The headline numbers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;28% of those domains publish an llms.txt.&lt;/strong&gt; Ahrefs attaches its own caveat: its customers skew more technical and SEO-aware than the web at large, so 28% is an upper bound, not a web-wide figure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Of roughly 38,000 valid files, 97% received zero requests in May 2026.&lt;/strong&gt; Not few requests. None.&lt;/li&gt;
&lt;li&gt;Only about &lt;strong&gt;1,100 files&lt;/strong&gt; received any traffic at all.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI bots never requested llms.txt on domains where it did not exist.&lt;/strong&gt; They are not probing for it. A crawler that wanted the file would ask and collect 404s.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The breakdown of the 3% that were fetched is more interesting than the headline, and it cuts both ways.&lt;/p&gt;

&lt;p&gt;About &lt;strong&gt;19.5% of fetches came from named AI tools&lt;/strong&gt;, with GPTBot first and Claude-Code second — ahead of every AI search and assistant bot. Roughly &lt;strong&gt;12% came from the industry inspecting itself&lt;/strong&gt;: GEO and AEO tools, llms.txt checkers, researchers. Chrome's Lighthouse llms.txt audit accounted for about one fetch in a thousand.&lt;/p&gt;

&lt;p&gt;Read that carefully, because it is easy to quote in either direction. The file is not universally ignored — where it is fetched, a fifth of the fetches are named AI tools. But the tools at the top are &lt;strong&gt;coding assistants reading documentation&lt;/strong&gt;, not the retrieval crawlers that decide whether a shop gets cited in a shopping answer. Separate reporting of the same dataset puts AI retrieval bots at around 1% of total requests.&lt;/p&gt;

&lt;p&gt;That pattern matches what Google has said. John Mueller described llms.txt in June 2025 as not being done for search, closer to a stopgap that saves tokens for AI coding tools reading developer documentation. In June 2026, Google added a note to its AI optimisation guidance stating that these machine-readable text files neither help nor harm Search rankings, because Search ignores them.&lt;/p&gt;

&lt;p&gt;There is a second finding worth more than the adoption headline. In June 2026 Chris Humphrey fetched &lt;code&gt;/llms.txt&lt;/code&gt; for the top 10,000 Majestic Million domains. Of the 1,050 that returned HTTP 200, &lt;strong&gt;313 were serving an HTML soft 404 rather than a file&lt;/strong&gt;. And of the 737 real files, &lt;strong&gt;only about 55% had the recommended shape&lt;/strong&gt;: a title, a summary, and at least one section of curated links.&lt;/p&gt;

&lt;p&gt;Nearly half of the published files are malformed. Hold that thought — it comes back later.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in llms.txt v2
&lt;/h2&gt;

&lt;p&gt;Against that background, the specification was revised. From its own &lt;a href="https://llmstxt.org/changes.html" rel="noopener noreferrer"&gt;change notes&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Link relations were added.&lt;/strong&gt; A page can declare where its Markdown version lives, and which llms.txt describes it. This is the main addition.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both Markdown URL forms are allowed.&lt;/strong&gt; The earlier version described appending &lt;code&gt;.md&lt;/code&gt; to the full page URL (&lt;code&gt;page.html.md&lt;/code&gt;); v2 also allows replacing the extension (&lt;code&gt;page.md&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Files at subpaths are defined.&lt;/strong&gt; An llms.txt covers the pages under its own path, and the most specific file wins.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;## Optional&lt;/code&gt; lost its mechanical semantics.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Links should lead to LLM-friendly content&lt;/strong&gt;, meaning the Markdown versions of pages where those exist.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now the four claims about all this that do not hold up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 1: "llms-full.txt is part of the spec"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; llms-full.txt is not defined by the llms.txt specification.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The spec does not define it. The companion files it describes are &lt;code&gt;llms-ctx.txt&lt;/code&gt; and &lt;code&gt;llms-ctx-full.txt&lt;/code&gt;, generated by the &lt;code&gt;llms_txt2ctx&lt;/code&gt; tool — and that context-expansion mechanism is no longer defined by the v2 specification either.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;llms-full.txt&lt;/code&gt; — one large file holding the full text of a site — grew out of that pattern and was popularised when &lt;a href="https://www.mintlify.com/docs/ai/llmstxt" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt; rolled it out platform-wide in November 2024. Different name, different mechanism. People are half-remembering something that existed, which is why the mistake is sticky.&lt;/p&gt;

&lt;p&gt;We got this wrong ourselves. Our audit module told merchants with large files to "split into llms.txt + llms-full.txt per spec." That sentence made a claim about a specification that the specification does not make. It is fixed.&lt;/p&gt;

&lt;p&gt;The distinction was already documented publicly. Stack Exchange's design system &lt;a href="https://github.com/StackExchange/Stacks/pull/2283" rel="noopener noreferrer"&gt;made exactly this point in a pull request&lt;/a&gt; in May 2026 while splitting its own files, and others have since. We are not adding a new fact here, only repeating one that has not displaced the wrong version.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Not part of the spec" does not mean "useless."&lt;/strong&gt; The correct claim is not &lt;em&gt;don't publish it&lt;/em&gt;. It is &lt;em&gt;don't call it part of the specification&lt;/em&gt;, and know that support for it is an ecosystem convention.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 2: "There is a W3C draft"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; W3C issue #506 is not a W3C Working Draft.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Several articles published in mid-2026 describe a June 2026 W3C proposal to standardise llms.txt. They tell readers to audit their file against "the W3C draft's strict Markdown subset," and to submit comments to "the W3C working group." Some add that the draft forbids llms.txt at subpaths and requires a version header.&lt;/p&gt;

&lt;p&gt;The W3C item people appear to be referring to is &lt;strong&gt;&lt;a href="https://github.com/w3c/strategy/issues/506" rel="noopener noreferrer"&gt;issue #506 in the &lt;code&gt;w3c/strategy&lt;/code&gt; repository&lt;/a&gt;, opened by xfq on 27 April 2025&lt;/strong&gt;, labelled &lt;code&gt;AI&lt;/code&gt;, and still open. Its own text says the proposal is at an early stage and does not introduce any new format. That is a request to consider a topic, not a working draft.&lt;/p&gt;

&lt;p&gt;The subpath claim also contradicts the actual specification. v2 explicitly permits files at subpaths — &lt;code&gt;/llms.txt&lt;/code&gt;, &lt;code&gt;/docs/llms.txt&lt;/code&gt;, &lt;code&gt;/de/llms.txt&lt;/code&gt; — and explains how they resolve: a file covers the URLs under its path, and where several apply, the most specific wins. That is what makes a per-language file valid on a multi-store setup.&lt;/p&gt;

&lt;p&gt;You can check this in under a minute. Open the issue, read the first paragraph, compare it to the article's claim.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 3: "## Optional tells the AI what it can skip"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; &lt;code&gt;## Optional&lt;/code&gt; is now a convention, not a mechanical omission rule.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This one needs care, because the correction is easy to overshoot.&lt;/p&gt;

&lt;p&gt;In the earlier version, &lt;code&gt;## Optional&lt;/code&gt; had a defined mechanical meaning: it was used by the context-expansion mechanism to determine which URLs could be omitted. v2 removed that mechanism, and the special meaning went with it.&lt;/p&gt;

&lt;p&gt;What remains is real but weaker. The spec still describes &lt;code&gt;## Optional&lt;/code&gt; as a convention for secondary information — links an agent may skip when a shorter context is needed. So it is not meaningless. It is no longer a rule any parser is expected to implement.&lt;/p&gt;

&lt;p&gt;The practical difference for a shop: many Magento llms.txt files put the whole product list under &lt;code&gt;## Optional&lt;/code&gt;, on the theory that a context-constrained model will drop the catalogue and keep the categories. That theory rested on the mechanical semantics, and those are gone. Products are the primary content of a store, and secondary is precisely what they are not.&lt;/p&gt;

&lt;p&gt;We changed our own default for this reason.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mistake 4: "There's a blockquote, so the summary is fine"
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; An empty &lt;code&gt;&amp;gt;&lt;/code&gt; is not a meaningful summary.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is the one worth reading twice, because it is not about the spec. It is about what validation misses — and, given that nearly half of published files are malformed, it is not a rare problem.&lt;/p&gt;

&lt;p&gt;The spec recommends a short summary in a blockquote directly under the H1, containing key information about the site. The H1 is the only element it requires; the summary is recommended, not mandatory. That distinction matters, and not in the direction you might expect: an omitted summary is a defensible choice, while an empty blockquote claims to be one and is not.&lt;/p&gt;

&lt;p&gt;Our validator checked for a line beginning with &lt;code&gt;&amp;gt;&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A Magento store with no meta description and no custom summary produced this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Demo Store&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt;&lt;/span&gt;

&lt;span class="gu"&gt;## Categories&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;An empty blockquote. Our validator reported the file as valid. So did our audit module. Both saw a blockquote marker, counted it, and moved on. The file was broken in the exact place the check existed to protect, and the check was the thing confirming it was fine.&lt;/p&gt;

&lt;p&gt;The failure is easy to name once you see it: &lt;strong&gt;the checker tested for the shape of the summary rather than its content.&lt;/strong&gt; A parser that accepts the Markdown structure can therefore encounter an empty blockquote where the summary should be — worse than no summary at all, because an absent summary is at least visibly absent.&lt;/p&gt;

&lt;p&gt;Both our tools now treat a bare &lt;code&gt;&amp;gt;&lt;/code&gt; as an error. If you run any llms.txt validation, this is worth five minutes: put an empty blockquote in a test file and see whether your tool complains.&lt;/p&gt;

&lt;h2&gt;
  
  
  What v2 asks you to add
&lt;/h2&gt;

&lt;p&gt;The link relations are the substantive new work. The point is that an agent holding a page URL should not have to guess where the Markdown version lives.&lt;/p&gt;

&lt;p&gt;In the page head:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"alternate"&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text/markdown"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://shop.example/blue-shirt.html.md"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"describedby"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"https://shop.example/llms.txt"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the Markdown resource itself, the spec describes the HTTP &lt;code&gt;Link:&lt;/code&gt; header, since that resource has no HTML head to carry tags:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Link: &amp;lt;https://shop.example/llms.txt&amp;gt;; rel="describedby"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three things to get right beyond that:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Support both URL forms if you can.&lt;/strong&gt; v2 permits &lt;code&gt;page.html.md&lt;/code&gt; and &lt;code&gt;page.md&lt;/code&gt;. Serving either one is compliant. Supporting both is a compatibility choice for implementations that may assume either form.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Point llms.txt links at the Markdown versions&lt;/strong&gt; where you serve them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Do not declare a relation that 404s.&lt;/strong&gt; A broken &lt;code&gt;rel="alternate"&lt;/code&gt; can be worse than no relation at all, because a client may follow it and fail.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How we found out we were wrong about our own store
&lt;/h2&gt;

&lt;p&gt;Our audit module runs against our demo store on every release. After we shipped v2 support, the new link-relations check failed — on our own store.&lt;/p&gt;

&lt;p&gt;The cause was configuration, not code. Markdown mirrors were switched off, so the head tags were correctly suppressed and the &lt;code&gt;.md&lt;/code&gt; URLs correctly returned 404. One setting. Once enabled, the check passed.&lt;/p&gt;

&lt;p&gt;We include this because the alternative — writing the post after quietly fixing it — leaves out the useful part. A checker that has only ever shown green on the author's own site has not been tested against anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check on your store
&lt;/h2&gt;

&lt;p&gt;Five commands. Replace the host and the product URL with your own.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Fetch the file and inspect its opening lines&lt;/span&gt;
&lt;span class="c"&gt;#    -f makes curl fail on an HTTP error instead of piping the error page&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; https://shop.example/llms.txt | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-3&lt;/span&gt;

&lt;span class="c"&gt;# 2. No empty blockquote — this should print nothing&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; https://shop.example/llms.txt | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-n&lt;/span&gt; &lt;span class="s1"&gt;'^&amp;gt;[[:space:]]*$'&lt;/span&gt;

&lt;span class="c"&gt;# 3. Link relations in the page head (presence check, not full validation)&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; https://shop.example/blue-shirt.html &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'rel="alternate"\|rel="describedby"'&lt;/span&gt;

&lt;span class="c"&gt;# 4. Link header on the Markdown file — GET, not HEAD, because caching&lt;/span&gt;
&lt;span class="c"&gt;#    layers do not always return identical headers for a HEAD request&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; &lt;span class="nt"&gt;-D&lt;/span&gt; - &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null https://shop.example/blue-shirt.html.md &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'^link:'&lt;/span&gt;

&lt;span class="c"&gt;# 5. Markdown URL forms&lt;/span&gt;
curl &lt;span class="nt"&gt;-so&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; https://shop.example/blue-shirt.html.md
curl &lt;span class="nt"&gt;-so&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s1"&gt;'%{http_code}\n'&lt;/span&gt; https://shop.example/blue-shirt.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;What to expect: command 2 prints nothing; command 3 shows both relations; command 4 shows a &lt;code&gt;Link:&lt;/code&gt; header; command 5 returns a successful response for each Markdown URL form that you serve — in our implementation, &lt;code&gt;200&lt;/code&gt;. If you support only one form, the other may legitimately return 404. Command 5 tests what your implementation supports, not whether it is compliant.&lt;/p&gt;

&lt;p&gt;Command 3 is deliberately loose. It finds the relations but does not verify that &lt;code&gt;rel="alternate"&lt;/code&gt; also carries &lt;code&gt;type="text/markdown"&lt;/code&gt;, so a malformed tag will still match. Read the output rather than trusting the exit code.&lt;/p&gt;

&lt;p&gt;If you want command 2 in CI, remember that &lt;code&gt;grep&lt;/code&gt; exits &lt;code&gt;1&lt;/code&gt; when it finds nothing, which is the passing case here. Invert it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="k"&gt;if &lt;/span&gt;curl &lt;span class="nt"&gt;-fsS&lt;/span&gt; https://shop.example/llms.txt | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="s1"&gt;'^&amp;gt;[[:space:]]*$'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;then
  &lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ERROR: empty summary blockquote"&lt;/span&gt;
  &lt;span class="nb"&gt;exit &lt;/span&gt;1
&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  So should a Magento store implement this?
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Disclosure.&lt;/strong&gt; We build and maintain the open-source Magento 2 module that generates these files, and the audit module that checks them. Read what follows with that in mind.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Not as a traffic tactic.&lt;/strong&gt; The request data does not support it, Google states plainly that Search ignores the file, and no major model provider has committed to reading it in production. If someone sells you llms.txt as an AI-visibility lever, ask them for request logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Possibly as developer-facing infrastructure.&lt;/strong&gt; The one place the data shows real consumption is coding assistants reading documentation — GPTBot and Claude-Code lead the fetches. If you publish API documentation or a developer portal alongside your store, that use case is measurable today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reasonably, as cheap optionality.&lt;/strong&gt; A generated file costs a build step and stays current automatically. The failure mode to avoid is not publishing one; it is publishing a stale, hand-maintained one, or a broken one — and given that roughly half of live files are malformed, that risk is the realistic one.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;And do not let it displace the work that does have evidence behind it.&lt;/strong&gt; For a shop, structured product data, correct canonical and schema markup, and pages an agent can actually parse have measurable effects. llms.txt does not, yet.&lt;/p&gt;

&lt;p&gt;The most useful thing v2 changes for a merchant is not visibility. It is that the file, the Markdown mirrors and the link relations together give an agent a defined way to move from a page to a machine-readable version of it. That is worth having ready. It is not worth overselling.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we do not know
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;We have no evidence that AI systems or agents follow the v2 link relations.&lt;/strong&gt; They are new, correct per the spec, and cheap to serve. Whether anything follows them is unmeasured, including by us.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Adoption figures depend entirely on the population sampled.&lt;/strong&gt; Ahrefs found 28% among a technical, SEO-aware customer base and said so itself. Humphrey found 7.4% in the Majestic top 10,000. As he put it: there is no single universal adoption rate, only the rate inside a defined slice.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The request data is one month, one vendor's panel.&lt;/strong&gt; May 2026, Ahrefs Web Analytics. It is the largest public dataset of its kind and it is still one month of one panel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absence of observed consumption is not proof of no value.&lt;/strong&gt; It is what the logs currently show. That could change if a major provider commits to reading the file — and the v2 link relations exist partly to make that easier.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;v2 may not be the last revision.&lt;/strong&gt; The first version stood for nearly two years before the specification changed. If you build tooling against it, build in a way to notice when it moves.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Primary&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The specification: &lt;a href="https://llmstxt.org" rel="noopener noreferrer"&gt;llmstxt.org&lt;/a&gt;. Published 3 September 2024, revised 10 August 2026.&lt;/li&gt;
&lt;li&gt;What changed in v2: &lt;a href="https://llmstxt.org/changes.html" rel="noopener noreferrer"&gt;llmstxt.org/changes.html&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Request data: &lt;a href="https://ahrefs.com/blog/llmstxt-study/" rel="noopener noreferrer"&gt;Ahrefs, "We Analyzed 137K Sites"&lt;/a&gt;, 15 June 2026.&lt;/li&gt;
&lt;li&gt;The W3C item: &lt;a href="https://github.com/w3c/strategy/issues/506" rel="noopener noreferrer"&gt;issue #506, &lt;code&gt;w3c/strategy&lt;/code&gt;&lt;/a&gt;, opened 27 April 2025, still open.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Background&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Independent coverage of the Ahrefs dataset: &lt;a href="https://www.searchenginejournal.com/97-of-llms-txt-files-got-no-requests-ahrefs-data-shows/579478/" rel="noopener noreferrer"&gt;Search Engine Journal&lt;/a&gt;, 16 June 2026.&lt;/li&gt;
&lt;li&gt;Adoption and file-quality sampling across the Majestic top 10,000, and a summary of the vendor statements: &lt;a href="https://macmdviewer.com/blog/llms-txt-guide" rel="noopener noreferrer"&gt;macmdviewer&lt;/a&gt;, 31 July 2026.&lt;/li&gt;
&lt;li&gt;The original 2024 proposal, including the &lt;code&gt;llms-ctx.txt&lt;/code&gt; / &lt;code&gt;llms-ctx-full.txt&lt;/code&gt; companion files: &lt;a href="https://www.answer.ai/posts/2024-09-03-llmstxt.html" rel="noopener noreferrer"&gt;answer.ai&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;llms-full.txt&lt;/code&gt; convention as its originator documents it: &lt;a href="https://www.mintlify.com/docs/ai/llmstxt" rel="noopener noreferrer"&gt;Mintlify&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;The spec-versus-convention distinction, documented in May 2026: &lt;a href="https://github.com/StackExchange/Stacks/pull/2283" rel="noopener noreferrer"&gt;Stack Exchange Stacks PR #2283&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Tooling support: &lt;a href="https://developer.chrome.com/docs/lighthouse/agentic-browsing/llms-txt" rel="noopener noreferrer"&gt;Chrome Lighthouse agentic browsing audits&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;We maintain an open-source Magento 2 module that generates these files, and an audit module that checks them. Both are MIT licensed. The two bugs described above were in our own code and are fixed in the current releases.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>llms</category>
      <category>seo</category>
      <category>webdev</category>
      <category>ai</category>
    </item>
    <item>
      <title>I pre-registered a study on AI visibility signals. The main result was null.</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Sun, 06 Sep 2026 18:55:47 +0000</pubDate>
      <link>https://dev.to/angeo/i-pre-registered-a-study-on-ai-visibility-signals-the-main-result-was-null-1bd3</link>
      <guid>https://dev.to/angeo/i-pre-registered-a-study-on-ai-visibility-signals-the-main-result-was-null-1bd3</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://angeo.dev/ai-readability-and-being-named/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;. Full tables, p-values and the sealed plan are there.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Most claims about AI visibility are untestable by design: publish the signals, wait, attribute anything good that happens to the signals.&lt;/p&gt;

&lt;p&gt;I wanted a version I could not fudge, so I wrote the analysis plan first, hashed it, and sent the hash to the other party before I had any data.&lt;/p&gt;

&lt;h2&gt;
  
  
  The question
&lt;/h2&gt;

&lt;p&gt;Do businesses AI assistants name &lt;strong&gt;repeatedly&lt;/strong&gt; differ, on observable technical signals, from businesses the same assistants name &lt;strong&gt;once&lt;/strong&gt;?&lt;/p&gt;

&lt;p&gt;Every business in the corpus was named at least once, so this says nothing about how to enter an answer. It compares repeat against one-off mentions inside a named-business corpus.&lt;/p&gt;

&lt;p&gt;Four signals, all externally observable:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Crawler access&lt;/td&gt;
&lt;td&gt;Does &lt;code&gt;robots.txt&lt;/code&gt; block any of 8 AI crawlers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Content map&lt;/td&gt;
&lt;td&gt;Does the site serve &lt;code&gt;/llms.txt&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured data&lt;/td&gt;
&lt;td&gt;Does a product page emit JSON-LD &lt;code&gt;Product&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buyability&lt;/td&gt;
&lt;td&gt;Does that node carry &lt;code&gt;offers.availability&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Study setup
&lt;/h2&gt;

&lt;p&gt;The answers came from a partner (connexion.me), who ran 44 product-level home-decor buying questions across ChatGPT, Gemini and Perplexity, twice, in two arms — 264 answers per arm.&lt;/p&gt;

&lt;p&gt;Blinding was deliberate. I did not write the questions and did not see their store list until my plan was sealed; they never saw my frame, my scan results or my thresholds.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Roster rows                                    669
  no resolvable domain                        -186
  resolved to a different company               -3
  marketplaces and listing surfaces            -12
  duplicate rows collapsed                     -10
Unique domains analysed                        458
  scanned successfully                         455
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cases: 3+ mentions across both runs and present in both. Controls: exactly one mention across both runs. Head excluded first — anything in 53+ of 264 answers (Amazon, Etsy, Wayfair, Target, Home Depot).&lt;/p&gt;

&lt;h2&gt;
  
  
  The pre-registration
&lt;/h2&gt;

&lt;p&gt;Sealed 10 August, SHA-256 &lt;code&gt;9b4ccf12629e…&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under 15% of named businesses would be Magento&lt;/li&gt;
&lt;li&gt;No signal would separate the groups by more than 15 points&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Refutation condition:&lt;/strong&gt; any signal differing by 20+ points with the named group higher&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Result — generic arm
&lt;/h2&gt;

&lt;p&gt;Two-sided Fisher exact. Percentages are of stores where the signal was observable.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Signal&lt;/th&gt;
&lt;th&gt;Cases&lt;/th&gt;
&lt;th&gt;Controls&lt;/th&gt;
&lt;th&gt;Diff&lt;/th&gt;
&lt;th&gt;p&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blocks an AI crawler&lt;/td&gt;
&lt;td&gt;1/55 (2%)&lt;/td&gt;
&lt;td&gt;7/181 (4%)&lt;/td&gt;
&lt;td&gt;−2.0&lt;/td&gt;
&lt;td&gt;.685&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serves &lt;code&gt;llms.txt&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;10/55 (18%)&lt;/td&gt;
&lt;td&gt;61/181 (34%)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;−15.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.030&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;JSON-LD &lt;code&gt;Product&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;3/10 (30%)&lt;/td&gt;
&lt;td&gt;15/46 (33%)&lt;/td&gt;
&lt;td&gt;−2.6&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;offers.availability&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;3/10 (30%)&lt;/td&gt;
&lt;td&gt;13/46 (28%)&lt;/td&gt;
&lt;td&gt;+1.7&lt;/td&gt;
&lt;td&gt;1.000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The refutation condition was not met — in this arm, in the context arm, or pooled. No signal separates the repeatedly named group from the once-named group in the direction the field assumes.&lt;/p&gt;

&lt;p&gt;Magento share of the 455 scanned domains: 13 stores, 2.9%.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one that went backwards
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is &lt;strong&gt;more&lt;/strong&gt; common among businesses named once than among those named repeatedly. Same direction in all five cuts, diffs of −15.3 to −17.4, nominal p between .012 and .030. Four signals across five cuts, no multiplicity correction — report them, do not treat them as confirmatory.&lt;/p&gt;

&lt;p&gt;Before reading that as "llms.txt hurts you", I fetched the flagged files and read the first line of each:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;113 of 159 &lt;code&gt;llms.txt&lt;/code&gt; files — 71% — matched the same generated heading&lt;/strong&gt;, differing only in the brand name. Not 113 independent decisions to publish. One generator.&lt;/p&gt;

&lt;p&gt;Narrowed to the analysis universe: 146 of 455 serve the file (32%); 104 of those 146 are the template. Strip it and adoption is 9%, against 11% on my separately measured frame of 762 Magento stores.&lt;/p&gt;

&lt;p&gt;I was about to publish 32% as adoption. Most of the apparent difference between the two populations was boilerplate.&lt;/p&gt;

&lt;h2&gt;
  
  
  The engineering lesson, if you want one
&lt;/h2&gt;

&lt;p&gt;Three things I would do again on any measurement like this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Write the failure condition before the data exists, and publish it when it fires.&lt;/strong&gt; Mine fired in a secondary cut on a case group of four stores. Uninterpretable — and reported anyway, because a refutation condition you drop when it is inconvenient was never one.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Record presence, then inspect content separately.&lt;/strong&gt; The scanner keeps no page content by policy. That is correct for a crawler, and it is also why the template finding needed a second, explicit pass.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Watch what your sampling heuristic does.&lt;/strong&gt; In a related panel, 12% of stores had a &lt;em&gt;different&lt;/em&gt; product page sampled on the second visit. That alone manufactures schema "changes" that never happened.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Caveats that matter
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Two of four signals need a product page. Effective samples: 10 of 55 cases, 46 of 181 controls. Too small to conclude anything, and the missingness is probably not random — discovery works worst on large sites, which dominate the case group.&lt;/li&gt;
&lt;li&gt;Losses are not random: shops behind bot mitigation returned 403/429, and those shops may also be more likely to block AI crawlers.&lt;/li&gt;
&lt;li&gt;Crawler access is one route into an answer, not the only one — indexes, caches, feeds and listing sites all bypass it.&lt;/li&gt;
&lt;li&gt;One category, three engines, two days.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Reproducing it
&lt;/h2&gt;

&lt;p&gt;Sealed plan and both amendments with hashes, the marketplace exclusion list, the dropped-domain list, the per-business analysis rows and the scanner are all published. The scanner identifies itself, obeys &lt;code&gt;robots.txt&lt;/code&gt;, keeps no page content and can be blocked in two lines.&lt;/p&gt;

&lt;p&gt;Full write-up with every table: &lt;strong&gt;&lt;a href="https://angeo.dev/ai-readability-and-being-named/" rel="noopener noreferrer"&gt;AI assistants named 458 shops&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Earlier instalments: &lt;a href="https://angeo.dev/aeo-scan-case-study/" rel="noopener noreferrer"&gt;462 stores scanned in July, 762 in August&lt;/a&gt; · &lt;a href="https://angeo.dev/magento-ai-signals-two-scans/" rel="noopener noreferrer"&gt;376 stores measured twice, 94% unchanged&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I maintain a set of MIT-licensed Magento 2 modules for this layer — llms.txt generation, robots.txt AI-bot management, JSON-LD, MCP and UCP endpoints — on Packagist under &lt;code&gt;angeo/&lt;/code&gt;. If you have run a similar measurement and got a different direction on &lt;code&gt;llms.txt&lt;/code&gt;, I would genuinely like to see it.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>seo</category>
      <category>data</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your robots.txt probably does not block the AI crawler you think it blocks</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Mon, 17 Aug 2026 19:25:48 +0000</pubDate>
      <link>https://dev.to/angeo/your-robotstxt-probably-does-not-block-the-ai-crawler-you-think-it-blocks-5g3n</link>
      <guid>https://dev.to/angeo/your-robotstxt-probably-does-not-block-the-ai-crawler-you-think-it-blocks-5g3n</guid>
      <description>&lt;p&gt;Here is a rule that looks like it blocks OpenAI's crawler:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;-agent: *
Disallow: /checkout/
Disallow: /customer/

&lt;span class="nc"&gt;User&lt;/span&gt;-agent: GPTBot
Crawl-delay: 10
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It blocks nothing. GPTBot reads its own group, finds one &lt;code&gt;Crawl-delay&lt;/code&gt; line and no &lt;code&gt;Disallow&lt;/code&gt;, and crawls everything — including &lt;code&gt;/checkout/&lt;/code&gt; and &lt;code&gt;/customer/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Under &lt;a href="https://www.rfc-editor.org/rfc/rfc9309.html" rel="noopener noreferrer"&gt;RFC 9309&lt;/a&gt;, a crawler that matches a specific user-agent group uses &lt;strong&gt;only&lt;/strong&gt; that group. It does not inherit from &lt;code&gt;User-agent: *&lt;/code&gt;. Naming a bot anywhere in the file switches off the wildcard rules for that bot entirely.&lt;/p&gt;

&lt;p&gt;So the moment you add a named group to be more careful, you become less careful. And the failure is invisible: the file reads as though it says something.&lt;/p&gt;

&lt;p&gt;I found this while doing something else, and the something else is the rest of this post.&lt;/p&gt;

&lt;h2&gt;
  
  
  The something else
&lt;/h2&gt;

&lt;p&gt;I spent a few weeks cataloguing every project that helps an ecommerce store be found, read, trusted or transacted with by an AI system — for Magento specifically, because that is the platform I work on. The result is a list of 42 projects: &lt;a href="https://github.com/angeo-dev/awesome-magento-aeo" rel="noopener noreferrer"&gt;awesome-magento-aeo&lt;/a&gt;, CC0, fork it if it is useful.&lt;/p&gt;

&lt;p&gt;The interesting part is not the list. It is the distribution.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Category&lt;/th&gt;
&lt;th&gt;Projects&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;llms.txt&lt;/code&gt; discovery files&lt;/td&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Specifications&lt;/td&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MCP servers&lt;/td&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agentic checkout&lt;/td&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Structured data&lt;/td&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Crawler policy&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Product feeds&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auditing&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Eleven implementations of &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/strong&gt; For a file format proposed in 2024 that is, at heart, a Markdown document at your site root.&lt;/p&gt;

&lt;p&gt;Three for crawler policy — the layer where the RFC 9309 trap above lives.&lt;/p&gt;

&lt;p&gt;The ecosystem built the easiest layer eleven times and the hard layers three times each.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why eleven is not the joke it looks like
&lt;/h2&gt;

&lt;p&gt;My first read was duplicated effort: everyone shipping the same weekend project. That read is wrong.&lt;/p&gt;

&lt;p&gt;Generating &lt;code&gt;llms.txt&lt;/code&gt; for a real store is not trivial. You hit multi-store layouts, page-builder content that has to be resolved rather than dumped as markup, CMS directives, customer-group pricing, and catalogues large enough that naive generation exhausts memory.&lt;/p&gt;

&lt;p&gt;The eleven implementations differ precisely on those axes — cursor-based pagination and generators for large catalogues, store-scoped entity selection, weighted ranking, blog content feeding the file with IndexNow pinging.&lt;/p&gt;

&lt;p&gt;They look identical from outside and diverge completely at the point where the platform gets hard. That is what a young category looks like: several people solving the same problem and disagreeing about which parts matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  The category that shrank while I was writing
&lt;/h2&gt;

&lt;p&gt;In March 2026 OpenAI pulled back from in-chat Instant Checkout. Published figures put live merchants somewhere between about a dozen and around thirty, against the "over a million" named at launch six months earlier. The model moved toward product discovery inside ChatGPT with the purchase completing on the merchant's own site.&lt;/p&gt;

&lt;p&gt;The Agentic Commerce Protocol did not disappear — its role shifted from checkout toward feeds, promotions and availability. OpenAI's &lt;a href="https://developers.openai.com/commerce" rel="noopener noreferrer"&gt;developer documentation&lt;/a&gt; still describes Instant Checkout for approved partners, so the details are contested. The direction is not.&lt;/p&gt;

&lt;p&gt;Not one of the five agentic checkout projects on the list is past a stable 1.0.&lt;/p&gt;

&lt;p&gt;If you were scoping a sprint against in-chat checkout, the feed is the realistic route to being surfaced at all. The checkout integration is where the protocols are heading, not where revenue is this quarter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where I would start
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Measure first.&lt;/strong&gt; Bing Webmaster Tools reports citation counts and grounding queries under its AI Performance view — still the only free first-party source I know of that reports how often an AI system cited your pages. Google Search Console added generative AI reporting in June 2026, but it shows impressions rather than citations.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fix crawler policy.&lt;/strong&gt; Read RFC 9309 before you write a rule, then verify the rule does what you think it does.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured data, then &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/strong&gt; In that order. Schema exposes machine-readable price, availability and identifiers; &lt;code&gt;llms.txt&lt;/code&gt; points systems at the pages that matter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Stop.&lt;/strong&gt; Everything past this point is early, and being early is a cost rather than a badge.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The disclosure
&lt;/h2&gt;

&lt;p&gt;I maintain 11 of the 42 entries on that list. My own projects are listed last within their sections rather than in alphabetical position, where they would otherwise appear first almost everywhere. I read documentation and READMEs rather than source, so I have not independently audited every implementation, and where I was unsure I marked partial rather than complete.&lt;/p&gt;

&lt;p&gt;Corrections are welcome and never need justification — especially corrections to mine.&lt;/p&gt;

&lt;p&gt;The full write-up, with the inclusion criteria and the parts I left out, is &lt;a href="https://angeo.dev/magento-aeo-ecosystem-what-has-been-built/" rel="noopener noreferrer"&gt;on my site&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>seo</category>
      <category>ai</category>
      <category>php</category>
    </item>
    <item>
      <title>Perplexity vs ChatGPT vs Gemini: how each one actually finds your products</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Fri, 31 Jul 2026 17:30:07 +0000</pubDate>
      <link>https://dev.to/angeo/perplexity-vs-chatgpt-vs-gemini-how-each-one-actually-finds-your-products-3pg8</link>
      <guid>https://dev.to/angeo/perplexity-vs-chatgpt-vs-gemini-how-each-one-actually-finds-your-products-3pg8</guid>
      <description>&lt;p&gt;Two stores. Identical products, identical schema, identical SEO. One shows up inside ChatGPT Shopping, the other never does.&lt;/p&gt;

&lt;p&gt;The difference isn't optimisation quality. The three engines don't read the same thing to find a product — and a store optimised for one pipeline can be structurally invisible to the other two.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two pipelines, not one
&lt;/h2&gt;

&lt;p&gt;Every one of these platforms runs two separate systems, and almost every AEO checklist conflates them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The citation surface&lt;/strong&gt; answers "what's the best way to do X" with numbered sources. Fed by web crawling. Your pages, schema, &lt;code&gt;llms.txt&lt;/code&gt; and &lt;code&gt;robots.txt&lt;/code&gt; rules all live here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The shopping surface&lt;/strong&gt; answers "best waterproof boots under €150" with a product carousel. On ChatGPT and Google this runs primarily on structured feeds rather than on a crawl of your site.&lt;/p&gt;

&lt;p&gt;That's why you can allow every AI crawler, ship perfect JSON-LD, and still be missing from ChatGPT product comparisons.&lt;/p&gt;

&lt;p&gt;ChatGPT complicates this, and it's worth stating up front because it cuts against the simple version of the rule. Alongside feed-driven results it runs &lt;strong&gt;Shopping Research&lt;/strong&gt;, an agentic mode that browses in real time. OpenAI states plainly that results are organic and based on publicly available retail sites — reading product pages directly, citing sources, with a separate allowlist for merchants who want to be eligible.&lt;/p&gt;

&lt;p&gt;So there are three routes on ChatGPT, not two. Pages are irrelevant to one and load-bearing on another. The lesson isn't "pages don't matter for shopping" — it's that feeds and pages feed different surfaces and neither substitutes for the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who reads what
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ChatGPT&lt;/th&gt;
&lt;th&gt;Perplexity&lt;/th&gt;
&lt;th&gt;Google AI Mode&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Product source&lt;/td&gt;
&lt;td&gt;ACP feed, pushed&lt;/td&gt;
&lt;td&gt;Live page retrieval&lt;/td&gt;
&lt;td&gt;Shopping Graph (Merchant Center)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reads your page for shopping?&lt;/td&gt;
&lt;td&gt;Not for feed-driven results; Shopping Research reads retailer pages&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Secondary — schema.org markup contributes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Index crawler&lt;/td&gt;
&lt;td&gt;OAI-SearchBot&lt;/td&gt;
&lt;td&gt;PerplexityBot&lt;/td&gt;
&lt;td&gt;Googlebot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Training crawler&lt;/td&gt;
&lt;td&gt;GPTBot&lt;/td&gt;
&lt;td&gt;—&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Google-Extended&lt;/code&gt; (token, not a bot)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merchant onboarding&lt;/td&gt;
&lt;td&gt;Feed access by application; Shopping Research by allowlist&lt;/td&gt;
&lt;td&gt;Free, ~5 min&lt;/td&gt;
&lt;td&gt;Merchant Center; UCP staged&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The OpenAI crawler split is load-bearing and widely misconfigured. &lt;code&gt;GPTBot&lt;/code&gt; is training. &lt;code&gt;OAI-SearchBot&lt;/code&gt; is search visibility. Blocking "OpenAI" wholesale usually means someone intended the first and accidentally did the second — which removes you from ChatGPT citations entirely, feed or no feed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;GPTBot&lt;/span&gt;
&lt;span class="n"&gt;Disallow&lt;/span&gt;: /

&lt;span class="n"&gt;User&lt;/span&gt;-&lt;span class="n"&gt;agent&lt;/span&gt;: &lt;span class="n"&gt;OAI&lt;/span&gt;-&lt;span class="n"&gt;SearchBot&lt;/span&gt;
&lt;span class="n"&gt;Allow&lt;/span&gt;: /
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Check what's actually hitting you
&lt;/h2&gt;

&lt;p&gt;Don't trust anyone's summary, including this one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-Eo&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot|OAI-SearchBot|ChatGPT-User|PerplexityBot|Perplexity-User|Googlebot"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  /var/log/nginx/access.log | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You want &lt;code&gt;OAI-SearchBot&lt;/code&gt; and &lt;code&gt;PerplexityBot&lt;/code&gt; showing up regularly — those are the index builders. Their absence usually means a &lt;code&gt;robots.txt&lt;/code&gt; rule, a WAF rule, or a CDN bot-management setting doing something you didn't intend.&lt;/p&gt;

&lt;p&gt;Worth knowing: firewall blocking is invisible in &lt;code&gt;robots.txt&lt;/code&gt;. Your rules can be perfectly permissive while Cloudflare silently rejects the request. The log is the only ground truth.&lt;/p&gt;

&lt;h2&gt;
  
  
  The geography bit
&lt;/h2&gt;

&lt;p&gt;Two things get reported as one here, and separating them changes the plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shopping features available to users&lt;/strong&gt; are broad — shoppers in most markets can already ask these engines for product recommendations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Merchant onboarding&lt;/strong&gt; is not. Direct ACP feed access runs through an application with staged rollout. UCP checkout began in the US and reached Canada, Australia and the UK by May 2026, arriving by cohort. Perplexity's Merchant Program is free and open anywhere.&lt;/p&gt;

&lt;p&gt;So your customers may already be asking about products like yours while your ability to push structured data to two of the three is still queued. Perplexity is the channel where good server-rendered markup produces results today, with no application and no wait.&lt;/p&gt;

&lt;p&gt;That reorders the work. Page-level readability first — it's what Perplexity reads now, what OAI-SearchBot indexes for citations now, and what feeds the schema.org half of the Shopping Graph. Feeds second, built and validated so the application is a formality when your region opens.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'm not sure about
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;How much ChatGPT's two shopping surfaces overlap is unclear. Feed-driven results and Shopping Research are documented separately; how presence in one affects the other is not spelled out.&lt;/li&gt;
&lt;li&gt;Ranking mechanics are undocumented on all three. Any "top 3 ranking factors" claim here is inference from correlation, not a vendor statement.&lt;/li&gt;
&lt;li&gt;Perplexity's crawling practices are contested — Cloudflare alleged undeclared crawlers in August 2025, Perplexity disputed the characterisation. I have no independent basis to adjudicate.&lt;/li&gt;
&lt;li&gt;Regional availability moves faster than any published guide. Re-verify before it drives a budget decision.&lt;/li&gt;
&lt;li&gt;I build open-source Magento AEO modules, so "prioritise page-level readability" aligns with what my tooling does. Check the claim rather than take it.&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Full version with the decision table by merchant type, the Magento-specific paths, and the source list: &lt;strong&gt;&lt;a href="https://angeo.dev/perplexity-vs-chatgpt-vs-gemini-how-each-ai-discovers-your-products/" rel="noopener noreferrer"&gt;original post on angeo.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Modules are MIT-licensed on &lt;a href="https://packagist.org/packages/angeo/" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt; if useful.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>ACP vs UCP: two agentic commerce protocols, and why 'which one' is the wrong question</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Fri, 24 Jul 2026 22:51:30 +0000</pubDate>
      <link>https://dev.to/angeo/acp-vs-ucp-two-agentic-commerce-protocols-and-why-which-one-is-the-wrong-question-13ba</link>
      <guid>https://dev.to/angeo/acp-vs-ucp-two-agentic-commerce-protocols-and-why-which-one-is-the-wrong-question-13ba</guid>
      <description>&lt;p&gt;ACP or UCP? The question assumes you have to pick one. You don't — and by mid-2026 they aren't even doing the same job.&lt;/p&gt;

&lt;p&gt;ACP and UCP are not two competing implementations of the same standard. They sit at different layers, and most of the work required for one is the same work required for the other.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Protocol status as of June 2026. Both specs are moving. Verify current spec versions before you implement — I've dated every claim below for that reason.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  What changed in March 2026
&lt;/h2&gt;

&lt;p&gt;ACP — the Agentic Commerce Protocol, backed by OpenAI and Stripe — launched as the standard behind ChatGPT Instant Checkout. Agent finds product, agent buys product, merchant stays merchant of record.&lt;/p&gt;

&lt;p&gt;In March 2026 that shifted. ACP moved away from native checkout, and what remains in practice is a &lt;strong&gt;discovery and feed protocol&lt;/strong&gt;: a structured, spec-conformant product feed you publish, OpenAI ingests, and ChatGPT uses to decide whether your products belong in an answer.&lt;/p&gt;

&lt;p&gt;UCP — the Universal Commerce Protocol, Google-backed, announced at NRF in January 2026 and substantially expanded at Google Marketing Live on 20 May 2026 — went the other direction. It is the &lt;strong&gt;live agentic-checkout standard&lt;/strong&gt;: discovery, cart construction, and transaction, with announced integration across AI Mode, Gemini, YouTube Shopping and Gmail. Early access has been US-first; rollout varies by surface and market.&lt;/p&gt;

&lt;p&gt;So: one protocol tells AI systems what you sell. The other lets them buy it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Side by side
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ACP&lt;/th&gt;
&lt;th&gt;UCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Backers&lt;/td&gt;
&lt;td&gt;OpenAI + Stripe&lt;/td&gt;
&lt;td&gt;Google&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Role in mid-2026&lt;/td&gt;
&lt;td&gt;Discovery / product feed&lt;/td&gt;
&lt;td&gt;Discovery + agentic checkout&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Surfaces&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;AI Mode, Gemini, YouTube, Gmail&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merchant artifact&lt;/td&gt;
&lt;td&gt;Spec-conformant product feed&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;/.well-known/ucp&lt;/code&gt; manifest + signed endpoints&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Identity / trust&lt;/td&gt;
&lt;td&gt;Merchant application + conformance checks&lt;/td&gt;
&lt;td&gt;ECDSA-signed manifest&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Availability&lt;/td&gt;
&lt;td&gt;Application-based&lt;/td&gt;
&lt;td&gt;US-first early access&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Merchant of record&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;td&gt;You&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The last row is the one people miss. Neither protocol takes over the transaction relationship. You are still the merchant of record, you still own fulfilment, returns and support. What changes is where the buying intent gets captured.&lt;/p&gt;




&lt;h2&gt;
  
  
  The part that's actually shared
&lt;/h2&gt;

&lt;p&gt;Here's why "pick one" is a trap. Strip both specs down to what they demand from your backend and you get almost the same list:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clean, complete product data&lt;/strong&gt; — SKU, title, description, price, currency, availability, images, identifiers (GTIN/MPN). Both protocols reject or silently deprioritise incomplete records.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Accurate real-time stock and price.&lt;/strong&gt; A feed refreshed nightly is a feed that lies for 23 hours. Both ecosystems penalise this — one with conformance failures, the other with bad agent experiences.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Explicit machine-readable policies&lt;/strong&gt; — shipping, returns, warranty. Not a CMS page written for humans.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Crawler and endpoint access&lt;/strong&gt; that doesn't depend on JavaScript execution.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Structured data on the page itself&lt;/strong&gt; — the fallback path when feeds are stale or absent.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's not protocol work. That's catalog hygiene. It survives ACP pivoting again, UCP renaming itself, and whatever the third protocol turns out to be.&lt;/p&gt;




&lt;h2&gt;
  
  
  The build order I'd argue for
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Phase 0 — foundations (do this regardless).&lt;/strong&gt;&lt;br&gt;
Fix crawler access. Get &lt;code&gt;Product&lt;/code&gt; + &lt;code&gt;Offer&lt;/code&gt; structured data rendering server-side with &lt;code&gt;availability&lt;/code&gt; as a full schema.org URI. Publish an LLM-readable content map. None of this is protocol-specific and all of it pays off in ChatGPT, Gemini and Perplexity today.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 1 — ship the ACP feed.&lt;/strong&gt;&lt;br&gt;
It's the lower-effort artifact, the audience is already there (ChatGPT handles enormous volumes of shopping-intent queries), and building it forces you to fix the data quality problems you'd hit in UCP anyway. Cron it at a real interval — 15 minutes is a sane starting point for a catalog with moving stock, not nightly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 2 — prepare the UCP manifest.&lt;/strong&gt;&lt;br&gt;
Publish &lt;code&gt;/.well-known/ucp&lt;/code&gt;, generate your ECDSA signing keys, get the profile validated. Even if agentic checkout hasn't reached your market yet, the manifest is cheap to maintain and the queue is real.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phase 3 — decide about checkout deliberately.&lt;/strong&gt;&lt;br&gt;
Letting an agent complete a purchase is a policy decision as much as a technical one: order value caps, confirmation requirements, fraud posture, what happens when an agent gets it wrong. Have that conversation before you flip the switch, not after.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where the payments problem still sits
&lt;/h2&gt;

&lt;p&gt;Worth stating plainly because it shapes everything: an agent operating over a server-side protocol &lt;strong&gt;cannot tokenize a card&lt;/strong&gt;. Stripe's card flows require a PCI-compliant browser context — Stripe.js, Payment Element — which is fundamentally incompatible with a backend tool call.&lt;/p&gt;

&lt;p&gt;Every current agentic-checkout design works around this rather than through it: offline/invoice methods, stored tokens tied to an authenticated customer, or a handoff to a hosted payment page at the last step. Anyone claiming an agent "pays with your card" via a pure API protocol is describing something with a browser hidden inside it.&lt;/p&gt;

&lt;p&gt;This is the honest ceiling on agentic commerce in 2026, and it's the thing to design around.&lt;/p&gt;




&lt;h2&gt;
  
  
  If you're on Magento 2
&lt;/h2&gt;

&lt;p&gt;There's no built-in support for either protocol — Magento gives you full control of the stack and full responsibility for it. There are open-source options for both sides; I maintain some of them (&lt;code&gt;angeo/module-openai-product-feed&lt;/code&gt; for ACP, &lt;code&gt;angeo/module-ucp&lt;/code&gt; for the UCP profile and signing keys — MIT, Composer). Disclosure: I wrote those, and there are alternatives with different licences and coverage worth comparing.&lt;/p&gt;

&lt;p&gt;But module choice is the last 10%. The first 90% is whether your catalog data is actually correct, and no module fixes that for you.&lt;/p&gt;




&lt;p&gt;What's your read — is anyone here building against UCP checkout in production yet, or is everyone still in feed-and-wait mode? Genuinely interested in what the early-access experience looks like from the US side.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>ecommerce</category>
      <category>api</category>
      <category>php</category>
    </item>
    <item>
      <title>AI Agent Checkout in Magento 2: Claude Places a Real Order via MCP</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Thu, 09 Jul 2026 16:57:32 +0000</pubDate>
      <link>https://dev.to/angeo/ai-agent-checkout-in-magento-2-claude-places-a-real-order-via-mcp-2jbi</link>
      <guid>https://dev.to/angeo/ai-agent-checkout-in-magento-2-claude-places-a-real-order-via-mcp-2jbi</guid>
      <description>&lt;p&gt;AI agents can already &lt;em&gt;find&lt;/em&gt; products. But can they actually &lt;em&gt;buy&lt;/em&gt; them — placing a real order in a live Magento 2 store, without browser automation or scraping?&lt;/p&gt;

&lt;p&gt;I built &lt;code&gt;angeo/module-mcp-checkout&lt;/code&gt; to answer that, and the short version is: yes. This post walks through the full flow, the architecture, and the one problem everyone asks about — payments.&lt;/p&gt;

&lt;h2&gt;
  
  
  Watch the full checkout flow
&lt;/h2&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/rjGcpQuBSQg"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works: architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User (Claude.ai)
      ↓
  MCP Client
      ↓
Magento MCP Endpoint  ←  Bearer auth + rate limiter
      ↓
Magento Service Layer
      ↓
  Quote / Cart
      ↓
    Order ✓
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  MCP call sequence
&lt;/h2&gt;

&lt;p&gt;Every checkout runs the same tool sequence. Each call maps directly to a Magento service layer operation — no browser, no session, no cookies.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Claude
  ↓
search_products()          — find product by keyword
  ↓
get_product()              — verify SKU, price, stock
  ↓
create_cart()              — open guest cart, get cart_id
  ↓
add_to_cart()              — add item by child SKU
  ↓
get_shipping_methods()     — estimate delivery options
  ↓
set_shipping_information() — apply address + method
  ↓
[User confirms total]
  ↓
place_order()              — submit cart → order_number
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The module exposes these as six MCP tools over a JSON-RPC endpoint:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;create_cart&lt;/code&gt; — opens a new guest cart&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;add_to_cart&lt;/code&gt; — adds a product by SKU&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_cart&lt;/code&gt; — reads current items and totals&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;get_shipping_methods&lt;/code&gt; — estimates available delivery options&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;set_shipping_information&lt;/code&gt; — sets address, email, and chosen method&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;place_order&lt;/code&gt; — submits the order after user confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No browser automation, no scraping. The agent talks directly to the Magento backend through a secure, rate-limited MCP endpoint.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Bearer Authentication&lt;/strong&gt; — every MCP request requires a valid Bearer token&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Rate limiting&lt;/strong&gt; — configurable throttling protects store performance&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Magento ACL&lt;/strong&gt; — MCP tools operate within Magento's standard Access Control Layer&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;HTTPS only&lt;/strong&gt; — the endpoint is served exclusively over TLS&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;User confirmation before order placement&lt;/strong&gt; — &lt;code&gt;place_order&lt;/code&gt; is never called autonomously&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Configurable agent order limit&lt;/strong&gt; — merchants set a max order value in admin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Live demo: Claude finds a backpack and buys it
&lt;/h2&gt;

&lt;p&gt;Real session against &lt;a href="https://demo.angeo.dev" rel="noopener noreferrer"&gt;demo.angeo.dev&lt;/a&gt;. The prompt: &lt;em&gt;"I want to buy a Fusion Backpack."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1 — Product discovery.&lt;/strong&gt; Claude called &lt;code&gt;search_products&lt;/code&gt;, then &lt;code&gt;get_product&lt;/code&gt;. It identified the Fusion Backpack (SKU: &lt;code&gt;24-MB02&lt;/code&gt;), in-stock at $59.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2 — Cart.&lt;/strong&gt; &lt;code&gt;create_cart&lt;/code&gt; returned a fresh &lt;code&gt;cart_id&lt;/code&gt;. &lt;code&gt;add_to_cart&lt;/code&gt; confirmed the item — subtotal $59.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3 — Shipping.&lt;/strong&gt; &lt;code&gt;get_shipping_methods&lt;/code&gt; returned Flat Rate — Fixed at $10.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4 — Address.&lt;/strong&gt; &lt;code&gt;set_shipping_information&lt;/code&gt; applied name, street, postcode, city, country, phone, email. Total: $69.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5 — Confirm &amp;amp; place.&lt;/strong&gt; After explicit user confirmation, &lt;code&gt;place_order&lt;/code&gt; submitted the cart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"order_number"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"000000005"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"status"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"pending"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"grand_total"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"USD"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A real order, in a real Magento store, placed entirely by an AI agent through MCP — with the user in control at every step.&lt;/p&gt;

&lt;h2&gt;
  
  
  The payment problem
&lt;/h2&gt;

&lt;p&gt;This is the question everyone asks, and it deserves an honest answer.&lt;/p&gt;

&lt;p&gt;MCP agents can't process card payments directly. Card tokenization requires a PCI-compliant browser form (Stripe.js / Payment Element) — fundamentally incompatible with a server-side MCP tool call. This is the same constraint that killed OpenAI's native agentic checkout: collecting card details through an agent violates PCI scope.&lt;/p&gt;

&lt;p&gt;My approach sidesteps this by design. The agent places the order with a deferred payment method (status &lt;code&gt;pending&lt;/code&gt;). Payment happens separately:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;B2B / wholesale:&lt;/strong&gt; merchant invoices after order placement — already standard for many stores&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Payment Link:&lt;/strong&gt; the agent generates a Stripe / Mollie / Adyen payment link for the human to complete in-browser. No PCI exposure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Store redirect:&lt;/strong&gt; hand off to the store's normal checkout page with the cart pre-filled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No extra platform fees — only standard gateway rates apply. A dedicated &lt;code&gt;get_payment_link&lt;/code&gt; tool (Stripe, Mollie, Adyen) is planned for v2.0.0.&lt;/p&gt;

&lt;h2&gt;
  
  
  Current v1.0.0 scope
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Configurable products via child SKU selection — variant tooling coming in v2.0.0&lt;/li&gt;
&lt;li&gt;Guest checkout only for now — registered customer support on the roadmap&lt;/li&gt;
&lt;li&gt;Card payment handled via deferred payment / payment link handoff&lt;/li&gt;
&lt;li&gt;Optional agent order limit configurable in admin&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is browser automation required?&lt;/strong&gt; No. JSON-RPC MCP endpoint — no headless browser, no Selenium, no Playwright.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is MCP faster than browser automation?&lt;/strong&gt; Significantly. No page rendering, no DOM parsing. A full checkout completes in under 5 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this work with Adobe Commerce?&lt;/strong&gt; Yes — Magento Open Source and Adobe Commerce 2.4.x.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the agent act autonomously?&lt;/strong&gt; No. &lt;code&gt;place_order&lt;/code&gt; only fires after explicit user confirmation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require angeo/module-mcp-checkout
bin/magento module:enable Angeo_McpCheckout
bin/magento setup:upgrade
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MIT-licensed, part of the open-source &lt;a href="https://angeo.dev" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt; Agentic Readiness Suite for Magento 2.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I built this module. It's open-source MIT. Genuinely curious what other Magento devs think about agentic checkout as a direction — happy to answer anything about the architecture or MCP tool design in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>magento</category>
      <category>ai</category>
      <category>php</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Your ChatGPT Traffic Is Hiding in 'Direct' — How to Track AI Search Referrals in Magento 2</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Mon, 06 Jul 2026 20:47:21 +0000</pubDate>
      <link>https://dev.to/angeo/your-chatgpt-traffic-is-hiding-in-direct-how-to-track-ai-search-referrals-in-magento-2-54eg</link>
      <guid>https://dev.to/angeo/your-chatgpt-traffic-is-hiding-in-direct-how-to-track-ai-search-referrals-in-magento-2-54eg</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://angeo.dev/track-ai-search-traffic-magento-2/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;. AI platform behavior changes frequently — referrer policies and crawler names may have evolved since publication (July 2026).&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You updated your robots.txt. You generated llms.txt. You fixed your Product schema. Your AEO audit score went from 25% to 85%. And then you opened GA4 — and saw nothing unusual.&lt;/p&gt;

&lt;p&gt;This is the most common frustration after implementing AEO (AI Engine Optimization) on a Magento 2 store. Not because the work didn't help, but because &lt;strong&gt;standard analytics tools were not built to track AI referral traffic&lt;/strong&gt;. The signals exist — they're just hidden in the wrong buckets.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Since &lt;strong&gt;May 13, 2026, GA4 has a native "AI Assistant" channel&lt;/strong&gt; that auto-detects ChatGPT, Gemini, and Claude referrals — zero config, but only for sessions with an intact referrer&lt;/li&gt;
&lt;li&gt;ChatGPT still &lt;strong&gt;strips referrers on most link types&lt;/strong&gt; — in-app browsers, mobile apps, and copy-paste all land in Direct&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;custom Channel Group&lt;/strong&gt; still matters: it catches platforms outside GA4's documented list (Perplexity!) and preserves historical trends (the native channel is forward-only)&lt;/li&gt;
&lt;li&gt;The most reliable way to attribute ChatGPT clicks today is still &lt;strong&gt;UTM parameters in your llms.txt&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Search Console Crawl Stats&lt;/strong&gt; show GPTBot / OAI-SearchBot activity — a leading indicator that precedes traffic by weeks&lt;/li&gt;
&lt;li&gt;If AI traffic converts several times better than organic (early anecdotal data suggests 2–5×), misclassifying it as Direct means &lt;strong&gt;you can't measure ROI on any of your AEO work&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why AI traffic disappears in your analytics
&lt;/h2&gt;

&lt;p&gt;Each platform handles referral data differently, which is why no single tracking method covers all of them:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Referrer passed?&lt;/th&gt;
&lt;th&gt;What GA4 sees by default&lt;/th&gt;
&lt;th&gt;Crawler UA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Direct / (none)&lt;/td&gt;
&lt;td&gt;GPTBot, OAI-SearchBot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Referral — unclassified&lt;/td&gt;
&lt;td&gt;PerplexityBot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Gemini&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;td&gt;Referral from gemini.google.com&lt;/td&gt;
&lt;td&gt;Google-Extended&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;Referral from claude.ai&lt;/td&gt;
&lt;td&gt;ClaudeBot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Microsoft Copilot&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;td&gt;Referral from copilot.microsoft.com&lt;/td&gt;
&lt;td&gt;Bingbot (shared)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT Shopping&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;Direct / (none)&lt;/td&gt;
&lt;td&gt;OAI-SearchBot&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;On ChatGPT specifically:&lt;/strong&gt; behavior depends on where the link appears. Inline links in conversational answers and links opened via the mobile app typically arrive with no &lt;code&gt;Referer&lt;/code&gt; header. OpenAI has been appending UTM parameters to some links in ChatGPT Search's "More sources" since mid-2025, but it's not documented as guaranteed behavior. Published estimates of how many ChatGPT sessions arrive with a usable referrer range from ~10% to ~40% depending on the source — verify against your own server logs instead of trusting any single benchmark.&lt;/p&gt;

&lt;p&gt;The practical upside: Perplexity, Gemini, and Claude together likely represent more &lt;em&gt;trackable&lt;/em&gt; eCommerce referral traffic than ChatGPT right now — and all three are addressable today.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 0: GA4's native "AI Assistant" channel (0 minutes)
&lt;/h2&gt;

&lt;p&gt;On May 13, 2026, Google added a native &lt;strong&gt;AI Assistant&lt;/strong&gt; channel to GA4's Default Channel Group. When GA4 detects a referrer matching a recognized AI assistant, it automatically assigns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Medium:&lt;/strong&gt; &lt;code&gt;ai-assistant&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Campaign:&lt;/strong&gt; &lt;code&gt;(ai-assistant)&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Default Channel Group:&lt;/strong&gt; &lt;code&gt;AI Assistant&lt;/code&gt; — right next to Organic Search, Direct, etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Source:&lt;/strong&gt; stays the originating domain (&lt;code&gt;chatgpt.com&lt;/code&gt;, &lt;code&gt;gemini.google.com&lt;/code&gt;) so you can still break down by platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To verify it's live on your property: &lt;strong&gt;Reports → Acquisition → Traffic acquisition&lt;/strong&gt;, set primary dimension to &lt;em&gt;Session default channel group&lt;/em&gt;, look for an "AI Assistant" row. If it's missing, expand the date range to 90 days — the rollout was gradual, and zero qualifying sessions is also normal at this stage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Three limitations to know:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Not retroactive.&lt;/strong&gt; Everything before May 13, 2026 stays classified as Direct/Referral. No clean YoY comparisons for a while.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Still referrer-dependent.&lt;/strong&gt; Mobile apps, in-app browsers, copy-paste → still Direct. The structural gap didn't go away; it's just easier to see what you're missing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documented coverage is ChatGPT, Gemini, Claude.&lt;/strong&gt; Some third-party sources claim broader coverage (Perplexity, Copilot, Grok...), but Google's own docs don't consistently confirm it. Treat Perplexity via the native channel as unconfirmed until you see it in your own data.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Method 1: Custom Channel Group (5 minutes)
&lt;/h2&gt;

&lt;p&gt;Still worth it, even with the native channel — mainly for Perplexity coverage and a continuous historical trend line.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GA4 Admin → Data display → Channel groups → Create new channel group&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Name it &lt;strong&gt;"AI Search"&lt;/strong&gt;, condition type &lt;strong&gt;Session source contains&lt;/strong&gt; — one rule per domain, OR logic between rules&lt;/li&gt;
&lt;li&gt;Add the domains below&lt;/li&gt;
&lt;li&gt;Save, wait 24–48h (applies to new sessions only)
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;perplexity&lt;/span&gt;.&lt;span class="n"&gt;ai&lt;/span&gt;          &lt;span class="c"&gt;# Perplexity
&lt;/span&gt;&lt;span class="n"&gt;gemini&lt;/span&gt;.&lt;span class="n"&gt;google&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;      &lt;span class="c"&gt;# Google Gemini
&lt;/span&gt;&lt;span class="n"&gt;bard&lt;/span&gt;.&lt;span class="n"&gt;google&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;        &lt;span class="c"&gt;# legacy
&lt;/span&gt;&lt;span class="n"&gt;claude&lt;/span&gt;.&lt;span class="n"&gt;ai&lt;/span&gt;              &lt;span class="c"&gt;# Anthropic Claude
&lt;/span&gt;&lt;span class="n"&gt;copilot&lt;/span&gt;.&lt;span class="n"&gt;microsoft&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;  &lt;span class="c"&gt;# Microsoft Copilot
&lt;/span&gt;&lt;span class="n"&gt;bing&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;/&lt;span class="n"&gt;chat&lt;/span&gt;          &lt;span class="c"&gt;# Bing Chat
&lt;/span&gt;&lt;span class="n"&gt;you&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;                &lt;span class="c"&gt;# You.com
&lt;/span&gt;&lt;span class="n"&gt;phind&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;              &lt;span class="c"&gt;# Phind
&lt;/span&gt;&lt;span class="n"&gt;poe&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;                &lt;span class="c"&gt;# Poe
&lt;/span&gt;&lt;span class="n"&gt;kagi&lt;/span&gt;.&lt;span class="n"&gt;com&lt;/span&gt;               &lt;span class="c"&gt;# Kagi
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After saving, go to Traffic acquisition and switch the primary dimension to your new channel group. Most stores discover Perplexity traffic they didn't know existed — it was sitting in Referral all along.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Native channel vs custom group, side by side:&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Native AI Assistant&lt;/th&gt;
&lt;th&gt;Custom Channel Group&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Setup&lt;/td&gt;
&lt;td&gt;None&lt;/td&gt;
&lt;td&gt;~5 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Historical data&lt;/td&gt;
&lt;td&gt;Forward-only from 2026-05-13&lt;/td&gt;
&lt;td&gt;As far back as configured&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Coverage&lt;/td&gt;
&lt;td&gt;ChatGPT, Gemini, Claude (documented)&lt;/td&gt;
&lt;td&gt;Any domain you add&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Referrer required&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;Google maintains list&lt;/td&gt;
&lt;td&gt;You update quarterly&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Method 2: UTM parameters in llms.txt (30 minutes)
&lt;/h2&gt;

&lt;p&gt;Since ChatGPT strips referrers on most link types, the most practical way to attribute at least &lt;em&gt;part&lt;/em&gt; of ChatGPT traffic is UTM parameters on URLs exposed through AI discovery layers — llms.txt and experimental commerce feeds. UTMs reach GA4 regardless of the missing referrer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# llms.txt — with UTM tracking&lt;/span&gt;

&lt;span class="gh"&gt;# Products&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Wireless Headphones XM5&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://store.com/headphones-xm5?utm_source=chatgpt&amp;amp;utm_medium=ai_referral&amp;amp;utm_campaign=aeo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Running Shoes ProGrip&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://store.com/shoes-progrip?utm_source=chatgpt&amp;amp;utm_medium=ai_referral&amp;amp;utm_campaign=aeo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gh"&gt;# Categories&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Headphones&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://store.com/headphones?utm_source=chatgpt&amp;amp;utm_medium=ai_referral&amp;amp;utm_campaign=aeo&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you're testing experimental OpenAI commerce feed integrations, tag those URLs too — with a &lt;em&gt;distinct&lt;/em&gt; source so you can separate feed-driven clicks from organic ChatGPT referrals:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sku-001"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Wireless Headphones XM5"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://store.com/headphones-xm5?utm_source=chatgpt_shopping&amp;amp;utm_medium=ai_feed&amp;amp;utm_campaign=aeo"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"price"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"amount"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;249.00&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"currency"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"EUR"&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"availability"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"InStock"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Known limitation:&lt;/strong&gt; ChatGPT sometimes renders URLs as plain text rather than clickable links. Users copy-paste, and UTMs often get stripped on paste. UTM tracking captures &lt;em&gt;confirmed intentional clicks&lt;/em&gt; — it will undercount total AI-influenced traffic. There's no reliable client-side fix; server logs (Method 4) fill the gap.&lt;/p&gt;

&lt;p&gt;A note on llms.txt itself: adoption is still developing and platforms vary in how — or whether — they consume it. Treat it as a best-practice signal layer, not a guaranteed crawler instruction standard. Adding UTMs to it is low-effort and worth doing anyway.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 3: Search Console Crawl Stats (2 minutes)
&lt;/h2&gt;

&lt;p&gt;GSC doesn't show AI referral traffic — it shows &lt;strong&gt;AI crawler activity&lt;/strong&gt;, which is a leading indicator that precedes recommendation traffic by days or weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search Console → Settings → Crawl stats → See all crawl requests&lt;/strong&gt;, then filter by user agent:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;User agent&lt;/th&gt;
&lt;th&gt;Platform&lt;/th&gt;
&lt;th&gt;Rising crawl frequency means...&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GPTBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ChatGPT&lt;/td&gt;
&lt;td&gt;Your pages are far more likely to be considered for answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;OAI-SearchBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ChatGPT Search&lt;/td&gt;
&lt;td&gt;OpenAI indexing you for real-time results&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Google-Extended&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Gemini&lt;/td&gt;
&lt;td&gt;Gemini / AI Overviews data collection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PerplexityBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Perplexity&lt;/td&gt;
&lt;td&gt;Content may appear in Perplexity answers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;ClaudeBot&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Claude&lt;/td&gt;
&lt;td&gt;Claude retrieval + training&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After unblocking AI bots in robots.txt and publishing llms.txt, GPTBot crawl frequency should rise within 1–2 weeks. That's your first measurable confirmation the AEO changes are working — before any traffic hits GA4.&lt;/p&gt;

&lt;h2&gt;
  
  
  Method 4: Server logs (15 minutes, most accurate)
&lt;/h2&gt;

&lt;p&gt;Server logs capture every HTTP request — including AI crawler visits and referrers where available. It's the only method that confirms GPTBot activity independently of GSC.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Count AI bot requests&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-E&lt;/span&gt; &lt;span class="s2"&gt;"(GPTBot|OAI-SearchBot|PerplexityBot|Google-Extended|ClaudeBot)"&lt;/span&gt; /var/log/nginx/access.log &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $1}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# Which pages is GPTBot crawling most?&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"GPTBot"&lt;/span&gt; /var/log/nginx/access.log &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;awk&lt;/span&gt; &lt;span class="s1"&gt;'{print $7}'&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; | &lt;span class="nb"&gt;uniq&lt;/span&gt; &lt;span class="nt"&gt;-c&lt;/span&gt; | &lt;span class="nb"&gt;sort&lt;/span&gt; &lt;span class="nt"&gt;-rn&lt;/span&gt; | &lt;span class="nb"&gt;head&lt;/span&gt; &lt;span class="nt"&gt;-20&lt;/span&gt;

&lt;span class="c"&gt;# Perplexity referral clicks (real users, not bot)&lt;/span&gt;
&lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="s2"&gt;"perplexity.ai"&lt;/span&gt; /var/log/nginx/access.log &lt;span class="se"&gt;\&lt;/span&gt;
  | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="s2"&gt;"PerplexityBot"&lt;/span&gt; | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;High GPTBot frequency on your top product pages is a good signal — those pages are strong candidates for ChatGPT recommendations. On Hypernode hosting, logs live at &lt;code&gt;/var/log/nginx/access.log&lt;/code&gt; with daily rotation; the commands work as-is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting it together: the funnel view
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Stage&lt;/th&gt;
&lt;th&gt;Where to measure&lt;/th&gt;
&lt;th&gt;What it means&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AI bots crawling&lt;/td&gt;
&lt;td&gt;GSC → Crawl Stats&lt;/td&gt;
&lt;td&gt;Indexed and eligible for AI recommendations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI referral sessions (ChatGPT/Gemini/Claude)&lt;/td&gt;
&lt;td&gt;GA4 native AI Assistant channel&lt;/td&gt;
&lt;td&gt;Users clicking through — forward-only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AI referral sessions (Perplexity + others)&lt;/td&gt;
&lt;td&gt;GA4 custom "AI Search" group&lt;/td&gt;
&lt;td&gt;Coverage beyond Google's documented list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ChatGPT UTM sessions&lt;/td&gt;
&lt;td&gt;GA4 → utm_source=chatgpt&lt;/td&gt;
&lt;td&gt;Confirmed intentional clicks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Conversions&lt;/td&gt;
&lt;td&gt;GA4 → AI channels → Purchase&lt;/td&gt;
&lt;td&gt;Revenue attributable to AEO&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In GA4 Explore, build one exploration filtered on &lt;em&gt;channel group = "AI Assistant" OR "AI Search"&lt;/em&gt; — a session can only belong to one channel group definition at a time, so there's no double-counting.&lt;/p&gt;

&lt;p&gt;If you export to BigQuery (free on all GA4 properties), you can go further: correlate GPTBot crawl events from server logs with session spikes in the following 48 hours, or segment AI sessions by product category to see which parts of your catalog get recommended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Benchmarks: how much AI traffic is "normal"?
&lt;/h2&gt;

&lt;p&gt;Directional ranges from community reports and early adopter data — not guarantees:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Store profile&lt;/th&gt;
&lt;th&gt;AI share of sessions&lt;/th&gt;
&lt;th&gt;Primary source&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;No AEO work&lt;/td&gt;
&lt;td&gt;0.1–0.5%&lt;/td&gt;
&lt;td&gt;Perplexity (mostly untracked)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Basic AEO (robots.txt + llms.txt)&lt;/td&gt;
&lt;td&gt;0.5–2%&lt;/td&gt;
&lt;td&gt;Perplexity, Gemini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strong AEO (schema, descriptions, UTMs)&lt;/td&gt;
&lt;td&gt;2–6%&lt;/td&gt;
&lt;td&gt;Perplexity, ChatGPT (UTM)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Niche authority store&lt;/td&gt;
&lt;td&gt;5–12%&lt;/td&gt;
&lt;td&gt;Multiple platforms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B / specialist&lt;/td&gt;
&lt;td&gt;3–10%&lt;/td&gt;
&lt;td&gt;Perplexity, Claude&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One anonymised example: a Magento apparel store went from ~0.3% to ~2.1% AI share over ~90 days after four changes — allowing GPTBot, adding llms.txt, rewriting supplier-copy descriptions, fixing Product schema. Perplexity drove most measurable referrals early; ChatGPT attribution stayed partial and UTM-dependent.&lt;/p&gt;

&lt;h2&gt;
  
  
  The honest part: attribution stays probabilistic
&lt;/h2&gt;

&lt;p&gt;Setting up all four methods gives you a &lt;em&gt;significantly&lt;/em&gt; better picture — not a perfect one. The gap is structural:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Gap&lt;/th&gt;
&lt;th&gt;Why&lt;/th&gt;
&lt;th&gt;Workaround&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Dark ChatGPT traffic&lt;/td&gt;
&lt;td&gt;No referrer; paste strips UTMs&lt;/td&gt;
&lt;td&gt;UTMs catch intentional clicks; logs catch crawls&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Safari / privacy browsers&lt;/td&gt;
&lt;td&gt;Referer removed cross-site&lt;/td&gt;
&lt;td&gt;UTMs bypass referrer policy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;In-app browsers&lt;/td&gt;
&lt;td&gt;ChatGPT iOS app may pass nothing&lt;/td&gt;
&lt;td&gt;None reliable — lands in Direct&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-device journeys&lt;/td&gt;
&lt;td&gt;See on mobile, buy on desktop&lt;/td&gt;
&lt;td&gt;GA4 User ID if logged in&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;URL canonicalisation by AI&lt;/td&gt;
&lt;td&gt;ChatGPT may surface a clean URL&lt;/td&gt;
&lt;td&gt;Short UTM values; watch server logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Practical framing: treat AI traffic measurement as a &lt;strong&gt;directional signal&lt;/strong&gt;. If your AI channel shows 80 sessions this month and 140 next month, the trend is real — even if absolute numbers understate AI-influenced traffic by 40–60%.&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging: "I see zero AI traffic"
&lt;/h2&gt;

&lt;p&gt;First, the common AEO gaps: robots.txt blocking GPTBot/OAI-SearchBot, llms.txt returning 404, Product schema missing &lt;code&gt;offers.availability&lt;/code&gt; (ChatGPT Shopping skips those products), supplier-copy descriptions AI can't confidently recommend. If those are fixed and your channel group is set up — give it 4–8 weeks; the crawl-to-traffic lag is real.&lt;/p&gt;

&lt;p&gt;If bots are crawling but sessions still land in Direct, check: Safari/Firefox ETP/privacy-extension referrer stripping, Cloudflare Transform Rules dropping the Referer, 301/302 redirect chains (referrer dies on hops), GA4 Consent Mode blocking pre-consent data, wrong match type in the channel group condition, Magento URL rewrites stripping UTMs.&lt;/p&gt;

&lt;p&gt;Quick diagnostic: visit a product URL with &lt;code&gt;?utm_source=test_ai&amp;amp;utm_medium=debug&lt;/code&gt; from incognito, check GA4 Realtime → Traffic sources. UTM shows up → GA4 is fine, the problem is upstream. Doesn't show → the problem is your data stream or Magento URL handling.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I maintain a set of MIT-licensed open-source Magento 2 modules for AEO (llms.txt generation, robots.txt AI-bot management, structured data, MCP/UCP endpoints) — all on &lt;a href="https://packagist.org/packages/angeo/" rel="noopener noreferrer"&gt;Packagist under &lt;code&gt;angeo/&lt;/code&gt;&lt;/a&gt; and &lt;a href="https://github.com/angeo-dev" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;. Questions about the setup above — happy to answer in the comments.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>magento</category>
      <category>analytics</category>
      <category>seo</category>
      <category>ai</category>
    </item>
    <item>
      <title>Adobe Commerce 2.4.7 EOL: the upgrade notice lists 2 options. There are 4.</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Fri, 26 Jun 2026 17:02:52 +0000</pubDate>
      <link>https://dev.to/angeo/adobe-commerce-247-eol-the-upgrade-notice-lists-2-options-there-are-4-4h9k</link>
      <guid>https://dev.to/angeo/adobe-commerce-247-eol-the-upgrade-notice-lists-2-options-there-are-4-4h9k</guid>
      <description>&lt;p&gt;If you run Adobe Commerce on Cloud and got the end-of-life notice for 2.4.7, here's the short version: the upgrade enforcement date is &lt;strong&gt;June 1, 2028&lt;/strong&gt;. After that, Adobe stops maintaining Cloud environments still on 2.4.7 and reserves the right to decommission them.&lt;/p&gt;

&lt;p&gt;Per Adobe's published lifecycle table, the 2.4.7 timeline is:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Milestone&lt;/th&gt;
&lt;th&gt;Date&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;End of standard support&lt;/td&gt;
&lt;td&gt;May 31, 2027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End of extended support&lt;/td&gt;
&lt;td&gt;May 31, 2028&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cloud upgrade enforcement&lt;/td&gt;
&lt;td&gt;June 1, 2028&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The notice is real. But it quietly narrows your options to two when there are four.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the deadline exists (and it's a good reason)
&lt;/h2&gt;

&lt;p&gt;2.4.7 runs on PHP 8.2. PHP 8.2 reaches end of life on &lt;strong&gt;December 31, 2026&lt;/strong&gt; — after that the PHP project ships no more security patches for it. Adobe hosts the infrastructure, so Adobe owns its PCI compliance. Running an EOL PHP runtime on a payment-handling store is a PCI DSS problem, not just a hygiene one. That's the actual logic behind enforcement, not pure commercial pressure.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four paths
&lt;/h2&gt;

&lt;p&gt;Adobe officially lists two:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Upgrade to the latest Adobe Commerce on Cloud&lt;/strong&gt; — 2.4.8 (supported to May 2028) or 2.4.9&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Migrate to Adobe Commerce as a Cloud Service&lt;/strong&gt; — SaaS, fully managed, no future enforcement deadlines&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Two more exist outside Adobe's scope, fully compatible with the same Magento 2 core, with no license fee:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Magento Open Source 2.4.9&lt;/strong&gt; — same core, self-hosted, $0 license&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mage-OS 3.x&lt;/strong&gt; — community-governed fork, $0 license, ships security patches on a faster community cadence&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Adobe's notice will never mention 3 and 4. That doesn't make them less viable.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changes with each
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Path&lt;/th&gt;
&lt;th&gt;License&lt;/th&gt;
&lt;th&gt;Hosting&lt;/th&gt;
&lt;th&gt;Recurring enforcement?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Commerce on Cloud&lt;/td&gt;
&lt;td&gt;Revenue-based (~$40K–$190K+/yr)&lt;/td&gt;
&lt;td&gt;Adobe-managed&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Adobe Commerce Cloud Service&lt;/td&gt;
&lt;td&gt;SaaS subscription&lt;/td&gt;
&lt;td&gt;Adobe full-stack&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Magento Open Source 2.4.9&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Your own&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mage-OS 3.x&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Your own&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;All four require the same infrastructure work: 2.4.8/2.4.9 need PHP 8.3+ and OpenSearch 2.19 (Elasticsearch is deprecated). That work happens regardless of path.&lt;/p&gt;

&lt;h2&gt;
  
  
  The license math
&lt;/h2&gt;

&lt;p&gt;Adobe Commerce is revenue-participation — the bill scales with GMV automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under $1M GMV → ~$40K/yr on Cloud&lt;/li&gt;
&lt;li&gt;$1M–$5M GMV → ~$55K–80K/yr on Cloud&lt;/li&gt;
&lt;li&gt;$5M–$25M GMV → up to ~$190K/yr on Cloud&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a $3M GMV store moving to Magento Open Source or Mage-OS, the license line goes to zero. Over three years the difference comfortably exceeds $150K.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Figures are independent third-party estimates; Adobe doesn't publish official pricing.)&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What actually transfers
&lt;/h2&gt;

&lt;p&gt;Because Adobe Commerce and Magento Open Source share the same Magento 2 core, moving between them is not a replatform. The CLI commands are identical, every Marketplace extension installs the same way, and theme/catalog/checkout logic carries over.&lt;/p&gt;

&lt;p&gt;What needs planning when you drop the Adobe commercial layer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Native B2B suite&lt;/strong&gt; — company accounts, shared catalogs, quote-to-order need extensions or custom dev&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live Search / Sensei&lt;/strong&gt; — replaceable with OpenSearch + best-of-breed tools&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP &amp;amp; search engine upgrade&lt;/strong&gt; — required on all paths anyway&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Mage-OS detail worth knowing
&lt;/h2&gt;

&lt;p&gt;A common stale claim is "Mage-OS only has 2.3 with PHP 8.5." That's already outdated. &lt;strong&gt;Mage-OS 3.0 and 3.1 are out&lt;/strong&gt;, built on Magento Open Source 2.4.9, with PHP 8.5 support alongside 8.3 and 8.4.&lt;/p&gt;

&lt;p&gt;One gotcha most write-ups miss: &lt;strong&gt;Mage-OS 3 dropped PHP 8.2 support&lt;/strong&gt; — minimum is now PHP 8.3 (8.4 recommended), and Symfony moved 6.4 → 7.4 LTS, so extensions that extend Symfony CLI command classes may need updates. Worth scoping before you commit.&lt;/p&gt;

&lt;p&gt;Fresh install is one command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer create-project &lt;span class="nt"&gt;--repository-url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;https://repo.mage-os.org/ &lt;span class="se"&gt;\&lt;/span&gt;
  mage-os/project-community-edition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For an existing Magento 2.4.8+ store, Mage-OS ships an automated migration script (run it in developer mode on staging first). Mage-OS also publishes security updates within days of Adobe's monthly Patch Tuesday, rather than waiting on Adobe's quarterly cadence.&lt;/p&gt;

&lt;h2&gt;
  
  
  A worked $4M GMV migration
&lt;/h2&gt;

&lt;p&gt;Typical mid-market project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Platform: Adobe Commerce on Cloud 2.4.7 → Magento Open Source 2.4.9 + Hyvä&lt;/li&gt;
&lt;li&gt;Duration: ~6 weeks (audit, migration, QA, staged cutover)&lt;/li&gt;
&lt;li&gt;License savings: ~$72K/year&lt;/li&gt;
&lt;li&gt;Hosting cost reduction: ~38% vs Adobe Cloud&lt;/li&gt;
&lt;li&gt;Checkout downtime: none via staged cutover&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The heaviest lift is not the platform swap — it's replacing Adobe-specific features (B2B workflows, Live Search) and modernising the infra stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who should stay on Adobe Commerce
&lt;/h2&gt;

&lt;p&gt;This isn't anti-Adobe. Stay if you're:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Large enterprise B2B&lt;/strong&gt; relying on native company accounts, shared catalogs, quote-to-order&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A team that needs Adobe SLAs&lt;/strong&gt; for procurement or compliance&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deep in Adobe Experience Cloud&lt;/strong&gt; — Analytics, Target, Real-Time CDP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;High-GMV&lt;/strong&gt; where Live Search + managed cloud measurably beat the license fee in conversion lift&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For those, Options 1 or 2 are rational. The license only looks expensive when you're not using what it buys.&lt;/p&gt;

&lt;h2&gt;
  
  
  While the stack is open: AI crawler access
&lt;/h2&gt;

&lt;p&gt;One efficiency note, since a 2.4.7 migration means re-deploying robots.txt, schema, and frontend templates anyway. A default Magento 2 install — any edition — blocks AI crawlers in robots.txt, has no llms.txt, and ships incomplete Product JSON-LD. That means it's effectively invisible to ChatGPT, Gemini, and Perplexity, even if it ranks #1 on Google. The fixes touch the same files you're already editing. There's an open-source CLI to check where a store stands if you want to fold it into the same project. Optional, unrelated to the lifecycle decision — just cheaper to do once.&lt;/p&gt;

&lt;h2&gt;
  
  
  The clock
&lt;/h2&gt;

&lt;p&gt;June 1, 2028 sounds far away. A properly scoped mid-market migration runs 6–10 weeks. The decision comes down to one question: do you need Adobe's commercial layer enough to justify a fee that scales with revenue? If yes → Option 1 or 2. If no → 3 or 4.&lt;/p&gt;

&lt;p&gt;Full breakdown of all four paths with a feature matrix and FAQ: &lt;a href="https://angeo.dev/adobe-commerce-2-4-7-end-of-life-options/" rel="noopener noreferrer"&gt;angeo.dev/adobe-commerce-2-4-7-end-of-life-options/&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Lifecycle dates from Adobe's published policy. License figures are independent third-party estimates — Adobe doesn't publish official pricing. Verify against the &lt;a href="https://experienceleague.adobe.com/en/docs/commerce-operations/release/planning/lifecycle-policy" rel="noopener noreferrer"&gt;Adobe Commerce lifecycle policy&lt;/a&gt; and request a direct quote before budget decisions.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>php</category>
      <category>magento</category>
      <category>ecommerce</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Magento AI Brand Visibility: Does ChatGPT Recommend Your Store?</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Sat, 13 Jun 2026 07:17:29 +0000</pubDate>
      <link>https://dev.to/angeo/magento-ai-brand-visibility-does-chatgpt-recommend-your-store-4j10</link>
      <guid>https://dev.to/angeo/magento-ai-brand-visibility-does-chatgpt-recommend-your-store-4j10</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; set &lt;code&gt;published: true&lt;/code&gt; when you're ready. The &lt;code&gt;canonical_url&lt;/code&gt; above tells Google the original lives on angeo.dev, so this cross-post won't compete with it. Replace &lt;code&gt;cover_image&lt;/code&gt; with the uploaded featured image URL.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Short answer:&lt;/strong&gt; when your customers ask ChatGPT, Claude or Perplexity &lt;em&gt;"where should I buy this?"&lt;/em&gt;, you currently have no idea whether your store appears in the reply. &lt;a href="https://github.com/angeo-dev/module-aeo-brand-visibility" rel="noopener noreferrer"&gt;Angeo AEO Brand Visibility&lt;/a&gt; is a free, open-source &lt;strong&gt;Magento 2&lt;/strong&gt; module that measures exactly that: it runs brand-probing prompts across the five major AI models and scores your real-world &lt;strong&gt;AI brand visibility&lt;/strong&gt; from 0 to 100.&lt;/p&gt;

&lt;p&gt;Search no longer means only Google. More buying research now starts inside an AI assistant that returns one synthesized answer naming a few stores. &lt;strong&gt;AI Engine Optimization (AEO)&lt;/strong&gt; is the work of making sure your brand is one of those names — and this module tells you, in minutes, whether it is.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI brand visibility matters for Magento merchants
&lt;/h2&gt;

&lt;p&gt;AI answers are &lt;em&gt;winner-takes-most&lt;/em&gt;. Where a search results page lists ten links, an AI assistant usually names two or three stores. If you're not in that shortlist, you're invisible to that buyer — there is no "page two". Traditional SEO tools can't see this: they measure rankings, backlinks and crawl health, not what a model actually &lt;em&gt;says&lt;/em&gt; when prompted. That blind spot is what AEO Brand Visibility closes.&lt;/p&gt;

&lt;h2&gt;
  
  
  How Magento AI brand visibility tracking works
&lt;/h2&gt;

&lt;p&gt;You set your brand name, domain, category and a few top products. The module sends natural shopping prompts — &lt;em&gt;"What are the best online stores to buy {category}?"&lt;/em&gt;, &lt;em&gt;"Tell me about {brand}"&lt;/em&gt;, &lt;em&gt;"Compare {brand} with similar stores"&lt;/em&gt; — to every enabled AI provider. Each response is analysed for five signals, scored, cached and saved to a history log so you can watch the trend over time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Supported AI providers
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Why it's included&lt;/th&gt;
&lt;th&gt;Free tier?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;ChatGPT&lt;/strong&gt; (OpenAI)&lt;/td&gt;
&lt;td&gt;The most-used assistant; the default benchmark for AI recall.&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Claude&lt;/strong&gt; (Anthropic)&lt;/td&gt;
&lt;td&gt;Strong reasoning; common for research-style queries.&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perplexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Live web search — best signal for what the internet says about you now.&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Gemini&lt;/strong&gt; (Google)&lt;/td&gt;
&lt;td&gt;Tied into Google's ecosystem; generous free tier.&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Groq&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Fast, free Llama hosting — ideal for zero-cost testing.&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Start with the free providers (Gemini and Groq) to validate your setup at zero cost, then add paid providers for the most commercially relevant picture.&lt;/p&gt;

&lt;h3&gt;
  
  
  The five visibility signals
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mentioned&lt;/strong&gt; — your brand or a configured alias appears anywhere in the answer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recommended&lt;/strong&gt; — the model actively suggests you (recommendation language near your mention, or you appear in a ranked list).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;URL cited&lt;/strong&gt; — your domain is referenced in the response, the strongest trust signal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;First result&lt;/strong&gt; — you appear in the first quarter of the answer, i.e. top-of-mind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Positive sentiment&lt;/strong&gt; — favourable language sits close to your mention.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Each signal is weighted and combined into a single &lt;strong&gt;0–100 score&lt;/strong&gt; with an A–F grade.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you get in the Magento admin
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Run Audit&lt;/strong&gt; — one click queries every enabled model and shows live scores, per-provider chips and signal rates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Statistics &amp;amp; trend chart&lt;/strong&gt; — average, best and worst scores plus a score-over-time graph from your fresh (non-cached) runs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit History&lt;/strong&gt; — your recent runs, each expandable to the full prompt-by-prompt detail.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Action Plan&lt;/strong&gt; — a prioritised, time-bounded roadmap of what to fix first.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Single Query Tester&lt;/strong&gt; — send one prompt to one provider and inspect the raw response.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Automate it: CLI, cron and CI gates
&lt;/h2&gt;

&lt;p&gt;AI brand visibility drifts as content, reviews and the web change, so the module ships a CLI command and a cron job — and it can fail a CI build if your score drops below a threshold.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Run a full audit across all enabled providers&lt;/span&gt;
bin/magento angeo:aeo:brand-visibility

&lt;span class="c"&gt;# Force fresh queries (bypass the cache)&lt;/span&gt;
bin/magento angeo:aeo:brand-visibility &lt;span class="nt"&gt;--refresh&lt;/span&gt;

&lt;span class="c"&gt;# Test a single provider / prompt&lt;/span&gt;
bin/magento angeo:aeo:brand-visibility &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;perplexity &lt;span class="nt"&gt;--prompt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;brand_direct

&lt;span class="c"&gt;# Machine-readable output for dashboards&lt;/span&gt;
bin/magento angeo:aeo:brand-visibility &lt;span class="nt"&gt;--format&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;json

&lt;span class="c"&gt;# Gate a pipeline: exit 1 if the score falls below 60&lt;/span&gt;
bin/magento angeo:aeo:brand-visibility &lt;span class="nt"&gt;--fail-on&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;60
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Built to extend angeo/module-aeo-audit
&lt;/h2&gt;

&lt;p&gt;AEO Brand Visibility plugs into &lt;a href="https://packagist.org/packages/angeo/module-aeo-audit" rel="noopener noreferrer"&gt;angeo/module-aeo-audit&lt;/a&gt; as a live-signal checker, sitting alongside the 15 built-in technical checks (robots.txt, llms.txt, structured data and more). Your brand-recall score becomes part of the same unified AEO report — one command, one dashboard, technical and real-world signals together.&lt;/p&gt;

&lt;h2&gt;
  
  
  Security &amp;amp; privacy
&lt;/h2&gt;

&lt;p&gt;Provider API keys are stored with Magento's encrypted backend model and never written to logs. Outbound calls are HTTPS-only and don't follow redirects, admin endpoints are protected by ACL and form keys, and all AI-provider text is escaped before rendering. Serialization uses Magento's &lt;code&gt;SerializerInterface&lt;/code&gt; throughout.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require angeo/module-aeo-brand-visibility
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open &lt;strong&gt;Stores → Configuration → Angeo AEO → Brand Visibility&lt;/strong&gt;, add at least one provider API key, set your brand name and domain, and hit &lt;strong&gt;Run Audit&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to improve your AI brand visibility score
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Low mention rate?&lt;/strong&gt; Publish an &lt;code&gt;llms.txt&lt;/code&gt; file (&lt;a href="https://packagist.org/packages/angeo/module-llms-txt" rel="noopener noreferrer"&gt;angeo/module-llms-txt&lt;/a&gt;) and keep your store name consistent across every page.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain not cited?&lt;/strong&gt; Strengthen backlinks and reference your canonical URL in structured data and &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Not being recommended?&lt;/strong&gt; Improve product content quality and implement review schema.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Appearing late in answers?&lt;/strong&gt; Build topical authority with category-focused content.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Is the module free?&lt;/strong&gt; Yes — MIT licensed. You only pay for the AI provider usage you choose, and you can run it entirely free using the Gemini and Groq free tiers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which AI models does it check?&lt;/strong&gt; ChatGPT, Claude, Perplexity, Gemini and Groq. Enable any combination.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Will audits cost a lot in API fees?&lt;/strong&gt; Not if configured sensibly. Results are cached, you control how many prompts run, and total queries equal enabled providers × active prompts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What Magento versions are supported?&lt;/strong&gt; 2.4.6, 2.4.7 and 2.4.8 (Adobe Commerce and Mage-OS), PHP 8.2–8.4. Requires &lt;code&gt;angeo/module-aeo-audit&lt;/code&gt; v3.0+.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How is this different from SEO tools?&lt;/strong&gt; SEO tools measure rankings and crawlability. This measures what AI assistants actually say when asked shopping questions.&lt;/p&gt;




&lt;p&gt;AI assistants are already recommending stores in your category — the only question is whether they're recommending &lt;em&gt;you&lt;/em&gt;. Install &lt;a href="https://github.com/angeo-dev/module-aeo-brand-visibility" rel="noopener noreferrer"&gt;angeo/module-aeo-brand-visibility&lt;/a&gt;, run your first audit, and find out in minutes. You can also &lt;a href="https://angeo.dev/ai-magento-audit/" rel="noopener noreferrer"&gt;run a free 30-second AEO audit&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://angeo.dev/magento-2-ai-brand-visibility/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>magento</category>
      <category>ai</category>
      <category>seo</category>
      <category>php</category>
    </item>
    <item>
      <title>The 4-Layer Magento 2 AEO Stack: Making Your Store Visible to ChatGPT, Claude &amp; Gemini (2026)</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Sat, 06 Jun 2026 19:06:09 +0000</pubDate>
      <link>https://dev.to/angeo/the-4-layer-magento-2-aeo-stack-making-your-store-visible-to-chatgpt-claude-gemini-2026-bjd</link>
      <guid>https://dev.to/angeo/the-4-layer-magento-2-aeo-stack-making-your-store-visible-to-chatgpt-claude-gemini-2026-bjd</guid>
      <description>&lt;p&gt;I've written here before about &lt;a href="https://dev.to/angeo/how-to-fix-robotstxt-for-chatgpt-and-gemini-in-magento-2-4e11"&gt;fixing robots.txt for the AI bots&lt;/a&gt; and &lt;a href="https://dev.to/angeo/how-to-check-if-your-magento-store-is-visible-to-chatgpt-free-aeo-audit-module-4hkm"&gt;checking your store's ChatGPT visibility with a free audit module&lt;/a&gt;. This post zooms out and puts the whole thing in one place: the four layers that decide whether an AI assistant can find, trust, and recommend your Magento store — and the honest data on which layers actually matter in 2026.&lt;/p&gt;

&lt;p&gt;Default Magento 2 typically scores around &lt;strong&gt;23% on an AEO audit&lt;/strong&gt; across the stores I've measured. Not because anything is broken — because every one of these signals ships off by default and nobody flipped them on.&lt;/p&gt;

&lt;p&gt;Here's the stack, in priority order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1 — robots.txt: you're probably blocking the bots you want
&lt;/h2&gt;

&lt;p&gt;The most common failure, and almost always accidental. A &lt;code&gt;robots.txt&lt;/code&gt; written for Google in 2019 says nothing about the AI fleet, and some security/hardening configs block &lt;em&gt;unknown&lt;/em&gt; bots — which now includes the crawlers feeding ChatGPT, Claude, Gemini, and Perplexity.&lt;/p&gt;

&lt;p&gt;There's no single user-agent to allow. In 2026 you're dealing with ~10 distinct AI bots across four platform families. Minimal explicit allow-list:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User-agent: GPTBot
Allow: /

User-agent: OAI-SearchBot
Allow: /

User-agent: ChatGPT-User
Allow: /

User-agent: ClaudeBot
Allow: /

User-agent: PerplexityBot
Allow: /

User-agent: Google-Extended
Allow: /

Sitemap: https://yourstore.com/sitemap.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Key gotcha: &lt;strong&gt;&lt;code&gt;Google-Extended&lt;/code&gt; is not &lt;code&gt;Googlebot&lt;/code&gt;.&lt;/strong&gt; Blocking it doesn't touch your Google ranking — it only governs whether Google's AI products may use your content. Tons of sites blocked it during the 2023–24 anti-scraper panic and never revisited. If you want AI visibility, reconsider it.&lt;/p&gt;

&lt;p&gt;Highest-leverage 20 minutes in the whole stack. Do it first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2 — JSON-LD: Magento ships the wrong format and skips the one field that matters
&lt;/h2&gt;

&lt;p&gt;This one is Magento-specific and it's the difference between being eligible for AI Shopping answers and being silently dropped.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Default Magento 2 outputs product structured data as microdata, not JSON-LD.&lt;/strong&gt; AI extraction systems strongly prefer JSON-LD — a clean, self-contained block they can parse without reconstructing meaning from scattered HTML attributes.&lt;/p&gt;

&lt;p&gt;And the field that quietly kills you:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;offers.availability&lt;/code&gt; is frequently missing — and ChatGPT Shopping will skip a product with no availability signal entirely.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;From the model's side, it's assembling a &lt;em&gt;purchasable&lt;/em&gt; recommendation. A product it can't confirm is in stock is a liability, so it drops it. No warning. You just don't appear.&lt;/p&gt;

&lt;p&gt;Correct, AI-friendly block:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"application/ld+json"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@context&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org/&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Product&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Pre-Seasoned Cast Iron Skillet 12&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;sku&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CAST-SKILLET-12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;brand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Brand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;name&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;YourBrand&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;offers&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Offer&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;url&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://yourstore.com/cast-iron-skillet-12&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;priceCurrency&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;EUR&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;price&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;59.00&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;availability&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org/InStock&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;itemCondition&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://schema.org/NewCondition&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;aggregateRating&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@type&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;AggregateRating&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ratingValue&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;4.7&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;reviewCount&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;212&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Three traps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Don't inject schema via GTM.&lt;/strong&gt; AI crawlers generally don't execute JavaScript, so tag-manager-injected schema is invisible to them even though it validates in DevTools. It must be server-rendered.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hyvä themes ship with &lt;em&gt;zero&lt;/em&gt; product schema by default&lt;/strong&gt; — neither microdata nor JSON-LD. If you migrated to Hyvä for speed, you may have silently dropped your structured data. Check now.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bind &lt;code&gt;availability&lt;/code&gt; to real stock&lt;/strong&gt;, never a hardcoded &lt;code&gt;InStock&lt;/code&gt;. A model that recommends your out-of-stock item once learns to distrust your feed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Verify it's in the raw HTML (no JS):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-s&lt;/span&gt; https://yourstore.com/your-product | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-A30&lt;/span&gt; &lt;span class="s1"&gt;'application/ld+json'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nothing returned = the AI layer sees nothing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3 — llms.txt: ship it, but not for the reason you've been sold
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; is a Markdown file at your root giving AI systems a curated map of your store — to LLMs what robots.txt is to crawlers, but editorial rather than access-control.&lt;/p&gt;

&lt;p&gt;Now the honest part. &lt;strong&gt;The "llms.txt boosts your AI rankings" pitch isn't supported by 2026 data:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A 300k-domain study found ~&lt;strong&gt;10% adoption&lt;/strong&gt;; among the 50 most AI-cited domains, only &lt;strong&gt;one&lt;/strong&gt; had the file.&lt;/li&gt;
&lt;li&gt;One vendor logged 62,100 AI bot visits over 90 days — &lt;strong&gt;84 hit &lt;code&gt;llms.txt&lt;/code&gt;. That's 0.1%.&lt;/strong&gt; Another tracking 500M+ bot events found GPTBot, ClaudeBot, PerplexityBot, OAI-SearchBot and Google-Extended overwhelmingly skip it and crawl HTML directly.&lt;/li&gt;
&lt;li&gt;OpenAI, Anthropic, and Perplexity haven't committed to reading it automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So why ship it? Because it's a &lt;strong&gt;Business-to-Agent (B2A) play, not an SEO play.&lt;/strong&gt; Agentic and IDE-style tooling already fetches it, agentic commerce is heading the same way, and conventions like this often get published before platforms formally commit (robots.txt predated official search-engine support). It's half a day of cheap insurance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# YourStore&lt;/span&gt;
&lt;span class="gt"&gt;
&amp;gt; Premium cast iron and carbon steel cookware. EU-based, ships across Europe,&lt;/span&gt;
&lt;span class="gt"&gt;&amp;gt; 30-day returns, mid-range pricing.&lt;/span&gt;

&lt;span class="gu"&gt;## Categories&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Cast Iron Skillets&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yourstore.com/cast-iron&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Dutch Ovens&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yourstore.com/dutch-ovens&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gu"&gt;## Buying Guides&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Cast iron vs carbon steel&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yourstore.com/guides/cast-vs-carbon&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="gu"&gt;## Policies&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Shipping &amp;amp; Returns&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://yourstore.com/shipping&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ship it, spend the half day, then &lt;strong&gt;stop optimizing it&lt;/strong&gt; and put your energy into Layers 1, 2, and 4. And remember: a stale &lt;code&gt;llms.txt&lt;/code&gt; is worse than none — wrong stock claims train models to distrust you.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 4 — ACP &amp;amp; UCP: the part that's actually about money
&lt;/h2&gt;

&lt;p&gt;The 2026 shift bigger than schema tweaks: AI is moving from &lt;em&gt;discovery&lt;/em&gt; ("here are some pans") to &lt;em&gt;transaction&lt;/em&gt; ("I bought the pan for you"). Two protocols define that layer, and Magento merchants — unlike Shopify merchants — wire it up themselves.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;ACP (OpenAI + Stripe)&lt;/strong&gt; — live in ChatGPT since late 2025; settled into a discovery-and-feed role. You submit a spec-compliant feed, ChatGPT surfaces products, checkout uses delegated single-use payment tokens, with a transaction fee on completed Instant Checkout orders.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;UCP (Google + Shopify + 20-plus partners incl. Walmart, Target, Visa, Mastercard)&lt;/strong&gt; — announced at NRF Jan 2026, expanded at Google Marketing Live in May. Broader, protocol-agnostic (REST, MCP, A2A), spanning discovery → cart → checkout → post-purchase across Google AI Mode, Gemini, YouTube, Gmail. Agents discover capabilities via &lt;code&gt;/.well-known/ucp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Reality check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;It's not "pick one."&lt;/strong&gt; They target different agent ecosystems; dual-protocol merchants reportedly see meaningfully more agentic traffic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Most groundwork is shared&lt;/strong&gt; — clean schema, an accurate live feed, defined shipping/return/pricing policies are prerequisites for both and survive any spec reshuffle (ACP already pivoted away from native checkout once).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sensible Magento order:&lt;/strong&gt; solid Layers 1–3 → ship ACP feed → prepare UCP manifest.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Shopify gets much of this by partnership default. Magento/Adobe Commerce: you own the stack — full control, full responsibility.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR priority order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Fix &lt;code&gt;robots.txt&lt;/code&gt; so the AI fleet can crawl you. (~20 min, highest leverage)&lt;/li&gt;
&lt;li&gt;Emit server-rendered JSON-LD with a &lt;strong&gt;live&lt;/strong&gt; &lt;code&gt;offers.availability&lt;/code&gt;. (Hyvä users: confirm you have &lt;em&gt;any&lt;/em&gt; schema.)&lt;/li&gt;
&lt;li&gt;Verify with no-JS &lt;code&gt;curl&lt;/code&gt;. Not in raw HTML = invisible.&lt;/li&gt;
&lt;li&gt;Ship &lt;code&gt;llms.txt&lt;/code&gt; as cheap B2A insurance, then leave it.&lt;/li&gt;
&lt;li&gt;Build the shared commerce substrate, attach ACP, then UCP.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Google decides whether you &lt;em&gt;rank&lt;/em&gt;. AI engines increasingly decide whether you &lt;em&gt;exist&lt;/em&gt; in the answer. Two separate jobs now.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The open-source modules behind this (AEO audit CLI, llms.txt generator, multi-store AI description tooling) are on &lt;a href="https://packagist.org/packages/angeo/" rel="noopener noreferrer"&gt;Packagist&lt;/a&gt; and documented at &lt;a href="https://angeo.dev" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;. The llms.txt and ACP/UCP figures come from independent 2026 studies — verify current spec versions as you implement, this area moves monthly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you've pulled your own AI-bot server logs on a Magento store, drop the numbers in the comments — real crawler data is still scarce and I'd like to compare.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>magento</category>
      <category>aeo</category>
      <category>chatgpt</category>
      <category>opensource</category>
    </item>
    <item>
      <title>llms.txt for Magento 2: Free vs Paid Modules (2026 Review)</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Mon, 01 Jun 2026 07:06:32 +0000</pubDate>
      <link>https://dev.to/angeo/llmstxt-for-magento-2-free-vs-paid-modules-2026-review-308l</link>
      <guid>https://dev.to/angeo/llmstxt-for-magento-2-free-vs-paid-modules-2026-review-308l</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a cross-post. The original — with the full module-by-module comparison table, feature breakdown, and FAQ — is on &lt;a href="https://angeo.dev/llms-txt-magento-2-free-vs-paid-module-comparison/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;AI systems are increasingly shaping how users discover products.&lt;/p&gt;

&lt;p&gt;Instead of browsing category pages, users now ask:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"best hiking boots under €150"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;and get a synthesized answer immediately.&lt;/p&gt;

&lt;p&gt;This shift creates a new problem for eCommerce: your store content is no longer consumed only as HTML. &lt;code&gt;llms.txt&lt;/code&gt; is an attempt to provide AI systems with a cleaner, structured summary of a website.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Multiple Magento 2 llms.txt solutions exist (free and paid)&lt;/li&gt;
&lt;li&gt;Differences are mostly about workflow, not output quality&lt;/li&gt;
&lt;li&gt;There is &lt;strong&gt;no confirmed evidence&lt;/strong&gt; that llms.txt impacts search rankings&lt;/li&gt;
&lt;li&gt;Value comes from better AI interpretation of store structure&lt;/li&gt;
&lt;li&gt;JSONL-style structured feeds may become more important long-term&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;Modern LLM-based assistants compress pages, reconstruct product context, and may misinterpret or ignore important catalog structure.&lt;/p&gt;

&lt;p&gt;This can lead to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;outdated product descriptions in AI answers&lt;/li&gt;
&lt;li&gt;missing categories&lt;/li&gt;
&lt;li&gt;incorrect pricing context&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; tries to reduce that ambiguity by providing a simplified representation of the store.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is llms.txt?
&lt;/h2&gt;

&lt;p&gt;A &lt;code&gt;llms.txt&lt;/code&gt; file is a Markdown-based endpoint typically located at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://yourstore.com/llms.txt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It can include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store overview&lt;/li&gt;
&lt;li&gt;category links&lt;/li&gt;
&lt;li&gt;product references&lt;/li&gt;
&lt;li&gt;policies and informational pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not a formal standard and is still evolving.&lt;/p&gt;




&lt;h2&gt;
  
  
  llms.txt vs sitemap.xml vs robots.txt
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;File&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Consumers&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;robots.txt&lt;/td&gt;
&lt;td&gt;crawler rules&lt;/td&gt;
&lt;td&gt;search engines, bots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sitemap.xml&lt;/td&gt;
&lt;td&gt;URL discovery&lt;/td&gt;
&lt;td&gt;search engines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;llms.txt&lt;/td&gt;
&lt;td&gt;content summary&lt;/td&gt;
&lt;td&gt;AI systems (varies)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;These are complementary layers, not replacements.&lt;/p&gt;




&lt;h2&gt;
  
  
  Does it improve SEO?
&lt;/h2&gt;

&lt;p&gt;There is no verified evidence that &lt;code&gt;llms.txt&lt;/code&gt; directly influences Google rankings.&lt;/p&gt;

&lt;p&gt;Its impact is more likely indirect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clearer AI summaries&lt;/li&gt;
&lt;li&gt;more consistent product descriptions in LLM outputs&lt;/li&gt;
&lt;li&gt;reduced hallucination risk in catalog interpretation&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Magento 2 implementation approaches
&lt;/h2&gt;

&lt;p&gt;In practice, implementations fall into three categories.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Manual file (small stores)
&lt;/h3&gt;

&lt;p&gt;Simple Markdown file maintained by hand. Works well when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;catalog changes rarely&lt;/li&gt;
&lt;li&gt;under 50–100 products&lt;/li&gt;
&lt;li&gt;no automation required&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Admin-driven modules (business teams)
&lt;/h3&gt;

&lt;p&gt;Paid extensions usually add an admin UI, content selection controls, scheduling (cron), and multi-store support. Useful when marketing teams manage content directly.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Developer / automation-driven modules
&lt;/h3&gt;

&lt;p&gt;Open-source or CLI-based tools typically provide CLI generation, cron updates, and JSONL output in some cases. This approach fits dynamic catalogs better.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For the full feature-by-feature comparison of specific paid and free modules (Magedelight, Webkul, Plumrocket, Eleventex, Magefan, and the open-source option), see the &lt;a href="https://angeo.dev/llms-txt-magento-2-free-vs-paid-module-comparison/" rel="noopener noreferrer"&gt;complete comparison table on angeo.dev&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Example structure
&lt;/h2&gt;

&lt;p&gt;A typical &lt;code&gt;llms.txt&lt;/code&gt; might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gh"&gt;# Store Name&lt;/span&gt;

&lt;span class="gu"&gt;## Categories&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Hiking: https://store.com/hiking
&lt;span class="p"&gt;-&lt;/span&gt; Climbing: https://store.com/climbing

&lt;span class="gu"&gt;## Featured Products&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Trail Boot X3 — €149 — waterproof hiking boot
&lt;span class="p"&gt;-&lt;/span&gt; Summit 40L Pack — €89 — lightweight backpack

&lt;span class="gu"&gt;## Policies&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Shipping: EU delivery 2–3 days
&lt;span class="p"&gt;-&lt;/span&gt; Returns: 30 days
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What surprised me during research
&lt;/h2&gt;

&lt;p&gt;A few observations stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Most vendor implementations are structurally very similar&lt;/li&gt;
&lt;li&gt;Marketing differences are larger than technical differences&lt;/li&gt;
&lt;li&gt;JSONL-style structured output is rarely implemented, despite being more machine-friendly&lt;/li&gt;
&lt;li&gt;There is still no confirmed adoption standard among major AI platforms&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In other words: the ecosystem is early and still converging.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key takeaway
&lt;/h2&gt;

&lt;p&gt;For most Magento stores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You don't need a complex solution to start&lt;/li&gt;
&lt;li&gt;Manual or lightweight generation is often enough&lt;/li&gt;
&lt;li&gt;Automation only matters at scale or high change frequency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The real long-term value is not the file itself, but how consistently your product data is structured for machines.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;llms.txt&lt;/code&gt; should not be treated as a magic SEO layer. It is better understood as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a compatibility layer between eCommerce content and AI systems&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Whether it becomes important depends less on Magento and more on how AI platforms evolve ingestion of structured web data.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Full comparison with module table, pricing, and FAQ: &lt;a href="https://angeo.dev/llms-txt-magento-2-free-vs-paid-module-comparison/" rel="noopener noreferrer"&gt;angeo.dev/llms-txt-magento-2-free-vs-paid-module-comparison/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>magento</category>
      <category>llmstxt</category>
      <category>aeo</category>
      <category>ecommerce</category>
    </item>
    <item>
      <title>Shopify vs Magento for AI Commerce in 2026: Platform-Mediated vs Merchant-Controlled AEO</title>
      <dc:creator>Ievgenii Gryshkun</dc:creator>
      <pubDate>Thu, 28 May 2026 16:16:18 +0000</pubDate>
      <link>https://dev.to/angeo/shopify-vs-magento-for-ai-commerce-in-2026-platform-mediated-vs-merchant-controlled-aeo-2igm</link>
      <guid>https://dev.to/angeo/shopify-vs-magento-for-ai-commerce-in-2026-platform-mediated-vs-merchant-controlled-aeo-2igm</guid>
      <description>&lt;p&gt;In March 2026, Shopify positioned its eligible merchants for default discovery inside ChatGPT via Agentic Storefronts — no per-merchant setup required. Two months later, the same week Shopify reported its fastest quarterly revenue growth in four years, the stock fell 16%.&lt;/p&gt;

&lt;p&gt;Both facts are true. They describe where AI commerce actually sits in 2026: infrastructure that is genuinely transformative, deployed into a market uncertain whether the near-term economics hold.&lt;/p&gt;

&lt;p&gt;For developers and architects working with Adobe Commerce, Magento 2, or any non-Shopify e-commerce stack, the question is narrower than the stock story: &lt;strong&gt;which architecture gives the merchant the most controllable path to AI commerce visibility — and what does the implementation actually look like in code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This article frames the answer through a single distinction: &lt;strong&gt;platform-mediated AI distribution&lt;/strong&gt; (Shopify's bet) versus &lt;strong&gt;Merchant-Controlled AEO&lt;/strong&gt; (the approach Magento merchants build themselves, and increasingly the more defensible long-term position).&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Read the full version with embedded diagrams on &lt;a href="https://angeo.dev/shopify-vs-magento-ai-commerce-aeo-2026/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Key findings (as of May 2026)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Shopify wins distribution.&lt;/strong&gt; Agentic Storefronts positioned millions of merchants for default ChatGPT visibility in March 2026 — onboarding effort is near-zero for eligible US merchants.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Magento wins control.&lt;/strong&gt; A default Adobe Commerce install scores ~25% on a 9-signal AEO audit. With free open-source modules, 80–90% is achievable in approximately 90 minutes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Both reach the same AI channels.&lt;/strong&gt; ChatGPT, Microsoft Copilot, Google AI Mode, Gemini, and Perplexity are technically accessible from either platform.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retrieval quality is platform-agnostic.&lt;/strong&gt; JavaScript-rendered content is invisible to AI extraction on both Shopify and Magento by default. The Agentic Commerce Protocol (ACP) feed solves discovery; it does not solve on-page extraction.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auditability differs sharply.&lt;/strong&gt; Magento's AEO signals are inspectable with one CLI command. Shopify's distribution layer is largely opaque to the individual merchant.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-store and B2B favor Magento.&lt;/strong&gt; Per-store-view AEO configuration, B2B price books, and ERP integration remain Magento-native territory.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt; — Shopify wins distribution. Magento wins control. Both reach the same AI channels. The platform choice matters less than the AEO implementation you build on top of it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The two paths to AI commerce visibility
&lt;/h2&gt;

&lt;p&gt;The fundamental difference between the two platforms is architectural, not cosmetic:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SHOPIFY — Platform-Mediated AI Distribution
Merchant catalog
       ↓
Shopify Catalog (platform-managed)
       ↓
Agentic Commerce Protocol (ACP) syndication
       ↓
OpenAI / Microsoft Copilot / Google AI Mode / Gemini
       ↓
AI recommendation

MAGENTO — Merchant-Controlled AEO
Merchant catalog
       ↓
robots.txt — OAI-SearchBot, PerplexityBot, Google-Extended access
llms.txt — machine-readable catalog map
Product JSON-LD schema (with offers.availability)
ACP product feed (generated locally)
MCP server endpoints (live agent access)
Server-rendered content (extractable by AI crawlers)
       ↓
AI crawler access + retrieval + feed ingestion
       ↓
AI recommendation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Shopify handles the distribution layer on the merchant's behalf. Magento exposes the full stack — each signal configured, testable, and auditable by the merchant.&lt;/p&gt;

&lt;p&gt;Neither path is inherently superior. They reflect different philosophies about who controls the infrastructure between a merchant and an AI platform.&lt;/p&gt;




&lt;h2&gt;
  
  
  The state of play: what each platform delivers
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Shopify — platform-mediated AI distribution
&lt;/h3&gt;

&lt;p&gt;Shopify's AI commerce strategy is the most significant platform-level AEO development of 2026. Via Agentic Storefronts, &lt;a href="https://www.shopify.com/news/agentic-commerce-momentum" rel="noopener noreferrer"&gt;Shopify positioned its merchant ecosystem for default discovery inside ChatGPT, Microsoft Copilot, Google AI Mode, and the Gemini app&lt;/a&gt; — managed centrally from the Shopify Admin, with no app installation or separate feed submission required from merchants.&lt;/p&gt;

&lt;p&gt;The architecture is technically significant: &lt;a href="https://www.shopify.com/news/shopify-open-ai-commerce" rel="noopener noreferrer"&gt;Shopify describes syndicating real-time pricing, inventory, images, and variants&lt;/a&gt; from the Shopify Catalog to OpenAI's shopping layer via the Agentic Commerce Protocol (ACP). Per Shopify's announcements, merchants who had done nothing specific for AI visibility were positioned for product discoverability inside ChatGPT by default — though actual retrieval consistency and ranking behaviour within ChatGPT's shopping layer are not independently verified.&lt;/p&gt;

&lt;p&gt;Shopify has also announced native Model Context Protocol (MCP) server support via its AI Toolkit — described as enabling AI agents to access live store data including inventory and specifications. Production MCP adoption in commerce is still early-stage, but the infrastructure appears designed for that direction as the ecosystem matures.&lt;/p&gt;

&lt;p&gt;Early reported metrics suggest meaningful traction: &lt;a href="https://finance.yahoo.com/markets/stocks/articles/shopifys-ai-push-sustain-more-161700877.html" rel="noopener noreferrer"&gt;Shopify reported AI-driven traffic surging 8× year-over-year in Q1 2026, with orders from AI-powered searches up nearly 13×&lt;/a&gt; — from a small but growing base.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt; A US-based DTC merchant on Shopify who has done literally nothing for AEO is positioned for ChatGPT visibility by default. That is unprecedented for the SMB segment.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Magento — Merchant-Controlled AEO
&lt;/h3&gt;

&lt;p&gt;Adobe Commerce / Magento 2 has no equivalent platform-level arrangement with OpenAI or other AI platforms. Every AEO signal must be configured deliberately. The default Magento 2 installation scores approximately 25% on a 9-signal AEO audit — based on audits across 50+ stores — with three consistent failure points:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;robots.txt blocks AI crawlers&lt;/strong&gt; — default wildcard rules prevent OAI-SearchBot, PerplexityBot, and Google-Extended from accessing the store&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No llms.txt&lt;/strong&gt; — no machine-readable catalog map is present&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Product schema missing &lt;code&gt;offers.availability&lt;/code&gt;&lt;/strong&gt; — required field for ChatGPT Shopping ACP conformance checks&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Fixing these takes approximately 90 minutes with the right open-source modules. Reaching ChatGPT Shopping eligibility requires a separate application at chatgpt.com/merchants, ACP feed generation, and passing OpenAI's conformance review. There is no automatic path — but the same AI commerce channels are technically reachable through Merchant-Controlled AEO implementation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt; Magento's "disadvantage" is the cost of one afternoon. The "advantage" is that you own and can audit every signal in the stack — which matters more as AI platforms diversify and feed terms evolve.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Real audit output — what Merchant-Controlled AEO looks like
&lt;/h2&gt;

&lt;p&gt;The abstract comparison becomes concrete when you see what the audit actually returns. Here is the output from &lt;code&gt;bin/magento angeo:aeo:audit&lt;/code&gt; on a fully configured Adobe Commerce 2.4.7 store (mid-market apparel, ~14k SKUs, EU multi-store):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;$ &lt;/span&gt;bin/magento angeo:aeo:audit &lt;span class="nt"&gt;--store&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;default

Running AEO audit &lt;span class="k"&gt;for &lt;/span&gt;store: default
─────────────────────────────────────────────────────────────

✓ PASS  robots.txt              All 10 AI bots permitted
                                  OAI-SearchBot, ChatGPT-User, GPTBot,
                                  PerplexityBot, Google-Extended,
                                  ClaudeBot, Claude-Web, Bingbot,
                                  CCBot, Applebot-Extended

✓ PASS  llms.txt                Generated — 12,400 products mapped
                                Last regenerated: 2026-05-24 03:00 UTC
                                Per-store-view: 4 variants active

✓ PASS  Product JSON-LD         offers.availability present
                                aggregateRating present &lt;span class="o"&gt;(&lt;/span&gt;8,200 / 12,400&lt;span class="o"&gt;)&lt;/span&gt;
                                brand, sku, gtin13 present
                                priceValidUntil present

✓ PASS  ACP product feed        Spec-compliant — 12,400 products
                                Refresh interval: 15 min
                                Last successful &lt;span class="nb"&gt;sync&lt;/span&gt;: 2026-05-25 09:15 UTC
                                OpenAI conformance: PASSED 2026-04-12

✓ PASS  MCP server endpoint     /mcp/v1 active
                                Live inventory + pricing exposed
                                Authentication: bearer token configured

✓ PASS  Server-side rendering   Product description visible &lt;span class="k"&gt;in &lt;/span&gt;HTML
                                No JavaScript-only critical content

✓ PASS  FAQPage schema          On 8 CMS pages
                                Average 6 Q&amp;amp;A pairs per page

✓ PASS  AI order attribution    sales_order.ai_referrer column active
                                Q1 2026: 1,847 orders attributed
                                Top &lt;span class="nb"&gt;source&lt;/span&gt;: ChatGPT &lt;span class="o"&gt;(&lt;/span&gt;62%&lt;span class="o"&gt;)&lt;/span&gt;

⚠ WARN  Canonical consistency   3 product URLs with conflicting hreflang
                                See: var/log/angeo_aeo_warnings.log

─────────────────────────────────────────────────────────────
AEO Score: 91% — Excellent
Time elapsed: 4.2s
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On Shopify, AI visibility is largely a black box. You can observe whether products appear in ChatGPT responses. You cannot inspect what &lt;code&gt;offers.availability&lt;/code&gt; value Shopify is transmitting for a specific variant via ACP, verify the exact feed format OpenAI is receiving, or audit which products are failing conformance checks and why. If a product is not appearing, the debugging path is indirect.&lt;/p&gt;

&lt;p&gt;That difference — a 4-second CLI output versus an opaque distribution layer — is what "Merchant-Controlled AEO" means in practice.&lt;/p&gt;




&lt;h2&gt;
  
  
  Retrieval tests — what AI engines actually surface
&lt;/h2&gt;

&lt;p&gt;The capability tables describe theoretical reach. Retrieval tests describe what AI engines actually do with the available signals. These are spot-check results from controlled queries run in May 2026 across three store configurations in the same category (industrial test equipment, identical product catalogs replicated across platforms for benchmarking purposes):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Query&lt;/th&gt;
&lt;th&gt;Shopify (Agentic SF)&lt;/th&gt;
&lt;th&gt;Magento (default)&lt;/th&gt;
&lt;th&gt;Magento (Merchant-Controlled AEO)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;"best Siemens thermal imaging camera under €2k"&lt;/td&gt;
&lt;td&gt;Surfaced — product card&lt;/td&gt;
&lt;td&gt;Absent&lt;/td&gt;
&lt;td&gt;Surfaced — product card + spec citation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"Fluke 87V vs Keysight U1242C"&lt;/td&gt;
&lt;td&gt;Surfaced — comparison&lt;/td&gt;
&lt;td&gt;Absent&lt;/td&gt;
&lt;td&gt;Surfaced — citation in editorial answer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"thermal camera with USB-C and 320×240 sensor"&lt;/td&gt;
&lt;td&gt;Partial — generic recs&lt;/td&gt;
&lt;td&gt;Absent&lt;/td&gt;
&lt;td&gt;Surfaced — exact-spec match&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"recommend a megohmmeter for industrial use"&lt;/td&gt;
&lt;td&gt;Surfaced — top 3&lt;/td&gt;
&lt;td&gt;Absent&lt;/td&gt;
&lt;td&gt;Surfaced — top 3 with cited specs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;"who sells calibrated multimeters in the EU"&lt;/td&gt;
&lt;td&gt;Partial — US-bias&lt;/td&gt;
&lt;td&gt;Absent&lt;/td&gt;
&lt;td&gt;Surfaced — EU retailer cited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;ChatGPT retrieval spot-checks, May 2026. Same catalog across configurations. Results are illustrative of architectural difference, not exhaustive ranking benchmarks. AI retrieval is non-deterministic; individual query outcomes vary across sessions.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Two observations from the test pattern:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Default Magento is invisible.&lt;/strong&gt; Blocked AI bots, missing llms.txt, incomplete schema, and no ACP feed compound into zero retrieval surface.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Configured Magento matches Shopify on retrieval — and sometimes exceeds it on EU-specific and spec-driven queries.&lt;/strong&gt; Agentic Storefronts is currently US-weighted. Detailed spec retrieval depends on schema depth, which Magento exposes more granularly than Shopify's standard product templates.&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What this means:&lt;/strong&gt; The distribution-versus-control framing is not theoretical. Once a Magento store is configured with Merchant-Controlled AEO, retrieval performance is competitive — and the merchant retains diagnostic control Shopify does not provide.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Full capability comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Capability&lt;/th&gt;
&lt;th&gt;Shopify&lt;/th&gt;
&lt;th&gt;Magento (configured)&lt;/th&gt;
&lt;th&gt;Magento (default)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ChatGPT Shopping (ACP)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Platform-level via Agentic Storefronts&lt;/td&gt;
&lt;td&gt;✅ Manual — ACP feed + application&lt;/td&gt;
&lt;td&gt;✗ Not configured&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Perplexity discovery&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Via Shopify Catalog integration&lt;/td&gt;
&lt;td&gt;✅ Via llms.txt + PerplexityBot access&lt;/td&gt;
&lt;td&gt;✗ Bot blocked by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Google AI Mode / Gemini&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Via Agentic Storefronts opt-in&lt;/td&gt;
&lt;td&gt;✅ Via Google Merchant Center + Google-Extended access&lt;/td&gt;
&lt;td&gt;⚠ Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Copilot&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Active integration&lt;/td&gt;
&lt;td&gt;⚠ Requires custom ACP feed configuration&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MCP (Model Context Protocol) live agent access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native in Shopify Admin&lt;/td&gt;
&lt;td&gt;✅ Via angeo/module-openai-product-feed-api&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;llms.txt&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠ No native generation&lt;/td&gt;
&lt;td&gt;✅ angeo/module-llms-txt — per store view&lt;/td&gt;
&lt;td&gt;✗&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Product JSON-LD schema&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Better defaults than Luma — incomplete for full ACP compliance&lt;/td&gt;
&lt;td&gt;✅ angeo/module-rich-data — availability, aggregateRating&lt;/td&gt;
&lt;td&gt;⚠ Missing offers.availability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AI order attribution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Native in Shopify Analytics&lt;/td&gt;
&lt;td&gt;⚠ Requires custom observer to persist to sales_order&lt;/td&gt;
&lt;td&gt;✗ GA4 dark traffic only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;robots.txt AI bot access&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Managed by Shopify&lt;/td&gt;
&lt;td&gt;✅ angeo/module-robots-txt-aeo&lt;/td&gt;
&lt;td&gt;✗ Blocked by default&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Multi-store / B2B / custom data&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠ Limited without Shopify Plus&lt;/td&gt;
&lt;td&gt;✅ Native — multi-store, B2B, ERP integration&lt;/td&gt;
&lt;td&gt;✅ Same&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AEO audit CLI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠ No CLI audit — manual checking only&lt;/td&gt;
&lt;td&gt;✅ angeo/module-aeo-audit — 9 signals, one command&lt;/td&gt;
&lt;td&gt;✅ Same&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Where Shopify's advantage is real
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Platform-level distribution via ACP
&lt;/h3&gt;

&lt;p&gt;The Shopify–OpenAI partnership, based on public announcements, is a structural distribution advantage — not a parity feature. Per Shopify's documentation, eligible merchants were positioned for default ChatGPT discoverability through Agentic Storefronts and the Agentic Commerce Protocol without individual action. No equivalent arrangement exists for Adobe Commerce or Magento merchants. Adobe has not announced a comparable platform-level integration with any AI shopping platform.&lt;/p&gt;

&lt;h3&gt;
  
  
  Native AI attribution
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.shopify.com/blog/aeo-for-ecommerce" rel="noopener noreferrer"&gt;Shopify Analytics natively filters sessions and orders by AI referrer&lt;/a&gt;. For Magento, even basic AI attribution requires custom observer code to persist referrer data to &lt;code&gt;sales_order&lt;/code&gt;. The measurement infrastructure Shopify includes by default takes several hours of custom development on Magento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Speed to AI visibility
&lt;/h3&gt;

&lt;p&gt;For a merchant starting from zero, Shopify's path to AI commerce visibility is measured in hours — or zero, given Agentic Storefronts default activation. For Magento, the path requires sequential steps: AEO audit, robots.txt fix, llms.txt generation, schema update, ACP feed generation, merchant application, and OpenAI conformance review. Total elapsed time: days to weeks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Shopify thesis in one sentence:&lt;/strong&gt; If you accept platform-mediated AI distribution, Shopify delivers it faster and more completely than any alternative on the market.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Where Magento's advantage is real
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Control and auditability — the Merchant-Controlled AEO position
&lt;/h3&gt;

&lt;p&gt;Every AI signal in Magento's AEO stack is explicitly configured, testable, and auditable with a single CLI command (see the audit output above). On Shopify, AI visibility is largely a black box. You can observe whether products appear in ChatGPT responses. You cannot inspect what ACP feed payload Shopify is transmitting for a specific variant, verify the exact format OpenAI is receiving, or audit which products are failing conformance checks and why.&lt;/p&gt;

&lt;h3&gt;
  
  
  Multi-store architecture
&lt;/h3&gt;

&lt;p&gt;Shopify's AI capabilities are primarily designed for single-brand storefronts. For merchants running multiple stores with different catalogs, languages, currencies, or B2B price books — Magento's native multi-store architecture provides per-store control over every AEO signal. Separate &lt;code&gt;llms.txt&lt;/code&gt; per store view, different schema configurations per locale, precise ACP feed control per market.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open standards, no vendor lock-in
&lt;/h3&gt;

&lt;p&gt;The signals Merchant-Controlled AEO is built on are open standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;robots.txt&lt;/strong&gt; — 30-year-old RFC&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JSON-LD&lt;/strong&gt; — W3C standard&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agentic Commerce Protocol (ACP)&lt;/strong&gt; — OpenAI's open spec, adoptable by any merchant&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; — Anthropic's open spec&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;llms.txt&lt;/strong&gt; — emerging community convention&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A merchant running Merchant-Controlled AEO reaches any AI engine that speaks these protocols — present and future. A merchant on Shopify reaches the platforms Shopify has agreements with. The first scales with the protocol layer; the second scales with the platform's BD team.&lt;/p&gt;

&lt;h3&gt;
  
  
  Data ownership
&lt;/h3&gt;

&lt;p&gt;When a Shopify merchant uses Agentic Storefronts, their product data — pricing, inventory, variant configuration — flows through Shopify's infrastructure to AI platforms via ACP. The merchant does not control the update frequency beyond what Shopify allows, or verify the representation of their products in AI responses. On Magento, the ACP feed is generated locally, validated locally, and transmitted directly. The merchant controls exactly what AI platforms receive.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The Magento thesis in one sentence:&lt;/strong&gt; If you want to own the infrastructure between your catalog and AI platforms — and audit it — Merchant-Controlled AEO on Adobe Commerce is the only mainstream option that delivers it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The gap neither platform fully solves
&lt;/h2&gt;

&lt;p&gt;Both Shopify and Magento share a structural limitation independent of platform choice: &lt;strong&gt;JavaScript rendering&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;AI extraction systems do not reliably execute client-side rendering. Shopify's standard product themes use JavaScript for variant selection and dynamic content. Magento's Luma theme uses RequireJS tabs that collapse the product description on load.&lt;/p&gt;

&lt;p&gt;In both cases, content hidden behind JavaScript is often invisible to AI extraction pipelines — regardless of how comprehensive the ACP structured data feed is. The feed provides product data for shopping interfaces; crawled page content provides context for retrieval and editorial recommendations. Both matter. Agentic Storefronts solve the feed discovery problem. They do not solve the on-page extraction problem for content-based AI visibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  Which platform for which merchant
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Merchant profile&lt;/th&gt;
&lt;th&gt;Better fit&lt;/th&gt;
&lt;th&gt;Primary reason&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DTC brand, &amp;lt;10k SKUs, US market, speed priority&lt;/td&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;Agentic Storefronts positions catalog for ChatGPT by default via ACP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-store, multi-language, EU / APAC primary&lt;/td&gt;
&lt;td&gt;Magento&lt;/td&gt;
&lt;td&gt;Per-store AEO configuration; Shopify AI features US-first&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B2B manufacturer or distributor&lt;/td&gt;
&lt;td&gt;Magento&lt;/td&gt;
&lt;td&gt;Complex catalog depth, B2B pricing, ERP integration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mid-market brand, existing Shopify store&lt;/td&gt;
&lt;td&gt;Shopify&lt;/td&gt;
&lt;td&gt;Native AI attribution, ACP feed management, Copilot integration live&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Enterprise Adobe Commerce, technical team&lt;/td&gt;
&lt;td&gt;Magento (Merchant-Controlled AEO)&lt;/td&gt;
&lt;td&gt;Data ownership, auditability, custom AEO implementation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  The real shift isn't Shopify vs Magento
&lt;/h2&gt;

&lt;p&gt;The platform debate is the surface. The deeper question — the one that will define commerce infrastructure for the next decade — is whether AI commerce becomes &lt;strong&gt;platform-mediated&lt;/strong&gt; or &lt;strong&gt;merchant-controlled&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Shopify is betting on centralized AI distribution. Agentic Storefronts, native ACP syndication, Shopify-managed MCP endpoints, AI attribution baked into Shopify Analytics — every piece reinforces a single architectural premise: the platform sits between the merchant and the AI layer, and that is the value proposition.&lt;/p&gt;

&lt;p&gt;Adobe Commerce / Magento 2 still allows direct infrastructure ownership. The ACP feed is generated locally. The MCP server runs on the merchant's stack. The llms.txt is regenerated by the merchant's cron. The AEO audit is the merchant's CLI command. Every signal in the AI commerce pipeline is the merchant's to inspect, change, version-control, and migrate.&lt;/p&gt;

&lt;p&gt;For SMB DTC, platform-mediated distribution is probably the right trade. The merchant gets ChatGPT visibility without learning ACP. Shopify takes the operational complexity.&lt;/p&gt;

&lt;p&gt;For mid-market and enterprise — especially merchants with multi-store architecture, B2B obligations, regulatory locality requirements, or strategic catalog data that should not transit through a third-party distribution layer — &lt;strong&gt;Merchant-Controlled AEO&lt;/strong&gt; is increasingly the more defensible position. Not because Shopify's offering is weak, but because the value of owning the infrastructure between your catalog and the AI layer grows as that layer becomes more economically significant.&lt;/p&gt;

&lt;p&gt;Shopify won the first round of AI commerce distribution. The second round — retrieval quality, content accuracy, citation authority, attribution measurement, multi-channel feed control — is more level, and increasingly favors merchants who can own and audit their stack.&lt;/p&gt;

&lt;p&gt;In 2026, the choice between platform-mediated AI distribution and Merchant-Controlled AEO is more consequential than the choice between storefront features themselves.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This article was originally published on &lt;a href="https://angeo.dev/shopify-vs-magento-ai-commerce-aeo-2026/" rel="noopener noreferrer"&gt;angeo.dev&lt;/a&gt; with embedded architecture diagrams and AEO score progression charts. The &lt;a href="https://packagist.org/packages/angeo/module-aeo-audit" rel="noopener noreferrer"&gt;angeo/module-aeo-audit&lt;/a&gt; checks all 9 Merchant-Controlled AEO signals for Adobe Commerce / Magento 2 stores in one CLI command.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ecommerce</category>
      <category>ai</category>
      <category>magento</category>
      <category>shopify</category>
    </item>
  </channel>
</rss>
