<?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: Bcrypto</title>
    <description>The latest articles on DEV Community by Bcrypto (@bcrypto).</description>
    <link>https://dev.to/bcrypto</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%2F4072173%2F63169890-757e-481d-b854-6a5cf1eed2a6.png</url>
      <title>DEV Community: Bcrypto</title>
      <link>https://dev.to/bcrypto</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/bcrypto"/>
    <language>en</language>
    <item>
      <title>I have 591 pages. Google indexed one. Here's how I'm debugging it.</title>
      <dc:creator>Bcrypto</dc:creator>
      <pubDate>Tue, 11 Aug 2026 19:00:50 +0000</pubDate>
      <link>https://dev.to/bcrypto/i-have-591-pages-google-indexed-one-heres-how-im-debugging-it-5cel</link>
      <guid>https://dev.to/bcrypto/i-have-591-pages-google-indexed-one-heres-how-im-debugging-it-5cel</guid>
      <description>&lt;p&gt;I run a directory site with 2,499 real vendor listings across Beirut, Dubai, Riyadh, Doha, Cairo and Casablanca. It has 591 programmatic landing pages and 1,182 URLs in its sitemap.&lt;/p&gt;

&lt;p&gt;I checked what Google had actually indexed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The homepage. That was it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Not 591. Not 200. One.&lt;/p&gt;

&lt;p&gt;This post is what I checked, what I ruled out, and the one diagnostic that actually decides what to do about it — because I got that last part wrong at first, and I suspect a lot of people do.&lt;/p&gt;

&lt;h2&gt;
  
  
  First instinct: something's broken on the site
&lt;/h2&gt;

&lt;p&gt;That's where I went, and it's usually where everyone goes. So I worked the checklist.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;robots.txt&lt;/strong&gt; — correct. Allows everything, references the sitemap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sitemap&lt;/strong&gt; — valid XML, 1,182 URLs, auto-generated, submitted.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hub page&lt;/strong&gt; — present. Something links into the page set; they aren't orphans.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Internal linking&lt;/strong&gt; — 62 cross-links per page. Not a dead end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Structured data&lt;/strong&gt; — JSON-LD on every page.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Server-rendered content&lt;/strong&gt; — real listings in the initial HTML. Not a JS shell.&lt;/p&gt;

&lt;p&gt;Here's the fastest way to check that last one, and it's the one people skip:&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://yoursite.com/some-page | &lt;span class="nb"&gt;wc&lt;/span&gt; &lt;span class="nt"&gt;-w&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that number is small, that's roughly what a crawler sees. Your framework hydrating beautifully in a browser is irrelevant to a bot that doesn't run JavaScript. I've measured client sites with &lt;strong&gt;10 words&lt;/strong&gt; in the initial HTML that looked perfect to a human.&lt;/p&gt;

&lt;p&gt;All six checks passed. Which meant the problem wasn't on the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  The wrong conclusion I nearly published
&lt;/h2&gt;

&lt;p&gt;My first explanation was: the site has no inbound links and no brand mentions anywhere, so Google has no reason to crawl it deeply. Authority problem. Go get links.&lt;/p&gt;

&lt;p&gt;That's a coherent story. It might even be right. But I nearly wrote it up as fact, and it turns out there's a specific piece of data that decides it — and until you look at that data, you're guessing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The diagnostic that actually matters
&lt;/h2&gt;

&lt;p&gt;Google Search Console → &lt;strong&gt;Indexing → Pages&lt;/strong&gt; → "Why pages aren't indexed".&lt;/p&gt;

&lt;p&gt;Two statuses look similar and mean opposite things:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Discovered – currently not indexed&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Google knows the URL exists but hasn't spent crawl budget on it. This is the authority/crawl-scheduling case. Links and internal-linking improvements genuinely help here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;Crawled – currently not indexed&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
Google fetched the page, looked at it, and decided not to index it. This is a &lt;strong&gt;quality judgement&lt;/strong&gt;. For programmatic pages — city × category templates where only a couple of fields change — this usually means it read them as thin or near-duplicate.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;If it's the second one, backlinks will not fix it.&lt;/strong&gt; You can build links for six months and stay at one indexed page, because the pages themselves are what got rejected. The fix is consolidation: fewer, substantially different pages with real unique content, rather than more thin ones.&lt;/p&gt;

&lt;p&gt;Same symptom. Opposite remedies. The export is free and takes two minutes, and I was about to skip it in favour of a narrative that felt right.&lt;/p&gt;

&lt;h2&gt;
  
  
  The trap in programmatic SEO
&lt;/h2&gt;

&lt;p&gt;Programmatic SEO makes the satisfying work and the useful work feel identical.&lt;/p&gt;

&lt;p&gt;Generating 600 pages is a fun afternoon. It produces a number that goes up. It looks like progress. And if your pages are being &lt;em&gt;rejected&lt;/em&gt; rather than &lt;em&gt;not reached&lt;/em&gt;, generating another 600 moves you from one indexed page to one indexed page.&lt;/p&gt;

&lt;p&gt;I could have shipped a second batch and felt productive the whole time.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd check on any site, in order
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;site:yourdomain.com&lt;/code&gt; in Google.&lt;/strong&gt; Compare the count to how many pages you think you have. The gap is the actual story, and most people never look.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;View source with JS disabled.&lt;/strong&gt; If there's a loading spinner where your content should be, that's what you've published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GSC → Indexing → Pages.&lt;/strong&gt; Get the real status before choosing a fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check whether you're blocking AI crawlers.&lt;/strong&gt; Plenty of &lt;code&gt;robots.txt&lt;/code&gt; files disallow &lt;code&gt;GPTBot&lt;/code&gt;, &lt;code&gt;ClaudeBot&lt;/code&gt; or &lt;code&gt;PerplexityBot&lt;/code&gt; inherited from a template, and then people wonder why assistants never cite them:
&lt;/li&gt;
&lt;/ol&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://yoursite.com/robots.txt | &lt;span class="nb"&gt;grep&lt;/span&gt; &lt;span class="nt"&gt;-iE&lt;/span&gt; &lt;span class="s2"&gt;"gptbot|claudebot|perplexity"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Grep your bundles for keys.&lt;/strong&gt; Unrelated to indexing, but while you're in there — anything starting &lt;code&gt;sk_live&lt;/code&gt;, &lt;code&gt;AKIA&lt;/code&gt;, or a service-role JWT that reached the browser is public regardless of what your backend does.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Where I've got to
&lt;/h2&gt;

&lt;p&gt;The GSC export is the next thing I do, and it decides whether the next month is spent earning citations or consolidating pages. I'm writing this before I have that answer deliberately, because the interesting part isn't the resolution — it's that the symptom looked obvious and pointed at two incompatible fixes.&lt;/p&gt;

&lt;p&gt;If you've got a programmatic site sitting at a fraction of its expected index coverage, check which status you have before you spend a month on the wrong one.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I automated the on-page half of these checks into a free scanner while debugging this — &lt;a href="https://preflightscan.vercel.app" rel="noopener noreferrer"&gt;preflightscan.vercel.app&lt;/a&gt;, no signup. It won't tell you your GSC status; nothing can except GSC.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>seo</category>
      <category>webdev</category>
      <category>debugging</category>
      <category>ai</category>
    </item>
  </channel>
</rss>
