<?xml version="1.0" encoding="UTF-8"?>
<!--
  FACTR Labs — public marketing sitemap (2026-09-14, founder-requested
  ahead of real Facebook ad spend).

  SCOPE: factrlabs.com only. Same one-static-file-for-six-hostnames
  constraint robots.txt's own comment already documents — this build is
  served byte-identical on factrlabs.com, www.factrlabs.com,
  factrtelehealth.com, www.factrtelehealth.com, app.factrlabs.com, and
  app.factrtelehealth.com, but a sitemap's <loc> entries must be absolute,
  single-host URLs. factrtelehealth.com (the separate B2B platform
  marketing site, PlatformSite.jsx) has its own distinct set of public
  pages this file does NOT cover — deliberately out of scope for this
  pass (tomorrow's ad spend targets the consumer hair-loss funnel, not
  the B2B site), not silently dropped. A real per-host sitemap needs
  edge-side generation (Cloudflare Pages Function) — the same follow-up
  this repo's robots.txt already flags for per-domain social-preview
  metadata.

  Every URL below was verified LIVE (rendered, not guessed) against
  production on 2026-09-14: loads without redirecting away, carries no
  <meta name="robots"> block, and is not Disallow'd in robots.txt.

  DELIBERATELY EXCLUDED, checked and rejected for real reasons, not
  omitted by oversight:
    /hair                 -> client-side redirects to / (not a distinct page)
    /hair/quiz             -> client-side redirects to /hair/quiz/1, whose
                               own <link rel="canonical"> already points
                               there — /hair/quiz/1 is listed instead
    /hair/quiz/2 .. /:step -> funnel steps of the same page, not unique
                               landing content (matches the canonical above)
    /hair/start             -> Funnel B (HairQuizB.jsx) — carries its OWN
                               <meta name="robots" content="noindex, nofollow">
                               by design (2026-09-11, avoids duplicate-
                               content penalty against the canonical quiz).
                               Listing a noindexed URL in a sitemap is a
                               real Search Console error class; never do it.
    /products, /products/:id -> storeEnabled is currently false; both
                               redirect client-side to / (nothing to index)
    /results, /skin/results -> personal AI-analysis result pages (render
                               whatever the visitor's own local data is,
                               e.g. a specific face-score) — not stable,
                               generic marketing content
    /cart, /confirm-email-change, /activation-sent, /activate,
    /find-portal, /diagnostics, /set-password -> transactional/account/
                               utility pages, not marketing content
    /labs-site, /join, /affiliate/*, and every /admin, /doctor,
    /dashboard, /platform, /t/, /login, /checkout/, /profile/,
    /signup, /reset-password, /oauth/, /r/ path -> already Disallow'd in
                               robots.txt; listing a Disallow'd URL in a
                               sitemap is the other real Search Console
                               error class ("blocked by robots.txt")

  /skin was considered and is DELIBERATELY EXCLUDED (founder decision,
  2026-09-14): the marketing page itself is live/public/crawlable
  regardless of this file, but CLAUDE.md notes the underlying Skin
  service is "disabled / coming soon" for the current Spain-first
  Hair-only launch, and the founder chose to keep it out of the sitemap
  until that changes -- not an oversight, revisit when Skin launches.
-->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <url>
    <loc>https://factrlabs.com/</loc>
  </url>
  <url>
    <loc>https://factrlabs.com/hair/quiz/1</loc>
  </url>
  <url>
    <loc>https://factrlabs.com/telehealth</loc>
  </url>
  <url>
    <loc>https://factrlabs.com/facial-analysis</loc>
  </url>
  <url>
    <loc>https://factrlabs.com/privacy-policy</loc>
  </url>
</urlset>
