We sent eight questions developers ask every week, like how to verify Stripe webhook signatures in Node and which error monitoring tool suits a small SaaS, to OpenAI's model with web search and to Perplexity's API on September 26. OpenAI's side cited 36 URLs. Every one was an official doc, an official GitHub page or a vendor's own pricing page, and not a single Stack Overflow thread, Reddit post or dev.to tutorial made the cut.
Perplexity went the other way on the commercial questions. For error monitoring it listed 19 sources, and none was a vendor's pricing or product page. The vendor pages it did include were blog roundups, four of them from Rollbar's blog.
If you market a developer tool, those two results are most of the brief. The engine with the tightest sourcing quotes your docs and pricing pages, and third-party coverage decides the rest. The developer AI search workflow below starts with the docs and ends with a weekly check you can run from a terminal.
What the engines cited for eight developer questions
Here's the full run, one call per question per engine:
| Question | OpenAI with web search | Perplexity API |
|---|---|---|
| Verify Stripe webhook signatures in Node | 2, both Stripe docs | 16, about a quarter Stripe docs |
| Best Postgres hosting for a startup | 7, each a vendor's own page | 19, mostly third-party blogs |
| Supabase vs Firebase for a mobile app | 8, all from the two vendors | 17, one Supabase page, the rest third-party |
| Rate limiting a Next.js API route | 3, all official docs | 17, docs mixed with GitHub and tutorials |
| Best error monitoring for a small SaaS | 5, all vendor pricing pages | 19, no vendor pricing or product page |
| Using the OpenAI Responses API with tools | 3, all OpenAI docs | 19, mostly official docs |
| Vercel vs Netlify for Next.js | 5, all from the two vendors | 19, about a third official |
| GitHub Actions for a monorepo | 3, all official | 18, about a quarter official |
Read the Perplexity column with one caution. Its API returned 16 to 19 URLs per answer against OpenAI's 2 to 8, so the list looks closer to everything Perplexity retrieved than to the handful of sources it leaned on. Even so, OpenAI's column contains no third-party page at all.
The how-to rows agree across engines: official docs show up in every one. It's the same pattern we found across B2B buying questions, where whoever owns the answer gets cited.
Step 1: Write docs pages around the task and the error
Stripe's page for this is titled "Resolve webhook signature verification errors," and a few paragraphs down it quotes the exact "Webhook signature verification failed" message a developer would paste into a search box. OpenAI's model cited that page and the Node version of Stripe's webhook guide.

That page gets several things right, and you can copy them without a docs platform migration:
- One task per page, titled the way a developer would describe the problem.
- The exact error strings your product emits, in plain text.
- Code for each language, on URLs an engine can cite, like Stripe's
?lang=nodevariant. - The API or SDK version the page applies to, stated near the top.
Then fetch the page with curl and search the raw HTML for your first code sample. If it only appears after JavaScript runs, some crawlers will never see it.
Step 2: Give coding agents a markdown copy
Look at the toolbar under Stripe's heading in that screenshot: "Copy for LLM" and "View as Markdown." Add .md to a Stripe docs URL and you get the page as markdown. We checked docs.stripe.com/webhooks/signature.md on September 26 and got a clean 4.9 KB markdown file. Supabase does the same for its guides, and Cloudflare's docs for agents describe both the .md suffix and Accept: text/markdown requests.
The llms.txt files sit on top as indexes. Stripe's is a 92 KB markdown map of its docs. Supabase's is a 2.7 KB index that points to a 7 MB llms-full.txt and to the .md version of each guide, while Cloudflare's root file links to a separate llms.txt for each product.
Don't expect the index to bring traffic by itself. In an r/SaaS thread asking whether founders use llms.txt, one founder said they shipped the file on July 31 and found zero AI sessions in a 28-day GA4 window.
When another commenter pointed out that GA4 can't see a raw file fetch, they checked nginx logs back to July 1 and found 70 requests. Their own curl checks made up 32 of them and site scanners most of the rest, and a single fetch came from an AI tool, with a claude-code user agent.
Are any founders actually using llms.txt?
I’ve been reading more about llms.txt and I’m curious how founders are actually using it. If you’ve added one to your startup: What do you include in it? Do you write it manually or generate it? Have you noticed any difference in ChatGPT, P...
We'd ship the .md pages before the llms.txt. When a developer asks a coding agent about your API, the agent fetches a page, and a markdown copy of that page is what it can use. Our llms.txt review covers the file itself.

