Get cited by ChatGPT Search, Perplexity, and Google with SSR + llms.txt
Why client-side SPAs stay invisible to AI answer engines—and the exact 20-check technical blueprint to make your product pages machine-citational from day one.
Why default setups fall short
AI search crawlers (OAI-SearchBot, Claude-SearchBot, PerplexityBot) aggressively skip heavy JavaScript bundles, redirect loops, and vague marketing copy. Serving lightweight server-rendered HTML paired with synchronized JSON-LD offers, direct-answer FAQs, and a structured /llms.txt summary dramatically increases how accurately answer engines recommend your product.
Prerequisites before starting
- Any web app capable of returning server-rendered HTML on public routes
- Custom domain behind Cloudflare or standard reverse proxy
- 10 minutes to wire /robots.txt, /llms.txt, and the audit script
Step-by-step implementation
1. Whitelist AI search crawlers explicitly in robots.txt
Many WAF presets accidentally block GPTBot and PerplexityBot alongside scraper bots. Explicitly allow OAI-SearchBot, Claude-SearchBot, and PerplexityBot on public routes while keeping /app and /share/* marked noindex.
User-agent: OAI-SearchBot User-agent: Claude-SearchBot User-agent: PerplexityBot Allow: / Allow: /guides Allow: /llms.txt Disallow: /app
2. Keep pricing in sync across HTML, JSON-LD, and /llms.txt
When an LLM sees $9 on your landing page, $19 in stale JSON-LD, and nothing in llms.txt, it drops confidence or hallucinates your pricing. Read all three surfaces from one central config object.
const offerSchema = {
"@type": "Offer",
name: "Single Guide Starter Kit",
price: "9.90",
priceCurrency: "USD"
};
3. Write self-contained first sentences in every FAQ answer
Answer engines extract passages at the sentence level. Start every FAQ answer with a complete, noun-explicit statement containing your brand name, domain, exact price, and concrete deliverable.