Product Labels and Badges for Magento 2

View Demo

Product Labels adds sale, new, stock and brand labels to product images by rules and product attributes, so they appear and disappear as prices, stock and the catalog change.

Labels can show the real discount or the stock left, use one of 12 editable templates or your own image, and appear on category, search and widget listings and on the product page, on Luma and Hyvä.

  • Sale, new and low-stock labels by rules
  • Real discount % and stock left on the label
  • A brand logo for every attribute option
  • 12 editable templates or your own image
  • Nine positions, several labels per product
  • Hyvä support built in
Marketplace Approved
Hyvä
Magento Cloud
WCAG
Mage-OS
Compatible with:
Community:
2.3.* - 2.4.9
Enterprise:
2.3.* - 2.4.9

Product labels, stickers and badges that follow your catalog

A "Sale" sticker you upload once is easy. Keeping it on the right products is the hard part: the discount ends, stock runs out, a new collection arrives, and someone has to update the badges by hand.

Product Labels puts labels on product images by rules and product attributes, so they appear and disappear as your catalog changes:

  • Sale labels for products with a discount, showing the real percentage or amount saved
  • "New" labels for products added in the last N days
  • "Only 3 left" and "Out of stock" labels driven by stock quantity and status
  • A brand logo or feature badge for every option of a product attribute
  • Labels on category, search and widget listings, related products and the main product image

Most stores use labels for sales and discounts, free shipping, brand and feature badges, and out-of-stock notices. All of these run on their own once the rule is set.

Labels that switch on by themselves

A rule-based label is shown on every product that matches its conditions. You build the conditions the same way as in Magento's promotion rules, combining them with ALL or ANY:

  • Discount: percent discount, final price, or the difference between price and final price. The label reads the price after catalog price rules and special prices, so it shows the discount Magento actually gives.
  • New arrivals: Magento's "Set Product as New" dates, or days since the product was created or updated.
  • Stock: quantity in stock (for example, fewer than 5 for a low-stock label), stock status and whether the product is salable.
  • Catalog: category, attribute set, SKU, brand or any attribute available for promotion rules.

Each label also has its own customer groups, store views and active dates. For example, show a "-20%" label on pants only to visitors who aren't logged in, with the discount itself set up in a Magento catalog price rule. Product Labels shows discounts; it doesn't create them.

Configurable products are covered too: a label can follow the selected variant and update when the shopper picks a swatch, or appear on the parent product when any of its variants matches the rule.

Show the real numbers on the label

Label text can include values taken from each product, so one label works for the whole catalog:

  • "Save 25%" or "Save $30" from the product's discount percentage or amount
  • "Only 3 left" from the stock or salable quantity
  • "Sale ends in 4 days" from the special price end date
  • "Added 3 days ago" from the days since the product became new
  • Any attribute value, such as the material or warranty period

The numbers are calculated for every product in advance, when the extension rebuilds its label index, so you don't edit labels when a price or stock level changes. The list of variables is in the user manual.

Brand logos and attribute badges without a rule for each

An attribute label gives every option of a dropdown or multiple-select attribute its own image or text. Create one label for the Brand attribute, add a logo for each brand, and every product gets the logo of its brand. Stores with many brands save the most time here.

The same works for any attribute you sell by: a warranty badge, an energy class, "Made in Italy" or a free shipping badge. On configurable products, the parent shows the attribute labels of its variants.

Ready templates, your own images, or text

A label can be an image (PNG, GIF, JPG or SVG), text, or text on one of 12 ready templates: badge, price tag, rounded and wave shapes, arrow, flag, circles and a corner. Templates are HTML and LESS, so you can edit them or create your own, with a preview on test data before saving. Text labels can include HTML and emoji.

A label can also have a tooltip on hover and a link, for example to the sale page. Clickable labels work from the keyboard, and label text is marked as decorative for screen readers and search engines.

You can use the same label on listings and the product page, or a different one for each, for example a small badge in the category grid and a bigger one on the product image.

Nine positions and several labels per product

Each label goes into a placeholder: one of nine positions on the product image (top, middle or bottom, left, center or right), or a manual placeholder you add anywhere in your theme's template.