Built by the team that got cited in 48 hours.
Content generation, backlink building, AI visibility tracking, and Google rankings. One platform, zero guesswork.
Step 3: Put your prices and comparisons on your own site
For "best Postgres hosting for a startup," OpenAI's model built its answer from seven vendors' own pages, including AWS's RDS pricing page and Crunchy Bridge's plans page. For "Supabase vs Firebase," it cited both vendors' docs and pricing and no third-party comparison at all.
Two of the Supabase pricing URLs it cited still carried tracking tags from where the model found them, one from a LinkedIn article and one from a tools directory. So the model reads third-party pages on the way, then cites the vendor's page for the facts. If your pricing hides behind a sales form or loads with JavaScript, the comparison gets built from your competitor's page.
Perplexity rewards a different asset. Its sources for the commercial questions were mostly roundups and comparison posts, and Rollbar's blog shows up four times in the error monitoring list, with posts on Sentry alternatives, Bugsnag alternatives, APM tools and its own alternatives. No other domain appears more than once in that list.
So keep plans, prices and limits in plain HTML on your pricing page, and publish head-to-head comparison pages against the tools your buyers weigh you against.
Step 4: Write the roundup Perplexity reads
Perplexity's Postgres answer shows the other half of the job. Its 19 sources included roundups that vendors published themselves, on Railway's blog, Northflank's blog, Fly.io's learning pages and three education pages from Instaclustr. When the answer suggested Railway or Northflank for startups that want app hosting next to the database, the two sources behind that line were Railway's and Northflank's own posts.
Any devtool can run that play. Write the category roundup yourself and include the tools buyers compare you with. Give real prices, say where each one fits, including where yours doesn't, and date the post, since a roundup with last year's prices gives the engine a reason to prefer someone else's.
Step 5: Run a weekly citation diff
This is the developer part of the workflow, and it's small. We call it a citation diff: the same questions every week, the cited URLs saved to a file, and a diff against last week's file. A lost citation or a new competitor URL becomes a docs ticket and goes in the same queue as your other docs bugs.
Start with 20 to 50 questions pulled from support tickets, GitHub issues and your community channel. Then run each one through both APIs:
Q="How do I verify Stripe webhook signatures in Node?"
curl -s https://api.openai.com/v1/responses \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg q "$Q" '{model:"gpt-5.5",tools:[{type:"web_search"}],input:$q}')" \
| jq -r '[.output[] | select(.type=="message") | .content[].annotations[]?.url] | unique[]'
curl -s https://api.perplexity.ai/v1/agent \
-H "Authorization: Bearer $PERPLEXITY_API_KEY" \
-H "Content-Type: application/json" \
-d "$(jq -n --arg q "$Q" '{preset:"fast",input:$q}')" \
| jq -r '[.output[] | select(.type=="search_results") | .results[].url] | unique[]'
Perplexity set September 27, 2026 as the end of support for its older Sonar chat completions endpoint, which is what our test used, so the snippet above calls its Agent API instead.
Append the output to a dated file, then diff it against last week's. Two runs of the same question on the same day can differ, so act on URLs that stay gone for two weeks, not one. Also remember that API answers approximate the ChatGPT and Perplexity apps without matching them exactly.
Building this takes an afternoon. Reading the diff and filing fixes takes about an hour a week for 30 questions, longer once you add more engines.
See your first AI citation report in under 5 minutes.
No setup calls. No onboarding meetings. Connect your domain and see where AI mentions your brand right now.

Where RankControl fits in a terminal workflow
You can keep running the script yourself, and for one product and two engines it works fine. Or RankControl can run the checks for you. AI visibility tracking asks up to 50 of your questions every week on seven engines, including ChatGPT, Perplexity and Claude, and shows which sources each engine quoted and which competitors got named instead of you.
It stays in the terminal if that's where your team works. npx rankcontrol citations --model chatgpt lists tracked citations, and npx rankcontrol sources --days 30 shows which domains got cited. Claude Code connects with claude mcp add rankcontrol -- npx rankcontrol mcp, and anything with a public side effect, like publishing an article, stays a dry run until you confirm it. The MCP page has the full setup, and our guide to running SEO from Claude Code and Cursor covers the day-to-day prompts.
For a quick baseline before any of that, run a free check of your brand in AI answers.
Your competitors are building backlinks while you read this.
Organic outreach, social mentions, and citations from Editorial Circle member sites, with managed backlinks available as an add-on. Grow your domain authority without running the campaign yourself.










