Press slash to focus this field, or Escape to return home.
What does Webflow actually put in your HTML?
WebflowEveryone tells you AI crawlers cannot read JavaScript. Almost nobody tells you which parts of a Webflow site are JavaScript. So I fetched seven production sites I built, as a bot, and counted.
The method is boring and that is the point. One curl per site with GPTBot's user agent, no browser, no rendering, then count what is in the bytes that came back. Anything present is visible to every crawler. Anything missing exists only after JavaScript runs.
What came back
| Component | In served HTML? | What I measured |
|---|---|---|
| CMS Collection List | Yes | Items present on every site with a collection. One page shipped 105 items, another 52, another 22. |
| Native Tabs | Yes | All four panels carried their copy, not just the active one. Around 170 characters of real text per hidden panel. |
| Native Slider | Yes | 11 of 16 slides carried text. The empty ones were image-only. |
| Dropdown menus | Yes | Link lists present in the markup. |
| CMS collection driven by a script | No | Shipped Webflow's empty-state element instead of items. Zero content for a non-rendering crawler. |
Seven Webflow sites I built, fetched 6 August 2026 as GPTBot. Counts are of the raw response body, before any JavaScript.
The finding that surprised me
Native Webflow is in better shape than its reputation. Tabs were the one I expected to fail, because the whole point of a tab is that three quarters of it is hidden. Hidden is not the same as absent. All four panels were in the HTML, so a crawler reads every one.
The same held for Sliders and Dropdowns. Webflow builds these as markup with CSS and JS controlling visibility, not as markup created on the fly. For AEO purposes that distinction is the whole game.
The one that failed
One site shipped a w-dyn-empty element, which is what Webflow renders when a Collection List has nothing to show. It sat inside a slider whose collection is populated by a script after load.
To a person, that component works. To GPTBot, ClaudeBot and PerplexityBot, that section of the page contains a polite notice that there are no items. Not a degraded version. Nothing.
This is the actual shape of the problem in Webflow, and it is much narrower than "Webflow sites have a JavaScript problem". Webflow renders your content. The pattern that breaks is when you put something in front of it: a filtered list, a load-more, an infinite scroll, a slider fed by a script.
How to check your own site in one line
curl -sL https://yoursite.com | grep -c "w-dyn-empty"
Anything above zero is a collection that shipped empty. Then check that the number of items you can see matches the number that arrived:
curl -sL https://yoursite.com | grep -c "w-dyn-item"
If you see twelve cards and the count says three, the other nine are being injected and no non-rendering crawler will ever read them.
What I do about it
Keep the paginated, filtered, scripted version for people. Make sure a plain, complete, linkable version exists for machines. In Webflow that usually means the collection has a real template page per item, the listing renders its first page natively rather than through a script, and the filter is a layer on top of markup that already contains everything.
That is the same rule I apply to CMS modelling generally. If something is worth finding, it gets a URL. If it only exists inside a tab, a filter or a carousel, it exists for exactly as long as JavaScript is running.
None of this required a tool or a subscription. It took seven curl commands and a text search, which is roughly the cost of continuing to guess.