When several labels match one product, the placeholder decides how they're shown: the maximum number of labels, whether they line up horizontally or vertically, and which come first by sort order. A product on sale that's also new and low in stock doesn't end up with three badges on top of each other.

If you don't need labels on certain pages, hide them there, for example in the shopping cart.

See what a rule matches before it goes live

For instance, here's a label for a sale on bags:

  • Step 1. Set the sale dates, store views and customer groups for the label.

  • Step 2. Choose the products in the Conditions tab, for example the Bags category. After you save, the tab shows how many products the conditions match, so you can check the reach before the label's start date.

  • Step 3. Pick the image or template, the text and the position. The label grid shows a preview of each label.

The sale label appears on every bag in the category and leaves on its own when the sale dates end.

Hyvä support built in

Hyvä support is part of the extension since version 2.6.0, with no separate compatibility package to install. On Hyvä, labels show on category, search and CMS listings, related product tiles and the main product image. The only extra step is for your developer: after installing or updating, regenerate the Hyvä config and rebuild Tailwind, as described in the Hyvä guide.

Built for large catalogs

Labels are prepared in advance by their own index and rendered in the page HTML, so the storefront doesn't check rules for each product on every visit. A category page loads the labels for all its products in one database query.

The 2026 releases were focused on stores with large catalogs: labels stay visible during a full reindex, two reindexes can't run at the same time, and the index changelog is cleaned in batches, so a large backlog doesn't stall the database.

Still comparing product label extensions? Our comparison of Magento 2 product label extensions puts the paid and free options side by side on label rules, cart labels and Hyvä support, including where another one is the better fit.

Sale, new and stock labels that update with your catalog, on Luma and Hyvä.
No hidden fees
Our developers install the extension on your store and configure it for your setup, free of charge.
Lifetime access to source code
Access to free support and updates for 1 year
Updates and support prolongation - $90

Pay today $149 for the first year.

Then $90 for updates and support services per year.

Cancel anytime.

30 days money back guarantee
See it in action!
Pick a quick tutorial to learn about various aspects of this extension
Customer Reviews 32
Earn points for your review about this extension modules. $1 = 10 points
Write Your Own Review

check-circle You submitted your review for moderation.

Alex Verified Buyer
From United States
Using the module for over 1 month
Useful but needs some tweaks
Not completely bug-free, but it still saves a significant amount of time compared to building it from scratch.
Mike
From United Kingdom
Ok
Ok, work ok
Also installed:
Blog MX,  Automatic Related Products,  Elastic Search Ultimate,  AI Agent Integration (MCP)
Maarten Verified Buyer
From Amersfoort, Netherlands
Using the module for 20 days
Need some adjustments
Hmm, not 100% bugfree, but saves a lot of time to build it myself.
Also installed:
RMA,  Advanced Reports,  Advanced SEO Suite,  Google PageSpeed Optimizer,  GDPR,  Reward Points
Jacob Verified Buyer
From Vernon, Canada
Using the module for over 1 year
The best product label module for Magento
This is the best product label module I have tried. It is easy to use and powerful. From Sales to Out of stock notifications, this module makes it easy to add labels to products. They can also be shown on a variety of pages.

Also installed:
Elastic Search Ultimate,  Layered Navigation,  Advanced Reports,  Google PageSpeed Optimizer,  Product Finder,  Blog MX,  IP Geolocation Redirect and 7 more
ahmed Verified Buyer
From Cairo, Egypt
Using the module for 16 days
good
Suitable for its price
Also installed:
Improved Sorting,  Automatic Related Products,  Advanced SEO Suite,  Mass Product Actions,  Custom Form Builder ,  RMA,  Follow Up Email and 10 more
Manual & Support
Need more help?

Save time by starting your support request online and we'll connect you to an expert.

Frequently asked questions
chevron-down chevron-right

What can product labels be used for in a Magento store?

Stores most often use labels to mark sales and discounts, free shipping, brand or feature badges taken from product attributes, new arrivals and out-of-stock products.

With Product Labels, these labels follow the catalog: a sale label shows on discounted products, a "New" label on products added in the last N days, and an "Only 3 left" label when stock drops below the quantity you set. A bestseller label is set by hand, with an attribute, SKU or category.

