Last updated: June 2026. The pricing-display rules touched on here (Omnibus, the EU) are summarised, not legal advice, confirm specifics for your markets.
Most PrestaShop merchants treat pricing as a maths problem: find the margin, undercut the competitor, round it off. But the number on the tag isn't the whole story: how that number is written, framed and placed changes what a customer feels before they've finished reading it. The same €50 product can read as a deal or a splurge depending on three characters and where they sit on the page. This is the psychology of pricing, and the useful part for you is that nearly all of it is adjustable from the PrestaShop back office without touching a margin.
This guide is specifically about the presentation and framing of price. The small, reversible changes you make in the Pricing tab, in Catalog Price Rules, and in your theme's price template. It is not about discount strategy at scale or how to physically push hundreds of prices at once (that's mass price updates), and it's not about pricing your whole catalogue to lift basket size (that's average order value). It's the layer underneath those: the per-product decisions that decide whether a price feels fair.
Charm pricing and the left-digit effect

Prices ending in .99 or .95 can outperform their rounded neighbours, and the reason is well established in consumer-behaviour research: people read the leftmost digit first and over-weight it. €49.99 gets filed under "forty-something"; €50.00 reads as "fifty." The cent difference is trivial; the perceived bracket is not. This is one of the most replicated findings in pricing psychology, so you can apply it with confidence, but the size of the effect on your store is something only your own data can tell you, and the published uplift figures vary enormously by category and study. Treat them as "this is real and worth testing," not as a number to put in a forecast.
Where most advice stops is the assumption that charm pricing always wins. It doesn't. Research on hedonic versus utilitarian purchases (Wadhwa & Zhang, 2015) found that round prices feel more fluent for emotional, aspirational buys, a gift, a luxury item, something bought on feeling rather than calculation. A charm price signals "deal," which is exactly the wrong signal for a premium product. So the choice of ending is itself a positioning statement.
A decision framework for price endings
| Ending style | Example | Use for | Signals |
|---|---|---|---|
| Charm (.99 / .95) | €49.99 | Everyday products, commodities, price-sensitive categories, clearance | "This is a deal" |
| Round (.00) | €50 | Premium, gifts, luxury, services, subscriptions | "This is quality / confident" |
| Precise (odd cents) | €47.83 | Technical, B2B, made-to-measure | "This price was calculated, not invented" |
So what does that mean for you? Before you A/B test anything, you can sort your catalogue into these three buckets by category in an afternoon. A store selling both budget accessories and a flagship premium line should not use one ending convention across both, the charm price that lifts the accessory undercuts the flagship.
Charm pricing varies by market, important for multi-language stores
Most PrestaShop merchants who localise are selling across several European markets, and price-ending conventions are not the same everywhere. The .99 ending is deeply embedded in UK and Irish shopping culture and tends to perform well there. German and Austrian shoppers, by contrast, often read round prices as more honest and transparent, and several Nordic countries have phased out small coins entirely. Which makes a .99 ending feel slightly out of step with everyday life. France and Italy generally sit closer to the UK end of the spectrum.
This is a directional pattern, not a law, the only way to know how your customers in each market react is to test. But it's a strong argument for not hard-coding one ending across every currency and country, and PrestaShop gives you the exact tools to differentiate.
Implementing charm pricing in PrestaShop
You have two back-office mechanisms, and they suit different jobs:
- Specific Prices (edit a product → Pricing tab → Specific prices section) override the price for a given currency, country, customer group, date range or quantity threshold. This is where you implement the cross-market strategy: a Specific Price that targets Germany directly (the country field) to show €50 (round) there while the catalogue default stays €49.99. You can target the country directly in the specific price. There's no need to route it through a customer group unless you have a deliberate segmentation workflow that happens to map to countries. It writes to the ps_specific_price table and the front office picks the most specific matching rule automatically.
- Catalog Price Rules (Catalog → Discounts → Catalog price rules) apply a percentage or fixed reduction across whole categories, brands or suppliers at once, useful for nudging an entire category onto a consistent ending, or for seasonal markdowns, without editing products one by one.
For per-product precision you set the price directly in the Pricing tab. For the cross-market approach, point each Specific Price at the relevant country directly, only fall back to customer groups (under Customers → Groups) if you already run a deliberate segmentation workflow, since groups are not automatically country-bound. If you find yourself re-running the same scheduled charm-priced promotion every month, Smart Dynamic & Scheduled Discounts automates time-based price changes so the windows start and end on their own. The benefit being you set the campaign once instead of returning to the back office at midnight to flip it on.
Anchoring: the first number sets the frame
Anchoring is the tendency to lean on whatever number you saw first when judging value. The classic demonstration is Kahneman and Tversky's 1974 work, and decades of replication confirm it applies squarely to pricing. The practical consequence: when a customer sees a higher, struck-through price next to the current one, their internal question shifts from "is this worth €39?" to "am I saving €21?", a far easier yes.
Three anchoring approaches
- Legitimate "was / now" pricing. Your genuine previous price, struck through beside the current one. It works, but in the EU it must be honest. The Omnibus Directive (2019/2161) requires that the "was" price reflects the lowest price applied in the preceding 30 days. A fabricated anchor isn't just bad practice; it's unlawful, and it's exactly the kind of thing that gets a store fined.
- Premium-option anchoring. Lead with the high-end variant. When the page opens with the €199 version, the €79 standard option reads as reasonable rather than expensive, Dan Ariely's Predictably Irrational documents this well.
- External reference anchoring. "RRP €89" or "comparable products from €120" sets a market-level anchor without a crossed-out price of your own.
Showing a crossed-out anchor price in PrestaShop
- Go to Catalog → Products → [your product] → Pricing tab.
- Set the full retail figure as the regular Price (tax excl.).
- Add a Specific price with a percentage or fixed reduction, and (optionally) a date range for a timed offer.
- Enable the "Display the ‘On sale!’ flag on the product page" toggle (on the Pricing tab) if you want the badge.
- The theme then renders the original price struck through next to the reduced one automatically, via the {$product.regular_price} / {$product.price} values in product-prices.tpl.
That on-sale flag is a small graphic doing psychological work, and whether it helps or just adds noise is its own question. We get into it in custom product badges and the honest assessment in do badges actually work. For scheduling the promotional window itself. Start date, end date, countdown, Sales Revolution ties the anchor to a real deadline so the urgency is genuine, which matters for the trust point below.
The decoy effect: a third option that reframes the other two
Ariely's Economist subscription experiment is the cleanest illustration. Three options were offered: online-only at $59, print-only at $125, and print+online also at $125. Nobody rationally picks print-only, it's strictly worse than print+online for the same money. But its mere presence pulled the overwhelming majority toward the premium print+online tier; remove that "useless" middle option and far fewer chose the top tier. The decoy doesn't get bought. It makes the option beside it look obviously right.
Applying the decoy to physical products
You don't need a SaaS pricing table. Build three product bundles where the middle one is deliberately close in price to the top one:
- Basic: €29, one product
- Standard (decoy): €49, two products
- Premium (target): €55, three products
The jump from Basic to Standard is €20 for one extra item; the jump from Standard to Premium is just €6 for a whole extra item. Premium looks like the only sensible choice. In PrestaShop, build these as Packs (Catalog → Products → New product → type Pack), which lets you combine existing products into a single sellable item with its own price, or via quantity-based Specific Prices for tiered discounts. Whichever you use, always display the sum of the individual prices beside the bundle price so the saving is visible. That sum is the anchor.
Bundling and three-tier offers shade into suggesting the right add-on at the right moment, which is a discipline of its own, when a nudge helps versus when it nags is covered in cross-selling and upselling.
Price presentation: format changes how expensive a number feels
Independent of the actual figure, the visual treatment of a price shifts how costly it reads. Several effects are well documented:
- Syllable / character length. Prices that are longer to say feel larger. €49 ("forty-nine") reads as cheaper than €49.00 ("forty-nine point zero zero"). Trimming trailing zeros from whole-number prices is a free reduction in perceived cost.
- Currency-symbol weight. A prominent currency sign primes the "spending money" feeling. You can't drop the symbol in a real checkout, it's legally required, but you can reduce its visual weight in the theme so it doesn't shout.
- Physical size. Our brains conflate the size of the printed number with its magnitude. A price set in a smaller, lighter font reads as a smaller amount; reserve the big, bold treatment for the saving, not the price.
- Colour. Red on a standard price triggers "expensive" anxiety. Keep red strictly for sale/discount prices, where it reads as "deal."
A PrestaShop theme formatting checklist
- Drop trailing zeros at the currency level if your PrestaShop version exposes a currency precision/decimals setting (under International → Localization → Currencies), but note that any such change is global: it strips the decimal part from every price in that currency (cart, checkout and invoices included), so €49.50 also renders as €50, not just €49.00 becoming €49. It suits catalogues priced in whole numbers. If your version doesn't expose that setting, or you need to keep real cents on some prices and only tidy the round ones, handle whole-price display in the theme's price template rather than globally.
- Shrink the currency symbol in your child theme's CSS, e.g. .product-price .currency { font-size: 0.7em; }, always in a child theme or custom stylesheet, never by editing the parent theme, so a theme update doesn't wipe it.
- Use a lighter font weight for the regular price; bold and enlarge the savings figure instead.
- Confine red to sale prices only.
If you're rethinking how the price block sits among the title, gallery, reviews and add-to-cart button, that's a wider layout question, we lay out the hierarchy in PrestaShop product page design and product page anatomy.
Urgency and scarcity work, but only when they're real
Genuine time limits and genuine low stock do move customers. Fabricated ones destroy trust at a rate that wipes out any short-term lift. "Only 2 left!" on an item with 200 in the warehouse, or a countdown that resets every time the page loads, is the fastest way to teach a returning customer that nothing on your store is true. The rules are simple:
- Countdown timers only on offers with a real end date.
- Stock indicators only when stock is actually low, PrestaShop already exposes this with the "Show available quantities" setting and the low-stock threshold per product.
- Social proof from real activity, never invented.
That last point, proving demand without lying about it, has its own toolkit on the product page, and it's a sibling topic rather than a pricing one. If a customer is wavering on a price, seeing that the item genuinely sells can do the convincing: live sales notifications, the recent-purchases sales popup, and a total-sold counter all show real numbers. Sales Revolution keeps countdowns tied to actual start/end dates so the urgency on a discounted price is honest rather than theatre.
How to test a pricing change without poisoning your data
Pricing experiments need more discipline than a button-colour test, because the confounders are worse and the cost of a wrong read is real revenue. A workable method on PrestaShop:
- Change one thing. Don't test a charm price and a new layout together, you won't know which moved the needle.
- Run at least two full weeks. You need both weekday and weekend behaviour, ideally twice, to see past weekly noise.
- Track revenue per visitor, not just conversion rate. A charm price can convert better while earning less per sale; revenue per visitor catches both.
- Avoid contaminated windows. Don't start a price test during Black Friday, a campaign launch or a seasonal swing.
- Segment with customer groups. Create a test group under Customers → Groups and attach the test Specific Prices to it. A group is a clean way to hold a controlled price variant for a known set of customers. Note that PrestaShop has no native mechanism for randomly splitting anonymous traffic into A/B variants: assigning a slice of visitors to the test group requires custom code, a dedicated experiment tool, or a split-test module.
If you've never run one, start with charm-versus-round on your top products by traffic (the biggest data pool, the fastest read), then anchor-price presentation, then bundle pricing on your best cross-sell pairs.
The biggest mistake: competing on price instead of value
The pricing failure we see most often isn't a badly chosen ending, it's reflexively cutting prices whenever sales dip. That's a race to the bottom: it erodes margin, attracts deal-hunters who never come back at full price, and quietly teaches the market that your brand is the cheap one. The research points the same way. Buyers infer lower quality from a price that sits well below the category norm, even when the product is identical. A suspiciously low price triggers doubt, not delight.
So the tactics in this article (charm endings, anchoring, decoys, presentation) are amplifiers, not substitutes. They make a strong value proposition land harder; they can't manufacture one. Used well, pricing becomes a communication tool rather than a margin lever: round numbers say "premium," precise numbers say "calculated," a clean uncluttered price says "we're confident in this." Every price on your store tells a customer something before they read a word of the description. The whole point of pricing psychology is to make sure it tells the right story, and on PrestaShop, almost all of it is a few settings in the Pricing tab and a couple of lines in your theme away.
FAQ
Should every price end in .99?
No. Charm endings (.99 / .95) reliably help value items, commodities and clearance because shoppers over-weight the leftmost digit, €49.99 files under "forty-something." But for premium, gift, luxury and subscription products, a round price (€50) feels more honest and confident; a charm price there signals "deal," which undercuts the positioning. A precise odd-cent price (€47.83) suits technical or B2B lines because it reads as calculated. Match the ending to the product, and don't use one convention across a mixed catalogue.
How do I show a different price ending in Germany versus the UK from one PrestaShop catalogue?
Use Specific Prices targeted at the country directly. On the product's Pricing tab, add a Specific Price with the country field set to Germany showing €50 (round) while the catalogue default stays €49.99, German and Austrian shoppers often read round prices as more honest. You don't need to route this through a customer group unless you already run a deliberate segmentation workflow. It writes to ps_specific_price and the front office picks the most specific matching rule automatically. Treat the ending conventions as a directional pattern and test rather than assume.
Is a struck-through "was" price legal in the EU?
Only if it's honest. This is the one place where pricing psychology meets the law. The Omnibus Directive (2019/2161) requires the struck-through reference to be the lowest price the product was sold at in the previous 30 days, not an inflated number set the week before. PrestaShop's default strikethrough shows your catalogue price, which isn't necessarily that 30-day low, so verify the reference rather than trusting the default. This is a summary, not legal advice.
Can I build a decoy-pricing offer in PrestaShop without a SaaS-style pricing table?
Yes. Build three bundles as Packs (Catalog → Products → New product → type Pack), where the middle "decoy" sits just below the top tier, for example Basic €29 (one item), Standard €49 (two), Premium €55 (three). The €6 jump from Standard to Premium for a whole extra item makes Premium the obvious pick. Always display the sum of the individual prices beside the bundle price, because that sum is the anchor that makes the saving visible.
How long should I run a pricing test, and what should I measure?
Run at least two full weeks so you capture weekday and weekend behaviour past weekly noise, change only one variable at a time, and avoid contaminated windows like Black Friday or a campaign launch. Track revenue per visitor, not just conversion rate. A charm price can convert better while earning less per sale. Note that PrestaShop has no native random A/B split for anonymous traffic; holding a controlled price variant requires a test customer group, custom code or a split-test module.
Key takeaways
- Match the ending to the product: charm (.99) for value items, round (.00) for premium, precise cents for technical/B2B, don't use one convention across a mixed catalogue.
- Localise endings by market using country-targeted Specific Prices; the UK leans .99, Germany and the Nordics often lean round. Test rather than assume.
- Anchor honestly: struck-through "was" prices work, but the EU Omnibus Directive requires the "was" to be the lowest price of the prior 30 days.
- Build decoys with three-tier Packs where the middle option sits just below the top tier, making the top tier the obvious pick.
- Format the price to feel smaller: drop trailing zeros, shrink the currency symbol in a child theme, keep red for sale prices only.
- Keep urgency and social proof real. Fabricated scarcity costs more in trust than it earns in conversion.
- Test with revenue per visitor over at least two weeks, changing one variable at a time, using a PrestaShop customer group as the test segment.