Shopify Builds>Capabilities>Collection merchandising: rails, tiles and in-grid promotion

Collection Merchandising: Rails, Tiles and In-Grid Promotion on Shopify

Definition

Merchandiser-configured product carousels, tabbed collection shelves, category tile rows and block-scoped rails on landing pages, plus promo tiles placed at chosen positions inside a collection or search grid without breaking pagination — including tiles that appear only when a given facet is active. One product-card renderer reused everywhere so behavior stays consistent.

The Evidence

  • Evidence strength: 24 live, Deploi-attributed builds across 3 Shopify storefronts.
  • Split by storefront: Nudestix 12, Three Ships 7, LUS Brands 5.
  • Split by attribution: 19 Deploi-authored, 5 modifications of vendor theme code — named as such on each build page.
  • Evidence quality: nine carry code plus client working records. Fifteen are documented from the code; no client-side record of the decision survives.
  • Confidence: 7 strong, 17 moderate.
  • Surfaces: homepage and collection pages lead (12 builds each), then landing pages, blog, search, the PDP and the mega menu.
  • Status: Live, verified 2026-09-06. Buy-vs-build verdict: build or configure in the theme.

How It's Actually Built

The mechanism at the centre of this capability is a loop rewrite, and it exists because Shopify paginates products, not grid slots. Drop a promo tile inside {% for product in collection.products %} and it either eats a product slot or shifts every product after it, and the count the shopper sees stops matching the grid. So the loop becomes a slot loop: it walks grid positions while a separate product cursor advances only when a product is actually emitted. A promo block claims its position first; otherwise the next product renders. The paginate object is never touched, so pagination keeps counting products and the tile is additive rather than substitutive.

The tile itself is a theme block: position, width (one grid item, two, or full bleed), image, aspect ratio, heading, body, button and its colours, all theme-editor settings. Tiles are scoped by collection handle so one section can carry a season's worth and only the right one renders, and a section that renders its grid twice accumulates the ids it has already emitted so a tile can't appear twice. On the search side the same block trades position-matching for facet-matching: it renders only when a chosen facet is active. And because a tile sits in a product grid, its markup mirrors the grid's own column arithmetic at every breakpoint — a hand-built srcset and a sizes string derived from page width, gutters and column count — or the row reflows around it.

Rails follow one rule: render the theme's own card. card-product on the Dawn storefronts, product-grid-item and product-card.liquid on the premium theme. That's what keeps price, badges, ratings, wishlist and quick-add identical whether a product appears on a collection page, a homepage carousel, a landing page or an article. Where Dawn's featured-collection section couldn't be stacked — every id and Swiper selector keys off section.id — we re-keyed the whole thing to block.id so one events page can hold several independently configured rails. Where merchandisers needed a category row, the card resolves through a fallback chain: link from the block, else the collection's URL; label from the block, else the collection's title; image from the block, else collection.featured_image, else Shopify's placeholder. Adding a category is picking a collection.

The Buy-vs-Build Position

The corpus's own verdict:

Always built or configured in the theme; in-grid promo tiles in particular are trivial to own and are a standard line item in merchandising apps.

That's the least fashionable verdict we publish and the one we're most confident about. A merchandising app's value is scheduling, rules and reporting. The tile is the cheap part — it's a block with settings and a rewritten loop — and buying the tile means renting a second card renderer that has to be re-taught your badges, your ratings and your quick-add every time either side changes. Our reasoning on which half is worth paying for is in the merchandising rules decision.

The Builds

Eleven of the 24 have published pages. Of the rest — the gift and category tile sections with their own desktop and mobile layout modes, the tabbed collection browser and the block-scoped event rails among them — twelve are documented and will follow. One won't get a page of its own — editorial review didn't clear it.

LUS Brands

Nudestix

Three Ships

What This Rests On

What Varies by Storefront

Theme base sets the ceiling. LUS Brands runs Dawn 15.4.1, Nudestix runs Dawn 6.0.2 — the same lineage nine major versions apart — and Three Ships runs Palo Alto 5.8.0 by Presidio Creative, a paid premium theme, so its merchandising sections are vendor code we extended and have to keep upgrading. The Dawn gap shows up directly: the newer store gets a block model and a card that already supports quick add, while the older one hand-rolls behaviour Dawn's own slider markup can't express and can't simply swap in a library without abandoning the theme's CSS.

Catalog cadence decides the shape. A haircare catalog with a separate kids audience wants rails that carry their own theming per audience, so colour and type scale arrive as CSS custom properties emitted per section. A cosmetics catalog on a campaign calendar wants tiles authored per breakpoint and layout modes chosen per section, because a campaign changes the arrangement, not just the artwork. A skincare catalog with a small SKU count and multiple sizes has a different merchandising problem entirely — the decision to move onto the card isn't which product, it's which size, which is why that storefront's grid work is a variant picker rather than a tile.

Installed apps set the last constraint. Review widgets, wishlist buttons, an analytics loader and a recommendation widget all live in the DOM these grids replace or inject into, so each storefront's re-render puts back a different set of things — and on one of them, cards arrive after load from a recommendation widget, which is why its quick-add is delegated from document.

Where This Gets Hard

The dual-render pattern is the cost people don't expect. Shopify renders Liquid once, on the server, with no knowledge of the viewport, so "grid on desktop, carousel on mobile" has exactly two honest answers: build a carousel that CSS can neutralise, or render the tile set twice and let a scoped {% style %} block reveal one. Several sections here take the second route because a merchandiser can rearrange it without breaking it. It is also markup you pay for on every request, on the pages that can least afford it.

