<?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[Wonderlist Engineering]]></title><description><![CDATA[Wonderlist Engineering]]></description><link>https://wonderlist.hashnode.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/6ada0cf902c674786a6793f0/427f79df-0c4a-4000-a1e7-a05fa5934023.png</url><title>Wonderlist Engineering</title><link>https://wonderlist.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Tue, 27 Oct 2026 03:43:49 GMT</lastBuildDate><atom:link href="https://wonderlist.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[We had 167 pages Google wouldn't index. The fix was links, not tags.]]></title><description><![CDATA[Wonderlist ( is a travel marketplace: Pakistani agencies list Umrah packages and tours, travelers compare and book in the app. The web side has a public…]]></description><link>https://wonderlist.hashnode.dev/we-had-167-pages-google-wouldn-t-index-the-fix-was-links-not-tags</link><guid isPermaLink="true">https://wonderlist.hashnode.dev/we-had-167-pages-google-wouldn-t-index-the-fix-was-links-not-tags</guid><category><![CDATA[Next.js]]></category><category><![CDATA[SEO]]></category><category><![CDATA[webdev]]></category><category><![CDATA[React]]></category><dc:creator><![CDATA[Wonderlist]]></dc:creator><pubDate>Thu, 22 Oct 2026 13:25:14 GMT</pubDate><content:encoded><![CDATA[<p>Wonderlist (<a href="https://wonderlist.co">https://wonderlist.co</a>) is a travel marketplace: Pakistani agencies list Umrah packages and tours, travelers compare and book in the app. The web side has a public page for every package, built with the Next.js App Router.</p>
<p>Search Console said 16 pages indexed, 167 not. Every page had a title, a description, a canonical and JSON-LD. The sitemap listed them all. So what was wrong?</p>
<h3>1. Nothing linked to the pages</h3>
<p>The /tours page was a client-side search: it loaded packages with JavaScript after the page rendered. Googlebot does render JavaScript, but it ranks pages by the links it finds in HTML, and our server HTML had <strong>zero links to any package page</strong>. A URL that is only in the sitemap is a URL Google knows about but has no reason to rank.</p>
<p>The fix was boring: server-rendered category pages (<code>/umrah-packages</code>, <code>/pakistan-tours</code>, <code>/international-tours</code>) that list every bookable package as a plain <code>&lt;a href&gt;</code>, linked from the footer on every page. Then "similar packages" on each package page, an agency directory, and facet pages for real searches (<code>/umrah-packages/21-days</code>, <code>/pakistan-tours/skardu</code>) — each only indexable when at least two packages match, so there are no near-empty pages.</p>
<h3>2. The sitemap listed trips that had already happened</h3>
<p>79 of 180 active packages had tour dates in the past. They were in the sitemap and indexable, so Google was spending crawl on dead trips. Now a finished trip stays reachable (old links and QR posters still work) but is <code>noindex</code> and out of the sitemap, and its Offer says <code>SoldOut</code>.</p>
<h3>3. Titles longer than Google shows</h3>
<p>140 of 213 titles were over 60 characters (agencies write long package names). One helper builds every title: the package name first, the brand only if it fits, cut at a word.</p>
<pre><code class="language-ts">export function seoTitle(main: string): string {
  const text = clean(main);
  if (text.length + SUFFIX.length &lt;= 60) return `${text}${SUFFIX}`;
  return cutAtWord(text, 60);
}
</code></pre>
<h3>4. Check it, don't assume it</h3>
<p>A short script crawls the live sitemap and fails on any page that isn't 200, has a title over 60 or description over 155, a canonical that isn't itself, a <code>noindex</code>, more or fewer than one <code>&lt;h1&gt;</code>, or JSON-LD that doesn't parse. I run it against production after every deploy; the result today is 164 URLs, 0 problems. New URLs go to Bing and others through IndexNow straight after.</p>
<h3>What I'd tell anyone with the same Search Console report</h3>
<p>"Discovered – currently not indexed" usually isn't a tag problem. Open your server HTML (<code>curl</code>, not the browser) and count the <code>&lt;a href&gt;</code> links to the pages you want indexed. If it's zero, that's the bug.</p>
]]></content:encoded></item></channel></rss>