<?xml version="1.0" encoding="UTF-8"?>
<!-- lastmod = last git commit that touched the page's source (marketing pages
     share MarketingLayout, so a layout change moves them all). Update when the
     pages change; URLs must mirror the public routes in src/App.jsx and the
     crawlable surface declared in robots.txt. -->
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
  <!-- Homepage (simplified single-message page; depth on /developers + /features) -->
  <url>
    <loc>https://growomat.com/</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>

  <!-- Marketing Pages -->
  <url>
    <loc>https://growomat.com/features</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/developers</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <!-- The developer sub-pages. Each is a self-contained campaign destination
       with its own title, description and canonical, so it can be indexed and
       advertised on its own terms. The tab-qualified /developers/api|sdk|mcp
       URLs are the signed-in portal and stay out of the sitemap (robots.txt). -->
  <url>
    <loc>https://growomat.com/developers/claude</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/developers/rest-api</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/developers/sdks</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/features/autopilot</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/support</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>

  <url>
    <loc>https://growomat.com/how-it-works</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/pricing</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <!-- Per-platform pages (slugs mirror the backend registry ids; one
       PlatformPage template, see src/premium/views/marketing/platformPages.js).
       /meta-ads is deliberately indexed while the platform is pre-GA — the
       page says "coming soon" and accrues index age until the GA flip. -->
  <url>
    <loc>https://growomat.com/google-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/microsoft-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/reddit-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/meta-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/about</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>

  <!-- Intent landing pages — ONE PER WANT, not per feature and not per
       competitor. Registered in src/premium/views/marketing/intentPages.js and
       rendered by one IntentPage template. Root-level slugs on purpose: the
       slug is the thing somebody typed, which is the strongest URL for the
       query it answers, and it is what the per-platform pages already do. A
       future app route colliding with one of these is the real risk, and
       intentPages.test.js turns it into a failing unit test rather than a URL
       shape chosen to avoid it.

       /switch-your-ppc-tool is the one that catches the whole
       "<somebody> alternative" cluster. It argues against SHAPES OF TOOL
       rather than against companies, so no competitor is named in a URL, a
       heading or a table cell — brand-overview §01 stays intact, and the page
       does not go stale when somebody else changes their price list.

       THESE HAVE NO LOCALE TWINS, deliberately, and they are the only SPA
       URLs here besides the blog that do not. Paid is English, and §3.4's rule
       is that a DE/FR version follows a page that is already earning in
       English — so each page declares hreflang for `en` alone
       (usePageMeta's `alternates`), /de/<slug> client-redirects to the English
       URL, and marketingLocales.test.js exempts exactly this set from the
       every-route-in-every-locale rule while asserting the inverse: that none
       of them appears under a prefix. Advertising a German alternate that
       serves nothing is worse than not annotating at all. -->

  <url>
    <loc>https://growomat.com/without-an-agency</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/google-ads-automation</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/run-ads-from-claude</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/all-your-ads-in-one-place</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>

  <url>
    <loc>https://growomat.com/switch-your-ppc-tool</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.9</priority>
  </url>

  <!-- Blog. The block between the markers below is GENERATED by
       scripts/build-blog.mjs from content/blog/*.md and rewritten in place on
       every `npm run build` (the `prebuild` hook). Do not edit it by hand: CI
       regenerates it after checkout and fails the deploy on a diff, which is
       what makes "a post exists but is not advertised" and "a URL is advertised
       but has no post" unreachable states rather than things to remember.

       Listing a post here is also what gets it PRERENDERED — scripts/
       prerender.mjs takes its route list from this file. The blog is
       English-only in v1, so these URLs carry NO locale prefix and the pages
       declare hreflang for `en` alone (usePageMeta's `alternates` option).

       An empty blog is a valid state: with no published posts the block is
       empty and the blog is advertised nowhere. -->
  <!-- BLOG:START -->
  <url>
    <loc>https://growomat.com/blog</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>

  <url>
    <loc>https://growomat.com/blog/why-your-ad-platforms-disagree-about-last-week</loc>
    <lastmod>2026-08-09</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
  <!-- BLOG:END -->

  <!-- Legal Pages -->
  <url>
    <loc>https://growomat.com/terms.html</loc>
    <lastmod>2026-07-19</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <url>
    <loc>https://growomat.com/privacy.html</loc>
    <lastmod>2026-07-19</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <url>
    <loc>https://growomat.com/impressum.html</loc>
    <lastmod>2026-07-19</lastmod>
    <changefreq>yearly</changefreq>
    <priority>0.3</priority>
  </url>

  <!-- German (de). English owns the unprefixed paths; every other locale is
       served under its own prefix and self-canonicalises there. Listing these
       is also what gets them PRERENDERED — scripts/prerender.mjs takes its route
       list from this file, so a locale URL that is not here would be advertised
       to nobody and rendered by nobody. The reciprocal hreflang annotations ship
       in each page's <head> (see usePageMeta), which is where crawlers read them
       for a prerendered page. -->
  <url>
    <loc>https://growomat.com/de</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/features</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/developers</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/developers/claude</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/developers/rest-api</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/developers/sdks</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/features/autopilot</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/support</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/how-it-works</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/pricing</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/google-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/microsoft-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/reddit-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/meta-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/de/about</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>

  <!-- French (fr). English owns the unprefixed paths; every other locale is
       served under its own prefix and self-canonicalises there. Listing these
       is also what gets them PRERENDERED — scripts/prerender.mjs takes its route
       list from this file, so a locale URL that is not here would be advertised
       to nobody and rendered by nobody. The reciprocal hreflang annotations ship
       in each page's <head> (see usePageMeta), which is where crawlers read them
       for a prerendered page. -->
  <url>
    <loc>https://growomat.com/fr</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>1.0</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/features</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/developers</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/developers/claude</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/developers/rest-api</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/developers/sdks</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/features/autopilot</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/support</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.8</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/how-it-works</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/pricing</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/google-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/microsoft-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/reddit-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/meta-ads</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>weekly</changefreq>
    <priority>0.9</priority>
  </url>
  <url>
    <loc>https://growomat.com/fr/about</loc>
    <lastmod>2026-08-08</lastmod>
    <changefreq>monthly</changefreq>
    <priority>0.7</priority>
  </url>
</urlset>
