The previous post covered what AEO is (When Users Start Asking ChatGPT, Can They Still Find You?). This one is about implementation. Online AEO guides routinely list 20 action items — but in practice, 80% of the effect is concentrated in three. Here's what we did on our own site (Next.js App Router + TypeScript).
Why Only Three
We spent an afternoon combing every AEO guide we could find and realized most items fall into two buckets:
- Long game: FAQs, backlinks, E-E-A-T signals — all matter, but none pay off within a week
- Minor gains: Open Graph tweaks, OG images, canonical — things SEO-era sites should do anyway; AEO doesn't amplify their importance
What actually determines whether AI can read you comes down to three things: can it get in, can it understand, does it know when you update. That maps to robots.txt, JSON-LD, and IndexNow.
#1: Let AI Bots Through robots.txt
Most-overlooked of the three. Plenty of companies block everything except Googlebot to "protect content" — the result: ChatGPT, Claude, and Perplexity don't know you exist.
public/robots.txt:
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: Claude-Web
Allow: /
User-agent: anthropic-ai
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Perplexity-User
Allow: /
User-agent: Applebot-Extended
Allow: /
User-agent: *
Allow: /
Disallow: /admin/
Disallow: /api/
Sitemap: https://www.heiso.io/sitemap.xml
A few notes:
Google-Extendedis notGooglebot— it controls what Google can use to train Gemini. List it separately.Applebot-Extendedis Apple Intelligence-specific, only introduced in 2024 — lots of oldrobots.txtfiles don't have it.
#2: JSON-LD Structured Data
This is what makes you readable. Plain-text pages are a blob to AI. JSON-LD hands it the subject–verb–object directly.
Minimum viable version: put Organization + WebSite schemas in your root layout so every page has them.
src/lib/schema.ts:
export function getOrganizationSchema() {
return {
'@context': 'https://schema.org',
'@type': 'Organization',
name: 'Heiso Digital',
url: 'https://www.heiso.io',
description: 'Heiso Digital provides custom software development, enterprise system integration, and AI Agent deployment.',
sameAs: [
'https://www.linkedin.com/company/heiso',
// other social profiles
],
};
}
src/components/JsonLd.tsx:
export function JsonLd({ data }: { data: object }) {
return (
<script
type="application/ld+json"
dangerouslySetInnerHTML={{ __html: JSON.stringify(data) }}
/>
);
}
Drop it into root layout:
// src/app/layout.tsx
import { JsonLd } from '@/components/JsonLd';
import { getOrganizationSchema } from '@/lib/schema';
export default function RootLayout({ children }) {
return (
<html>
<body>
<JsonLd data={getOrganizationSchema()} />
{children}
</body>
</html>
);
}
Run your homepage through Rich Results Test — you should now see the Organization schema detected.
Going further: add Service schema to service pages, SoftwareApplication to product pages, FAQPage wherever you have a FAQ section. But getting Organization right already solves 60% of the "AI doesn't know who I am" problem.
#3: IndexNow for Instant Pinging
Sitemaps are passive — crawlers come when they feel like it. IndexNow is active — when you publish, you ping Bing, Yandex, and Naver to crawl you now. Google isn't on IndexNow, but ChatGPT rides on Bing's index, which makes IndexNow more important for AI search than Google Search Console.
Setup:
- Generate a key (any 32–128 chars): e.g.
heiso-indexnow-2026-xyz789 - Put it as a file:
public/heiso-indexnow-2026-xyz789.txt, content is just the key - Write a notify function:
// src/lib/indexnow.ts
const KEY = 'heiso-indexnow-2026-xyz789';
const KEY_LOCATION = `https://www.heiso.io/${KEY}.txt`;
export async function notifyIndexNow(urls: string[]) {
await fetch('https://api.indexnow.org/indexnow', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
host: 'www.heiso.io',
key: KEY,
keyLocation: KEY_LOCATION,
urlList: urls,
}),
});
}
- Call it when:
- A new blog post is published
- Service page copy is updated
- A new landing page ships
Our own setup wraps this in a single endpoint: POST /api/indexnow/notify. Hit it once and it auto-collects every status: published blog post (zh + en) and the main static pages, then pings Bing in one shot. No URL list to maintain.
curl -X POST https://www.heiso.io/api/indexnow/notify
# {"ok":true,"status":202,"urlCount":32}
status: 202 is the expected response (IndexNow doesn't return 200 — 202 = received and queued). We wire this call into the last step of our blog publishing flow — once an article flips to status: published, we ping. Time from "draft saved" to "ChatGPT knows you exist" compressed to a few minutes.
How to Verify These Three Are Actually Working
Don't assume it just works after deploy — each step has its own test.
robots.txt
curl -s https://your-site.com/robots.txt | grep -E "GPTBot|ClaudeBot|PerplexityBot"
You should see User-agent: GPTBot followed by Allow: — not Disallow:. A blanket Disallow: / blocks all AI crawlers.
JSON-LD
curl -s https://your-site.com/ | grep -c "application/ld+json"
Homepage should have ≥ 2 (one Organization + one WebSite). Or paste your URL into Schema.org Validator to confirm structure.
IndexNow
Check Bing Webmaster Tools — under URL Submission you should see a timestamp for each publish. Or watch the trend of Bing's indexed-page count — the trend matters, not the absolute number.
1–2 weeks later: fact-check with AI engines
After the AI re-crawl cycle (GPTBot, ClaudeBot, PerplexityBot), ask ChatGPT and Perplexity:
- "What does [your company name] do?"
- "What services does [your company name] offer?"
If AI lists your specific services and cites your domain → these three did their job translating you to AI.
New domains can take 1–3 months. The deliverable here is "structure is correct, AI bots can in" — AI citation is a matter of time.
Heiso's Current Status
Applying the same checks to our own heiso.io — two done, third still in backlog:
✅ robots.txt: 14+ AI bots explicitly Allowed
curl -s https://www.heiso.io/robots.txt | grep -E "GPTBot|ClaudeBot|PerplexityBot"
Full list: GPTBot, ChatGPT-User, OAI-SearchBot, ClaudeBot, Claude-Web, anthropic-ai, Google-Extended, Googlebot, PerplexityBot, Perplexity-User, Applebot, Applebot-Extended, Bingbot, BingPreview, CCBot. Verify yourself at heiso.io/robots.txt.
✅ JSON-LD: 2 schemas on homepage
curl -s https://www.heiso.io/ | grep -c "application/ld+json"
# → 2
Organization + WebSite, injected once into every page via src/app/layout.tsx. Verify via View Source.
⏳ IndexNow: not yet (honest disclosure)
curl -I https://www.heiso.io/indexnow-key.txt
# → HTTP 404
This article documents how, but we haven't deployed it ourselves yet — our blog is still ramping up the first few posts, and IndexNow's value is highest for sites with frequent updates, so it sits in the backlog. Including this honestly rather than pretending: "real status = some done, some pending" is more credible than "all deployed, dramatic results."
We'll come back in two weeks to add IndexNow + actual AI-citation verification. A real action item, not article rhetoric.
Closing
AEO implementation can go deep, but the first step is just these three things. The hard part isn't the tech — three lines in robots.txt, ten lines of JSON-LD, a single fetch call for IndexNow — the hard part is deciding how you want AI to understand you. That answer takes thinking. Once you have it, the implementation is a one-day job.
想把這套用在你的專案?
從盤點問題、設計流程到落地實作——Heiso 顧問團隊一起接住