GEO-013·Issue 02·Technical Foundation·13 / 132

A Complete AI Crawl Audit: From robots.txt to Server Logs

A five-gate crawl audit for cross-border stores: prove where AI access actually fails, using server-log evidence, three common misreads, and a two-week plan.

5 min readGEOTechnical Foundationcross-border

Issue focusGet Seen First: Crawling, Rendering, and AI Bot Accessibility

Thursday morning in Berlin, a small-space furniture brand pushes a new balcony table live on its German storefront. The growth lead types the question a customer would type — a 60 cm balcony, room for two chairs, folds flat — into ChatGPT and gets four brands back. Hers is not one of them. Engineering opens the live robots.txt: three groups, every one Allow. Nobody touched the template. Both are right, and one question still has no owner: did anything read that product page to the end?

A crawl audit is not a review of robots.txt. It is proof of which of five gates — allow, reach, render, parse, index — is closed, and that proof lives outside the config file.

robots.txt passing clears one gate, not the audit

robots.txt is a preference file. RFC 9309 defines its syntax, not its enforcement: ignoring it breaks no lock. It answers whether a crawler may come — not whether anyone returned or could read the page.

The other four fail in unrelated ways: a WAF returns 403 for a client it misreads, a client-rendered storefront returns 200 with no price, a template ships its size chart as an image, a page sits outside the sitemap. From outside, all four look alike — you are missing from the answer, so the symptom cannot name the cause.

The usual wasted sprint: three weeks rewriting above-the-fold copy because “the model does not understand us yet”, while a bot rule on one template returns 403. Who crawls and what they got are separate questions; the AI crawler map is this audit’s input, not its substitute.

Five gates, five kinds of evidence

GateHow it failsEvidencePasses when
Allowwildcard group catches a product template; a partial ships noindexthe live file, saved and read group by groupretrieval agents inside an allow group on public pages
Reach403 or 429, geo-block, verification pagein-market IP with the agent’s user agent; status, headers200, and the body is the product page
Render200, but price and specs wait for JavaScriptJavaScript off, diffed against the rendered DOMtitle, price, variants, stock visible without JavaScript
Parsespecs inside images; structured data contradicting the pageProduct and Offer validation, feed fields against the pageentity, price, availability agree in all three
Indexcrawlable, rarely revisited; new URLs missing from sitemapserver logs by path; sitemap lastmodrepeat visits to core templates; new URLs land same day

Only the first gate closes with a configuration change; the rest demand outside evidence — a status code, a log line, a rendered DOM. A report without it is a suspicion list. Order is a cost argument: config, then templates and pipeline, then sitemap and links — which is what stops a team rewriting copy to fix a firewall rule.

Three misreads that void the work

Trusting the user agent. The UA is the easiest field to fake. Two checks hold: forward-confirmed reverse DNS and the operator’s published IP ranges. Fail both and it is an unknown crawler: throttle it, never allowlist a string.

Reading 200 as read. A client-rendered storefront answers 200 and fills the body later. Only a no-JavaScript fetch exposes it, as in whether AI can render your store.

Judging recovery from one screenshot. Answers shift by region, account, and hour: fix a prompt set, wait days, rerun it. Keep arrival and citation apart — a log proves a fetch, not a mention — and score both against an AI visibility baseline.

Two weeks, four steps, one page

StepActionOwnerPasses when
1 Sampleone market, one template, 20 URLs (new, variant, out-of-stock); 90 days of logs by agent, path, statusEngineeringtop five agents and the paths they fetch
2 Gatherfour requests per URL: in-market IP, bare agent, JavaScript off, a normal browser; log status, first screen, priceEngineeringa four-column row per URL
3 Attributename exactly one gate; if you cannot, the evidence is thin, so collect moreTech leadone gate per row, no “possibly”
4 Reportfixes with URLs for engineering, a fixed prompt set for growthGrowthin two weeks, what changed or why nothing did

Step 3 is where audits die: five suspected causes per template produce a wish list, and engineering fixes the cheapest one, not the closed gate. Attribute one gate, or leave the row blank.

The report stays on one page: template, failing gate, evidence, owner, retest date. No “likely”. A blank row is the next evidence task.

Example: three faults stacked on one template

Example — a hypothetical DTC seller of portable power stations shipping into the US; no real brand, no invented figures. The audit found three gates closed at once: robots.txt allowed everything; a WAF headless-browser rule returned 403 to a retrieval agent on the product template; price was injected client-side, so a no-JavaScript fetch showed a loading state. Fix order was the WAF rule, then a server-rendered price, then sitemap entries. Retested with the same ten questions, the domain began appearing in answers.

The order is the lesson: the WAF change took an hour and made the other two measurable; a server-rendered price first would have changed nothing.

Where this breaks

Marketplaces get little from this. On Amazon or TikTok Shop, AI reads listings, reviews, and fulfillment; fix the feed first. A brand that refuses training restates the goal as “retrieval allowed, training denied” and reports the two separately. Under roughly fifty SKUs the index gate barely exists: run the no-JavaScript and WAF checks and skip the dashboard. If crawling already slows the origin, add rate limits and caching — an audit does not reduce load.

Time is the last limit. Rules, templates, CDN settings, and front-end frameworks reset a gate on deploy: treat this as a quarterly check or a product-template release gate, not a project with an end date. For why the entry point moved, see how AI search splits e-commerce traffic; the rest of the line is on the technical foundation hub.

This month: one market, one product template, 20 URLs. Fetch them from an in-market IP with a retrieval agent’s user agent, then again with JavaScript off. Record status, first-screen text, and price visibility in one sheet. If those columns are not full, do not schedule the content calendar.