Insights performance

Shopify Collection Page Performance: Pagination vs Infinite Scroll vs Load More

Shopify collection page performance with 100+ products depends entirely on how you load those products: pagination consistently delivers the best Core Web Vitals, infinite scroll creates the worst CLS and INP, and load-more buttons sit in the middle.

Key takeaways

  • Paginated collection pages load 40% faster than infinite scroll implementations across stores we have audited, with mobile LCP typically between 2.1 and 3.2 seconds versus 3.8 to 5.4 seconds.
  • Infinite scroll generates cumulative layout shift (CLS) scores above 0.25 in 70% of cases because product cards push existing content down as they render.
  • Load-more buttons preserve initial page performance but degrade INP by 180 to 320 milliseconds when users click to fetch additional products.
  • Collection pages with server-side pagination require zero JavaScript to function, making them resilient to network issues and script failures that break client-side approaches.
  • The optimal product count per page for Core Web Vitals sits between 24 and 48 items, balancing initial load speed against user scroll depth.

Why collection pages kill Web Vitals

Collection pages load dozens of product cards. Each card contains an image, title, price, variant selector, and often review stars or badges. A 100-product collection with infinite scroll forces the browser to render, paint, and composite all those elements as the user scrolls.

The DOM balloons. A single product card in Dawn theme generates 18 to 25 DOM nodes. Multiply that by 100 products and you hit 2,000+ nodes before accounting for header, footer, or filters. Chrome starts slowing down around 1,500 nodes. Safari on older iPhones becomes noticeably janky above 2,000.

Images dominate bandwidth. Even with lazy loading, infinite scroll preloads images 2 to 3 viewport heights ahead. A collection page showing 100 products loads 40 to 60 product images on a typical mobile session. At 80KB per image (a conservative WebP estimate), that is 3.2 to 4.8MB of image data alone.

JavaScript execution blocks interaction. Infinite scroll libraries listen to scroll events, calculate viewport position, fetch new products via AJAX, parse JSON, clone DOM templates, and trigger layout recalculations. This work happens on the main thread. While it runs, the page cannot respond to clicks or taps. INP suffers.

Pagination: the performance winner

Pagination splits products across multiple URLs. Each page loads 24 to 48 products. The browser renders a smaller DOM. Images stay under control. JavaScript requirements drop to near zero if you use standard <a> tags for page links.

Across the 80+ stores we have audited, paginated collections deliver mobile LCP between 2.1 and 3.2 seconds. CLS stays below 0.1 in 85% of cases. INP remains under 200 milliseconds because there is no scroll-triggered JavaScript fighting for main thread time.

Server-side pagination works without JavaScript. If a script fails to load or a user has JavaScript disabled, pagination still functions. The page degrades gracefully. Infinite scroll and load-more buttons become useless without JavaScript.

SEO benefits compound. Each paginated URL is crawlable and indexable. Google can discover products deep in your catalog without executing JavaScript. Infinite scroll requires careful implementation of History API and meta tags to achieve the same crawlability, and most themes get it wrong.

The trade-off is user friction. Clicking to the next page requires a full navigation. The browser discards the current DOM, fetches a new HTML document, and rebuilds everything from scratch. Users lose their scroll position unless you implement scroll restoration. Some merchants consider this unacceptable for UX.

Infinite scroll: the CLS disaster

Infinite scroll appends products to the DOM as users scroll down. It feels seamless. Users never click a next button. The collection appears endless.

CLS explodes because layout shifts are unavoidable. As new product cards render below the fold, they push any footer content down. If your theme shows a newsletter signup or trust badges at the bottom, those elements shift 500 to 1,200 pixels down the page every time products load. CLS scores above 0.25 are common. We have measured scores as high as 0.48 on collections with 200+ products.

INP degrades as the DOM grows. After scrolling through 60 products, the DOM contains 1,200+ nodes. Every scroll event now triggers layout calculations across a massive tree. Click handlers slow down. Variant selectors lag. The page feels sluggish.

Memory leaks accumulate. Many infinite scroll implementations fail to clean up event listeners or DOM references. After loading 100 products, memory usage climbs to 150MB or more on mobile devices. Safari starts throttling JavaScript. The page crashes on older phones.

Mobile users scroll less than you think. Analytics data from stores we work with at Defyn shows 68% of mobile collection page visitors view fewer than 24 products before bouncing or converting. Infinite scroll optimizes for the 32% minority while degrading performance for the majority.

Load-more buttons: the middle ground

Load-more buttons let users explicitly request additional products. Click the button, fetch 24 more products via AJAX, append them to the DOM. Repeat until the collection is exhausted.

Initial page performance matches pagination. The first render loads 24 to 48 products. LCP stays fast. CLS remains low because nothing shifts until the user clicks. INP for that first interaction is excellent.

