{"id":"rvp88jysd238a1n","title":"How I Feed Google New Field Notes Without Another Deploy","slug":"internal-links-spa-journal-discovery","summary":"After prerender shells and full article HTML are live, GSC labels still lag for weeks — I use internal links from already-indexed pages to feed crawl budget to new Field Notes without another deploy.","imageUrl":"https://briancrabtree.me/images/journal-internal-links-spa-journal-discovery.webp","category":"Web Development","date":"2026-06-10T18:00:00.000Z","featured":false,"likes":10,"author":"Brian Crabtree","content":"<h2>The trap after you fixed production</h2>\n\n<p>You shipped prerender shells. Per-slug canonicals. Full article HTML in <code>prerender-post-prose</code>. <code>curl</code> shows headings and body. URL Inspection live test says the page can be indexed. Then you open Page indexing in Search Console and nothing moved: still ten indexed URLs, still a 404 bucket full of legacy paths, still zero impressions on <code>/journal/*</code>.</p>\n\n<p>That is not a deploy failure. It is a timing problem. Google’s index tab reflects older crawls. Labels like Soft 404, crawled – currently not indexed, and not found (404) can sit unchanged for days or weeks after production is correct. Panic redeploys do not speed that up. Another build with the same HTML does not teach Google anything new.</p>\n\n<p>I wrote about the technical fixes in <a href=\"/journal/journal-soft-404-prerender-body/\">When Google Soft 404s Your Journal Despite a 200 Status</a> and <a href=\"/journal/react-spa-crawled-not-indexed-fix/\">React SPA Crawled, Not Indexed: The Fix That Actually Moved GSC</a>. Those were necessary. The next lever is discovery — how Google finds and re-prioritizes URLs you already fixed.</p>\n\n<h2>Internal links scale; daily quota does not</h2>\n\n<p>Search Console gives you roughly ten to twelve indexing requests per day. That is a drip, not a flood. Sitemap submission tells Google what exists. It does not guarantee recrawl order or that a stale label clears on the next pass.</p>\n\n<p>Internal links from pages Google already trusts do two things sitemaps alone struggle with:</p>\n\n<ul>\n  <li>They pass <strong>crawl budget</strong> from indexed URLs toward the targets you link.</li>\n  <li>They give <strong>context</strong> — anchor text and surrounding copy signal that a Field Note is a real article, not a duplicate of home.</li>\n</ul>\n\n<p>On a React marketing site with a prerender journal, you do not need a CMS plugin or a link-building campaign. You need consistent <code>&lt;a href&gt;</code> paths from hubs you already index toward posts you want indexed next.</p>\n\n<h2>Where I link from on this stack</h2>\n\n<p>These URLs were indexed or close to it when I ran recovery in June 2026:</p>\n\n<ul>\n  <li><a href=\"https://briancrabtree.me/\">Home</a> — journal grid cards now point at <code>/journal/{slug}/</code> article paths, not index hash fragments. Crawlers and users hit the canonical post URL directly.</li>\n  <li><a href=\"/journal/\">Field Notes index</a> — archive rows already link to full posts via <code>journalPostPath</code>.</li>\n  <li><a href=\"/journal/performance-checks-before-handoff/\">Performance Checks Before Handoff</a> — indexed flagship with natural cross-links to sibling posts.</li>\n  <li><a href=\"/projects/\">Portfolio</a> — case studies that reference build notes where relevant.</li>\n</ul>\n\n<p>Homepage project cards still deep-link to <code>/projects/#project-{id}</code> because portfolio comparison happens on the index. Field Notes are read in full — the homepage should open the article at the top, not scroll a long archive.</p>\n\n<pre><code>- [ ] Link targets use trailing-slash canonical /journal/{slug}/\n- [ ] href is real &lt;a&gt; — not onClick-only navigation without URL\n- [ ] Anchor text describes the post topic, not \"click here\"\n- [ ] Above-fold teasers use article paths, not /journal/#journal-{slug}\n- [ ] Cross-link from indexed posts to P0 slugs in priority queue\n- [ ] Do not chase stale 404 bucket URLs — live curl confirms 301/200</code></pre>\n\n<h2>P0 slugs worth linking this week</h2>\n\n<p>My indexing queue lives in operator notes, not in React state. When I add internal links, I start with posts that passed live URL Inspection but still show crawled-not-indexed or discovered-not-indexed:</p>\n\n<ul>\n  <li><a href=\"/journal/website-performance-audit-2026-react/\">Website Performance Audit Checklist (2026): What to Fix First on a React Site</a></li>\n  <li><a href=\"/journal/journal-soft-404-prerender-body/\">When Google Soft 404s Your Journal Despite a 200 Status</a></li>\n  <li><a href=\"/journal/react-css-before-module-js-pagespeed/\">Why Your React Site Loads Unstyled (CSS Before Module JS)</a></li>\n  <li><a href=\"/journal/why-pagespeed-scores-change-every-run/\">Why PageSpeed Scores Change Every Run</a></li>\n  <li><a href=\"/journal/how-core-web-vitals-sabotage-seo-fix/\">How Core Web Vitals Sabotage SEO (And How to Fix It)</a></li>\n  <li><a href=\"/journal/everything-your-website-needs-to-actually-succeed/\">Everything Your Website Needs to Actually Succeed</a></li>\n</ul>\n\n<p>One link from an indexed page is not magic. Five links from five indexed hubs, plus daily indexing requests on the same slugs, beats waiting for sitemap luck.</p>\n\n<h2>What not to do</h2>\n\n<ul>\n  <li><strong>Panic redeploy</strong> when curl and live tests already pass — you will not outrun GSC report lag with identical HTML.</li>\n  <li><strong>Chase the 404 bucket</strong> — many entries are legacy URLs from pre-redirect deploys; live <code>curl -sI</code> shows 301 or 200.</li>\n  <li><strong>Re-click Validate fix on Soft 404</strong> while validation is already Started — wait for recrawl.</li>\n  <li><strong>Rewrite the homepage bundle for SEO bloat</strong> — JSON-LD soup and keyword blocks risk the performance proof that makes citations credible. See <a href=\"/journal/ai-citations-llms-txt-robots-signals/\">AI Citations: llms.txt and Crawl Policy</a> for what actually matters on this stack.</li>\n</ul>\n\n<h2>How I measure progress</h2>\n\n<p>Weekly KPI row: URL-prefix indexed count, 28-day impressions, journal filter impressions. Success in seven days is not eighty indexed posts — it is fifteen to twenty indexed URLs, Soft 404 validation Passed, and the first journal URLs showing impressions. Compare exports week over week; do not stare at a frozen Page indexing chart from last month.</p>\n\n<p>For the performance side of the same discipline — head order, PSI gate, handoff checklist — see <a href=\"/journal/performance-checks-before-handoff/\">Performance Checks Before Handoff</a> and <a href=\"/journal/react-css-before-module-js-pagespeed/\">CSS Before Module JS for PageSpeed</a>.</p>\n\n<h2>When this is your bottleneck</h2>\n\n<p>If production HTML is correct but Search Console labels will not move, send your property URL, one example slug, and whether live URL Inspection passes at <a href=\"/contact?ref=journal\">/contact</a>. I will tell you whether you need more internal links, indexing queue discipline, or a crawl contract fix you have not shipped yet. See <a href=\"/services/\">services</a> for React SEO and deploy hygiene scope.</p>","tags":["seo","react","spa","google-search-console","internal-linking"],"views":22}