Text, filters and pagination optimized for real projects
Category pages are the commercial backbone of every Magento store, yet many merchants give away visibility here through duplicate content, poorly placed text, uncontrolled filter URLs and outdated pagination strategies. This guide shows, with practical examples, how to configure text placement, layered navigation, canonical tags, pagination and CMS blocks so category pages rank and convert sustainably in Magento.
Table of Contents
- 1. Why category pages are the SEO backbone of Magento stores
- 2. Category text above or below the grid: placement strategy and UX trade-off
- 3. Unique category text at scale
- 4. Layered navigation: is_filterable and the SEO pitfalls of facet URLs
- 5. Canonical and noindex strategy for filtered category pages
- 6. Pagination in Magento: why rel=next/prev is dead
- 7. View-all vs. paginated pages: when each strategy pays off
- 8. Using Magento category CMS blocks for SEO content correctly
- 9. Internal linking and breadcrumbs on category pages
- 10. Summary
- 11. FAQ
1. Why category pages are the SEO backbone of Magento stores
In most Magento stores, category pages are the ones expected to rank for the most commercially valuable search terms, short, high-volume keywords like "women's sneakers" or "garden furniture set", while product pages typically cover longer, more specific queries. Anyone who neglects the SEO quality of category pages is giving away visibility exactly where the largest search volume and the highest purchase intent meet. At the same time, category pages are the central hubs of internal linking: they gather link equity from the main navigation and pass it on to product pages in a targeted way.
In practice, this is exactly what gets neglected most often, because category pages are treated as pure listing pages instead of standalone landing pages. In stores with hundreds or thousands of categories, this systematically creates thin or duplicated content, uncontrolled filter URLs bloat the index, and outdated pagination rules produce the wrong crawl priorities. This guide walks through the most important levers in the order they are typically tackled on a real Magento project: text placement, text scaling, filters, canonical strategy, pagination and CMS content.
2. Category text above or below the grid: placement strategy and UX trade-off
Whether category text sits above or below the product grid is one of the most debated questions in category page SEO, and both options have real pros and cons. Text above the grid delivers context immediately, for both users and crawlers, and signals topical relevance before a single product is even visible. The downside: with longer copy, the actual offer gets pushed below the fold, which lengthens time-to-product and demonstrably lowers the conversion rate, especially on mobile devices with limited screen height.
Text below the grid protects the conversion-strong product overview in the initial viewport without losing SEO-relevant content, Googlebot renders the entire page and evaluates content regardless of scroll position. The approach that proves out in practice is a hybrid one: a short, two- to three-sentence teaser directly above the grid for immediate context, followed by the full, detailed text below the products. This position can be controlled in Magento via an additional category attribute such as description_position, which is evaluated in the category.phtml template.
<!-- app/design/frontend/Vendor/theme/Magento_Catalog/templates/category/view.phtml -->
<?php /** @var \Magento\Catalog\Block\Category\View $block */ ?>
<?php $category = $block->getCurrentCategory(); ?>
<?php if ($category->getData('description_position') === 'top'): ?>
<div class="category-description prose max-w-3xl mb-8">
<?= /* @noEscape */ $category->getDescription() ?>
</div>
<?php endif; ?>
<!-- Editorial content from the assigned category CMS block -->
<?= $block->getChildHtml('category.cms.block') ?>
<div class="product-grid">
<?= $block->getChildHtml('category.products') ?>
</div>
<?php if ($category->getData('description_position') !== 'top'): ?>
<div class="category-description prose max-w-3xl mt-10">
<?= /* @noEscape */ $category->getDescription() ?>
</div>
<?php endif; ?>
3. Unique category text at scale
Once a store passes a few hundred categories, hand-written, unique text for every single page stops being realistic, and this is exactly where the biggest duplicate content risk in Magento stores emerges. If the same text block is reused across twenty variants with only the category name swapped out, Google reliably detects this as near-identical content and devalues the affected pages instead of letting them rank in parallel. The result is keyword cannibalization: multiple category pages compete for the same query instead of reinforcing each other.
Unique text becomes scalable through dynamic building blocks that pull in real, category-specific data, product count, price range, available brands or top attributes can be inserted into a text template automatically via a ViewModel, producing a genuinely different body of text for every category. For the top 10 to 20 percent of categories by revenue, manually written text is still worthwhile because it is more precise and speaks more directly to search intent. Long texts should also be collapsed behind a "show more" toggle to keep the UX light without removing the content from the DOM.
/* Scope WYSIWYG output from the category CMS block into the theme typography */
.category-cms-block {
max-width: 65ch;
}
.category-cms-block h2 {
font-size: 1.25rem;
font-weight: 700;
margin-top: 1.5rem;
}
.category-cms-block a {
color: #1d4ed8;
text-decoration: underline;
}
/* Truncate long unique category text with a manual "read more" toggle */
.category-description[data-collapsed="true"] {
display: -webkit-box;
-webkit-line-clamp: 4;
-webkit-box-orient: vertical;
overflow: hidden;
}
4. Layered navigation: is_filterable and the SEO pitfalls of facet URLs
Layered navigation generates a separate URL for every combination of filter attributes, with ten attributes at five values each, thousands of combinations per category are theoretically possible. Without control, this burns crawl budget on near-identical, thin pages and produces mass duplicate content, because filtered views often differ only in product order. The is_filterable attribute decides whether an attribute appears in the category page's layered navigation at all, while is_filterable_in_search plays the same role for the search results page, both should be enabled deliberately and never blanket-enabled for every attribute.
As a rule of thumb: attributes with high search volume and clear purchase intent, such as brand or size, benefit from their own indexable landing page, while attributes with many, rarely searched values, such as color or material, are usually better left unindexed. After every change to is_filterable, a reindex of catalog_category_flat and catalogsearch_fulltext is required so layered navigation actually reflects the new configuration. Anyone introducing new filterable attributes should first check Google Search Console to see whether real search volume even exists for the resulting URL combinations.
// PUT /rest/V1/products/attributes/color
{
"attribute": {
"attribute_code": "color",
"frontend_input": "select",
"is_filterable": 1,
"is_filterable_in_search": 0,
"is_visible_in_advanced_search": 1,
"used_in_product_listing": true,
"is_searchable": 0
}
}
5. Canonical and noindex strategy for filtered category pages
By default, Magento does not set an automatic canonical tag for category pages that would fold filtered URL variants back onto the clean base category, this has to be actively configured. The proven strategy: every filtered URL with query parameters gets a canonical tag pointing to the unfiltered base URL of the category, combined with a noindex,follow meta tag as soon as more than one or two filters are active at the same time. This preserves the page's link equity while thin, redundant filter combinations disappear from the index.
It's important to distinguish between robots.txt blocking and meta-robots control: blocking via robots.txt prevents crawling entirely, so Google never even sees the page and can draw no link-equity signal from it at all. noindex,follow, on the other hand, still allows crawling but prevents indexing, the noticeably gentler and usually correct approach for filter URLs. Individual, high-search-volume filter combinations, such as a brand-color combination, can deliberately be excluded from this rule and made indexable with their own title and text if the effort is justified by the search volume gained.
<!-- Layout handle applied for filtered layered-navigation requests -->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<head>
<!-- Filtered variant: exclude from the index, but let link equity flow -->
<meta name="robots" content="noindex, follow"/>
<!-- Canonical always points back to the clean, unfiltered category URL -->
<link rel="canonical" href="https://mironsoft.de/women/shoes.html"/>
</head>
</page>
6. Pagination in Magento: why rel=next/prev is dead
Google officially stopped evaluating rel="next" and rel="prev" back in 2019, the attributes are not treated as an error, but they no longer contribute to consolidating paginated series for ranking. The once-common recommendation to funnel all signals to page 1 is therefore outdated. Current best practice: every paginated page gets a self-referencing canonical tag, pointing to itself rather than to page 1, because each page actually contains different products and is therefore independently indexable and rankable.
For this to work, paginated URLs need to be reachable by crawlers in the first place, product lists loaded purely client-side via JavaScript, without real, crawlable links to page 2 and beyond, are a common technical mistake in Magento frontends. In addition, the title tag from page 2 onward should include the page number, for example "Women's Sneakers, Page 2", to avoid duplicate-title warnings in Search Console. The page-size options in the toolbar should be chosen so click depth to the last products stays manageable, ideally three to five clicks.
<!-- Layout XML: toolbar configuration for the category view -->
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="product_list_toolbar">
<arguments>
<!-- Page size options shown to the customer -->
<argument name="page_size_options" xsi:type="string">12,24,36</argument>
<argument name="default_page_size" xsi:type="number">24</argument>
</arguments>
</referenceBlock>
<!-- Pages 2+ ship a self-referencing canonical, not one pointing at page 1 -->
<referenceBlock name="category.products">
<arguments>
<argument name="self_canonical" xsi:type="boolean">true</argument>
</arguments>
</referenceBlock>
</body>
</page>
7. View-all vs. paginated pages: when each strategy pays off
A view-all page shows every product in a category on a single URL and can make sense for medium-sized categories, because it consolidates ranking signals that would otherwise be spread across multiple paginated pages, and spares users the need to click through. For small to medium categories with up to roughly 150 to 200 products, this works well, especially combined with lazy loading for images, which keeps initial load time low despite the large number of products.
For very large categories with thousands of items, the advantage flips into a disadvantage: the page becomes so heavy that LCP and INP suffer measurably and Core Web Vitals scores slide into the red. In these cases, clean, well-configured pagination with a sensible page size is the better choice over a technically demanding, heavily optimized view-all variant. If a store offers both variants in parallel, the paginated version should never be canonicalized to the view-all page when the visible content differs, instead, each variant should get its own, correct canonical tag.
8. Using Magento category CMS blocks for SEO content correctly
Magento allows every category to be assigned a freely editable CMS block, embedded into the category page either via the landing_page attribute or a dedicated layout XML reference. This is especially valuable for SEO because marketing teams can maintain editorial content, seasonal notes or internal links to related categories without every change requiring a developer deployment, and the content still remains fully present in the page HTML and therefore crawlable.
The biggest mistake with CMS blocks on category pages is keyword stuffing or hidden text, such as white text on a white background, Google reliably detects such patterns and devalues the page, sometimes even with manual actions. Used sensibly, a category CMS block contains genuine added value: a short buying guide, answers to frequently asked questions with matching FAQPage schema, or links to topically related categories and guide articles that meaningfully round out the store's internal link structure.
9. Internal linking and breadcrumbs on category pages
Breadcrumbs on category pages serve a dual function: they help users orient themselves within the category hierarchy while simultaneously providing structured data that lets Google show a tidy breadcrumb trail directly in the search result instead of the long URL. The BreadcrumbList schema should be generated automatically on every category page from the actual category hierarchy, not maintained by hand, so structure and schema are guaranteed to match.
Beyond breadcrumbs, category pages are the most important distributors of internal link flow: links to subcategories, topically related categories and relevant blog or guide content within the category text or CMS block prevent orphaned pages that would otherwise only be reachable via the sitemap. Categories linked exclusively through a dropdown menu in the main navigation often structurally receive less link equity than categories with additional references from content pages, a detail that is frequently overlooked in internal linking strategy.
| Topic | Done wrong | Done right |
|---|---|---|
| Text placement | Long text entirely above the grid | Short teaser on top, full text below |
| Category text | Identical text block for every category | Dynamic data plus text for top categories |
| Layered navigation | is_filterable enabled blanket-wide for all attributes | Enabled selectively based on search volume |
| Filter URLs | Blocked entirely via robots.txt | noindex,follow plus canonical to base URL |
| Pagination | rel=next/prev as the sole solution | Self-referencing canonical per page |
Mironsoft
Category page SEO, layered navigation and content strategy for Magento stores
Ready to make your category pages SEO-fit?
We analyze text placement, layered navigation, canonical structure and pagination on your Magento category pages and implement targeted optimizations, from attribute configuration to Hyva template adjustments.
Category page audit
Analysis of text placement, duplicate content and index status
Filter and canonical setup
is_filterable configuration and canonical/noindex strategy
Content scaling
Dynamic category text and CMS block strategy for large category counts
10. Summary
Category page SEO in Magento solves a recurring problem: the pages with the greatest commercial potential are the ones most often technically neglected. A hybrid text model with a short teaser on top and detailed text below resolves the conflict between SEO visibility and conversion-strong UX. Dynamic, data-driven text blocks prevent duplicate content even when hundreds of categories need maintaining at once, while a deliberately configured is_filterable keeps layered navigation from wasting crawl budget on thin filter combinations.
Canonical tags and noindex,follow on filter pages protect index quality without losing link equity, while self-referencing canonical tags on paginated pages match current Google practice since the end of rel=next/prev. View-all pages only pay off up to a certain category size, beyond that, cleanly configured pagination wins out. CMS blocks and thoughtful internal linking round out the strategy, as long as the content offers genuine added value rather than pure keyword density.
Category page SEO in Magento, the essentials at a glance
Text placement
Short teaser above the grid, full text below, controlled via a category attribute.
Layered navigation
is_filterable set deliberately by search volume, reindex after every change.
Canonical & pagination
Filter URLs get noindex,follow plus canonical, paginated pages self-referencing.
CMS blocks & linking
Genuine added value instead of keyword stuffing, consistent internal linking from category text.