Section settings are an API, and they behave like one. The theme editor keys a section's saved values to its section type, so changing a live section's schema in place risks the configuration a merchandising team spent months tuning — which is why one of these sections lives as a deliberate fork published alongside the original rather than as an in-place rewrite. The fork is a second file to maintain. That's the trade the settings model forces, and it is still a trade.

And a tile is only easy until the grid moves. A filter change replaces the container wholesale, so slot arithmetic runs again on the server and everything bound inside the old grid is gone. A section that renders its grid twice has to ensure a tile isn't emitted twice. A tile has to reproduce the grid's column maths at every breakpoint or the row reflows. None of that is hard. All of it is somebody's Tuesday, forever.

So: if what you need is six chosen products on the homepage, both Dawn and Palo Alto already ship that section and a custom rail buys you a maintenance liability, not a capability. If your tiles change weekly and nobody will re-check them, an app's scheduling and reporting are worth more than our slot loop — that's the half of the category we'd tell you to buy. And we push back hard on a new section per campaign. A rail a merchandiser can re-point at a different collection outlives three bespoke ones.

Related Capabilities

Answers to Help You Make Smart Decisions

Can I put a promotional tile inside a Shopify collection grid without breaking pagination? Yes, and it's the standard move here. The trick is to stop looping products and start looping grid slots, advancing a separate product cursor only when a product is actually rendered. The paginate object stays untouched, so page counts and the "showing N of M" line remain honest while the tile occupies a real position in the layout.

Do I need a merchandising app to curate collections and rails? For the rail itself, no — it's a theme section with settings, and building it keeps one card renderer across your whole storefront. What an app genuinely sells you is scheduling, rules and reporting on merchandising decisions. If your team changes tiles weekly and wants campaigns to start at midnight without a deploy, that is a real reason to buy.

Why do themes render a grid and a carousel twice? Because Liquid renders on the server and has no idea how wide the screen is. If a merchandiser can choose grid on desktop and carousel on mobile, the section either ships a carousel CSS can flatten or ships both layouts and hides one. Both are legitimate; the second survives merchandiser editing better and costs you duplicated markup.

Can shoppers add to cart straight from a collection card? Yes, through the Cart AJAX API and the theme's own cart drawer. The complication is variants: a card with one button either adds an arbitrary default or sends the shopper to the product page. On one storefront here the card carries size pills, and the first tap on add-to-cart reveals them rather than adding anything.

Ready to Merchandise Your Collection Pages on Purpose?

Your merchandising team knows what should be in slot three this week. The only question is whether they need you to deploy it. Contact us today and we'll show you which of your rails should be a setting instead of a ticket.

Builds

Merchandisable homepage product carousel with a tag-driven badge engine and inline add-to-bag

A two-column row — optional linked lifestyle image, Swiper rail — where every label, color, badge and product is a theme-editor setting, and each card can add to bag without leaving the page.

LUS Brands

Shop-by-category carousel with collection-aware card fallbacks

A homepage category rail where adding a category is one action — pick the collection. The image, the link and the label all resolve from the collection record unless a merchandiser deliberately overrides them.

LUS Brands

Kids featured collection: a custom element that builds its Swiper on approach and wraps the theme's own product cards

A `<kids-featured-collection>` element leaves its slides as static markup until an IntersectionObserver fires, initializes Swiper then, and tears everything down when the section is removed — around Dawn's `card-product`, not a card of its own.

LUS Brands

Main collection grid: merchandisable promo tiles, load-more and a filter blocklist

Dawn's collection grid extended in four directions: promo tiles a merchandiser places by grid position, a textarea that suppresses unwanted filter values, load-more over the Section Rendering API, and an infinite-scroll fallback.

Nudestix

Homepage exclusive-offers rail with caption heights equalized in idle time

A merchandiser-built row of promotional tiles for the Nudestix homepage — grid or swipe rail, chosen separately for desktop and mobile — whose uneven caption blocks are measured in idle time and equalized through a single `--content-height` custom property.

Nudestix

Featured tutorial with an adjacent shoppable product rail

One section, two halves: a poster-first video that fetches its YouTube or Vimeo player only on click, and beside it the first three products of whichever collection a merchandiser picks — each one a real card with a quick view and an add to bag that never leaves the page.

Nudestix

Mega-menu product rail (v2): a library-free slider in a theme asset, constructed per panel when the panel is seen

The second generation of Nudestix's menu rail — a merchandiser title, a shop-all link and a track of navigation cards — keeps its slider in `megamenu-slider.js`, a small class that measures slide width at move time and is constructed per panel on first intersection.

Nudestix

Collection page: three filter modes, in-grid promo blocks and infinite scroll

The live collection body here is vendor code from a paid premium theme. This page documents what that code does, how it is configured across a large template set, and where our own contribution to it begins and ends.

Three Ships

Tabbed collection product slider and the shared merchandising card

One section renders every configured collection at once and switches between them with a class, so moving from Serums to Cleansers waits on nothing — and one card snippet backs the shelf, the blog and the rewards page.

Three Ships

Size-pill variant picker and quick add-to-cart inside product grids

One click handler, registered once on `document` in the capture phase, turns any grid card with a size-pill row into a variant selector and an add to cart — including cards that did not exist when the page loaded.

Three Ships

Filter-triggered promo cards inside the search results grid

A theme-editor block that puts a merchandiser-designed card into the search results grid at a chosen position, and shows it only while a named facet is active on that query.

Three Ships