Collection Lists
|
This content was generated with the assistance of AI and should be verified against the official Webflow documentation before being relied on in production. This sub-section’s Webflow bibliography lists the reference material consulted while preparing these pages. |
This page describes Collection lists as they were on 2026-10-28, the date on which its facts were checked against the official documentation. Collection lists are available on every site plan that includes the CMS (Premium, Team and Enterprise, and the Ecommerce tiers for the Ecommerce Collections); the Starter and Basic site plans have no CMS items to list, apart from a small number of items on Starter. Plans are named by tier only, and the Plans, Workspaces, Seats and Roles page explains the mapping from the older CMS and Business names. The numeric limits in the section on limits are the ones the Help Center published on the check date; Webflow has been raising them, so read the current article before relying on a number. The Designer API and Data API examples are written against the Data API v2 and the Designer API as documented on the check date, and they use a Developer workspace site so that they can be run without a paid plan.
The running example is Fernbrook Gardens, a fictitious botanical garden. Its Plants Collection holds one item per plant (name, slug, Latin name, family, sun requirement, bloom month, featured flag, photograph and a reference to a Garden zone), its Garden zones Collection holds the areas of the garden, and its Events Collection holds guided walks with a date. Every list in this page is a view of one of these Collections: a "Featured plants" strip on the home page, a paginated plant catalogue, an upcoming-events block, "Other plants in this zone" on each plant page, and a nested list of the plants of each zone.
What a Collection list is
A Collection list is the element that repeats a design once for every item of a Collection. The designer builds one Collection item (a card, a table row, a list entry) and binds its child elements to fields; Webflow renders that item as many times as the list asks for, filling each copy with the data of one CMS item. It is the only way to show a variable number of CMS items on a page, and it is the most-used CMS element: the home page, the catalogue, the blog index, the footer’s recent-posts block and the related-items block of every template page are all Collection lists.
Three ideas are worth fixing before the details.
-
A list is a query, not a copy. The list stores its source Collection and its settings (filter, sort, limit, offset, pagination). When the site is published, Webflow evaluates the query against the published items and writes the result into the HTML of the page. Nothing is stored in the list itself; edit an item and republish, and every list that matches it changes.
-
A list is evaluated at publish time, not at visit time. The markup that a visitor downloads already contains the items. The only exception is pagination, where the next page of the same list is served by Webflow’s servers from the same query. This is why visitors cannot change a list’s filter or sort at runtime without custom code, and why a list is good for SEO: the items are in the HTML that crawlers read.
-
A list belongs to a page. The same Collection can be listed on any number of pages, each with its own settings. The list on a Collection’s template page is special: it can refer to the current item. See Collection Template Pages.
The concept is the counterpart of a query in other systems. In WordPress it is a WP_Query loop in a template or a Query
Loop block, and in a framework such as Next.js it is a data fetch followed by a map. The difference in Webflow is that
the query is configured in a panel, evaluated by the platform, and limited by it.
Where lists sit in the CMS model
The CMS model is described in CMS Concepts and Content Modeling and Collections and Field Types. Lists read the published state of items: a draft item, or an item whose latest changes are not yet published, does not appear on the live site, and an archived item never appears. The Designer’s preview and the canvas show the staged content, which can differ from the live site until the next publish; see Publishing and Scheduling.
Anatomy of a Collection list
When you add a Collection list from the Add panel and choose a Collection, the Designer inserts a small tree of elements. Knowing the tree explains most layout surprises.
| Element | Role |
|---|---|
Collection list wrapper |
The outer block. It contains the list, the empty state and, when pagination is on, the pagination buttons. Style it to control spacing around the whole block. |
Collection list |
The element that holds the repeated items. This is where you set |
Collection item |
One repetition. It is a block that you design once. Webflow clones it for every item and writes the item’s data into its bound children. |
Empty state |
Shown instead of the list when the query returns nothing. It contains a text block reading "No items found" by default, on a grey background that you can restyle or replace. |
Pagination |
A Previous and a Next button and a page counter, present only when pagination is enabled for the list. |
The list element has no visible box of its own beyond what you style. The most common first mistake is to style the Collection item as the layout container: the layout belongs on the list, and the item is the grid or flex child. This is the same rule as for any flex or grid container, covered in Flexbox and Grid Layouts.
What Webflow generates
A published Collection list is ordinary markup. The class names with the w-dyn- prefix are added by Webflow and are
part of its runtime style sheet; the other classes are the ones you chose. The structure below is what the Fernbrook
"Featured plants" strip produces. The w-dyn-* names are observed in published output and are not a documented contract,
so style your own classes and do not depend on the w- names in production scripts unless you accept that they might
change.
<div class="plants-strip w-dyn-list">
<div role="list" class="plants-grid w-dyn-items">
<div role="listitem" class="plant-card w-dyn-item">
<a href="/plants/foxglove" class="plant-card__link w-inline-block">
<img src="https://cdn.prod.website-files.com/EXAMPLE/foxglove.avif" alt="Foxglove in flower" loading="lazy" class="plant-card__image">
<h3 class="plant-card__title">Foxglove</h3>
<div class="plant-card__latin">Digitalis purpurea</div>
</a>
</div>
<div role="listitem" class="plant-card w-dyn-item">
<a href="/plants/lavender" class="plant-card__link w-inline-block">
<img src="https://cdn.prod.website-files.com/EXAMPLE/lavender.avif" alt="Lavender rows" loading="lazy" class="plant-card__image">
<h3 class="plant-card__title">Lavender</h3>
<div class="plant-card__latin">Lavandula angustifolia</div>
</a>
</div>
</div>
<div class="w-dyn-empty">
<div>No items found.</div>
</div>
</div>
Three details are worth noting. The list wrapper has the roles list and listitem on the repeated elements, which
gives assistive technology a real list; do not remove them by converting the structure. The empty-state block is in the
markup of every list, and Webflow hides it when the list has items. Finally, the image comes from the asset CDN and is
converted and lazy-loaded as described in Images and Assets.
The CSS that you author for this strip is plain CSS on the classes, and the grid and the gap are on the list element.
.plants-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(16rem, 1fr));
gap: 1.5rem;
}
.plant-card {
border-radius: 0.5rem;
overflow: hidden;
}
.plant-card__image {
width: 100%;
aspect-ratio: 4 / 3;
object-fit: cover;
}
Dynamic and curated lists
A list has one of two modes. The choice decides which other settings exist.
Dynamic lists are the default. The list shows the items of the Collection that match its filters, in its sort order, up to its limit. When an editor adds a plant, the new plant appears on every dynamic list whose filter it matches after the next publish, without anyone touching the page. Filters, sort order, limit, offset and pagination are available only in this mode.
Curated lists show a hand-picked, ordered set of items. The designer chooses the items one by one in the list’s settings and orders them by dragging. A curated list is the right tool for a "Staff picks" or a homepage hero with three specific plants. Its drawback is that it is static: a new item never joins it, and an item that is later archived or deleted drops out. Curated lists have none of the filter, sort, limit, offset or pagination settings, and a curated list cannot be paginated.
The Designer API makes the split explicit: the queryMode setting is "dynamic" or "curated", switching to curated
clears the dynamic-only settings, and combining curated mode with filters or pagination in one call is rejected. If a
design needs "these five plants, plus whatever is newest", use a dynamic list with a filter on a featured switch field
rather than a curated list, because the filter keeps working as content changes.
| Aspect | Dynamic list | Curated list |
|---|---|---|
Items shown |
Every item that matches the query |
Exactly the items you picked |
Updates when content changes |
Yes, at the next publish |
No, you maintain the selection |
Filters, sort, limit, offset |
Available |
Not available |
Pagination |
Available when the list is connected directly to a Collection |
Not available |
Best for |
Catalogues, indexes, related items, "latest" blocks |
A fixed editorial selection |
Binding a list and its fields
Binding connects the design to data. The steps in the Designer are the same for any list.
-
Open the Add panel, choose the Collection list element, and drop it where it belongs. Webflow asks which Collection to connect; choose Plants.
-
Webflow creates the tree described above, with one Collection item that contains a placeholder.
-
Add the elements of one card inside the Collection item: an image, a heading, a text block, a link block.
-
Select each element and bind it. A heading’s text, an image’s source and alt text, and a link’s destination each have a Get text from, Get image from or Get link from control that lists the fields of the Collection (and, through reference fields, the fields of the referenced Collection).
-
Style the structure with classes, as for any other element. Because the item is one design, a change to a class changes every card.
Binding is per element, not per list: two headings in the same card can be bound to two different fields. A field can be bound to text, to an image, to a link, to the visibility of an element (see Conditional Visibility and Dynamic Embeds), to a background image and to custom attribute values, and an item can link to its own template page through the Link to option of a link block set to the item’s page.
Reference fields inside a list
A list over Plants can show data from the Garden zone a plant references, because a single-reference field exposes the fields of the referenced item as if they were part of the item. A card can therefore show "Zone: Alpine rock garden" with no extra query. A multi-reference field cannot be dropped into a text block directly: it needs a nested Collection list, described below. The model behind the two kinds of reference is in Reference and Multi-Reference Fields.
Settings of a dynamic list
Select the Collection list and open Element settings, then Collection list settings. The panel contains the
Collection, the filter block, the sort block, the limit, the offset and the pagination toggle. The Designer API names
the same settings source, filters, filterMatch, sort, limit, offset and pagination.
Filters
A filter keeps an item only when a condition on one of its fields is true. Each condition has three parts: the field, the operator and the value. Which operators are available depends on the field type.
| Field type | Typical conditions |
|---|---|
Plain text, email, phone |
Equals, does not equal, contains, does not contain, is set, is not set |
Number and price |
Equals, does not equal, greater than, less than, is set, is not set |
Switch |
Is on, is off |
Option |
Equals or does not equal a chosen option |
Date and time |
Is before or after a date, or within a window of days, weeks, months or years in the past or the future |
Reference |
Contains or does not contain a chosen item |
Multi-reference |
Contains or does not contain a chosen item |
Image, file, video and rich text |
Is set, is not set |
The exact operator labels in the panel can differ slightly from this table, and the Designer API lists the allowed operators of each field through its field search, so check the panel before documenting a rule to a client. Three conditions deserve their own explanation because they are the ones people use daily.
Switch fields make the "featured" pattern. Add a Featured switch to Plants, add the condition Featured is on to the home-page list, and editors control the strip by ticking the switch on the item; nobody edits the page. The same pattern covers "show on home page", "sold out" and "visible in the app".
Date fields make "upcoming" and "recent" lists. The condition Date is after today on Events shows the future walks; Date is within the last 30 days gives a "latest" block. The comparison is evaluated when the site is published, so a list that depends on today’s date goes stale until the next publish. For an "upcoming events" block that must roll over at midnight without anyone publishing, schedule a publish or use a small script that hides past events on the client; see the section on runtime filtering.
Reference conditions make "plants of this zone" and "events in the Greenhouse". Choose the reference field, the operator contains and the item. On a template page the item can be the current item, which is how related lists are built, described in a later section.
Combining conditions
A list can have several conditions. By default they combine with And: an item is shown only if it satisfies all of
them. The Designer API exposes this as filterMatch, which is "all" or "any", and the default is "all". So a
single list can be set to require every condition or at least one condition, but the choice applies to the whole list. A
condition set that mixes both, such as "(sun is full AND featured) OR bloom month is April", is not directly
expressible in one list on the canvas.
The practical workarounds, in order of preference:
-
Add a field that holds the result. A Spring highlights switch that an editor ticks (or that a script sets through the Data API) turns the compound rule into one condition.
-
Use two lists, one per branch, and place them in the same section. Items that satisfy both branches appear twice, so this fits only when the branches are disjoint.
-
Fetch the items with the Data API and render them yourself in a headless front end, where the query can be anything the API supports; see Data API: CMS and Content Delivery API and Headless.
The Data API’s own item listing is also limited: its field filters are combined with AND, and OR logic and nested filter groups are not supported on those GET requests, so the same restriction shows up there.
Sort order
Sorting orders the items before the limit and offset are applied. The sort block takes a field and a direction, and it
can hold several rules, applied in order, so the first rule is the primary key and later rules break ties. Fields that
can be sorted include the name, the slug, dates, numbers and option fields; the Designer API marks the sortable fields
with a canSort flag.
The common choices are:
-
Name A to Z for an alphabetical catalogue.
-
Created on or Last published descending for "latest".
-
A Date field ascending for an events list.
-
A Number field named Order for a manually ordered list. This is the standard workaround for the fact that a dynamic list has no drag-and-drop order: add an integer field, give items 10, 20, 30, sort by it, and insert items between by choosing intermediate numbers.
A sort of Last published changes every time an editor publishes the item, so a "latest" list ordered by it reorders when an old plant is merely corrected. Order "latest" lists by a field that records creation or by an explicit date.
Limit
Limit items is the maximum number of items to show. It accepts a whole number from 1 to 100, and leaving it unset means 100. Webflow has no setting that shows more than 100 items in one list; to show more, turn on pagination or split the content across several lists with offsets.
The limit is applied after filtering and sorting. A list that is filtered to nine items and limited to twelve shows nine. Setting a limit of three on a list sorted by date descending gives the three newest items: the combination of sort and limit is how every "latest N" block is built.
Offset
Offset is the number of items to skip at the start of the sorted, filtered result. It is combined with the limit to carve a result into slices. The classic use is a magazine layout on the Garden Journal: the first list shows one featured article with a limit of 1, and a second list directly below shows the next eight with an offset of 1 and a limit of 8, so the lead article is not repeated. The same sort and the same filters must be set on both lists, or the slices will not line up.
If the offset is larger than the number of matching items, the list renders nothing and its empty state appears. Offset and pagination work on the same list, with the offset applied before the first page begins.
Pagination
Pagination splits a long list across several pages of the same URL. Turn on the Pagination toggle in the list settings and choose Items per page, between 1 and 100. Webflow adds the Previous and Next buttons and a page counter, which you can style like any other elements, rename in the visible label and hide individually.
How it behaves:
-
The URL carries the page. Webflow appends a query parameter made of a short list identifier and the page number, for example
/plants?1c3de4q6_page=2. The identifier keeps the pagination of one list separate from another list on the same page, and each list’s buttons move only that list. -
Only the first page is indexed. The first page is the URL without the query string; later pages are query-string variants. Crawlers therefore see the first page of the list and discover the rest only through its links, so do not rely on paginated pages to expose items to search; give every item its own template page and link to it from a sitemap and from related lists.
-
Pagination needs a direct connection. It is available only on dynamic lists that are connected directly to a Collection, as the Designer API notes. A list that is the child of another list (a nested list) cannot be paginated.
-
Items per page is rounded. In the Designer API the value is rounded up and clamped to the range 1 to 100: 12.2 becomes 13, and 101 becomes 100.
-
Search results pages did not support pagination on the check date; see Password Protection and Site Search.
The pagination markup is a small block inside the list wrapper, with the buttons as links. A published page shows the buttons only when more than one page exists.
<div class="w-pagination-wrapper pagination">
<a href="?1c3de4q6_page=2" aria-label="Next Page" class="w-pagination-next pagination__button">
<div class="w-inline-block">Next</div>
</a>
<div class="w-page-count pagination__count">1 / 4</div>
</div>
The identifier in the example is an illustration, not a value to copy: Webflow generates it per list.
Pagination reloads the page, so scroll position and any client-side state are lost on each click. A designer who wants an infinite-scroll or "load more" experience has to add custom code or use a third-party attribute library, which are the options in the runtime section below.
The 100-item default
A list shows at most 100 items unless you paginate, and 100 is also the maximum for the limit and for items per page.
This is the number that surprises new users: a site with 350 plants renders 100 of them on a plain list with no warning.
The remedies are pagination, several lists with offsets, or splitting the Collection by category with one filtered list
per category. The Data API has the same ceiling on one request (100 items per call), and the fix there is to page
through with offset.
Nested Collection lists
A nested list is a Collection list inside the Collection item of another list. It is how a page shows one-to-many data: the zones of the garden, each with its plants, or each event with its guides. A nested list is the element that makes a multi-reference field visible, and it can also list items from another Collection that points back to the parent.
Setting one up for Fernbrook’s zones page:
-
Add a Collection list connected to Garden zones. Inside its Collection item, place a heading bound to the zone name.
-
Add a second Collection list inside that item. Instead of choosing a Collection, choose a field: the list’s source is the multi-reference field Plants in this zone of the parent item.
-
Design the nested item (a link and a name), bind it, and style it.
-
The nested list shows, for each zone, only the plants that zone references.
Each nested list has its own filter, sort and limit settings, so a zone can show its three featured plants in alphabetical order. A nested list has no pagination of its own.
<div class="zones w-dyn-list">
<div role="list" class="w-dyn-items">
<div role="listitem" class="zone w-dyn-item">
<h2 class="zone__name">Alpine rock garden</h2>
<div class="zone__plants w-dyn-list">
<div role="list" class="w-dyn-items">
<div role="listitem" class="w-dyn-item"><a href="/plants/edelweiss">Edelweiss</a></div>
<div role="listitem" class="w-dyn-item"><a href="/plants/saxifrage">Saxifrage</a></div>
</div>
</div>
</div>
</div>
</div>
Limits on nesting
The Help Center article on dynamic content limits sets three kinds of limit, and the figures differ by plan and have been rising.
| Limit | Enterprise | Other CMS plans at the check date |
|---|---|---|
Collection lists on one page |
40 |
20 |
Nested Collection lists on one page |
10 |
2 |
Items shown in one nested list |
100 |
10 |
The article states that the lower figures are being raised to match Enterprise, and Webflow’s community announcement of the next-generation CMS describes the higher figures and a deeper nesting of up to three levels. Because the numbers move, use the table as a snapshot and design so that a lower limit does not break the page: for example, a zone with more than ten plants should link to a zone page that has its own paginated list instead of relying on the nested list to show them all. The older figure of five items in a nested list that appears in many tutorials predates these changes and should not be used.
The limit on nested items is per parent item. A page whose outer list shows 12 zones with a nested list each therefore renders up to 12 nested lists' worth of items, and the number of nested lists limit counts the lists you placed on the page, not the number of times they repeat.
A page that hits a limit does not fail silently in the Designer: it shows a message and prevents the list from being added. A page that is near the limit is also a signal to reconsider the design, because every list is rendered into the HTML and large pages are slower to download and to render.
The nesting alternative: filtering by reference
A nested list over a multi-reference field is the only way to show the children of an item inside the parent’s repeat. When the page lists children for one parent only, a template page for the parent is simpler: one dynamic list on the Garden zones template page, filtered by Zone contains the current item. It is not nested, so it can be paginated and is not subject to the nested-list limits.
Empty states
When the query matches nothing, the list is replaced by the empty state. This can happen because no items exist, because filters remove them all, because the offset is past the end, or because a template page’s current item has no related items.
The default empty state is a grey box with the text "No items found". Design it for the visitor, not the editor.
-
On a catalogue, replace it with a helpful message and a link ("No plants match yet; see all plants").
-
On a related-items block, hide the whole section when it is empty, because a heading over an empty box looks broken. Webflow offers conditional visibility for this: set the section’s visibility to hide when the list is empty, using the condition on the Collection list. See Conditional Visibility and Dynamic Embeds.
-
Never set the empty state’s display to none in the Style panel as a way to hide it: a block hidden that way is removed on the published site even when the list is empty, which leaves the visitor with a blank space and no message. Use conditional visibility on the surrounding section instead.
One reported quirk is that a list’s native empty element renders only when the list has pagination on and at least two pages; if you rely on custom code to detect emptiness, test the real published page rather than the canvas.
The empty state is also where a defensive design places a call to action: an upcoming-events list with no future walks can read "No walks are scheduled; subscribe to hear about new ones", with a link to the newsletter form.
"Other items" lists: excluding the current item
On a Collection template page it is common to show a few other items from the same Collection under the current item: "More plants from this zone", "Other articles". If the list is a plain dynamic list of the same Collection, the current item appears in it, which looks like a bug.
Webflow adds a filter for this on template pages. With the list selected, open Collection list settings, add a filter, choose the Collection’s name in the field dropdown, choose is not, and pick Current Collection item as the value. The list then excludes the page’s own item. Choosing is instead shows only the current item. The option appears for lists whose Collection matches the template page’s Collection; a list of a different Collection on the same page does not get it by default.
To build "More plants from this zone" on the plant template page:
-
Add a Collection list connected to Plants.
-
Add the filter Plant is not Current Collection item.
-
Add the filter Garden zone is the current plant’s zone, using the reference field and the current item’s value. When the reference value is not offered, bind the list to the zone through a nested structure or use the Data API in a headless front end.
-
Sort by name and set the limit to 3 so the block stays short.
-
Hide the section when the list is empty, so a zone with one plant shows no block.
The conditions combine with And, so the result is the plants in the same zone except this one, which is what the visitor expects.
Runtime filtering and searching
All of the above is decided before the visitor arrives. A visitor-facing filter, such as "show only shade plants", "sort by bloom month" or a live search box, changes the displayed items in the browser, and Webflow’s native settings do not do that: the list’s filter and sort cannot be changed by the visitor at runtime. There are four ways to provide it.
A form that reloads the page. Webflow’s site search is a separate feature that returns search results pages; it does not filter an individual list. See Password Protection and Site Search.
Custom JavaScript over the rendered items. The items of a list are in the DOM, so a script can hide those that do not
match. This works for the items that are rendered, which means up to 100 per list and only the current page of a
paginated list. A small, dependency-free script that filters Fernbrook cards by a data attribute follows. The cards
carry data-sun through a custom attribute bound to the Sun requirement field, and a set of buttons carry the value
they select.
<div class="filter-bar">
<button type="button" class="filter-bar__button" data-filter="all">All</button>
<button type="button" class="filter-bar__button" data-filter="Full sun">Full sun</button>
<button type="button" class="filter-bar__button" data-filter="Shade">Shade</button>
</div>
<!-- each .plant-card carries data-sun="Full sun" or data-sun="Shade" through a custom attribute bound to a field -->
<script>
(function () {
var buttons = document.querySelectorAll('.filter-bar__button');
var cards = document.querySelectorAll('.plant-card');
function apply(value) {
cards.forEach(function (card) {
var show = value === 'all' || card.getAttribute('data-sun') === value;
card.style.display = show ? '' : 'none';
});
}
buttons.forEach(function (button) {
button.addEventListener('click', function () {
apply(button.getAttribute('data-filter'));
});
});
})();
</script>
The script lives in a Code Embed or in the page’s footer code; see
Custom Code in the Head, Footer and Embeds and
Custom Attributes and JavaScript. Because the filter hides cards
with display, those cards are still in the HTML for search engines, which is usually desirable, but a screen reader
user hears nothing for the hidden ones because display: none removes them from the accessibility tree.
A third-party attribute library. Several third-party libraries add filtering, sorting, "load more", combining of paginated lists and live search to Webflow lists by reading attributes you set on the elements. They are not Webflow products, their behaviour and licences change independently, and they run in the browser on the items that are in the page. Treat them as one option and compare them with a small script before adding a dependency; the Third-Party Libraries and Scripts page covers loading and risk.
The Data API from a headless front end. When the data set is large, or the filter must be server-side, render the lists in your own application from the Data API or the Content Delivery API and keep Webflow as the editing interface. This is the only approach that works beyond 100 items per request without paging in the browser.
Choosing between them
| Need | Fits | Does not fit |
|---|---|---|
A handful of toggle filters on up to 100 items |
Native lists with a small script |
Large data sets |
Live search and combined filters over several paginated pages |
An attribute library, or a headless front end |
Native settings alone |
A catalogue of thousands of items with server-side filtering |
Headless with the Data API |
Any in-page script, because items are not all in the page |
Different content per visitor |
Optimize or custom code reading a cookie |
Native lists, which are the same for everyone |
Collection lists from the Designer API
An app built on the Designer API can create and configure lists. The element is exposed as a DynamoWrapper element, and
its settings are read with getSettings() and written with setSettings(), which accepts a partial update and
validates the whole update before applying any of it. The example configures the Fernbrook home-page strip.
// Runs inside a Designer Extension. Check the element type before calling the settings methods.
const element = await webflow.getSelectedElement();
if (element && element.type === 'DynamoWrapper') {
await element.setSettings({
source: { collectionId: 'COLLECTION_ID_PLACEHOLDER' },
queryMode: 'dynamic',
filters: [{ fieldSlug: 'featured', operator: 'isOn' }],
filterMatch: 'all',
sort: [{ fieldSlug: 'name', direction: 'ascending' }],
limit: 6,
offset: 0,
});
}
Points from the reference that matter when automating:
-
Passing
nullresets a setting:limitreturns to 100,offsetto 0,filterMatchto"all",queryModeto"dynamic", andpaginationis disabled. -
filtersis an ordered array of rules. Each has afieldSlug, anoperatorand usually avalue; option fields take an option ID, reference fields usecontainsordoesNotContainwith an item ID, numbers are passed as strings, and date comparisons take an amount, a unit (days, weeks, months or years) and a direction (past or future). -
Some operators accept a binding instead of a fixed value, so a filter can read the value from a component prop, a CMS field, a page field or a locale; option and reference filters need static IDs.
-
Changing the
sourceclears the filters, sort, limit, offset, pagination and curated items, and it can fail when the item template contains bindings or nested lists. -
An offset past the available items renders nothing for the query.
Pagination is configured the same way.
await element.setSettings({ pagination: { itemsPerPage: 12 } });
// Disable it again:
await element.setSettings({ pagination: null });
Curated lists use queryMode: 'curated' with curatedItemIds, which needs item IDs found through the API’s item search.
See Designer Extensions and the Designer API.
The same data from the Data API
A Collection list is a configured view; the Data API returns the underlying items, which is what a headless front end, an export script or a sync job uses. A list of Plants with an explicit page size and offset reads, on a Developer workspace site, as follows. The token and the Collection ID come from the environment and are placeholders here.
export WEBFLOW_API_TOKEN="your-site-token-here"
export PLANTS_COLLECTION_ID="your-collection-id-here"
curl --request GET \
--url "https://api.webflow.com/v2/collections/${PLANTS_COLLECTION_ID}/items/live?limit=100&offset=0" \
--header "Authorization: Bearer ${WEBFLOW_API_TOKEN}" \
--header "accept: application/json"
Source: Data API: List Collection Items
The items/live endpoint returns published items, which is what a live Collection list shows; the plain items
endpoint returns the staged items, including drafts. The default limit is 100 and its maximum is 100, matching the
list limit, so a Collection with 350 items needs four requests with offsets 0, 100, 200 and 300. The response includes a
pagination object with the total, which tells the client when to stop.
// Node.js 22 or later; the token comes from the environment.
async function fetchAllPlants(collectionId, token) {
const items = [];
let offset = 0;
const limit = 100;
while (true) {
const url = `https://api.webflow.com/v2/collections/${collectionId}/items/live?limit=${limit}&offset=${offset}`;
const response = await fetch(url, { headers: { Authorization: `Bearer ${token}` } });
if (!response.ok) {
throw new Error(`Webflow API error ${response.status}`);
}
const page = await response.json();
items.push(...page.items);
offset += limit;
if (offset >= page.pagination.total) {
break;
}
}
return items;
}
Source: Data API: List Collection Items
The loop respects the rate limit of the plan only if it is not run in parallel; see Data API: SDKs, Limits and Errors. For repeated reads, the Content Delivery API serves cached responses from a separate host and spares the rate limit, as explained in Content Delivery API and Headless.
Patterns for the Fernbrook Gardens site
Putting the settings together gives the lists of the running site.
| Block | Collection | Settings |
|---|---|---|
Home: featured plants |
Plants |
Filter Featured is on, sort Name ascending, limit 6, no pagination |
Plant catalogue |
Plants |
No filter, sort Name ascending, pagination with 12 items per page |
Upcoming walks |
Events |
Filter Date is after today, sort Date ascending, limit 4, empty state with a newsletter link |
More from this zone (plant template) |
Plants |
Filters is not Current Collection item and same zone, sort Name, limit 3, section hidden when empty |
Zones with their plants |
Garden zones, nested Plants |
Outer list unfiltered; nested list over the multi-reference field, sorted by name |
Journal lead article |
Garden Journal |
Sort Published on descending, limit 1; second list with offset 1 and limit 8 for the rest |
Every block uses classes on the list and on the item and follows the naming system chosen for the site; see Class Naming Systems. The same card is worth building as a component with props, so that the home strip, the catalogue and the related block share it; a component used in a list item is described in Components, Props, Slots and Variants.
Responsive behaviour
A list adapts with the breakpoints like any other layout; see
Responsive Design and Breakpoints. The properties that matter are
the grid template or the flex wrap on the list element, the gap, and the padding of the item. A catalogue that uses
repeat(auto-fill, minmax(16rem, 1fr)) needs no breakpoint at all, because the column count follows the width.
Two behaviours are specific to lists. First, a smaller breakpoint cannot show fewer items by itself: the same items are
rendered on every device, so hiding items with display: none on a small breakpoint still downloads them. If a mobile
view must show three plants and a desktop view six, use two lists with different limits and show one per breakpoint, which
costs both lists in the HTML, or use a script. Second, a slider element can contain a Collection list, in which case each
item becomes a slide, but the slider’s navigation and the list’s pagination are independent.
Performance and SEO
-
Every item is in the HTML. A list of 100 cards with images is a large document. Keep images lazy-loaded below the fold, keep the number of fields shown per card small, and prefer a limit of 12 to 24 with pagination over a single 100-item list.
-
Place the largest list’s images carefully. The first row of a catalogue is likely the largest contentful paint on the page, so it should not be lazy-loaded; later rows should be. See Performance Optimization.
-
Links matter more than lists. A crawler follows the links in the list to the item pages, which are the pages that rank. Make the card a link block to the item’s template page, with a descriptive heading, rather than an image-only link.
-
Paginated pages are not independent pages. Only the first page of a paginated list is indexed, so give search engines another route to later items through category pages, related lists and the sitemap. See SEO and AEO.
-
Duplicate lists duplicate links. A page with four lists of overlapping items repeats the same links; that is harmless but increases weight.
-
Structured data for each item is better generated on its own template page with a dynamic embed than on the list; see Conditional Visibility and Dynamic Embeds.
Accessibility
The generated role="list" and role="listitem" give a screen reader the item count. Keep them. Give each card a single
link with meaningful text, because a heading wrapped in a link block reads as one link, whereas separate "Read more" links
on every card read as a row of identical links. Bind the image’s alt text to a field (a plain-text Image description
field) instead of leaving it empty or repeating the name; see Accessibility. Pagination
buttons are links with text, which is accessible by default; keep the text visible and do not replace it with an icon alone.
A script that hides items for filtering should also announce the result, for example by updating a status region with the
number of matches.
Common mistakes
-
Expecting more than 100 items. A plain list stops at 100. Paginate or split.
-
A date filter on a stale site. "After today" is evaluated at publish time. Schedule a publish, or filter the rolling window on the client.
-
Hiding the empty state with
display: none. This removes the message on the live site. Use conditional visibility on the section. -
Styling the item instead of the list. Layout belongs on the list element.
-
Using a nested list for a large child set. The nested limits are low on non-Enterprise plans; link to a page with its own paginated list.
-
Forgetting to exclude the current item. Add the is not Current Collection item filter on template pages.
-
Offset and limit with different sort rules. Two lists that slice one result must share their sort and filters.
-
Curated list for content that changes. Use a switch field and a dynamic list.
-
Relying on
w-dyn-*class names in scripts. They are generated and undocumented; use your own classes or data attributes. -
Changing the source of a list in an extension without expecting resets. Filters, sort, limit, offset, pagination and curated items are cleared.
Where older books and tutorials differ
Tutorials written before the next-generation CMS describe a nested list that shows five items and a page with at most one or two nested lists; the Help Center now publishes higher figures for nested lists, as shown in the limits table. The 2021 book on Webflow describes Collection lists, filters, sort and pagination accurately for its time, and it correctly states that a visitor cannot change a list’s filter at runtime and that interactive filtering needs custom code or an attribute library; those statements are still true. Where its screenshots show the older Designer layout, the setting names are the same but the panels have moved. The full list of corrections is on Where Older Books and Tutorials Are Outdated.
Summary
-
A Collection list is a configured query over one Collection, evaluated at publish time and written into the page.
-
Dynamic lists support filters, sort, limit, offset and pagination; curated lists are hand-picked and static.
-
Filters combine with And or with Or across the whole list, not both at once; model compound rules with a field.
-
A list shows at most 100 items unless it is paginated, and only directly connected lists can be paginated.
-
Nested lists show multi-reference data, are subject to lower and changing limits, and cannot be paginated.
-
Design the empty state and hide empty sections with conditional visibility.
-
Exclude the current item on template pages with the is not Current Collection item filter.
-
Visitor-controlled filtering needs custom code, an attribute library or a headless front end.
-
The Designer API configures lists, and the Data API reads the same items in pages of 100.