Site profile

1. Sitemap breakdown by section

Section URL count Notes
/pages/* 101 Templated "[niche]-pr-agency" landing pages. Not linked from homepage, nav, or footer.
/playbook/* 117 Long-form guide articles. Linked from /playbook hub (116 links found) and 8 links from homepage.
/blog/* 81 Linked from /blog hub.
/services/* 9 Linked from nav and footer directly.
/glossary/* 6 Linked from footer.
/work/* 7 Linked from nav/footer.
Region pages (/apac, /india, /singapore, /dubai-mena, /korea, /japan) 6 Linked from footer.
Core pages (home, about, speaker, testimonials, authors, press, faq, contact) 8 Linked from nav/footer.

2. Orphan page problem (primary cause)

Checked homepage <nav>, <header>, and <footer> link targets directly via DOM inspection:

This matches Google's own guidance and third-party GSC diagnostics for 2026: pages that exist only in an XML sitemap with no real internal links are the textbook cause of "Discovered - currently not indexed." Google's crawler treats the absence of internal links as a signal the page isn't important, regardless of sitemap presence.

3. Sitemap lastmod bug (corrected finding)

Initial read of the sitemap showed 255 of 335 URLs (76%) stamped lastmod = 2026-07-02 (today), which looked like a mass same-day publish. Root-caused in app/sitemap.ts, and it isn't a real publish event. The generator ran const now = new Date() and set lastModified: now on every static page (/pages/*, /playbook/*, /glossary/*, /services/*, regions, etc, everything except individual /blog/[slug] posts, which pull a real updated_at from Supabase). That means every static page gets stamped with the current request time on every single sitemap fetch, regardless of whether anything changed. That's why it looked like 255 pages changed today. Only the 81 blog posts showed genuine historical dates (May 28 - Jun 21) because those come from real Supabase timestamps.

This is a known anti-pattern: Google's own sitemap guidance warns that stamping every URL with the current date on every crawl makes the lastmod signal meaningless, and Google may start ignoring it site-wide. It doesn't block indexing by itself, but it wastes crawl budget and undermines a signal that could otherwise help prioritize genuinely updated pages.

Fixed: removed the fake lastModified: now for static pages in app/sitemap.ts so Next.js omits the field for them instead of lying about it. See Fix Plan.

4. Content pattern / cannibalization risk