Pilcrino
Blog · 16 min read

llms.txt and pricing.md for SaaS: What I Shipped and Why

llms.txt and pricing.md for SaaS: What I Shipped and Why

On 19 September 2026 I asked Perplexity what pilcrino.com sells and what it costs. It found the site and got the licence terms right, but said it couldn’t tell what kind of software it was and reported no price, although the price sits in plain HTML on the home page. That gap is what llms.txt and pricing.md for SaaS sites are meant to close. llms.txt is a plain-text file at your site root that tells AI tools what your site is and which pages matter. pricing.md is a plain copy of your price list next to it.

The evidence says AI tools rarely read llms.txt, and nothing measures pricing.md, so I treat both as a cheap bet to measure, not a switch. I built both as routes on pilcrino.com, the pre-launch site you’re reading, generated from the site’s own product facts and posts rather than kept by hand.

They’re one small input to a bigger job: getting ChatGPT to name your SaaS, not just cite it.

Below: what the evidence says, both files line by line, how to serve them, how to keep them honest, and the 60-day test.

What llms.txt and pricing.md Do, and What the Evidence Says

llms.txt comes from the llms.txt proposal by Jeremy Howard, first published on 3 September 2024 and updated to version 2 in August 2026. It’s a Markdown index of your site for AI tools: a name, a short summary, and lists of the links worth reading.

pricing.md isn’t a standard at all. It’s a convention some SaaS companies adopted, a plain Markdown copy of the pricing page, and Resend and Buffer both serve one.

Here’s the evidence, one source per line:

Google doesn’t speak with one voice here, though. Chrome’s Lighthouse audit tool added an agentic-browsing check that looks for llms.txt, and Mueller wrote on r/SEO: “When an AI platform that brings you clients complains that it needs the file for your site, then I’d recommend taking the time to create one.”

Every number above is about llms.txt. Nothing published measures pricing.md. Neither file matters if the assistants can’t fetch your site, so let ChatGPT’s and Perplexity’s search bots in first.

So who are these files for?

Agents that already know your site. They won’t get you discovered; content about your product does that, which is why posts about your product still matter when AI answers the query.

Skip both if you won’t keep them in sync (Step 5). Skip pricing.md alone if your price is already plain text in the page’s HTML (Step 3).

Step 1: Ask the Assistants About Your Product First

Without a before, any later answer means nothing. u/Downtown_Item_9996 on r/SaaS gave the right frame: “Treat llms.txt as a controlled discoverability experiment, not an SEO switch.” In the same thread, a founder who had shipped one reported: “The GA4 window we pulled is the last 28 days, wider than the file has been up, and there are zero sessions from any AI source anywhere in it.”

Baseline log: two Perplexity questions from 19 Sep 2026 with identified, describes, price outcomes

I asked Perplexity two questions, signed out, on 19 September 2026 at 20:35 UTC, before either file existed:

  1. “What is Pilcrino and how much does it cost?” It didn’t identify the product: “I don’t have enough information to identify which Pilcrino you mean.”
  2. “What does pilcrino.com sell and what is its price?” It found the site and the licence terms: a lifetime licence, 12 months of updates and support, one-time payment. It also said “we can’t definitively say what kind of software it is (e.g., AI tool, utility, plugin, etc.)” and that “the search results that mention pilcrino.com do not include a specific price figure”.

My read, which is a hypothesis and not a finding: Perplexity answered from search results about the page, and those results carried the licence line from the FAQ but not the product description or the price.

I haven’t asked ChatGPT. It has no before in this baseline, so at day 60 only Perplexity gives a before-and-after comparison; ChatGPT’s answer will be a first reading, not a change.

How do you run yours?

  • Write 2 to 5 questions a buyer would ask: what is X, what does X cost, X vs a competitor.
  • Ask each assistant signed out.
  • Paste every answer into a sheet with the date.
  • Keep the questions fixed. Change the wording and you’re measuring something else.

Step 2: Write llms.txt

The format, per the proposal:

  1. An H1 with the site name. It’s the only required part.
  2. A blockquote with a short summary.
  3. Optional paragraphs or lists, with no headings.
  4. H2 sections of links, each written as [name](url): note.
  5. An H2 called “Optional” for links an agent can skip when it’s short on room.

Here’s pilcrino.com’s file, trimmed to one blog link and with the price figure taken out. The live file lists every post:

# Pilcrino

> Pilcrino is an AI blog writer that runs on your own computer. It plans topics, researches each post through your browser, writes in your voice, makes the images and prepares the post for your site, using the Claude plan you already pay for. It costs [price] once, with no new subscription.

Pilcrino is for founders who have something to say about their product and want it written well. Docs, drafts and credentials stay on the owner's computer. Posts are researched from Google, Reddit and X with sources cited, reviewed, and published only after the owner approves them.

## Product