chevron-down chevron-right

What types of labels can I create?

There are two types. A rule label appears on every product that matches its conditions (discount, new, stock, category, attributes). An attribute label gives each option of a dropdown attribute its own image or text, such as a logo for every brand.

A label can be an image (including SVG), text, or text on one of 12 editable HTML and LESS templates. You can use the same label on listings and the product page or a different one for each. To adapt a label for small screens, add media queries to its styles.

chevron-down chevron-right

Can a label show the actual discount or the stock left?

Yes. Label text can include variables that are filled in for each product: the discount percentage or amount, the stock or salable quantity, the days left until the special price ends, the days since the product became new, and any attribute value. So one label shows "Save 25%" on one product and "Save 10%" on another.

The discount is read from the final price, after catalog price rules and special prices. The variables are listed in the user manual.

chevron-down chevron-right

How do I create a product label?

  • Choose a placeholder: one of nine positions on the product image or a manual placeholder in your theme.
  • Create the label: its type, conditions, store views, customer groups and active dates.
  • Set the look: a ready template, your own image or text, and the label text.
  • Save and apply the label.

Custom CSS is optional. The quick start guide walks through the first label.

chevron-down chevron-right

Where can a label be placed?

Each label goes into a placeholder. Nine placeholders form a 3x3 grid on the product image, so you can choose the top right corner, the bottom left corner, the center and so on.

A manual placeholder puts a label anywhere on the page. To use it, add the placeholder's code snippet to your theme template. A placeholder can hold several labels, with a limit, a horizontal or vertical direction, and sort order to decide which come first.

chevron-down chevron-right

Which pages show product labels?

Labels show wherever Magento renders a product image in a list: category and search results, CMS pages and widgets, and related, up-sell and cross-sell products. On the product page, they show on the main image.

Labels aren't designed for the cart and checkout. If they appear there with your theme, hide them on those pages in the extension settings.

chevron-down chevron-right

Why does a label show on the category page but not on the product page?

The most common reason is a custom or Hyvä product gallery that doesn't have the placeholder the label uses. Add a manual placeholder to the gallery template, or choose a placeholder that your gallery supports.

If a label is missing everywhere, check that the label index is up to date (in "Update by Schedule" mode, changes wait for cron or for the Apply button in the label form) and flush the page cache.

chevron-down chevron-right

Can I schedule labels for a sale?

Yes. Each label has Active From and Active To dates, plus store views and customer groups. The dates are applied when the label index is rebuilt, which runs daily by default, so a label switches on or off on that day rather than at the exact minute.

chevron-down chevron-right

Does it work with Hyvä themes?

Yes. Hyvä support is built into the extension since version 2.6.0, so there's no separate compatibility package. Labels show on Hyvä category, search and CMS listings, related product tiles and the main product image.

After installing or updating, regenerate the Hyvä config and rebuild Tailwind. See the Hyvä guide.

chevron-down chevron-right

Does it support GraphQL or headless (PWA) storefronts?

No. Labels are rendered on the server as part of the page HTML, and the extension has no GraphQL or REST API for labels. It's built for Luma-based and Hyvä themes.

