Answer Engine Optimization Checklist: 24 Checks With the Code
This is the implementation companion to What is AEO. That article explains why the answer surface works the way it does. This one is the checklist, in dependency order, with the code you need for each check.
TL;DR
Work the checklist in order, because the sections are dependencies rather than a menu. Access before structure, structure before authority, measurement before any of it. A blocked crawler makes every later check irrelevant, and it is a one-line fix, so checking it first can save you a quarter of misdirected work.
The single highest-yield check is section 1. AI engines crawl with their own user agents, and a robots.txt written for traditional SEO frequently blocks some of them through a rule nobody has revisited. Blocked access is the most common cause of a zero citation rate, produces no error message anywhere, and looks exactly like a content problem from the outside.
Verification is part of every check. A schema block that fails validation is discarded silently, so an invalid block and a missing block are indistinguishable. Each check below includes how to confirm it landed, because in this domain nothing tells you when it did not.
Section 1: Crawler Access (Do This First)
1. Allow each AI crawler by name in robots.txt
Do not assume a permissive wildcard covers them, and do not assume a rule you wrote for scrapers is not catching them. List each agent explicitly:
User-agent: GPTBot
Allow: /
User-agent: ChatGPT-User
Allow: /
User-agent: OAI-SearchBot
Allow: /
User-agent: ClaudeBot
Allow: /
User-agent: Claude-User
Allow: /
User-agent: PerplexityBot
Allow: /
User-agent: Perplexity-User
Allow: /
User-agent: Google-Extended
Allow: /
User-agent: CCBot
Allow: /
User-agent: Applebot-Extended
Allow: /
Two notes. Google-Extended controls Gemini and AI Overviews use and is entirely separate from Googlebot, so blocking it removes you from Google's answer surface while leaving your rankings untouched. Applebot-Extended is likewise separate from Applebot. Each vendor also splits training crawlers from live-fetch agents, GPTBot versus ChatGPT-User being the clearest case, and they serve different purposes: the live-fetch agent is what retrieves a page during an actual conversation, so blocking it costs you real-time citations.
Decide deliberately whether to admit training crawlers such as CCBot. Excluding them is a legitimate business choice. Excluding the live-fetch agents means opting out of being cited at all.
Three matching rules cause most of the accidental blocks in this file, and all three are silent:
Only the single most specific matching group applies. A crawler that finds a group naming its own user agent ignores User-agent: * entirely. So adding a group for GPTBot containing only a Crawl-delay line makes GPTBot stop inheriting your wildcard rules altogether.
User agent matching is a case-insensitive prefix, not an exact string. User-agent: Google matches Googlebot, Google-Extended, and GoogleOther together, so a site trying to opt out of AI training with User-agent: Google plus Disallow: / removes itself from Google Search.
Allow beats Disallow only when its path is longer. Rule order in the file is irrelevant; only path length decides, which is the opposite of how a config file reads.
2. Verify robots.txt actually serves what you think
Fetch it as a crawler would rather than trusting your source file. A misconfigured redirect, a stale CDN cache, or a framework rewrite can serve something other than what you deployed:
curl -sS "https://example.com/robots.txt?cb=$(date +%s)" -H "Cache-Control: no-cache"
The cache-buster matters. Edge-cached responses will happily show you the old file for hours after a deploy, which is how people conclude a fix did not work when it did, or that it did work when it did not.
3. Confirm crawlers are arriving, in your own logs
This is the only proof that access works. Your server logs already record it:
grep -iE 'GPTBot|ClaudeBot|PerplexityBot|Google-Extended|CCBot|Bytespider' access.log \
| awk '{print $NF}' | sort | uniq -c | sort -rn
For reference, our logs for echloe.io over one week in late July and early August 2026 recorded 172 AI crawler visits from 8 bots: ClaudeBot 82, ChatGPT-User 39, GPTBot 31, Bytespider 7, PerplexityBot 7, CCBot 3, Applebot 2, Google-Extended 1. That is a modest site. If you see zero across a week, you have an access problem regardless of what robots.txt says.
Note what that distribution says beyond the total. Eight of roughly fourteen known AI crawlers appeared at all, ClaudeBot alone was 48% of the traffic, and Google-Extended came exactly once. A permissive robots.txt is an invitation nobody is obliged to accept, and if you were ranking engine-specific work by who actually reads your site, the order would not match the engines' user market share.
3b. Check the blocker that is not in robots.txt
The most common real-world block is not in this file at all. Bot-management rules at your CDN or WAF classify traffic before your origin sees it, and an unfamiliar user agent is exactly what they are built to challenge. The signature is distinctive: robots.txt is permissive, the page loads fine in your browser, and the crawler gets a 403, a 503, or a JavaScript challenge it cannot solve.
Test as each bot, not as yourself:
for UA in "GPTBot/1.0" "ClaudeBot/1.0" "PerplexityBot/1.0" "OAI-SearchBot/1.0"; do
printf '%-22s %s\n' "$UA" \
"$(curl -s -o /dev/null -w '%{http_code}' -A "$UA" https://example.com/your-page)"
done
Anything other than 200 here is your problem, and no amount of content work will route around it. Four places cause it, in rough order of frequency: CDN bot rules (Cloudflare Bot Fight Mode, AWS WAF bot control, Akamai Bot Manager, whose verified-bot lists lag new AI crawler launches), rate limiting tuned for humans (the signature is partial, early 200s and later 429s, so the site looks crawled while most of it is missing), country or ASN blocks that catch cloud egress ranges, and security plugins that serve their own robots.txt over the file on disk.
One caution before you whitelist by user agent: crawler user agents are trivially forged, and an allow rule keyed on the string alone publishes a working bypass. Verify the source, with reverse DNS then a forward lookup confirming it resolves back to the same IP for Google and Apple bots, and by published IP range for OpenAI, Anthropic, and Perplexity.
4. Confirm content is in the HTML, not only in JavaScript
Some AI crawlers execute JavaScript inconsistently or not at all. Content that only exists after hydration may be invisible to them even though it renders perfectly in your browser. Check the raw response:
curl -sS https://example.com/your-page | grep -c "a distinctive phrase from your answer block"
A count of zero means the crawler that does not run JavaScript sees an empty page. Server-render or statically generate anything you want cited.
5. Confirm the page is indexable and canonical
An answer engine will not favor a page you have told search engines to ignore. Verify there is no noindex, that the canonical URL points at the page itself rather than elsewhere, and that the URL in your canonical exactly matches the URL you promote, including protocol, trailing slash, and www. A canonical mismatch splits your signals across URLs that each look weaker than the page really is.
The failure worth knowing is inheritance. In most frameworks a canonical set in a shared layout applies to every page under it, so one hardcoded absolute URL in a layout file silently tells every page that some other page is the original. The symptom is a "Duplicate, Google chose different canonical" report in Search Console across pages that have nothing to do with each other. Check the rendered output rather than the template:
curl -sS "https://example.com/your-page?cb=$(date +%s)" \
| grep -oE '<link[^>]rel="canonical"[^>]>'
Exactly one tag, pointing at the page you fetched. Two tags, or one pointing elsewhere, is the bug.
6. Add llms.txt
A machine-readable summary of your site's key content at /llms.txt. It is cheap, increasingly recognized, and gives a model a curated map instead of whatever it discovers by crawling:
# Example Inc
> One-sentence description of what the company does.
Core content
- What is AEO: Definition and implementation guide
- Product: What we build and who it is for
Contact
- [email protected]
Two honest qualifications. No major AI engine has publicly documented llms.txt as a supported convention, so treat it as a cheap option rather than a channel with proven return. And generate it from your existing content rather than maintaining it by hand, because a hand-written file goes stale within a quarter and a stale file points models at 404s. Ours is rebuilt on every deploy from each article's own frontmatter, which keeps the page, the sitemap, and llms.txt agreeing without anyone reconciling three copies.
Section 2: Answer Block Structure
7. Phrase headings as the questions people actually ask
"How Much Does AEO Cost?" beats "Pricing Considerations." The heading is a boundary marker telling a machine what the passage below answers, and a vague heading makes it guess.
| Instead of | Write |
|---|---|
| Overview | What is answer engine optimization? |
| Benefits | Why do AI referrals convert better than organic? |
| Implementation | How do you configure robots.txt for GPTBot? |
| Considerations | Should you block AI crawlers to protect your content? |
| Timeline | How long does AEO take to show results? |
8. Answer in the first sentence beneath the heading
No warm-up, no context-setting, no restating the question. The answer, then the reasoning. This inverts the usual instinct to build toward a conclusion, and it reads better for humans in a hurry too.
9. Make every answer passage self-contained
The test is mechanical. Read a passage with everything else on the page hidden. If it opens with "this means," refers to an undefined "it," or assumes a definition given three sections earlier, it fails, and an engine that lifts it produces something incoherent or skips it.
Four things break it, and all four are invisible while you read the page in order:
Unresolved pronouns. "This grew 527% last year" is meaningless once lifted. Name the subject in every passage, accepting repetition that reads slightly redundant in place. That redundancy is the price of extractability.
Backward references. "As discussed above" and "unlike the first method" point at text that will not travel with the passage.
Sequence dependence. "Second, configure the crawler rules" cannot stand alone, though "Configure crawler rules (step 2 of 5)" survives extraction.
Deictic openers. A paragraph starting "That said" or "However" inherits its meaning from the paragraph before it.
You can find most of these mechanically before a human reads the page:
grep -nE '^[[:space:]]*(This|That|It|They|These|Those|However|That said|Additionally)\b' \
content/blog/your-post.md
Not every hit is a defect, but every hit is worth one look.
10. Target roughly 130 to 170 words per answer passage
Long enough to be complete, short enough to quote whole. Passages substantially longer tend to be truncated at a point you did not choose.
Treat the range as a check after writing rather than a target while writing. It describes the length a complete self-contained answer tends to land at, not a threshold to reach, and optimizing the number directly fails in two ways: padding adds transitions and restatements that lower fact-per-word, and splitting one answer across two passages to stay in range breaks self-containment, which is the property that actually gates extraction. A complete 90-word answer beats a padded 150-word one.
11. Write one explicit definition sentence per key term
Use the pattern [Term] is [definition] in a single sentence. Models extract definitions from this pattern reliably and from a discursive explanation of the same concept much less reliably. Put it first in the section that introduces the term.
12. Include a TL;DR that summarizes rather than teases
Two to four paragraphs stating the actual conclusions. A summary promising insight further down gets extracted as your answer and delivers nothing, which is a worse outcome than not being extracted.
13. Replace generalities with specifics
Every "many companies" and "significantly faster" is an extraction opportunity wasted. Numbers, dates, and named sources are checkable, and models cite checkable claims far more readily. First-party data is strongest here because nobody else has it.
Same facts, twice, to make the rule concrete.
Not citable:
It's also worth noting that this has grown substantially. As we mentioned earlier, the trend has accelerated, and industry analysts expect it to continue.
"This" and "it" have no referent inside the passage, "as we mentioned earlier" depends on absent text, "industry analysts" attributes to nobody, and "grown substantially" is unfalsifiable. There is no sentence an engine can lift.
Citable:
AI-referred traffic to websites grew 527% year over year in 2025, according to BrightEdge. Visitors arriving from AI search engines convert at 4.4 times the rate of traditional organic visitors, per First Page Sage analysis. Despite this, HubSpot's 2025 State of Marketing survey found only 23% of marketers had begun investing in generative engine optimization.
Every sentence names its subject, every number names its source, no antecedents, and any one sentence is quotable alone.
There is a ceiling here worth naming: quoting Gartner makes your passage extractable but leaves you substitutable, because the page an engine most wants for a statistic is the one that produced it. Fifty other pages carry the same number with the same attribution. At least one figure per article should be your own measurement, since a number only you can report gives an engine no alternative source.
14. Use tables for comparisons
Comparative questions are disproportionately common on the answer surface, and a table gives a machine explicit row and column relationships instead of prose it must parse into a structure.
Two rules keep a table extractable. Keep cells to a short phrase or a number rather than a paragraph, since a cell containing three sentences is prose wearing a table's clothes. And make the header row name real dimensions ("Monthly cost", "Engines tracked") rather than vague ones ("Details", "Notes"), because the header is what tells a machine what each column means.
15. Add an FAQ section that answers questions the body does not
Not a restatement of your headings. Use it for the adjacent questions a reader asks next, which is also where conversational follow-up queries land.
The most valuable entries are the ones a competitor would rather not answer: "how long until this works", "does this apply to a site like mine", and "I did all of this and nothing happened". Those are real queries with thin competition, precisely because most pages skip them.
Section 3: Structured Data
16. Add Article schema with honest dates
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "Answer Engine Optimization Checklist",
"datePublished": "2026-08-05",
"dateModified": "2026-08-05",
"author": { "@type": "Organization", "name": "Example Inc" },
"publisher": {
"@type": "Organization",
"name": "Example Inc",
"logo": { "@type": "ImageObject", "url": "https://example.com/logo.png" }
},
"mainEntityOfPage": {
"@type": "WebPage",
"@id": "https://example.com/blog/your-slug"
}
}
dateModified is the field that earns its keep, because generative systems weight recency heavily and cannot see an update you did not declare. Update it when you substantively revise the page, and only then. Touching it without changing anything is a signal you will regret teaching people to distrust.
There is a failure mode upstream of the field itself: check where your publish date comes from. A pipeline that stamps the date at publish time rather than reading it from the content will restamp every page on every deploy, so an article from April advertises itself to Google as hours old and your index loses its chronology. We hit exactly this, and the fix is to source the date from the content's own metadata with the stored value as the fallback, never from the clock. The symptom to look for is a set of articles whose dates cluster at one timestamp that happens to match a deploy.
17. Add FAQPage schema matching your visible FAQ
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "What is an answer block?",
"acceptedAnswer": {
"@type": "Answer",
"text": "An answer block is a passage that completely answers one specific question and makes sense in isolation."
}
}]
}
The text must match what a user sees. Schema describing content that is not on the page is a violation of Google's structured data policies and risks a manual action.
18. Add HowTo schema for procedures
If the page contains ordered steps, declare them. HowTo with step entries gives a machine the sequence explicitly instead of requiring it to infer order from your numbering.
{
"@context": "https://schema.org",
"@type": "HowTo",
"name": "How to configure robots.txt for AI crawlers",
"step": [
{
"@type": "HowToStep",
"position": 1,
"name": "List each AI crawler by user agent",
"text": "Add an explicit group for GPTBot, ClaudeBot, PerplexityBot, and Google-Extended rather than relying on a wildcard.",
"url": "https://example.com/blog/your-slug#step-1"
},
{
"@type": "HowToStep",
"position": 2,
"name": "Fetch the deployed file as a crawler",
"text": "Request robots.txt with a cache-buster and each bot's user agent, and read the status code.",
"url": "https://example.com/blog/your-slug#step-2"
}
]
}
The url per step should point at a real anchor on the page, which requires your headings to have stable ids. A HowTo whose steps link nowhere is weaker than one that lets an engine cite the specific step.
19. Add Organization schema with sameAs
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "Example Inc",
"url": "https://example.com",
"logo": "https://example.com/logo.png",
"description": "One consistent sentence about what you do.",
"sameAs": [
"https://www.linkedin.com/company/example",
"https://x.com/example",
"https://github.com/example"
],
"knowsAbout": [
"Answer Engine Optimization",
"Generative Engine Optimization",
"AI search visibility"
]
}
This is the entity check. sameAs is how you tell a model that these scattered profiles are one entity, which is what lets it attribute to you confidently. Models are conservative about citing identities they cannot resolve, because attributing wrongly is a worse failure than not attributing.
Two rules keep it honest. Only list profiles you control, since a sameAs pointing at an abandoned or misattributed account associates you with content you did not write. And keep knowsAbout to topics your published content actually covers, because the claim is checkable against your own site and an unsupported one reads as a mismatch rather than a boost.
20. Validate every block, and re-validate after deploy
Invalid schema is discarded silently. Use Google's Rich Results Test and the Schema.org validator, then check the deployed page rather than your local copy, since a build step can mangle JSON-LD.
Confirm it is in the server-rendered HTML rather than injected after hydration, because schema that only exists once JavaScript runs is invisible to a crawler that does not execute scripts:
curl -sS "https://example.com/your-page?cb=$(date +%s)" \
| grep -c 'application/ld+json'
A count of zero on a page whose schema validates in a browser means the block is client-side only. Also watch for duplicate conflicting types on one page, which CMS templates emit routinely: both Article and BlogPosting for the same content, or two Organization blocks with different names.
Section 4: Entity and Authority Signals
21. Keep naming and self-description consistent everywhere
Same organization name, same capitalization, same one-sentence description on your site, your profiles, and your listings. A model reconciling three conflicting self-descriptions has three reasons to cite someone whose identity is unambiguous.
Write the sentence once, store it somewhere you can copy from, and use that copy everywhere. Third person with your actual name, not "we", because the sentence travels away from your site and "we" has no referent once extracted. The places to reconcile, and they are usually inconsistent: the schema description, the llms.txt blockquote, your LinkedIn and X bios, your Crunchbase entry, your GitHub organization profile, and your homepage meta description.
22. Make author identity resolvable
An author page with a real biography, not a name string. Then reference it consistently. Anonymous content is harder to attribute and therefore less likely to be cited.
An organization can be the author, which is what we do, and that is a legitimate choice for content produced by a team. What matters is that the author entity resolves to something with a page, a description, and a stable identifier, rather than to a free-text string that appears nowhere else on the internet.
23. Build brand mentions, not only backlinks
Profound's analysis of 11.84 billion citations found roughly 43% pointed at sites the brand does not own, and in pharma and biotech earned media alone supplied 59%. You cannot edit those pages, which makes this closer to public relations than to link building: a different activity with a different owner. Treating authority as one undifferentiated budget line is how this half silently gets nothing.
Two practical consequences. Prioritize by where engines actually look: YouTube correlates with AI citations at 0.737, the strongest among content and social platforms, with Reddit next, which puts video and genuine community participation ahead of guest posts. And accept the timescale, because this is the one part of the checklist that cannot be compressed. Everything in sections 1 through 3 is finishable in a month. This compounds over quarters, and expecting otherwise is why AEO programs get abandoned at week six.
Section 5: Measurement
24. Instrument all three surfaces before optimizing
Three plausible diagnoses, three completely different responses, and they are indistinguishable if you track one metric.
Rankings. Search Console. One trap: the API returns rows sorted by clicks and then truncates at your row limit, so a high-impression page with no clicks can fall outside a small window and disappear from your own reporting. Use a high row limit and sort by impressions yourself before drawing conclusions.
Citations. No console exists. Write down 20 questions a buyer would genuinely ask, run them against ChatGPT, Perplexity, and Google AI Overviews on a schedule, and record whether you appear. Twenty questions across three engines is under an hour a month by hand and is a real baseline. Tools automate the frequency and breadth rather than providing a different signal; we compare them in Best GEO Tools 2026.
Crawler visits. The leading indicator, from check 3. Crawler traffic appears weeks before citations.
Read them together. Heavy crawling with zero citations means access is fine and authority or depth is the constraint. Zero crawling means the models never saw the page and no rewriting will help. Our own reading of these two numbers is 172 crawler visits and a zero citation rate across 54 test queries and three engines, which tells us our constraint is authority, not access. Reporting an unfinished result is more useful than implying the checklist produces citations quickly on a young domain.
Three rules make the citation baseline worth the hour. Fix the wording and never change it, because rewording a query breaks comparability with every prior run. Record which competitors appear, not only whether you do, since a query where three established publishers are cited every time is a different problem from one where the engine cites nothing relevant. And run it before you change anything, because without a pre-change baseline you cannot attribute a later improvement to any of the 23 checks above.
What Search Console cannot tell you
Worth stating plainly, because it drives bad decisions. Search Console reports Google Search: impressions, clicks, average position. It does not report whether ChatGPT cited you, whether Perplexity used your definition, or whether an AI Overview quoted your paragraph without producing a click.
The consequence is a specific failure mode: being cited constantly and being cited never look identical in a standard analytics dashboard. A page quoted in answers that satisfy the user without a click shows the same flat traffic line as a page no engine has ever read. Teams conclude the content is not working and rewrite it, when the instrument simply does not measure the outcome.
Analytics recovers part of it, the fraction who clicked, if you filter sessions by AI hostnames (chatgpt.com, perplexity.ai, gemini.google.com, claude.ai). One warning from our own data before you trust an engagement number: split it by source before drawing any conclusion. A site-wide engagement rate can be dominated by bot traffic arriving as direct, which drags the real channels down and reorders any priority list built on it. Rates by themselves cannot distinguish "bots, filter them" from "AI referral, court it".
What to Do First If You Only Have an Hour
Checks 1 through 3, then check 24. Confirm the crawlers are allowed, confirm robots.txt actually serves that, confirm visits are arriving in your logs, and establish a citation baseline you can compare against later.
That hour tells you which of the remaining checks matter. If crawlers are blocked, fix that and change nothing else, because you may be done. If they are arriving and you have no citations, the work is content depth and authority, which is sections 2 through 4 and a quarter rather than an afternoon.
The free audit at echloe.io automates most of sections 1 through 3 against a URL and returns the findings in priority order, if you would rather not work the list by hand.
How Long Each Section Takes to Show Results
Different checks act through different mechanisms, and the mechanisms differ by an order of magnitude in latency. A single number for "how long AEO takes" describes one of them and omits the rest.
| Section | Mechanism | Observable within |
|---|---|---|
| 1: Crawler access | Bots reach the page | Days, in server logs |
| 2: Answer structure | Live retrieval selects the passage | Days to weeks |
| 3: Structured data | Boundaries and entity become explicit | Weeks |
| Training corpora | Content enters a future model | Months, unobservable directly |
| 4: Authority | Cross-platform recognition compounds | Quarters |
| 5: Measurement | You can tell which of the above happened | Immediately, and it gates the rest |
FAQ
What is the most important AEO check?
Crawler access, by a wide margin. AI engines use their own user agents, and if robots.txt blocks GPTBot, ClaudeBot, PerplexityBot, or Google-Extended, no content or schema work can produce a citation because the content is unreachable. It is a one-line fix, it produces no error message anywhere you would look, and from the outside it looks identical to a content quality problem. Check it first and verify against your server logs rather than your config file. Then check 3b, because the most common real-world block is not in robots.txt at all but a CDN or WAF bot rule returning 403 to crawler user agents on a page that loads perfectly in your browser.
Does blocking GPTBot hurt my Google rankings?
No. GPTBot is OpenAI's crawler and has no relationship to Google. The crawler that affects Google's answer surface is Google-Extended, which controls use in Gemini and AI Overviews and is separate from Googlebot. Blocking Google-Extended removes you from Google's AI answers while leaving your traditional rankings unaffected, which is a real trade to make deliberately rather than by accident. It is also the only bot on the list where blocking has no collateral cost, which makes it the one place a publisher can opt out of AI use without paying for it in rankings.
How long should an answer block be?
Roughly 130 to 170 words. Long enough to answer the question completely without depending on surrounding context, short enough for an engine to quote whole rather than truncating it at a point you did not choose. The length matters less than the self-containment: test each passage by reading it with the rest of the page hidden and confirming it still answers the question. Treat the range as a check after writing rather than a target while writing, because padding to reach it lowers fact-per-word and splitting one answer across two passages to stay inside it breaks the self-containment that actually gates extraction.
Do I need FAQPage schema if my FAQ is already visible on the page?
It helps meaningfully, because schema converts an inference into a declaration. Without it, a machine has to guess where each answer begins and ends from your heading structure. With it, the boundaries are explicit. The requirement is that the schema text matches the visible content exactly; schema describing content that is not on the page violates Google's structured data policies and risks a manual action.
How often should I update dateModified?
Only when you substantively revise the page. Generative systems weight recency heavily, so an honest dateModified on a genuinely updated page is valuable. Touching the field without changing content is the kind of signal that stops being useful for everyone once enough people do it, and it gives you no way to tell your real updates apart from your fake ones. Check where the date comes from as well as when it changes: a pipeline that stamps publish dates from the clock rather than from the content restamps every article on every deploy, which destroys your index chronology and tells Google that a six-month-old post is hours old.
Can I do AEO without any paid tools?
Yes, and all 24 checks above are doable at zero cost. Your server logs provide crawler data. Google's Rich Results Test and the Schema.org validator handle schema validation. Search Console covers rankings. A manual prompt set run monthly covers citations. Paid platforms buy frequency, engine breadth, and retained history rather than a different signal, and they are much easier to evaluate once you know which of the three diagnoses you are dealing with.
I have worked the whole checklist and still have no citations. What now?
Read checks 3 and 24 together, because the pair localizes the problem and nothing else does. Healthy crawl with no citations means access, structure, and schema are all fine and the constraint is authority or originality, which is section 4 and a matter of quarters rather than weeks. Zero crawl means you still have an access problem and should return to 3b before touching content. That is our own situation, for what it is worth: 172 crawler visits a week, 0% errors, and zero citations across 54 queries on three engines. A young domain with a correct configuration can genuinely be at zero, and the honest levers from there are first-party data that makes your pages non-substitutable, and brand presence on the platforms engines actually reference.
Which check gets skipped most often?
Check 24, and it is the expensive one to skip because it is what makes the other 23 legible. Without a pre-change citation baseline there is no way to attribute a later improvement to anything you did, so a team that works sections 1 through 4 for a quarter and then looks at their traffic learns nothing about which part worked. It is also the check that reveals the measurement gap: Search Console cannot see any AI surface, so being cited constantly and being cited never produce the same flat line, and that ambiguity is behind most "our content isn't working" rewrites of content that was working.