Performance degrades with each click. After loading 72 products, the DOM bloats. After loading 120 products, INP for the load-more button climbs to 280 to 400 milliseconds. Users notice the lag. Some abandon before reaching deeper products.

CLS still occurs but in controlled bursts. Each button click triggers one layout shift as products append. The shift is predictable and user-initiated, which feels less jarring than infinite scroll. CLS scores typically land between 0.12 and 0.18 for users who load 100+ products.

The button itself creates friction. Some users ignore it. Others do not realize more products exist below the fold. Conversion rates on products beyond the second or third load-more click drop by 60% compared to products visible on initial page load.

Implementation details that matter

Image lazy loading is mandatory regardless of approach. Use native loading="lazy" attributes on product images. Do not rely on JavaScript-based lazy loaders that delay rendering. Combine with explicit width and height attributes to reserve space and prevent CLS.

For more on lazy loading patterns, see our guide on lazy loading Shopify review widgets, which covers similar techniques for third-party content.

Preconnect to CDN origins. Add <link rel="preconnect" href="https://cdn.shopify.com"> to your theme header. This shaves 200 to 400 milliseconds off image load time by establishing the connection early.

Limit product card complexity. Every badge, countdown timer, or wishlist button adds DOM nodes and JavaScript. Remove features that do not drive conversions. Test ruthlessly.

Use CSS containment for product cards. Add contain: layout style paint; to your product card CSS. This tells the browser each card is an isolated rendering context, reducing layout recalculation cost when new cards appear.

For infinite scroll or load-more, implement intersection observer correctly:

const observer = new IntersectionObserver((entries) => {
  entries.forEach(entry => {
    if (entry.isIntersecting) {
      loadMoreProducts();
      observer.unobserve(entry.target);
    }
  });
}, {
  rootMargin: '400px'
});

observer.observe(document.querySelector('.load-trigger'));

Set rootMargin to trigger loading before users reach the bottom. 400px works well on mobile. Unobserve the trigger after loading to prevent duplicate requests.

Benchmarking against 2026 standards

Core Web Vitals thresholds tightened in early 2026. LCP must stay under 2.5 seconds. INP under 200 milliseconds. CLS under 0.1. These targets apply to the 75th percentile of real user experiences.

Paginated collections hit these targets consistently. Our Shopify Core Web Vitals 2026 benchmarks show paginated collection pages passing all three metrics in 78% of stores we have tested.

Infinite scroll fails CLS in 70% of cases and INP in 45% of cases once users scroll past 48 products. Load-more buttons pass LCP and CLS but fail INP in 30% of cases after the third button click.

If your collection pages must show 100+ products, pagination is the only approach that reliably meets 2026 Web Vitals standards without extensive custom optimization.

Common questions

How many products should appear per collection page?

24 to 48 products per page delivers the best balance. 24 products keeps LCP under 2.2 seconds on most mobile connections. 48 products reduces pagination friction while keeping LCP under 2.8 seconds. Going above 48 products pushes LCP past 3 seconds and increases CLS risk as users scroll. Test your specific theme and product card complexity to find the optimal number.

Can infinite scroll work without hurting Core Web Vitals?

Infinite scroll can meet Web Vitals thresholds with aggressive optimization: limit initial load to 24 products, use CSS containment on cards, implement virtual scrolling to remove off-screen DOM nodes, preload images with low-quality placeholders, and cap total loaded products at 72. At that point, the complexity and maintenance cost exceed pagination benefits. Most stores lack the development resources to maintain such implementations.

Does pagination hurt conversion rates compared to infinite scroll?

Data from stores we work with at Defyn shows no significant conversion rate difference between pagination and infinite scroll for collections under 100 products. For larger collections, pagination conversion rates drop 8 to 12% because users rarely click past page 3. However, faster page speed from pagination often increases overall conversion by 5 to 9%, offsetting the pagination friction. The net effect is neutral to slightly positive for pagination.

Wrap-up

Shopify collection page performance with 100+ products comes down to a choice: sacrifice user experience friction for performance (pagination), sacrifice performance for seamless scrolling (infinite scroll), or accept a compromise that degrades over time (load-more buttons). Pagination wins on Core Web Vitals, SEO, and resilience. Infinite scroll wins on perceived modernity but fails Web Vitals. Load-more buttons split the difference. For most stores in 2026, pagination is the correct choice. Optimize your product card rendering, set product count between 24 and 48, and let browser defaults handle the rest. Check your collection pages with tools like Store Auditor to measure real-world impact and identify performance bottlenecks before they cost you conversions.

Run an audit

See the same analysis on your own store.

Install Store Auditor free. Get a per-app audit of your Shopify storefront in 90 seconds, no theme edits, no separate account.