Bubble.io Repeating Groups: The Complete Guide to Lists and Tables
Every list in a Bubble app uses a Repeating Group. The four required settings, five layout patterns, performance rules that keep lists fast, and the FAQ every Bubble builder eventually needs.
How Bubble Displays Lists of Data
The Repeating Group is Bubble’s fundamental element for displaying multiple records. Every list in a Bubble app — a table of projects, a card grid of team members, a notification feed — uses a Repeating Group. Mastering Repeating Groups means understanding data sources, pagination, display patterns, and the performance rules that keep lists fast.
Every Repeating Group Needs These
Set Type of content to the data type you want to display. If showing Projects, set it to Project. This is required before you can configure the data source or reference ‘Current cell’s Project’ inside the RG.
Search for Projects [
workspace = Current User’s current_workspace,
is_deleted = no
] sorted by Created Date descending
// ALWAYS use search constraints, never :filtered by
Inside the Repeating Group, design one cell. This cell is the template for every item in the list. All elements inside can reference ‘Current cell’s Project’ to access that specific row’s data.
Items per page
: 20 (never unlimited for large datasets)
Next button workflow
: Show next n rows in RG
Prev button workflow
: Show prev n rows in RG
Every List Type You Will Need
| Layout | Settings | Best For |
|---|---|---|
| Vertical list | Column, 1 column, auto rows | Feed, notification list, search results |
| Card grid | Row, wrap items, min-width 280px per card | Product listings, team member cards |
| Data table | Row layout per row, fixed-width columns | Financial records, structured data |
| Horizontal carousel | Row, no wrap, overflow scroll | Featured items, image gallery |
| Kanban columns | Multiple RGs side by side, one per status | Project management, sales pipeline |
Why Lists Slow Down
Never Use :filtered by
Loads ALL records to the browser then filters in JavaScript. With 10,000 records this is catastrophic. Use search constraints at the data source level, always.
Avoid Deep Relational Chains
Accessing Current cell’s Task’s Project’s name requires multiple DB queries per row. Denormalise: store project_name directly on Task.
Always Paginate
An RG showing 500 items renders 500 DOM nodes. Mobile browsers struggle at 100. Paginate to 20 items per page for all repeating groups with more than 20 potential records.
Q: How do I search within a Repeating Group?
Add a search input above the RG. In the RG data source, add a constraint: name contains Search_input’s value. When the input changes, Bubble re-runs the search. Add a short delay via Toolbox to avoid searching on every keystroke.
Q: Why is my RG showing no data?
Check in order: (1) Is the search returning records? Remove all constraints and test. (2) Are privacy rules blocking? Temporarily set to Everyone to test. (3) Is the Type of content set correctly?
Build Your Bubble.io App With Expert Help
Pakistan’s leading Bubble.io development team. Multi-tenant SaaS architecture, Stripe billing, and full product builds done right from day one.
