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's 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, including the three that were hidden. 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 only Webflow's empty-state element. Zero content for a non-rendering crawler. |
Seven Webflow sites I built, fetched 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 still means present in the HTML. 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's 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 in the markup, and the filter is a layer on top of markup that already contains everything.
That's 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.