Changelog
Version 2.6.2Oct 2, 2026
A label whose conditions use a condition type that no longer exists showed on every product. This could happen after a downgrade, after removing an extension that supplied a condition, or after a class rename. Magento quietly skipped the condition it could not load, and an empty condition set matches everything, so the label appeared across the whole catalog. Such a label now matches no products until you fix it, and you can still open and edit it in the admin. If you save it without changing the conditions, the stored conditions are kept and a warning says the label matches no products. If you do change the conditions, they are saved and a warning says the missing condition was removed. ([#449]())
Upgrading no longer stops on the old Hyvä package — If mirasvit/module-cataloglabel-hyva was still installed, composer update refused to resolve and named no way out until you removed it by hand. Composer now removes it by itself during the upgrade.
A label display description could contain a script that ran on the storefront. The display title was already cleaned when a label was saved, but the description was not, so a <script> pasted into it was stored and shown to shoppers. Descriptions are now cleaned on save like titles, and simple formatting such as <b> still works. Labels saved before this update are not cleaned automatically, so open and save them again to clean them.
Hyvä category and search listings could show the product-page version of a label. A custom Hyvä item.phtml that rendered labels without calling setViewCode('list') got the product-page appearance in the listing. The layout now tells the block which appearance to use on each page. If your template calls setViewCode() itself, that call still takes precedence.
Attribute labels did not show on a configurable product for the attribute it varies on. For example, a label for the "Red" option of color did not appear on a configurable product whose red variant has that value, because the parent product has no color of its own. The parent now shows the labels of its variants' option values for that attribute.
Stock Status was in the wrong group in the label conditions. In the "Add condition" dropdown it appeared under Product Attribute, among the regular catalog attributes. It is now under Product Additional, next to Is Salable. Saved rules are not affected.
Fixed a PHP 8 error in the label conditions editor when a new-condition request had no condition type. The request now returns an empty response instead of an HTTP 500 error.
Fixed a PHP error when custom code looked up the admin name of a label image type. The lookup now returns the name instead of throwing a type error.
Version 2.6.1Sep 25, 2026
⚠️ The Mirasvit\CatalogLabel\Block\Product\Label PHP class was removed — Nothing in the extension had used it since 2.5.17 removed the templates it rendered, and it could no longer load labels even if called. Storefront labels are unaffected, and the Block\Product\Label\Renderer, Label\Placeholder and Label\Display blocks remain. Only custom code or a custom theme that referenced this class directly needs updating — use Block\Product\Label\Renderer instead.
Label template preview and label image upload now respect the Product Labels admin permission. Before, any logged-in admin user could preview stored label templates and upload files into the label media folder, even if their role had no access to Product Labels.
A LESS error in a label style could leak onto the storefront. When a label's custom style failed to compile, part of the style's own text could escape the error note and reach the page as live CSS or HTML. The error is now always contained, and the admin template preview still shows it.
Label sort order was applied backwards when a placeholder has a label limit. With a limit set (for example, show only 1 label), the label with the highest sort order was shown and the one you had set to come first was dropped. Labels are now picked lowest sort order first, and category/search listings and the product page now agree on which label wins.
The [stock_qty] label variable showed 0 on every configurable product. It now shows the combined stock of the configurable's child products. On stores without MSI, [salable_qty] had the same problem and is fixed too.
A label with no customer groups stored in the database broke the storefront. A label whose customer group list was empty (NULL) caused a PHP error on every page that checked which customer groups the label applies to. Such a label is now treated as applying to no groups.
A label image missing from disk produced broken image markup. If a display's image file was not present (for example, the media folder was not copied during a deployment), the label was rendered with an empty width and height. It now falls back to the intended 50×50 px size.
Opening a label, placeholder or template that no longer exists showed an error page. Following an old bookmark, or editing a record deleted in another tab, now shows the "does not exist" message and returns you to the grid (for templates, an empty form opens).
Admin label, placeholder and template actions returned an HTTP 500 error on incomplete requests. Saving, previewing or uploading without the expected form data now shows the normal "unable to find … to save" message instead of failing.
Saving a label through code with numeric or empty display values could leave it without displays. The label was saved, but its displays were dropped and it was never indexed. Number, true/false and empty values are now handled correctly.
Setting a display's template through code overwrote its placeholder. The display ended up with no template and the wrong placeholder, which either failed to save or rendered the label in the wrong spot. It now sets the template as expected.
Fixed PHP errors in three developer APIs used by custom integrations and themes — getting a label's displays for a product, looking up displays by a comma-separated list of IDs, and placing the product listing label by hand in a custom template (getAdditionalHtmlManually()).
Version 2.6.0Sep 23, 2026
Hyvä support now ships with the extension — The companion package, mirasvit/module-cataloglabel-hyva, is gone: everything it contained is part of Product Labels itself. That is the labels on Hyvä category, search and CMS product listings, the label overlaid on the product page's main image, the Tailwind styles that position a label in its corner of the image, and the script that refreshes labels when a shopper picks a swatch on a configurable product. There is no longer an extra package to find and keep in step, and on a Luma store the Hyvä part simply stays dormant. If the package is installed on your store, remove it before you upgrade — the first item under Improvements has the commands.
⚠️ Remove the companion package before upgrading — If your store has it installed, run this first:
⚠️ On a Hyvä store, rebuild Tailwind after upgrading — Run bin/magento hyva:config:generate and then npm run build-prod in your theme's web/tailwind directory. The extension now registers its own Tailwind sources, which the retired package used to do on its behalf. Skipping it leaves a label sitting under the product image instead of on it: the theme keeps serving the stylesheet it was built with, and that file knows nothing about the position-* classes the extension puts on a placeholder.
⚠️ Hyva_MirasvitCatalogLabel is gone, not renamed — The Hyvä module no longer exists in any form, and neither does its dependency on hyva-themes/magento2-compat-module-fallback. Which template a block uses is now decided in layout: a hyva_default.xml that Magento merges only on a Hyvä theme points the one block that needs it at its Hyvä version. Nothing in the extension asks which theme is active. setup:upgrade removes the old module name from app/etc/config.php for you. You only need to act if you referenced Hyva_MirasvitCatalogLabel yourself — in a custom di.xml, a layout file, or a deployment script that enables modules by name.
⚠️ If you overrode a Hyvä label template in your theme, repoint it — Only one template is Hyvä-specific now, and it moved from Hyva_MirasvitCatalogLabel::ajax.phtml to Mirasvit_CatalogLabel::ajax-hyva.phtml. The other two the retired package carried — labelRenderer.phtml and label/display.phtml — are gone entirely: both themes render the extension's own Mirasvit_CatalogLabel::labelRenderer.phtml and Mirasvit_CatalogLabel::label/display.phtml. The same goes for the JavaScript, which is now Mirasvit_CatalogLabel::js/label-updater.js. An override sitting at a path that no longer exists is simply not read, and there is no error to say so — the stock template renders instead. Luma template paths did not change.
One storefront, two themes — The label markup is one template now, rendered by Luma and Hyvä alike. Where a fix to a Hyvä template used to mean a release of both packages and a version pair to match up, it is now one release.
Faster label reindex when labels use the discount-percent condition — A product's discount percentage is now worked out once per product and store during a reindex, rather than once for every label rule that checks it. Before, each such label ran the catalog-price-rule lookup again for the product and, on a configurable product, for every one of its child products. Stores with several discount-based labels and many configurable products will see the biggest gain. The saved results are capped, so a full reindex of a very large catalog uses no more than about 4 MB extra memory.
The label-refresh warning on Hyvä storefronts was always in English. When the request that refreshes labels after a shopper picks a swatch failed, the message shown was a hard-coded English string, untranslatable on every store whatever its language. It is a proper phrase now and is translated into all 45 bundled locales. Luma storefronts were unaffected — that path shows Magento's own message.
Labels on Hyvä storefronts were missing two accessibility fixes and one SEO fix that Luma has had since 2.5.15. The retired package carried its own copy of the label template, frozen at an intermediate revision from May 2025, and the three corrections made to the extension's own copy after that never reached it. On Hyvä a clickable label was therefore an anchor that could not be reached by keyboard — no role, no tabindex, no Enter/Space handling — and its link text was counted by search engines as anchor text for the product, which is the "identical anchor text for different pages" warning 2.5.15 fixed for Luma. That anchor was also nested inside the product tile's own link, which is invalid HTML. All three are fixed on Hyvä by the merge, because both themes now render the same template. Luma storefronts were unaffected by any of them.
A label could appear twice over the main image on a Hyvä product page. If your theme's gallery.phtml renders the product.labels block itself, as the Hyvä instructions describe, the extension added the same label a second time on top. It now sees that the label is already in the gallery and leaves it alone. The retired package behaved the same way, so stores that had it installed may already have seen this. A stock Hyvä gallery was never affected.
The Hyvä label-refresh script could throw a JavaScript error after a shopper picked a swatch. If the swatch-change event had no selected options attached, the script failed instead of doing nothing. If the refresh request failed on a theme without Hyvä's message handler, it also failed while trying to show the warning. The script now does nothing in both cases.
Version 2.5.17Sep 15, 2026
⚠️ Removed the old product label templates that nothing in the module rendered any more: view/frontend/templates/product/badge.phtml, product/list.phtml, product/view.phtml and view/adminhtml/templates/label/preview.phtml. Labels on the storefront and the label preview in the admin are unaffected — they use different templates. Only a custom theme that copied or referenced one of these four files directly needs updating.
⚠️ Removed three PHP helper methods that existed only to render those templates: Helper\Data::getProductHtml(), getProductListHtml() and getProductViewHtml(). Two of them could no longer render anything at all, and the third rendered a template that is now gone. Custom code calling them should use Block\Product\Label\Renderer or Block\Product\Label\Placeholder instead.
Version 2.5.16Sep 3, 2026
Fewer database queries on storefront pages — the module used to look up its label placeholders again for every product block on the page (up to 12 identical queries on a single category page, and it happened even on stores with no labels configured yet). The result is now reused for the whole page request.
Indexing problems are no longer silent — if the label indexer cannot be reached when a product is saved, the module now records it in the log instead of ignoring it, so a store that stops updating labels can actually be diagnosed.
The user manual is no longer bundled inside the module package; it is published online instead.
⚠️ Requires Mirasvit Core module 1.7.15 or newer (previously 1.4.33). Composer updates it automatically; if you install modules manually, update the Core module together with this one.
⚠️ Three unused PHP classes were removed: Block\Adminhtml\Label\Preview, Model\System\Config\Source\LabelOutputType and Model\System\Config\Source\RenderMode. They were not referenced anywhere in the module, but custom code or a custom theme that referred to them must be updated.
Fixed labels silently stopping to update on large catalogs. The module's index change log grew without limit (hundreds of millions of rows on affected stores), and Magento's own cleanup tried to delete it in one statement — which consumed enormous amounts of database memory, ran for 20 minutes or more, and was killed before finishing. The change log therefore never drained, its internal counter eventually hit its ceiling, and product edits stopped reaching the labels. Cleanup now runs in small batches, and a full label reindex clears the change log completely and resets the counter.
Fixed products showing outdated labels when they were edited while a full label reindex was running. Such edits used to be discarded and the product kept its old labels until it was saved again; they are now re-queued and picked up by the next indexer run.
Fixed a single faulty label removing every label from the storefront. If one label's conditions could not be read, the entire reindex aborted and left the index empty. The problem label is now skipped and written to the log, and all remaining labels are indexed normally.
Fixed the [discount_percent] label variable and the "Percent Discount" label condition returning wrong values for bundle products. A fixed bundle with a percentage-based special price reported a large negative discount; once the bundle's required options cost more than the special price saved, the discount went negative as well; and dynamic bundles reported no discount at all. The discount is now measured between the bundle's full regular price and its full discounted price — required options included — so it matches the discount you configured (a 20% special price now reports 20%).
Fixed HTTP 500 errors from the label request that runs when a customer picks a swatch on a configurable product. An incomplete or unexpected request — no placeholder list, an unknown placeholder code, or a product that no longer exists — now skips that entry and returns the labels it can render, instead of failing the whole request.
Fixed a label being dropped from a placeholder when the internal record controlling its position had the id 0.
Reasons to choose Mirasvit
Client focusing and satisfaction

These are our primary. A major portion of our new clients come from referrals from our existing clients. Our professional team of developers, marketers and support staff have invested the best knowledge and experience in the field into our work, so you know you can come back to us again and again.

Remarkable support

One year free and high quality support. We go to great lengths to provide maximum satisfaction with every module you have purchased in our store. By helping you with installation, configuration, answering your every question, we do all our best to eliminate any possible problems.

Risk-free Investment

30-days money back guarantee. If you are not satisfied with our extension performance for any reason, we provide a full refund.

Constant improvements and upgrades

We constantly add new features to all our modules, and are always interested in hearing your opinion and implementing your suggested features in our future developments.

Comprehensive Documentation

We provide an expanded user guide for every aspect of our extension, so you can find answers for all your burning questions.

Unencrypted source code of our products

You can customize extension according to your needs and requirements.

Usability and Performance

The Module is easy to install and upgrade, just follow our step-by-step user guide. Additionally, the extension is ready to use with the Hyvä theme.

Ready for Magento Cloud

No core modifications. The extension has been tested in a Magento Cloud environment and is fully compatible with it.

Loading...