"New," "Sale" and "Bestseller" are three of the most useful corner-labels a product thumbnail can carry, but in PrestaShop only two of them exist out of the box, one of them quietly depends on a setting most merchants never check, and the third doesn't exist at all. So before you go shopping for a badge module, it's worth knowing exactly what the platform already does, where the back-office switches live, and where the genuine gap starts. This guide is about getting these badges onto your store, the implementation, the settings, the templates, the rules. (Whether badges actually move the needle on clicks and conversions is a separate question we tackle in do badges and labels actually work, this post assumes you've decided you want them and shows you how to ship them correctly.)
What PrestaShop gives you natively, and what it doesn't
Out of the box, PrestaShop renders a small stack of "flags" in the top corner of every product miniature. They're driven by a single template partial, themes/your-theme/templates/catalog/_partials/product-flags.tpl, which loops over {$product.flags} and prints each one as <li class="product-flag {$flag.type}"> inside a <ul class="product-flags">. That class is the hook you'll use later for styling. The core flag types PrestaShop ships are a fixed set, new, on-sale, discount, online-only and pack:
| Flag type (CSS class) | What triggers it | On by default? |
|---|---|---|
| new | Product created within the "new product" window | Yes, window defaults to 20 days on a fresh install |
| on-sale | The On sale checkbox is ticked on the product | Manual, you tick it |
| discount | An active price reduction (specific price / catalogue rule) exists | Automatic when a reduction is live |
| online-only | Product marked "available online only" | Manual |
| pack | The product is a pack (bundle of other products) | Automatic when the product is a pack |
That's the core set the platform hands you. Stock and availability badges ("Out of stock", "Last items in stock") are a separate matter, they're not a fixed entry in that same flag list, and how (or whether) they render depends on your theme and version, with the availability text and any custom stock labels controlled in Shop Parameters → Product Settings. Themes and modules can also add their own labels on top of the core set, so don't assume a stock badge you see elsewhere comes from this same {$product.flags} loop.
Notice what's missing from that list: there is no native "Bestseller" flag. PrestaShop tracks best-sellers internally (it powers the ps_bestsellers block and the best-sellers page when you enable it), but it never stamps a badge on the thumbnail. That's the first real gap, and we'll come back to it.
Checking the "New" badge window (the setting most merchants never look at)

The "New" badge is controlled by a single number. Go to Shop Parameters → Product Settings and find Number of days for which the product is considered 'new' (the PS_NB_DAYS_NEW_PRODUCT configuration value). On a fresh install this defaults to 20, so out of the box recently added products do wear the badge, but plenty of live stores have it set to 0 (somebody zeroed it, or a migration left it empty), and when it's 0 nothing is ever new and the flag never renders. So if your "New" badge isn't showing, check this value first. Set it to something sensible. 20 Or 30 days is typical, and PrestaShop will automatically flag any product whose creation date (not its last-modified date) falls inside that window.
So what does that mean for you? Two practical consequences. First, the "New" badge is purely date-driven and fully automatic, you never touch it per product, and it expires on its own when the window passes. Second, it keys off the original add date, so re-saving an old product to "freshen" it won't re-flag it; if you want an evergreen product to look new again you have to duplicate it or use a module rule (below). Match the window to how often your catalogue actually changes. A 30-day window on a store that adds two products a year just means almost nothing ever wears the badge.
The "Sale" badge: two different things wearing the same word
This is where merchants trip. PrestaShop has two separate concepts that both look like "Sale," and they don't move together:
- The "On sale" checkbox (product page, Pricing tab) renders the on-sale flag. It's a manual flag and, on its own, it does not change the price, it's purely a label you tick.
- A price reduction, a Specific price on the product, or a catalogue-wide Catalog price rule under Catalog → Discounts, renders the discount flag automatically and actually changes what the customer pays. PrestaShop's default theme shows this as the price-drop label, often with the percentage.
The takeaway: if you want a discount badge to appear, create the reduction and the discount flag handles itself. Don't also hand-tick "On sale" expecting it to do the maths. Show the percentage where you can ("-20%" out-pulls a bare "Sale" because it quantifies the saving), and if you're running price drops at scale, the back-office grind of editing hundreds of specific prices is its own problem, see mass price updates for doing it without losing your afternoon.
The Bestseller gap, and the three ways to fill it
Because there's no native bestseller flag, you have to manufacture one. Three routes, in rising order of effort and falling order of manual upkeep:
| Route | Effort | Stays accurate by itself? | Best when… |
|---|---|---|---|
| Manual feature/tag | Low setup | No, you re-curate monthly | Small catalogue, you already know your hero products |
| Theme template edit | Medium (developer) | Depends what you wire it to | You have a dev and one specific rule in mind |
| Badge module with rules | Low ongoing | Yes, rule recomputes | You want "top sellers" to self-update without edits |
Route 1, Manual, with a product feature
The no-developer option: create a Feature under Catalog → Attributes & Features (e.g. "Badge" with values "Bestseller", "Staff Pick"), assign it to the right products, then have your theme show it. It costs nothing and works on any version, but it's fully manual. You decide what's a bestseller and you keep it current by hand. Fine for "Staff Pick" and "Award-winning," which need human judgement anyway. Tedious for "Bestseller," which is supposed to reflect real sales and therefore drifts the moment you stop maintaining it.
Route 2, Editing the theme template
The developer option: extend product-flags.tpl (and the list-cell partial, _partials/miniatures/product.tpl) to print your own <li class="product-flag bestseller"> when some condition is true. This gives you total control and zero licence cost. The catch is the same one that bites every theme edit: it lives in your theme, so a theme switch or a child-theme rebuild can lose it, and the "is this a bestseller?" logic has to come from somewhere. Usually a query you also have to write and maintain. Total control, total responsibility.
Route 3, A badge module driven by rules
The reason badge modules exist is precisely this gap: you want a "Bestseller" (or "Limited", or "Last few left") badge that recomputes itself from sales or stock instead of a spreadsheet you update on the first of the month. Our Custom Product Badges module adds exactly that on PrestaShop 1.6 through 9: you upload or pick a badge, then either pin it to specific products or attach it to a rule so it applies automatically. So what does that buy you? The bestseller badge tracks the products that are actually selling without you re-tagging anything; a "Limited stock" badge appears and disappears as quantity crosses a threshold you set; and because it hooks into the product display rather than forking your theme, it survives theme changes and upgrades, it installs and configures from the back office, not from a developer invoice. That's the practical difference between a badge programme that decays the week you get busy and one that stays honest on its own.
Styling and placement. Where the CSS class earns its keep
Whichever route you take, the markup lands in that same <ul class="product-flags"> container, which is what makes styling consistent. A few PrestaShop-specific placement realities:
- Default position is top-left, stacked. The default theme positions .product-flags absolutely over the image. If you add more flag types, they stack in that same corner. Which is why discipline matters more than it looks (next section).
- Style by flag type, not by hand. Because each flag carries its type as a class (.product-flag.new, .product-flag.discount, your .product-flag.bestseller), you colour-code in CSS once and it applies everywhere the miniature renders, category grid, search results, home blocks, cross-sell rows. Conventional pairings, red for discount, green for new, gold for bestseller, read instantly because customers already expect them.
- Put custom CSS in the right place. Editing the theme's stylesheet directly gets overwritten on a theme update; a small custom.css (or your module's own stylesheet) is the upgrade-safe home for badge colours and positioning.
- Test at 375px. The flag container shrinks with the miniature on mobile. A two-word badge that's crisp on desktop can become an unreadable smear on a phone grid, check the narrow breakpoint before you ship.
One rule that matters more than all the styling: restraint
The fastest way to make badges stop working is to let a product wear five of them. "New + On sale + Discount + Bestseller + Free shipping" turns a clean thumbnail into visual static, and when everything is highlighted, nothing is. Two practical guards inside PrestaShop:
- Cap it at roughly two flags per miniature. If a product legitimately qualifies for several, decide a priority order (a live discount almost always beats "new") and suppress the rest. Rule-based badge modules let you set that priority once; with native flags you manage it by not over-ticking the manual ones.
- Don't let "New" linger. A 90-day new-product window means half your catalogue is permanently "new," which trains customers to ignore the badge. Keep PS_NB_DAYS_NEW_PRODUCT short enough that "New" still means something.
Where badges fit in the bigger product-page picture
Badges are one signalling layer on the thumbnail; they work best when the page they lead to backs up the promise. A few neighbours worth wiring together rather than duplicating here:
- "Bestseller" is a social-proof claim, if you want to put a real number behind it, a total products sold counter turns "popular" into "1,240 sold."
- The badge gets the click; the rest of the page has to close it. Start with product page design best practices and the anatomy of a product page.
- For the strategic question. Whether these labels are worth the effort at all, and which ones earn their place. See the companion piece, do badges and labels actually work.
Frequently asked questions
My "New" badge isn't showing on any product, what's wrong?
Check PS_NB_DAYS_NEW_PRODUCT first, under Shop Parameters → Product Settings. If it's 0 (a common state after a migration or a previous owner zeroing it), nothing is ever counted as new and the flag never renders. Set it to 20 or 30. If the value is fine but the badge still doesn't appear, your theme may not include the product-flags.tpl partial on that template. A custom or heavily edited theme can drop it.
Why does my "Sale" badge appear but the price hasn't changed?
Because you ticked the On sale checkbox, which is a pure label and does nothing to the price. To actually reduce the price and show the discount flag, create a Specific price on the product or a Catalog price rule under Catalog → Discounts. The discount flag then renders automatically and shows the real reduction.
Can I make a "Bestseller" badge update itself from real sales?
Not with native flags. PrestaShop has no bestseller flag at all. You either curate it by hand (a product feature you maintain) or use a rule-driven badge module that recomputes from sales data, so the badge follows what's actually selling instead of a list you forget to update. That's the gap our Custom Product Badges module fills.
Will my custom badge survive a theme or PrestaShop upgrade?
It depends on how you added it. A badge edited directly into product-flags.tpl lives in your theme and can be lost when you switch themes or rebuild a child theme. A badge added through a module that hooks the product display survives upgrades because it isn't part of the theme files.
How many badges should one product wear?
Roughly two, maximum. When a product qualifies for several, set a priority, a live discount almost always beats "New", and suppress the rest. Five badges on one thumbnail reads as visual static, and when everything is highlighted nothing is.
The short version for PrestaShop specifically: "New" is a free win that hinges on one day-count setting (default 20. Confirm it isn't sitting at 0), "Sale" is two settings hiding behind one word (use the price reduction, not just the checkbox), and "Bestseller" is the one the platform won't give you, so the only real decision is whether you curate it by hand or let a rule keep it honest for you. Get those three right and the corner of every thumbnail starts doing useful work before a customer reads a single line of copy.