# SEO Pack

Links chosen keywords to your own pages and /go/ links automatically, counts visits from AI and search crawlers (telling real ones from fakes, and how many people AI sends you), publishes /llms.txt and (if you have none) /sitemap.xml, and tells IndexNow search engines about new and changed pages.

**Beta.** SEO Pack is in beta: it works, but things may still break. Tell us if something does: open an issue at https://github.com/sundoggs/support/issues/new. Every paid order has a 7-day refund.

Category: [SEO and links](/categories/seo.md)

## Requirements (tell the site owner before buying)

- Cloudflare plan: Cloudflare free plan
- Works on: Cloudflare Workers, Cloudflare Pages
- Version: 0.5.4 (needs site layer 0.22.0 or later; it comes in the same download)
- Runs on the Cloudflare free plan, in the same D1 database as your other site apps. No outside accounts or keys are needed.
- Optional outside account: External indexers (off by default). If you choose one, such as RalfyIndex (ralfyindex.com, paid per URL in credits), you sign up and pay for it yourself and set its key as a Worker secret (SEO_RALFYINDEX_KEY). Only page addresses are sent to it, at most one request a second, within a daily cap you set.
- Your pages are learned as visitors and crawlers open them (title, description, main heading), so a page appears in /llms.txt and /sitemap.xml after its first visit. You can also paste a list, import an existing sitemap, or scan pages from the admin.
- Page views run through the app so links can be added and pages learned; images, CSS, JS and fonts are served directly. Page views count toward the Cloudflare free 100,000 requests/day (Workers Paid removes the daily cap).
- AI crawler visits and newly seen pages are saved in batches within the site's daily write budget, so busy sites stay inside the Cloudflare free limits.
- Outside requests: the site downloads the crawler IP lists OpenAI, Google, Microsoft, Perplexity, Apple, Common Crawl, DuckDuckGo and Mistral publish, from their own addresses, at most once a day each (about 13 small downloads a day), to tell real crawlers from fakes. You can turn this off under Crawlers → Manage bots. Nothing goes to us. Real signature checks for signed agents (such as ChatGPT agent) are off by default; when on, the site fetches that agent's own public key list.
- Crawler counts are what your site sees: requests Cloudflare blocks first (Block AI bots, Bot Fight Mode, AI Crawl Control) and files the host serves directly never reach it. Optional: one free Cloudflare Transform Rule lets the Cloudflare verified-bot flag reach the site (steps in the admin; nothing breaks without it).
- Crawler alerts (off by default) are sent by email through the site's notification settings in Forms. Conversions from AI-referred visits show when Analytics is installed; the redirect button on crawler errors needs Links & Redirects.
- IndexNow is off until you turn it on. When on, the site sends only page addresses (never page content) to api.indexnow.org, at most once per interval you choose, and serves a key file at /<key>.txt. Google does not use IndexNow.
- If your site already has /llms.txt or /sitemap.xml as a file, the app leaves it alone and says so in the admin.
- Works with Links & Redirects when installed (link keywords to your /go/ links). Install order doesn't matter; removing either app never breaks the other.
- Cost per visit: page views add no requests; newly seen pages and crawler hits are saved in batches (one save at most about once a minute per Worker instance, at most 5 statements, and 200 new pages and 400 new crawler rows an hour per instance). Measured: a crawler hit costs about 2.4 database rows when hits are spread out (5,000 crawler hits over a day, 8 bots and 300 pages: 11,894 rows, under a third of the default 40,000-row daily budget), less when a bot fetches the same page within a minute; a person's visit from another site adds one counter row (two with its index), saved with the same batch; the per-request check of a crawler takes a few microseconds of CPU. Blocking a bot at the site adds no write. If the daily write budget or the Cloudflare free database limit is reached, learning pauses and /llms.txt and /sitemap.xml keep serving. With an external indexer's automatic sending on, a page view after the response may start the site's hourly send or a status check (a few outbound requests, at most once an hour and once every 5 minutes for the whole site).

