<?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: Tabor Bachelor</title>
    <description>The latest articles on DEV Community by Tabor Bachelor (@taborbachelor).</description>
    <link>https://dev.to/taborbachelor</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%2F4011099%2F007f08c4-6a23-4037-8f4f-4427845a824f.jpg</url>
      <title>DEV Community: Tabor Bachelor</title>
      <link>https://dev.to/taborbachelor</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/taborbachelor"/>
    <language>en</language>
    <item>
      <title>ChatGPT Might Be Recommending Your Competitor, Not You — Here's How We Built a Tool to Check</title>
      <dc:creator>Tabor Bachelor</dc:creator>
      <pubDate>Wed, 01 Jul 2026 15:36:43 +0000</pubDate>
      <link>https://dev.to/taborbachelor/chatgpt-might-be-recommending-your-competitor-not-you-heres-how-we-built-a-tool-to-check-5bd</link>
      <guid>https://dev.to/taborbachelor/chatgpt-might-be-recommending-your-competitor-not-you-heres-how-we-built-a-tool-to-check-5bd</guid>
      <description>&lt;p&gt;Ask ChatGPT who the best project management tool is. Or the best CRM for startups. Or the best anything-in-your-category. It'll give you an answer — a specific one, with a specific brand in it. If yours isn't in that answer, you've lost a customer you never knew was in play.&lt;/p&gt;

&lt;p&gt;That's the problem I set out to measure with Relevyn: how visible is a brand across the AI engines that are quietly becoming the new front page of the internet — ChatGPT, Claude, Perplexity, and Gemini. Turns out, actually measuring that is a more interesting engineering problem than it sounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four APIs, four different ways to fail
&lt;/h2&gt;

&lt;p&gt;The obvious approach: send the same prompt to all four engines, see who gets mentioned. The reality is each provider fails differently, on its own schedule.&lt;/p&gt;

&lt;p&gt;Early versions ran everything in parallel with &lt;code&gt;Promise.all&lt;/code&gt; — which meant one slow or erroring engine took the entire scan down with it. Swapping to &lt;code&gt;Promise.allSettled&lt;/code&gt; fixed that: if Perplexity times out, you still get results from the other three instead of nothing.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;responses&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;allSettled&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;engines&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;callEngine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;engine&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;prompt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each engine call also gets its own retry logic (3 attempts, short backoff on a 503) and its own timeout, raced against the clock so one hung request doesn't stall the whole scan. Even with that, we had to drop from 6 prompts per scan down to 3, run sequentially instead of one big parallel burst — the combined latency of 4 engines × 6 prompts kept tripping serverless function timeouts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scoring text without paying another LLM to judge it
&lt;/h2&gt;

&lt;p&gt;The tempting move here is to hand each response to an LLM and ask "was the brand mentioned, and was it positive?" We deliberately didn't do that for the core detection — it's slower, non-deterministic, and adds cost to something that needs to run thousands of times a day.&lt;/p&gt;

&lt;p&gt;Instead: plain detection logic on the raw text. Is the brand name present. Where in the response does it first appear. Which sentences mention it, and do those sentences skew toward positive or negative language. Are competitor names present in the same response. It's less elegant than "ask an AI to grade the AI," but it's fast, free, and gives the same input the same score every time — which matters when you're about to tell someone their score changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What a scan actually costs
&lt;/h2&gt;

&lt;p&gt;Running real queries against four commercial LLM APIs at scale isn't free, but it's cheaper than you'd think if you're deliberate about it: a full multi-engine scan costs somewhere in the $0.06–0.09 range, mixing cheaper models for high-volume detection work against pricier ones only where reasoning quality actually matters for the output. The expensive mistake we made early on was leaving prompt caching headers on for a low-volume beta — they added latency and occasional 503s with no caching benefit at that traffic level. Removing them fixed more reliability issues than any retry logic did.&lt;/p&gt;

&lt;h2&gt;
  
  
  The finding that changed how we think about this
&lt;/h2&gt;

&lt;p&gt;Run the exact same query against the exact same brand two weeks apart and you will not get the exact same answer. These models aren't static lookups — they're generating an answer fresh each time, shaped by whatever's changed in their training and retrieval since the last time you asked.&lt;/p&gt;

&lt;p&gt;Which means a one-time "AI visibility audit" tells you almost nothing. It's a photograph of a moving target. The only thing that's actually useful is watching the trend — which is the entire reason Relevyn runs as a monitor, not a single report.&lt;/p&gt;

&lt;p&gt;If you want to see where your own brand lands, the scan's free: &lt;a href="https://relevyn.com" rel="noopener noreferrer"&gt;relevyn.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>saas</category>
      <category>webdev</category>
      <category>buildinpublic</category>
    </item>
  </channel>
</rss>
