BlogFindings
Cloudflare will generate your robots.txt, and its token list changes without you
Cloudflare announced Bot Preference Sync on 21 August 2026: a setting on every plan that writes your AI bot policy for Search, Agent and Training into robots.txt, prepends it above whatever file you already have, and refreshes the crawler names inside it from Cloudflare's own bot database. RFC 9309 says a crawler merges every group matching its token and reads the wildcard group only when none matches, so a prepended group changes which rules a named crawler obeys.
That is a description rather than a complaint, and the problem the feature sets out to fix is real and well documented. What follows reports what the announcement says, then works out what a generated and periodically refreshed block does to the file underneath it, using the matching rules in the robots exclusion standard rather than an opinion about vendors. Lantad has not tested Bot Preference Sync and could not have, because Cloudflare says it reaches all plans in the week after the announcement. What Lantad has tested is the older and more stubborn problem the feature is aimed at, which is what a server does when a crawler actually knocks.
In short
- Cloudflare announced Bot Preference Sync on 21 August 2026, a setting available from the Free tier to Enterprise that generates or updates a site's robots.txt from the AI bot policy already configured for Search, Agent and Training, and that is on by default for new customers.
- The announcement states that where a robots.txt file already exists the generated contents are prepended to the existing material so any existing Disallow directives are maintained, bounded by the comment lines BEGIN Cloudflare Bot Preference Sync and END Cloudflare Bot Preference Sync.
- The crawler names inside that block are not fixed: Cloudflare states it will use the bots it tracks in BotBase to periodically update the list added to robots.txt, so the file's contents change without a commit, a deploy, or an edit by the site owner.
- RFC 9309 section 2.2.1 requires a crawler to combine every group matching its product token into one group, and to obey the group with a wildcard user-agent line only when no group matches its own name, so a prepended group naming a crawler stops that crawler reading the wildcard rules a site wrote for everyone.
- Lantad has tested none of Cloudflare's feature. What it has measured, from the golden fixtures it captured on 15 July 2026, is the condition the feature targets: robots.txt permitted the crawler in all 60 user agent probes run against five real pages, and 11 of those probes came back unlike the baseline fetch.
| Bot category | Options stated | Default for a new customer | Reaches robots.txt |
|---|---|---|---|
| Search | Allow, Block on pages that serve ads, Block everywhere | No block applied | When set to Block |
| Agent | Allow, Block on pages that serve ads, Block everywhere | No block applied | When set to Block |
| Training | Disallow, described as writing a no training preference | No block, except sites that select the ads option, which default to Disallow | When set to Disallow |
What does Cloudflare's Bot Preference Sync actually do?
Cloudflare's announcement, published on 21 August 2026 under the byline Jin-Hee Lee, describes a setting that keeps robots.txt reflecting the AI bot preferences a customer has already set on the zone level dashboard. Three categories are covered: Search, Agent and Training. For Search and Agent the three options Cloudflare announced on 1 July 2026 remain, which the post gives as Allow, Block on pages that serve ads, and Block everywhere. For Training the post describes refining the option with Disallow, which writes a no training preference into the file.
The mechanics are stated plainly enough to quote. Where a site already has a robots.txt file, the announcement says the contents added by Bot Preference Sync will be prepended to the existing material, so any existing Disallow directives are maintained. The generated block is bounded by two comment lines, BEGIN Cloudflare Bot Preference Sync and END Cloudflare Bot Preference Sync, and the worked example in the post shows four User-agent lines followed by a single Disallow slash inside those markers. The names in that example are placeholders which the post says have been shortened and anonymised.
Availability and defaults matter as much as the mechanism. The post says the feature is available to all customers from the Free tier to Enterprise, that it will be on by default for all new customers, and that existing customers using the legacy managed robots.txt feature will be prompted to review and confirm their preferences during the transition. New customers get no blocks or disallows added on their behalf, with one exception: a site that selects the option about monetising from pages with ads at onboarding gets Training set to Disallow as its default, which the post frames as staying in search while keeping content out of model training.
The feature this replaces is already documented. Cloudflare's page for the managed robots.txt setting, carrying Last updated 3 August 2026 and read on 28 August 2026, says that when the setting is turned on, Cloudflare generates and maintains a robots.txt file that instructs known AI crawlers to stay away from your content. The new setting is that idea widened from one category to three, and the announcement says the sync can be turned on or off at any time.
-
Plan coverageAll plans Stated as available to all customers from the Free tier to Enterprise, in the week following the announcement. -
Existing filePrepended Generated contents are prepended to the existing material, so existing Disallow directives are maintained. -
New customersOn by default The sync is on by default, though no blocks or disallows are added on the customer's behalf at onboarding. -
Ad monetised sitesTraining Disallow Selecting the option about monetising from pages with ads sets Training to Disallow as the default. -
Custom rulesNot read Cloudflare states the sync will not directly read from individual custom rules with more complex logic.
Why does a prepended group change which rules a crawler reads?
Prepending sounds safe, and for the file's own text it is: nothing is deleted, and the lines a site wrote stay exactly where they were. The consequence is not in the text. It is in how a crawler decides which lines to obey.
RFC 9309, the Robots Exclusion Protocol, published on the Standards Track in September 2022, is specific in section 2.2.1. A crawler must use case insensitive matching to find the group that matches its product token and then obey the rules of that group. If there is more than one group matching the user agent, the matching groups' rules must be combined into one group. Then comes the sentence that does the work here: if no matching group exists, crawlers must obey the group with a user-agent line with the star value, if present. The wildcard group is a fallback for crawlers nobody named, not a base layer that applies underneath everything else.
So consider the common shape of a real file. A site has one group, headed by the wildcard, carrying whatever it wants kept out of every crawler's reach. No AI crawler is named in it, because most files do not name one: the 2025 Web Almanac count written up on this site found the catch-all user agent in 77.04 percent of desktop robots.txt files and gptbot in 4.5 percent. Bot Preference Sync then prepends an explicit group naming a set of crawler tokens. Every crawler named in that block now has a group matching its own token where it previously had none, so under section 2.2.1 it stops reading the wildcard group and obeys the generated block instead.
Where the generated rule is a blanket Disallow the outcome is the same either way, because everything is blocked and there is nothing left for the wildcard group to add. Where the generated rule is narrower, a crawler that used to be governed by the site's own wildcard rules is governed by Cloudflare's rules instead, and the site's rules for that crawler have quietly stopped applying to it. Cloudflare has not published the output for the option that blocks only on pages serving ads, and nobody here has seen it, so whether that option produces a narrow rule is not established. The mechanism is, and it is the same failure mode as a group headed by a token no crawler answers to: a file that reads as though it is in force and is not. The behaviour is documented rather than exotic, and fourteen named Google agents already ignore the wildcard group for a related reason.
Flow: Crawler reads robots.txt to Any group naming its token?; Any group naming its token? (yes) to Combine all matching groups into one; Any group naming its token? (no) to Obey the wildcard group instead; Obey the wildcard group instead (absent) to No rules apply; Combine all matching groups into one to Resolve path by longest match; Obey the wildcard group instead (present) to Resolve path by longest match.
The longest rule wins, not the one written first
The second half of the matching story runs the other way, and it is the half that keeps prepending from being as destructive as it might sound.
RFC 9309 section 2.2.2 says the matching must start with the first octet of the path, that the most specific match found must be used, and that the most specific match is the match that has the most octets. Where an allow rule and a disallow rule are equivalent, it says the allow rule should be used. Position in the file decides nothing at all. A rule written at the top has no precedence over a rule written at the bottom, and the only thing separating two conflicting rules is how many characters of the path each one matched.
That has a direct consequence for a prepended block. Suppose a site's existing file already carries a group for a named crawler with an Allow rule for a documentation directory inside it, and the generated block prepends a blanket Disallow for the same token. Section 2.2.1 merges the two groups into one, and section 2.2.2 then resolves the conflict by length rather than by order. For a request below that directory the Allow rule matched several octets and the blanket Disallow matched one, so the Allow wins and the page stays crawlable. A site owner reading the top of the file sees a blanket Disallow and reasonably concludes the crawler is shut out. It is not.
This is the same arithmetic behind a result published here on 27 August 2026, that a trailing asterisk changed no verdict across 168 pattern comparisons while still making a rule one character longer and therefore one character more specific. Octet count is the currency, and a character that matches nothing extra can still win a conflict. Anyone auditing a file that two parties now write into has to read it as a merged rule set resolved by length rather than as a document read from the top down, which is exactly why the robots.txt tester on this site resolves a path against the whole file rather than showing you the lines.
Sample Illustrative, not a measurement of any real site.
| Rule in the merged group | Where it came from | Octets matched | Verdict for /docs/guide |
|---|---|---|---|
| Disallow: / | Prepended generated block | 1 | Loses |
| Allow: /docs/ | The site's own group | 6 | Wins |
| Disallow: /docs/guide | The site's own group | 11 | Would win if present |
A maintained token list is the point, and also the cost
The most consequential sentence in the announcement is a short one. Cloudflare says it will use bots that it tracks in BotBase to periodically update the list of bots added to robots.txt when a customer chooses to block or disallow a category.
Read as a fix, that is the right design. Crawler tokens change, and a hand written file goes stale in silence. Google replaced Google-NotebookLM with Google-GeminiNotebook on 16 July 2026, a rename written up here in the post on stale robots rules, and nothing on a site reports a group that has stopped matching anything at all. Lantad's own crawler registry in core/src/bots.ts holds 15 robots.txt product tokens, and keeping even that many current is continuing work rather than a job that finishes. A vendor that maintains the list removes a genuine maintenance burden, and it removes it from thousands of sites at once.
Read as a change of control, it is a different thing. The file stops being a reviewed artefact. Its contents on any given day are whatever the vendor's bot database held when it last regenerated, which means the set of crawlers a site is blocking can change without a commit, without a deploy, and without anyone at the site deciding to block them. Cloudflare is explicit that the sync handles policy decisions made category wide rather than case by case, and that it will not read from individual custom rules with more complex logic, so a site with a specific arrangement with a specific company is told to turn the sync off and tailor the file itself. That is honest advice and it is also the whole tradeoff in one sentence.
Timing compounds it. RFC 9309 section 2.4 says crawlers may cache a fetched robots.txt and should not use a cached version for more than 24 hours unless the file is unreachable, which is a recommendation rather than a requirement and is made independently by each crawler. A regenerated file therefore does not take effect when it is written: there is a window, up to about a day wide and different per crawler, in which crawlers are acting on different versions of a file nobody at the site edited. The lag between an edit and its arrival is the subject of its own post here, and it applies to a machine's edits exactly as it applies to yours. It is worth remembering too that some of the names on any such list never appear in a server log at all, because they are usage controls rather than fetchers.
- Your Disallow lines survive The announcement states existing directives are maintained and the generated content is prepended above them.
- The crawler names stay put Cloudflare states the list is periodically updated from the bots it tracks in BotBase, so the names change on its schedule.
- The file is in your repository The generated block is produced at the edge, so the copy under review is only the half you wrote.
- Your custom rules are folded in Cloudflare states the sync will not directly read from individual custom rules with more complex logic.
- A change reaches crawlers at once RFC 9309 section 2.4 says a crawler should not use a cached copy for more than 24 hours, which is per crawler and advisory.
- Token renames get picked up This is the maintenance burden the feature genuinely removes. Lantad's own registry holds 15 tokens and needs manual upkeep.
What robots.txt says and what the server does are two measurements
Cloudflare's stated motivation is worth reporting carefully, because it names the same problem this scanner measures. The announcement says there are cases in which your robots.txt states that a crawler is disallowed from accessing your website while your enforcement rules do not actually block that crawler, and that when stated preferences and enforced rules disagree, some crawlers treat it as a basis to disregard your preferences or try to bypass your enforced rules.
That gap is measurable, and it has been measured, including here. Lantad probed 12 AI crawler user agent strings against five real pages it captured and stored on 15 July 2026, and robots.txt permitted the crawler in all 60 of those probes while 11 came back unlike the baseline fetch: four received HTTP 403 and seven received HTTP 200 carrying visible text that matched the baseline only 87 percent. The file said yes and several servers said something else. The disagreement runs in the other direction too, and at a larger scale: HasData found that 234 of the 592 domains disallowing GPTBot in robots.txt still returned it a live 200 when a request carrying that name actually knocked, measured in July 2026 across a 2,096 domain enforcement subset.
Both directions of that disagreement are what a sync between the stated preference and the enforced rule is trying to close, and closing either one is useful. What no sync can close is the part that was never robots.txt's job. RFC 9309 says in its first section that the rules are not a form of access authorization, so a site that writes a Disallow line and still serves the bytes is following the specification rather than breaking it. A synchronised preference remains a preference, it is read by clients that choose to read it, and a user agent string is a claim rather than an identity whichever side of the file you are standing on.
None of the figures in this section describe Cloudflare's feature. Lantad has run no test against Bot Preference Sync, and both measurements above predate the announcement by more than a month. They describe the condition the feature is aimed at, observed on sites that had nothing like it in place.
| Measurement | Who measured it | When | Result |
|---|---|---|---|
| User agent probes against five captured pages | Lantad, from its own golden fixtures | 15 July 2026 | 60 of 60 allowed by robots.txt, 11 answered differently |
| Live fetches at domains disallowing GPTBot | HasData, 2,096 domain enforcement subset | July 2026 | 234 of 592 served a 200 anyway |
| Named user agents in robots.txt files | 2025 Web Almanac, HTTP Archive July 2025 crawl | Published 15 January 2026 | Wildcard in 77.04 percent, gptbot in 4.5 |
What should you check on your own site?
None of this requires a verdict on whether the feature is good. It requires a habit change, because the file is now something two parties write into.
Fetch your own robots.txt and look for the marker comments. If the BEGIN Cloudflare Bot Preference Sync line appears, everything below it and above the END line is generated, and only what follows is yours. Record what the generated block names today, because that is precisely the part designed to change later, and a diff against a copy you kept is the only way you will notice when it does.
Then resolve a real path against the merged file rather than reading the file. If a crawler token appears both in the generated block and in a group you wrote, section 2.2.1 merges them and section 2.2.2 settles any conflict by octet count, which is not something anyone does reliably by eye on a long file. Our methodology page sets out how this scanner grades a robots.txt result and what it will not claim from one, and our own crawler's conduct rules are published under the same standard we are describing here.
Check the enforcement layer separately, because it is the half no file can report on. A 404 and a 503 on robots.txt mean opposite things to a crawler, and a server that returns 200 to a browser and 403 to a named agent leaves no trace in the file at all. The list of AI crawler tokens this scanner tests is a reasonable starting point for which names to send when you check what your own origin answers.
Finally, decide who you want writing the file. A maintained list is the right answer for a site with no special arrangements and no capacity to track token renames, which is most sites. It is the wrong answer for a publisher with a signed deal, and Cloudflare says as much: its guidance for anyone with a more fine tuned policy is to turn the sync off. That decision now sits alongside the other content controls a site can state, including the Content Signals Policy and the per request toll that pay per crawl proposes, neither of which is access control either.
Sample Illustrative, not a measurement of any real site.
GET /robots.txt
- # BEGIN Cloudflare Bot Preference Sync generated
- User-agent: ExampleTrainingBot not yours
- Disallow: / not yours
- # END Cloudflare Bot Preference Sync generated
- User-agent: * yours
- Disallow: /admin/ yours
- Sitemap: https://example.com/sitemap.xml yours
Lantad
Published .
A robots.txt file has always been a document with an author. Somebody typed the Disallow lines, somebody chose which crawlers to name, and the file sat in a repository next to everything else that gets reviewed before it ships. On 21 August 2026 Cloudflare announced a feature that changes that arrangement for sites behind its network: robots.txt becomes an output of a dashboard setting, regenerated on Cloudflare's schedule from a list of crawler names Cloudflare maintains.
Common questions
Does Bot Preference Sync delete or overwrite my existing robots.txt?
No. Cloudflare's announcement of 21 August 2026 states that the contents added by Bot Preference Sync are prepended to the existing material, so any existing Disallow directives are maintained, with the generated section bounded by BEGIN and END marker comments. What changes is not your text but which rules a named crawler reads. RFC 9309 section 2.2.1 says a crawler obeys the group with a wildcard user-agent line only when no group matches its own product token, so a crawler named in the generated block stops falling back to your wildcard group.
Is a robots.txt Disallow the same as blocking a crawler?
No. RFC 9309 states in section 1 that robots.txt rules are not a form of access authorization. A Disallow line is a request that a cooperating client is expected to honour, and the server still serves the bytes to anything that asks. Cloudflare's announcement treats the stated preference and the edge enforcement as two separate layers for exactly this reason, and says that when the two disagree some crawlers treat that as a basis to disregard the preference.
Which crawler names does Cloudflare put in the generated block?
The announcement does not publish the list. It says the names come from the bots Cloudflare tracks in BotBase, that the list is periodically updated, and that verified bots classified as Search, Agent and Training can be viewed in its public bots directory. The worked example in the announcement uses placeholder names which it says have been shortened and anonymised. For a sense of scale, Lantad's own crawler registry in core/src/bots.ts holds 15 robots.txt product tokens, read on 28 August 2026.
How long does a regenerated robots.txt take to reach a crawler?
RFC 9309 section 2.4 says crawlers may cache the fetched robots.txt and should not use a cached version for more than 24 hours unless the file is unreachable. That is a recommendation rather than a requirement, and each crawler decides for itself. A file regenerated on a vendor's schedule therefore reaches different crawlers at different times, up to roughly a day apart, and nothing on your site reports when any given crawler last refetched it.
See what AI can read on your site
Run a free scan and get a graded report of exactly what AI crawlers can and cannot read, with ranked fixes.