<?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: LovedByAI</title>
    <description>The latest articles on DEV Community by LovedByAI (@lovedbyai).</description>
    <link>https://dev.to/lovedbyai</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%2F3685040%2F7f667cb6-e39b-494b-be66-b4022d9d9750.png</url>
      <title>DEV Community: LovedByAI</title>
      <link>https://dev.to/lovedbyai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lovedbyai"/>
    <language>en</language>
    <item>
      <title>How to check if your site is blocking AI crawlers (robots.txt won't tell you)</title>
      <dc:creator>LovedByAI</dc:creator>
      <pubDate>Wed, 23 Sep 2026 20:32:49 +0000</pubDate>
      <link>https://dev.to/lovedbyai/your-logs-cant-tell-a-blocked-ai-crawler-from-a-happy-one-5g0o</link>
      <guid>https://dev.to/lovedbyai/your-logs-cant-tell-a-blocked-ai-crawler-from-a-happy-one-5g0o</guid>
      <description>&lt;p&gt;We build &lt;a href="https://www.lovedby.ai/" rel="noopener noreferrer"&gt;LovedByAI&lt;/a&gt;, a generative engine optimization platform for small business WordPress sites, which means we run crawler-access checks on live sites all day. In August we pointed that at 314 of them, fetching each one as 38 different AI crawlers and comparing the result against four weeks of their server logs.&lt;/p&gt;

&lt;p&gt;One finding is a genuine observability trap, and I have not seen it written up anywhere.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A site blocking OAI-SearchBot at the origin logged a page request from it 84.6% of the time. A site with no block at all logged one 87.3% of the time.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Three points apart. So if you are checking your own logs to find out whether AI crawlers can reach you, a working block and no block look the same.&lt;/p&gt;

&lt;p&gt;Reading robots.txt does not help either, and that turns out to be the more common failure: &lt;strong&gt;of those 314 sites, 135 refused at least one AI crawler and only 23 had written a rule about it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkxuiz5m17gowu2selhvz.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fkxuiz5m17gowu2selhvz.jpg" alt="LovedByAI Website Crawlability view: 38 crawlers checked, 1 blocked in robots.txt, 1 blocked by firewall, annotated " width="799" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the gap, as our own crawlability view reports it: what robots.txt declares on one side, what the server actually answered on the other. A site can carry one of each at the same time, and only one of them is something a human ever typed.&lt;/p&gt;

&lt;p&gt;Here is why that happens, and how to test it properly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Edge vs origin: where an AI crawler block lives
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A block at the edge happens before the request reaches your server. A block at the origin happens after.&lt;/strong&gt; That single distinction decides everything about what you can observe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Edge.&lt;/strong&gt; Cloudflare, a CDN firewall rule, a WAF. The crawler's request is terminated at the network boundary. Your application never runs. Your access log never gets a line. The crawler gets a &lt;code&gt;403&lt;/code&gt; and leaves.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Origin.&lt;/strong&gt; A security plugin, an nginx &lt;code&gt;map&lt;/code&gt; on &lt;code&gt;$http_user_agent&lt;/code&gt;, an Apache &lt;code&gt;RewriteCond&lt;/code&gt;. The request completes a TCP handshake, hits your server, gets logged, &lt;em&gt;then&lt;/em&gt; gets refused.&lt;/p&gt;

&lt;p&gt;So the origin-blocked request appears in your logs as a visit. Your crawler-stats plugin counts it. Your dashboard shows GPTBot stopping by.&lt;/p&gt;

&lt;p&gt;It left with a 403 and nothing else.&lt;/p&gt;

&lt;p&gt;Here's the same comparison for the edge case:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OAI-SearchBot blocked at the &lt;strong&gt;origin&lt;/strong&gt;: logged on &lt;strong&gt;84.6%&lt;/strong&gt; of sites&lt;/li&gt;
&lt;li&gt;OAI-SearchBot &lt;strong&gt;not blocked at all&lt;/strong&gt;: logged on &lt;strong&gt;87.3%&lt;/strong&gt; of sites&lt;/li&gt;
&lt;li&gt;OAI-SearchBot blocked at the &lt;strong&gt;edge&lt;/strong&gt;: logged on &lt;strong&gt;0.0%&lt;/strong&gt; of sites&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The edge column is the only one that's legible. Zero requests, because nothing ever arrived. An edge block is loud in your logs by being completely silent. An origin block hides in plain sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why robots.txt will not tell you if AI crawlers are blocked
&lt;/h2&gt;

&lt;p&gt;The obvious instinct is to skip logs and read robots.txt. That's worse.&lt;/p&gt;

&lt;p&gt;Of the 135 sites refusing a crawler, only 23 declared it. &lt;strong&gt;The other 112 refused at the server with nothing in the site's own config to show for it.&lt;/strong&gt; The request arrives, the server says &lt;code&gt;403&lt;/code&gt;, and robots.txt still reads like a welcome mat.&lt;/p&gt;

&lt;p&gt;And a written rule isn't reliable in the other direction either, because robots.txt is a convention, not an enforcement mechanism:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;33.3%&lt;/strong&gt; of sites disallowing GPTBot still logged real GPTBot page requests&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;17.6%&lt;/strong&gt; of sites disallowing ClaudeBot still logged ClaudeBot&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Neither figure counts robots.txt or sitemap fetches, which aren't ingested. Every request counted is a crawler asking for a page it was told not to take.&lt;/p&gt;

&lt;p&gt;So robots.txt tells you what you meant. Your logs tell you what arrived. Neither tells you what the crawler got.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to check if your site is blocking AI crawlers
&lt;/h2&gt;

&lt;p&gt;Send the request yourself, as the crawler, and read the status code.&lt;/p&gt;

&lt;p&gt;The part people skip is the control. If you fire ten requests at a site from one IP and get ten 403s, you've learned nothing. It could be your IP, a rate limiter, or the site being down. &lt;strong&gt;You need an unbranded request from the same address to prove the site is up and that the refusal is attributable to the user-agent string.&lt;/strong&gt;&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;#!/usr/bin/env bash&lt;/span&gt;
&lt;span class="nv"&gt;SITE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;:?usage:&lt;span class="p"&gt; ./crawlcheck.sh https&lt;/span&gt;://example.com&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

code&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; curl &lt;span class="nt"&gt;-s&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /dev/null &lt;span class="nt"&gt;-w&lt;/span&gt; &lt;span class="s2"&gt;"%{http_code}"&lt;/span&gt; &lt;span class="nt"&gt;-A&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$1&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="nt"&gt;--max-time&lt;/span&gt; 15 &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$SITE&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="nv"&gt;CONTROL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;code &lt;span class="s2"&gt;"crawlcheck-control/1.0"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"control          &lt;/span&gt;&lt;span class="nv"&gt;$CONTROL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$CONTROL&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"200"&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"control failed - results below are meaningless"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nb"&gt;exit &lt;/span&gt;1&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;for &lt;/span&gt;UA &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"GPTBot/1.2"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"OAI-SearchBot/1.0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"ChatGPT-User/1.0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"PerplexityBot/1.0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Claude-SearchBot/1.0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"ClaudeBot/1.0"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Bytespider"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"Amazonbot/0.1"&lt;/span&gt;
&lt;span class="k"&gt;do
  &lt;/span&gt;&lt;span class="nb"&gt;printf&lt;/span&gt; &lt;span class="s1"&gt;'%-18s %s\n'&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$UA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; | &lt;span class="nb"&gt;cut&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt;/ &lt;span class="nt"&gt;-f1&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;code &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$UA&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;sleep &lt;/span&gt;1
&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;200&lt;/code&gt; means reachable. &lt;code&gt;403&lt;/code&gt; means you found one.&lt;/p&gt;

&lt;p&gt;That covers eight crawlers. There are 38 tokens worth checking, including consent switches like &lt;code&gt;Google-Extended&lt;/code&gt; and &lt;code&gt;Applebot-Extended&lt;/code&gt; that are not crawlers at all and can only be evaluated against robots.txt. Keeping that list current as vendors add and rename tokens is the tedious part. LovedByAI automates the check across all 38 with the unbranded control request built in, and names each crawler that gets refused.&lt;/p&gt;

&lt;p&gt;That &lt;code&gt;sleep 1&lt;/code&gt; matters more than it looks. Which brings me to the thing that nearly broke our own numbers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why rate limiting breaks an AI crawler check
&lt;/h2&gt;

&lt;p&gt;Our check fires around 30 requests at a site in quick succession. That is enough to trip a rate limiter on its own.&lt;/p&gt;

&lt;p&gt;A &lt;code&gt;429&lt;/code&gt; therefore tells you about &lt;strong&gt;request volume&lt;/strong&gt;, not about how the site treats AI crawlers. It's a measurement artefact of the tool doing the measuring.&lt;/p&gt;

&lt;p&gt;We excluded every rate-limit response from every figure in the study. Including them would have added &lt;strong&gt;107 refusals across 39 sites&lt;/strong&gt; and made the headline considerably bigger.&lt;/p&gt;

&lt;p&gt;If you're building anything like this, space your requests out and throw away the 429s. Otherwise you're measuring your own burst.&lt;/p&gt;

&lt;h2&gt;
  
  
  What an AI crawler block looks like: 403, 406 and challenges
&lt;/h2&gt;

&lt;p&gt;Across 558 refusals where robots.txt explicitly allowed the crawler:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;509 were a plain &lt;code&gt;403 Forbidden&lt;/code&gt;&lt;/strong&gt;, 93% of the total&lt;/li&gt;
&lt;li&gt;24 were a Cloudflare browser challenge, which to a bot is an unsolvable puzzle and therefore a locked door&lt;/li&gt;
&lt;li&gt;20 were &lt;code&gt;406 Not Acceptable&lt;/code&gt;, typically a user-agent rule at the web server&lt;/li&gt;
&lt;li&gt;5 were a Cloudflare managed-rule 403&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That 93% is the useful part. It's the signature of a rule keyed to the user-agent string and nothing else. Not behaviour, not rate, not fingerprinting. Just string matching against a list somebody pasted in years ago.&lt;/p&gt;

&lt;p&gt;Which is exactly why this catches crawlers nobody meant to catch. A "block bad bots" toggle switched on in 2021 has no idea &lt;code&gt;ChatGPT-User&lt;/code&gt; would exist in 2026.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which AI crawlers actually crawl your site?
&lt;/h2&gt;

&lt;p&gt;Once the control returns &lt;code&gt;200&lt;/code&gt; and nothing returns &lt;code&gt;403&lt;/code&gt;, you know crawlers &lt;em&gt;can&lt;/em&gt; reach you. The next question is which ones actually do, and that needs request logs rather than a probe.&lt;/p&gt;

&lt;p&gt;The two answer different things. The probe tells you who can get in. The logs tell you who bothered, and in what proportion. Raw crawler totals are usually dominated by training crawlers like Meta-ExternalAgent, which will bury the assistant crawlers you care about if you read the totals without splitting them.&lt;/p&gt;

&lt;h2&gt;
  
  
  Training crawlers vs assistant crawlers: GPTBot vs OAI-SearchBot
&lt;/h2&gt;

&lt;p&gt;Not all of these are the same thing, and the naming does nothing to help:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Training crawlers.&lt;/strong&gt; &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;CCBot&lt;/code&gt;, &lt;code&gt;Bytespider&lt;/code&gt;, &lt;code&gt;Amazonbot&lt;/code&gt;, &lt;code&gt;Google-Extended&lt;/code&gt;. They take content to train models. Blocking them is a legitimate, common position and costs you nothing in AI search.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Assistant crawlers.&lt;/strong&gt; &lt;code&gt;OAI-SearchBot&lt;/code&gt;, &lt;code&gt;ChatGPT-User&lt;/code&gt;, &lt;code&gt;PerplexityBot&lt;/code&gt;, &lt;code&gt;Claude-SearchBot&lt;/code&gt;, &lt;code&gt;DuckAssistBot&lt;/code&gt;. They fetch a page &lt;em&gt;because someone just asked a question&lt;/em&gt;. The response ends in a citation with your link in it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;GPTBot&lt;/code&gt; and &lt;code&gt;OAI-SearchBot&lt;/code&gt; are both OpenAI. They do completely different jobs. A UA rule matching &lt;code&gt;GPT&lt;/code&gt; catches one; a rule matching &lt;code&gt;OpenAI&lt;/code&gt; or a blanket bot filter catches both.&lt;/p&gt;

&lt;p&gt;In our sample, 102 of the 135 affected sites block only training crawlers, deliberately and consistently. &lt;strong&gt;33 sites block at least one assistant crawler, and 31 of them never wrote it down anywhere.&lt;/strong&gt; That's not a policy. That's a side effect.&lt;/p&gt;

&lt;h2&gt;
  
  
  Does blocking AI crawlers cost you AI traffic?
&lt;/h2&gt;

&lt;p&gt;The thing you'd most want to know is whether blocked sites get less AI traffic. We can't show it.&lt;/p&gt;

&lt;p&gt;Median AI referral visits, June to August: 12 for the 269 reachable sites, 6 for the 11 blocking OpenAI at the edge, 5 for the 17 blocking at the origin. Points the right way. Then the 17 sites disallowing OpenAI in robots.txt came in at 19, above the reachable group, which is the opposite.&lt;/p&gt;

&lt;p&gt;Groups of 11 to 17 sites, no control for site size or niche. That's noise, and I'd rather say so than dress it up.&lt;/p&gt;

&lt;p&gt;What this data does establish: a large minority of sites refuse AI crawlers, most of them can't see it from their own configuration, and &lt;strong&gt;the most common kind of block is the kind your logs can't distinguish from success.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Run the script against your own domain. It takes ten seconds. If the control returns &lt;code&gt;200&lt;/code&gt; and anything else returns &lt;code&gt;403&lt;/code&gt;, you've found something you didn't know was there.&lt;/p&gt;

&lt;p&gt;Method, full numbers and the ones we threw out: &lt;a href="https://www.lovedby.ai/blog/blocking-ai-crawlers-study" rel="noopener noreferrer"&gt;the 314-site study&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you'd rather not maintain a token list by hand, &lt;a href="https://www.lovedby.ai/tools/geo-checker" rel="noopener noreferrer"&gt;LovedByAI&lt;/a&gt; is a generative engine optimization platform for small businesses built around WordPress. It automates the optimization work, checks all 38 crawler tokens with the control request built in, and reports AI mentions and AI referral traffic back. The crawler check is free to run.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;First-party crawlability checks and bot logs. 314 websites, 38 crawler tokens, 27 to 30 August 2026, validated against logs from 1 to 26 August. No site identified.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>wordpress</category>
      <category>seo</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>WordPress SEO Plugins Weren’t Built for AI Crawlers. Here’s What Changes in 2026</title>
      <dc:creator>LovedByAI</dc:creator>
      <pubDate>Mon, 14 Sep 2026 08:19:55 +0000</pubDate>
      <link>https://dev.to/lovedbyai/wordpress-seo-plugins-werent-built-for-ai-crawlers-heres-what-changes-in-2026-pip</link>
      <guid>https://dev.to/lovedbyai/wordpress-seo-plugins-werent-built-for-ai-crawlers-heres-what-changes-in-2026-pip</guid>
      <description>&lt;p&gt;For years, the WordPress SEO stack has been pretty straightforward.&lt;/p&gt;

&lt;p&gt;Install Yoast, Rank Math, AIOSEO, or something similar. Set your titles and descriptions. Generate a sitemap. Add schema. Fix your redirects. Make Google happy.&lt;/p&gt;

&lt;p&gt;That still matters.&lt;/p&gt;

&lt;p&gt;But ChatGPT, Gemini, Perplexity and other AI answer engines introduce a slightly different problem:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What does an AI crawler actually receive when it visits your page?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We recently compared five WordPress plugins through that lens:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rank Math&lt;/li&gt;
&lt;li&gt;Yoast&lt;/li&gt;
&lt;li&gt;AIOSEO&lt;/li&gt;
&lt;li&gt;LovedByAI&lt;/li&gt;
&lt;li&gt;Squirrly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Full comparison of the &lt;a href="https://www.lovedby.ai/best-geo-plugins-wordpress-2026" rel="noopener noreferrer"&gt;best GEO plugins for WordPress&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Disclosure before getting into it: I'm part of the team behind LovedByAI, so don't treat this as an independent ranking. What I think is more interesting than the ranking itself is what we found when comparing how these tools approach AI discovery.&lt;/p&gt;

&lt;h2&gt;
  
  
  SEO and GEO are solving different problems
&lt;/h2&gt;

&lt;p&gt;Traditional SEO plugins are primarily designed around search engines indexing a page and returning a link.&lt;/p&gt;

&lt;p&gt;You optimize things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Meta titles&lt;/li&gt;
&lt;li&gt;Canonicals&lt;/li&gt;
&lt;li&gt;XML sitemaps&lt;/li&gt;
&lt;li&gt;Structured data&lt;/li&gt;
&lt;li&gt;Redirects&lt;/li&gt;
&lt;li&gt;Internal linking&lt;/li&gt;
&lt;li&gt;Keyword usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GEO, or Generative Engine Optimization, is trying to influence a different outcome.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can Google rank this URL?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The question becomes:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Can an LLM understand this page well enough to use the business as part of an answer?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That means page structure, entity clarity and machine readability become much more important.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architectural difference I found most interesting
&lt;/h2&gt;

&lt;p&gt;Most WordPress SEO plugins are what I'd call &lt;strong&gt;passive optimization&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They improve the existing page.&lt;/p&gt;

&lt;p&gt;Rank Math might inject schema. Yoast adds metadata. AIOSEO adds LocalBusiness information.&lt;/p&gt;

&lt;p&gt;But when an AI crawler visits the site, it still receives the underlying WordPress page.&lt;/p&gt;

&lt;p&gt;Depending on the site, that can mean a pretty messy combination of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Theme HTML
Page-builder markup
Navigation
Popups
JavaScript
Tracking scripts
Widgets
Cookie banners
Actual content
More JavaScript
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a human browser, that's fine. The browser knows how to render it.&lt;/p&gt;

&lt;p&gt;For a machine trying to quickly determine:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;What does this company do?
Who is it for?
Where does it operate?
What services does it provide?
Why is it different?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;there's potentially a lot of noise.&lt;/p&gt;

&lt;p&gt;The alternative is an &lt;strong&gt;active rendering layer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Instead of only modifying the original WordPress HTML, you create a machine-oriented representation of the same page.&lt;/p&gt;

&lt;p&gt;Something closer to:&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;h1&amp;gt;&lt;/span&gt;Acme Accounting&lt;span class="nt"&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
Acme Accounting provides bookkeeping and tax services
for small businesses in Austin, Texas.
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;h2&amp;gt;&lt;/span&gt;What services does Acme Accounting offer?&lt;span class="nt"&gt;&amp;lt;/h2&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Bookkeeping&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Business tax preparation&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;Payroll management&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;alongside structured entity data.&lt;/p&gt;

&lt;p&gt;The information hasn't fundamentally changed.&lt;/p&gt;

&lt;p&gt;The representation has.&lt;/p&gt;

&lt;p&gt;That is the approach we took with LovedByAI's LLM view.&lt;/p&gt;

&lt;h2&gt;
  
  
  So do you replace Yoast or Rank Math?
&lt;/h2&gt;

&lt;p&gt;I don't think so.&lt;/p&gt;

&lt;p&gt;This was probably the biggest conclusion from the comparison.&lt;/p&gt;

&lt;p&gt;A GEO plugin and an SEO plugin shouldn't necessarily compete for the same slot.&lt;/p&gt;

&lt;p&gt;Rank Math is very good at things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;redirects&lt;/li&gt;
&lt;li&gt;sitemap management&lt;/li&gt;
&lt;li&gt;schema&lt;/li&gt;
&lt;li&gt;on-page SEO&lt;/li&gt;
&lt;li&gt;404 monitoring&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yoast remains extremely strong for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;editorial workflows&lt;/li&gt;
&lt;li&gt;readability&lt;/li&gt;
&lt;li&gt;metadata&lt;/li&gt;
&lt;li&gt;mature SEO infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;AIOSEO has particularly useful features for local businesses.&lt;/p&gt;

&lt;p&gt;Those problems don't disappear because ChatGPT exists.&lt;/p&gt;

&lt;p&gt;The stack increasingly looks more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;WordPress
    ↓
Traditional SEO layer
    ↓
Yoast / Rank Math / AIOSEO
    ↓
AI visibility layer
    ↓
Machine-readable content + entity data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In other words, &lt;strong&gt;SEO hygiene + GEO infrastructure&lt;/strong&gt;, rather than SEO vs. GEO.&lt;/p&gt;

&lt;h2&gt;
  
  
  llms.txt has gained popularity, but it's not the right answer
&lt;/h2&gt;

&lt;p&gt;Another thing worth mentioning.&lt;/p&gt;

&lt;p&gt;There has been a lot of attention around &lt;code&gt;llms.txt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It's an emerging convention, but generating an &lt;code&gt;llms.txt&lt;/code&gt; file doesn't suddenly make a site optimized for AI.&lt;/p&gt;

&lt;p&gt;The actual page still matters.&lt;/p&gt;

&lt;p&gt;An AI system needs to extract clear facts, relationships and answers from your content.&lt;/p&gt;

&lt;p&gt;Things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;clean semantic structure&lt;/li&gt;
&lt;li&gt;descriptive headings&lt;/li&gt;
&lt;li&gt;direct answers&lt;/li&gt;
&lt;li&gt;Organization and Service schema&lt;/li&gt;
&lt;li&gt;consistent entity information&lt;/li&gt;
&lt;li&gt;crawlable content&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;are much harder to fake with one text file.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I'd evaluate a WordPress GEO plugin
&lt;/h2&gt;

&lt;p&gt;After working on this space, I think the useful questions are less about how many "AI features" appear on the pricing page.&lt;/p&gt;

&lt;p&gt;I'd look at:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. What does an AI crawler actually receive?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inspect the output, not the marketing copy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Does it improve machine readability or just generate content?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;An AI writing assistant and an AI-search optimization layer aren't the same thing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Does it produce useful structured data?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not just generic Article schema.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Does it work alongside the existing SEO stack?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Replacing a mature SEO setup just to add GEO rarely makes sense.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. How much work does it require after installation?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For SMBs especially, a dashboard containing 47 recommendations isn't necessarily a solution.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bigger shift
&lt;/h2&gt;

&lt;p&gt;The web has historically been optimized primarily for two consumers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Humans
Googlebot
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We're adding a third:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Humans
Search crawlers
AI crawlers / answer engines
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And they don't necessarily want information presented in exactly the same way.&lt;/p&gt;

&lt;p&gt;I suspect the WordPress stack will increasingly reflect that.&lt;/p&gt;

&lt;p&gt;SEO plugins will continue handling technical search hygiene. A new layer of tools will focus specifically on making sites easy for AI systems to parse, understand and cite.&lt;/p&gt;

&lt;p&gt;I also created a &lt;a href="https://www.lovedby.ai/tools/geo-checker" rel="noopener noreferrer"&gt;free GEO auditor&lt;/a&gt; that you can run and see the type of suggestions that we are talking about.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llmseo</category>
      <category>wordpress</category>
      <category>seo</category>
    </item>
  </channel>
</rss>
