<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Gustavo Schroder — SEO & Web Development]]></title><description><![CDATA[SEO - gruposdewhatss.com.br]]></description><link>https://gruposdewhatsapp.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Gustavo Schroder — SEO &amp; Web Development</title><link>https://gruposdewhatsapp.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Mon, 31 Aug 2026 10:07:42 GMT</lastBuildDate><atom:link href="https://gruposdewhatsapp.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[What I Learned Building a Large Community Directory with Laravel and SEO in Mind]]></title><description><![CDATA[At first, building a directory sounds like a straightforward development project.
You have records in a database, categories, individual pages, filters, search, and a few administrative tools.
Then th]]></description><link>https://gruposdewhatsapp.hashnode.dev/what-i-learned-building-a-large-community-directory-with-laravel-and-seo-in-mind</link><guid isPermaLink="true">https://gruposdewhatsapp.hashnode.dev/what-i-learned-building-a-large-community-directory-with-laravel-and-seo-in-mind</guid><category><![CDATA[whatsapp]]></category><category><![CDATA[social media]]></category><dc:creator><![CDATA[Gustavo Schroder]]></dc:creator><pubDate>Sat, 15 Aug 2026 13:08:25 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6a8061b8ca8063ca02c107fc/5f16b7be-1742-4a95-9ad4-b711ce9c6a78.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>At first, building a directory sounds like a straightforward development project.</p>
<p>You have records in a database, categories, individual pages, filters, search, and a few administrative tools.</p>
<p>Then the project starts growing.</p>
<p>Thousands of URLs appear. Some pages become outdated. User-generated content creates duplication. Search engines crawl pages that were never intended to rank. Old records continue generating URLs long after they have stopped being useful.</p>
<p>At that point, the main challenge is no longer CRUD.</p>
<p>It is architecture.</p>
<p>I experienced this directly while working on a platform built around <a href="https://www.gruposdewhatss.com.br/en">WhatsApp groups</a>, where a relatively simple directory structure eventually turned into a much larger problem involving SEO, crawling, indexing, content quality, moderation, and application performance.</p>
<p>Here are some of the lessons that became much clearer as the project scaled.</p>
<h2>A Database Record Does Not Automatically Deserve an Indexable URL</h2>
<p>One of the easiest mistakes to make when building directories is creating a public page for every database record.</p>
<p>Technically, it makes sense.</p>
<p>You have something like:</p>
<pre><code class="language-php">Route::get('/group/{slug}', [GroupController::class, 'show']);
</code></pre>
<p>Every group has a slug.</p>
<p>Every slug generates a page.</p>
<p>Done.</p>
<p>Except that search engines do not care whether the architecture is elegant from a database perspective.</p>
<p>They care whether the resulting page provides value.</p>
<p>This means three concepts should be treated separately:</p>
<pre><code class="language-text">Database record
↓
Public URL
↓
Indexable document
</code></pre>
<p>They are not necessarily the same thing.</p>
<p>A record may need to exist in the database without requiring a public URL.</p>
<p>A public URL may need to exist for users without necessarily being indexed.</p>
<p>And an indexable page should generally justify its presence in the search index.</p>
<p>That distinction becomes extremely important once a directory reaches thousands or hundreds of thousands of records.</p>
<h2>URL Generation Is Cheap. Useful Pages Are Expensive.</h2>
<p>Modern frameworks make page generation almost trivial.</p>
<p>Laravel can turn database entities into routes, views, API responses, sitemaps, and internal links very quickly.</p>
<p>The dangerous part is that this makes it easy to scale the wrong thing.</p>
<p>Generating 100,000 URLs is not difficult.</p>
<p>Making 100,000 URLs genuinely useful is.</p>
<p>Directory projects often accumulate:</p>
<ul>
<li><p>thin pages;</p>
</li>
<li><p>expired entries;</p>
</li>
<li><p>duplicated descriptions;</p>
</li>
<li><p>empty categories;</p>
</li>
<li><p>unnecessary pagination;</p>
</li>
<li><p>internal search URLs;</p>
</li>
<li><p>filtered URLs;</p>
</li>
<li><p>outdated listings;</p>
</li>
<li><p>nearly identical landing pages.</p>
</li>
</ul>
<p>From the application perspective, everything may be working perfectly.</p>
<p>From the SEO perspective, the site can gradually become much harder to crawl and understand.</p>
<p>This is why I stopped treating URL creation as a purely development decision.</p>
<p>Every new route potentially changes the site's crawlable surface.</p>
<h2>User-Generated Content Needs a Lifecycle</h2>
<p>UGC is one of the reasons directories can grow quickly.</p>
<p>It is also one of their biggest technical liabilities.</p>
<p>Users rarely submit content with SEO quality in mind.</p>
<p>They submit short titles, duplicate descriptions, spammy text, broken links, incomplete information, or content that becomes outdated a few weeks later.</p>
<p>Validation helps, but validation only solves the problem at creation time.</p>
<p>The bigger issue is what happens afterward.</p>
<p>Every user-generated record should ideally have some kind of lifecycle.</p>
<p>For example:</p>
<pre><code class="language-text">Created
→ Published
→ Reviewed
→ Updated
→ Expired
→ Removed / Redirected / Archived
</code></pre>
<p>The exact states depend on the project, but the principle matters.</p>
<p>Content should not remain permanently indexable simply because it once passed a form validation rule.</p>
<p>A page that provided value six months ago may be completely useless today.</p>
<p>This is especially relevant for directories containing links, events, communities, products, jobs, or anything else that changes over time.</p>
<h2>SEO Decisions Belong in the Application Architecture</h2>
<p>SEO is often treated as something that happens after development.</p>
<p>Build the website first.</p>
<p>Optimize it later.</p>
<p>That approach becomes increasingly expensive as a project grows.</p>
<p>Some SEO decisions are fundamentally architectural decisions.</p>
<p>Examples include:</p>
<ul>
<li><p>URL structure;</p>
</li>
<li><p>canonicalization;</p>
</li>
<li><p>pagination;</p>
</li>
<li><p>HTTP status codes;</p>
</li>
<li><p>redirects;</p>
</li>
<li><p>internal linking;</p>
</li>
<li><p>sitemap generation;</p>
</li>
<li><p>indexation rules;</p>
</li>
<li><p>category hierarchy;</p>
</li>
<li><p>handling expired content;</p>
</li>
<li><p>handling duplicate entities.</p>
</li>
</ul>
<p>If these are considered only after the system has already produced hundreds of thousands of URLs, fixing them can become painful.</p>
<p>A good example is deletion.</p>
<p>From a database perspective, deleting a record is simple.</p>
<pre><code class="language-php">$model-&gt;delete();
</code></pre>
<p>But from an SEO perspective, several questions appear immediately.</p>
<p>Should the old URL return <code>404</code>?</p>
<p>Should it return <code>410</code>?</p>
<p>Should it redirect somewhere?</p>
<p>Is there an equivalent page?</p>
<p>Does the deleted URL still receive internal links?</p>
<p>Is it still present in the sitemap?</p>
<p>Does Google still crawl it frequently?</p>
<p>The database operation is one line.</p>
<p>The actual lifecycle of that URL is much more complicated.</p>
<h2>Categories Can Become More Important Than Individual Records</h2>
<p>One thing I underestimated early on was how important well-designed category pages can become.</p>
<p>In a directory, developers naturally focus on individual entities.</p>
<p>But individual entries are frequently unstable.</p>
<p>They disappear.</p>
<p>They expire.</p>
<p>Their content changes.</p>
<p>Categories are usually much more permanent.</p>
<p>A well-built category page can aggregate useful information, provide navigation, create internal linking relationships, and remain relevant even while individual records come and go.</p>
<p>This changes how I think about directory architecture.</p>
<p>Instead of relying entirely on thousands of individual pages, I prefer creating stronger permanent hubs that organize the unstable layer beneath them.</p>
<p>That structure is easier for users to navigate and generally easier to maintain from a search perspective.</p>
<h2>Internal Linking Should Reflect Relationships, Not Just SEO</h2>
<p>Another problem that appears at scale is automated internal linking.</p>
<p>It is tempting to create logic such as:</p>
<pre><code class="language-text">Every page links to 10 related pages.
</code></pre>
<p>Technically, this improves connectivity.</p>
<p>But relevance matters more than raw link count.</p>
<p>If related content is selected using weak criteria, the result becomes a large internal linking network with very little semantic value.</p>
<p>I now prefer fewer links based on stronger relationships.</p>
<p>Category.</p>
<p>Topic.</p>
<p>Intent.</p>
<p>Content similarity.</p>
<p>User behavior.</p>
<p>Whatever makes sense for that specific project.</p>
<p>The important part is that the link should exist because the destination genuinely helps someone continue navigating the topic.</p>
<p>SEO benefits from that naturally.</p>
<h2>Performance and SEO Problems Often Meet</h2>
<p>Laravel provides plenty of tools for performance:</p>
<ul>
<li><p>caching;</p>
</li>
<li><p>queues;</p>
</li>
<li><p>eager loading;</p>
</li>
<li><p>scheduled jobs;</p>
</li>
<li><p>Redis;</p>
</li>
<li><p>database indexing;</p>
</li>
<li><p>background processing.</p>
</li>
</ul>
<p>But optimizing application performance does not automatically improve content architecture.</p>
<p>You can cache a useless page perfectly.</p>
<p>You can generate an XML sitemap containing thousands of low-quality URLs incredibly quickly.</p>
<p>You can make an inefficient site architecture respond in 50 milliseconds.</p>
<p>Performance solves delivery.</p>
<p>It does not solve relevance.</p>
<p>On the other hand, SEO architecture can also create performance problems.</p>
<p>Large sitemaps, excessive crawls, expensive related-content queries, faceted navigation, and dynamically generated pages can all put unnecessary pressure on the application.</p>
<p>At scale, backend architecture and technical SEO stop being separate disciplines.</p>
<p>They start affecting each other directly.</p>
<h2>What I Would Design First Today</h2>
<p>If I were starting another large directory today, I would define URL rules before building most of the frontend.</p>
<p>I would decide:</p>
<ul>
<li><p>which entities receive public URLs;</p>
</li>
<li><p>which URLs are indexable;</p>
</li>
<li><p>when pages expire;</p>
</li>
<li><p>how expired content is handled;</p>
</li>
<li><p>what belongs in XML sitemaps;</p>
</li>
<li><p>how categories relate to entities;</p>
</li>
<li><p>how internal links are generated;</p>
</li>
<li><p>what happens when records are deleted;</p>
</li>
<li><p>which pages should never be crawlable.</p>
</li>
</ul>
<p>Only after defining those rules would I focus heavily on scaling content.</p>
<p>This prevents one of the most common directory problems: accidentally creating a much larger website than intended.</p>
<h2>The Main Lesson</h2>
<p>The hardest part of building a large directory is not generating pages.</p>
<p>Frameworks solved that problem a long time ago.</p>
<p>The harder problem is deciding which pages deserve to exist, which deserve to be indexed, and what should happen when they stop being useful.</p>
<p>Once a project reaches enough scale, those decisions affect development, database design, crawling, server resources, UX, and organic search at the same time.</p>
<p>That is probably the biggest lesson I took from the project:</p>
<p><strong>A scalable directory is not one that can generate millions of pages. It is one that can decide intelligently which pages should exist at all.</strong></p>
]]></content:encoded></item></channel></rss>