- [Home](https://pilcrino.com/): what Pilcrino does, how it works, and the questions buyers ask
- [Pricing](https://pilcrino.com/pricing.md): the licence, what it includes, and the other costs
- [About](https://pilcrino.com/about): who builds Pilcrino and how its blog is written

## Blog

- [Starting a SaaS Blog in 2026: What to Expect by Day 90](https://pilcrino.com/blog/launching-a-saas-blog-in-2026-zero-click): Starting a SaaS blog in 2026 means planning for fewer clicks. Five steps, a one-sheet scoreboard, and my public bet on this blog's first 90 days.
...

## Optional

- [RSS feed](https://pilcrino.com/blog/rss.xml)

Annotated llms.txt excerpt: summary, Product links, flat Blog list, near-empty Optional section

The decisions behind it:

  • The blockquote leads with what Pilcrino is and what it does, then what it costs. The baseline answer couldn’t say what kind of software it was, so the description comes first.
  • The plain paragraph under it answers the next three questions: who it’s for, where your files stay, where the research comes from.
  • Under “## Product”, the Pricing link points at /pricing.md, not at the pricing section, so an agent that follows it gets Markdown instead of a page.
  • The note after each “## Blog” link is that post’s own meta description, not a line written for the file. One less sentence that can drift.

So what’s missing?

What it doesn’t do is rank anything. Every post sits flat under “## Blog”, newest first, nothing marked as more worth reading than the rest, and “## Optional” holds a single item. Optional exists so an agent short on room knows what to skip, and mine barely gives it anything. A flat list with no ranking is the file’s ceiling.

Step 3: Write pricing.md, or Fix the Pricing Page Instead

A pricing.md earns its place when a machine can’t read your pricing page. That happens when the price is:

  • rendered by JavaScript
  • shown as an image
  • hidden behind a monthly/annual toggle
  • replaced by “contact sales”

@shannholmberg on X put the cost bluntly: “if your pricing is a JavaScript widget or an image, the agent cannot read it, so it recommends the competitor whose page it could”.

If you can change the page, putting the price in plain HTML fixes this for every reader, not only agents. pricing.md is the fallback when you can’t.

So when should you skip it?

When your price is already plain text in the page’s HTML. pilcrino.com is that case: a free plugin and one paid app, prices in static HTML. I keep a pricing.md anyway, because the baseline answer still said its results had no price figure, and a two-product file that rebuilds itself costs nothing to keep.

Two public files are worth copying. Resend serves its pricing as Markdown: an H1, a one-line summary, then an H2 per product with a plan, price, volume and overage table, and one plain sentence on how overage works. Buffer’s opens with a blockquote naming the source page and the product, then gives each plan an H3 with its limits.

Here’s pilcrino.com’s, with the opening summary cut short and the price figures taken out:

# Pricing: Pilcrino

Pilcrino is an AI blog writer that runs on your own computer. ...

## The plugin

- Price: free. MIT licensed.
- What it does: a content plan from research, research with sources, a draft and a separate review, images in your style, and the post opened as a pull request.

## The app

- Price: [price] USD, one-time payment. [launch price] for the first 50 buyers. No subscription.
- Includes: 12 months of updates and support. The version you have keeps running after that.
- Status: waitlist.

## What else you pay

- Your Claude plan. Pilcrino runs on it. No API key and no other subscription.
- One exception: AI illustrations need a Codex login or an image API key.

## Limits

- At your plan's limit the app pauses, then resumes when the limit resets.
- Pilcrino runs on your own computer, so the computer must be on while it writes. macOS only today.

## Platforms

- Sites built from a GitHub repository, WordPress as a draft, and a paste-in file for the rest.

Source: https://pilcrino.com/pricing

I left the numbers out here because prices change and this post shouldn’t go stale. The live pricing.md has it.

Annotated pricing.md excerpt: licence bullets with a price placeholder, extras, limits, source line

The decisions:

  • The first block answers the buying question in three lines: the cost and how it’s billed, what the licence includes, and where the product stands today.
  • “What else you pay” names the AI plan it runs on, says there’s no API key and no second subscription, and gives the one exception, AI illustrations. Leave those out and the price looks lower than it is.
  • “Limits” says what it can’t do: roughly how many posts a standard Claude plan handles in a day, that it pauses at your plan’s limit, that your computer has to be on. An assistant repeating a capability you don’t have is worse than silence.
  • The last line, Source:, points at the home page. If the file and the page disagree, the page is right.

Two things mine doesn’t have, and you may want both. A date at the top, so any reader can tell how old the facts are, and a table once you have more than one plan, so every number sits next to a label and a billing term.

Both files go at the site root: /llms.txt and /pricing.md. After deploy, check that each URL returns a 200 with the file, not your 404 page wearing a 200 status.

There are two ways to get them there. Drop a static file in whatever folder your host serves as is, public/ on an Astro site: one file, edited by hand, nothing to debug, and that’s what most sites should do. Or generate them as routes from data the build already has.

pilcrino.com does the second, generating both from one small facts file and the same posts the blog page renders. The post list can’t go stale, and the two files can’t disagree with each other about the price. The page states it in its own copy, so that one still changes in the same pull request.

The cost: you can’t read either file in your repo, or fix a typo without a deploy.

Then set the content type, the header that tells a client what kind of file it’s getting: text/plain; charset=utf-8 for llms.txt and text/markdown; charset=utf-8 for pricing.md, so no tool has to guess. pilcrino.com runs on Netlify, so the rules sit in a _headers file that ships with the built site:

/llms.txt
  Content-Type: text/plain; charset=utf-8

/pricing.md
  Content-Type: text/markdown; charset=utf-8

Does linking matter?

More than the file. Ahrefs found that “AI tools fetch llms.txt when a link, an index, or a user instruction tells them it exists,” and that “Zero requests came from AI bots for llms.txt files that don’t exist. They never go looking.”

So link pricing.md from llms.txt, as mine does. Resend’s pricing page goes further, with a visible “Are you an AI agent? See pricing” button pointing at its Markdown copy. pilcrino.com doesn’t have one yet.

To check both after a deploy:

curl -sI https://pilcrino.com/llms.txt | grep -iE '^(HTTP|content-type)'
curl -sI https://pilcrino.com/pricing.md | grep -iE '^(HTTP|content-type)'

You want a 200 and the content type you set, for each file.

Step 5: Keep Both Files in Sync With the Real Page

The real risk isn’t that nobody reads the files. It’s a second copy of your price that nobody looks at. Mueller said it on the podcast about Markdown copies of pages, which is exactly what pricing.md is: “as soon as you have these parallel versions of your content, then everything becomes so much more complex… if the LLM version of a page doesn’t load properly, then no user is going to tell you that something is broken.”

@DuaneForrester made the sharper point on X: “llms.txt can’t tell an AI that Feature X was deprecated, or that your pricing changed last month. It’s a flat list with no graph.”

He’s right. It can’t. That’s why the Source: line is there, and why both files read the price from one facts file and can’t drift from each other. The page states it in its own copy, so that one is still mine to keep level. A deprecated feature is still on me to write down.

Who notices when it drifts?

Nobody, unless your process forces it. The rule I use:

  • One source of truth for product facts.
  • Generate both files from it, or change them in the same pull request as the pricing section.
  • Re-run the curl check after the deploy.

On this site there’s one more copy to keep honest. The pipeline that writes this blog’s posts works from the blog’s product profile, so a feature or pricing-model change lands in that profile first, then in the page and both files.

Step 6: Re-Run the Same Questions in 60 Days

Sixty days after that baseline, I’ll ask again:

  1. The same two questions, word for word.
  2. The same assistant, signed out.
  3. For each answer, a log: identified yes or no; what it says the product does; whether it states the price and gets it right; whether llms.txt or pricing.md is among its cited sources.

What would count as a change?

The product described correctly, or the price stated, with one of the two files cited. A better answer with no file cited wouldn’t count, because the site also gains posts in those 60 days, and the posts alone could explain it.

I don’t have the result yet. The follow-up goes on this blog after the 60 days, in the same format as my day-90 bet for this blog.

Everything above works by hand, with a text editor and a spreadsheet. If you’d rather have posts about your product written in your voice, researched from real sources and checked before anything publishes, join the Pilcrino waitlist. The plugin is free; the app is $199 once, $129 for the first 50, with 12 months of updates and support.

Researched and drafted with Pilcrino. Approved by Slav.

FAQ

Does llms.txt help you show up in Google’s AI Overviews?

No. Google’s documentation for AI Overviews and AI Mode says you don’t need to create new machine readable files, AI text files or markup to appear in them. If Google is your goal, spend the time on the pages themselves.

Do ChatGPT and Claude read llms.txt?

Sometimes, when something points them to it. In Ahrefs’ study, OpenAI’s GPTBot and Anthropic’s Claude-Code agent were the top named AI fetchers of llms.txt files, but 97% of the files got no requests at all in May 2026. AI tools fetch the file when a link, an index or a user instruction tells them it exists.

Is pricing.md an official standard?

No. It’s a convention a few SaaS companies use, Resend and Buffer among them, and it isn’t part of the llms.txt proposal. Nothing published measures whether it changes AI answers yet, so treat it as a plain Markdown copy of your pricing page, keep it in sync, and check the result yourself.

What should a pre-launch SaaS put in pricing.md?

The status first: not on sale yet, and how to join the waitlist. Then the planned pricing model if it’s public, what the licence or plan includes, and what else a buyer pays for, such as the AI plan or hosting your product depends on. Put a “Last updated” date at the top so any reader can tell how fresh it is.

Can I just generate llms.txt with an AI tool?

Yes, as a first draft. Then edit it by hand, because the file is only useful if every fact in it is true. Google’s John Mueller made the point on Reddit: if an LLM can create the file for you, it could create it for itself. So the value is in the facts only you can confirm: what works today, what’s coming, and what it costs.

All posts