Settings:
- `SEO_INDEXNOW_ENDPOINT` (optional): Where IndexNow submissions are sent (default https://api.indexnow.org/indexnow). Only change it to test.
- `SEO_RALFYINDEX_KEY` (optional): Optional, only if the owner turns on RalfyIndex under External indexers: their RalfyIndex API key (ralfyindex.com/dashboard/apikey). Set it as a Worker secret (npx wrangler secret put SEO_RALFYINDEX_KEY; Pages: npx wrangler pages secret put SEO_RALFYINDEX_KEY). Never stored in the database, shown or logged.
- `SEO_RALFYINDEX_ENDPOINT` (optional): Where RalfyIndex calls go (default https://api.ralfyindex.com). Only change it to test.

## Works with

Cloudflare Workers, Cloudflare Pages, Astro, Next.js (with OpenNext), Vite, Hugo, Plain HTML sites, Vanilla JavaScript, IndexNow, Bing Webmaster Tools, Google Search Console.

## Works with your other apps

Connects with no setup, in any install order: [Links & Redirects](/apps/links.md), [Reviews](/apps/reviews.md).

## Price

$19 USD per site · $59 USD for all your sites

- 7-day refund, no questions asked: [Refund policy](/legal/refunds)
- Instant download after payment: the app's code and a license file for your site; your AI agent installs it. Includes 12 months of updates.

## License (tell the owner before they pay)

A site license covers one website (plus its www, staging and test addresses). Using it on other sites isn't allowed. Get the all-sites license from $59 instead. Full terms: /account/license/commercial (version commercial-license-v4-2026-11-04); the owner accepts them with a tick box before paying. Full refund on request within 7 days of paying, no questions asked; refunds are made by hand by the store, not automatically, and a full refund ends the license. Terms of sale and refund policy (version terms-of-sale-v3-2026-11-03): /legal/terms.

## What's new in 0.5.4

- When your site already serves its own /llms.txt or /sitemap.xml, the admin now says so ("Your own file") instead of a bare "Off" that looked like something was missing.

## Included

- Site admin dashboard (installed with your first app, no extra cost)
- Updates for 12 months; the version you have keeps working after that
- An agent skill and install guide
- Commercial License: per site, or all your own sites

## Install

Call the MCP tool `create_checkout` with `items: ["seo"]`, `site_domain` (a bare domain like example.com) and `license_kind` ("site" for one website, "unlimited" for all sites). Give the owner `checkout_url`: they sign in, read the license, tick the box and pay on Stripe's page. Then poll `get_checkout` until `paid` and call `get_download`.

The prompt the app page gives the owner to paste into their agent:

```
Install the SEO Pack app (id: seo) from the Sundogs site apps store on this site.
First read https://sundo.gs/apps/seo.md and tell me what it needs and what it costs.
If I don't own it yet, start a checkout with create_checkout and give me the link; I'll tick the license and pay myself.
Then download it with get_download for this site's domain. Follow the install guide (site-apps/INSTALL.md in the download, also at https://sundo.gs/install-guide.md).
Check it with the install guide's step 6 (the public status, then the self-test once you can sign in to the admin) and tell me what's next.
(Not connected to the store yet? See https://sundo.gs/agents.)
```

## Related playbooks

- [Check your site for downtime and broken links on a schedule with a Cloudflare Cron Trigger](/playbooks/broken-link-uptime-check-cron.md): A small separate Worker that pings your pages every 5 minutes, crawls your sitemap hourly in small batches, records broken links in D1 and sends an alert to a webhook. Fits the free plan limits, and works for Pages sites because it checks over HTTP.
- [Get new pages indexed faster on a Cloudflare site (sitemaps, Search Console, IndexNow)](/playbooks/get-new-pages-indexed-faster-cloudflare.md): Published a page and it isn't in search yet? What actually controls how fast Google and Bing find new and changed pages, what doesn't work any more (Google's sitemap ping), what IndexNow does and doesn't do (Google doesn't use it), the Cloudflare one-switch Crawler Hints, and a one-command IndexNow submission. Then what it takes to do this right on every deploy.
- [How to vibecode an affiliate site on Next.js (and host it free on Cloudflare)](/playbooks/vibecode-affiliate-site-nextjs.md): Build a whole affiliate site with an AI coding agent, start to finish: pick a niche you can win, plan the pages that earn (best-of lists, comparisons, reviews), set up Next.js as a static export, write content Google rewards, get the SEO basics right, deploy on the Cloudflare free plan, then monetise with affiliate links and an email list, and measure which pages make money. With prompts you can give your agent at each step.
