Most advice about "discounts that build loyalty" stops at a feeling: be generous, customers will come back. On a PrestaShop store that advice quietly bleeds margin. A discount is a lever on profit, and PrestaShop gives you four different mechanisms to pull it — Customer Groups, Catalog Price Rules, Specific Prices and Cart Rules — each with its own priority, its own stacking behaviour, and its own way of surprising you at checkout. Used carelessly they overlap and a customer pays 35% less than you ever intended. Used deliberately they turn one-time buyers into repeat customers without giving away the store.
This guide is about exactly that: the discount architecture for loyalty in PrestaShop — which of the four mechanisms to use for which job, how to stop them stacking into a margin hole, and the back-office settings that make it work. It is the discounting companion to the broader retention cluster: if you want the gentle, points-and-credits side of loyalty, that lives in loyalty programs for PrestaShop and keep it simple, keep it honest. Here we stay on the discount mechanics.
Why discounting deserves an architecture, not a habit
A first order from a new customer is usually unprofitable. You paid to acquire them, and one purchase rarely covers that cost. The whole economic case for loyalty discounting is that the second and third orders come at zero acquisition cost — so even a discounted repeat order is more profitable than a full-price first order from a stranger. Bain & Company's much-cited research suggests a small improvement in retention produces an outsized improvement in profit; the exact multiplier is debated and depends heavily on the business, so treat it as direction, not a number to put in a spreadsheet. The principle underneath it is just arithmetic you can verify on your own store, and that arithmetic is what should govern every discount you set.
The break-even math that sets your discount budget
Before you decide how generous to be, work out when a customer turns profitable. Take a store with a €65 average order value and a 40% gross margin, and assume it costs you €80 to acquire a customer:
- Order 1: €65 × 40% = €26 gross profit, minus €80 acquisition = −€54
- Order 2: +€26 (no acquisition cost) → cumulative −€28
- Order 3: +€26 → cumulative −€2
- Order 4: +€26 → cumulative +€24 — finally profitable
In this example the customer doesn't pay you back until their fourth order. So what? It means a 10% discount that costs you €6.50 in margin to secure a repeat order is buying a €26 gross-profit order you'd otherwise never see — a 4:1 return. The discount isn't a giveaway; it's the cheapest order you'll ever book. Plug your own AOV, margin and acquisition cost into the same four lines and you'll know how many discounted orders you can afford to chase. Every setting below is in service of getting customers to that break-even order and past it.
PrestaShop's four discount mechanisms — and what each is actually for
The single most common mistake is reaching for Cart Rules for everything because they're the most visible. PrestaShop has four distinct price-reduction systems, and they fire in a specific order. Knowing the order is what stops them fighting each other.
| Mechanism | Back-office path | Applies | Best loyalty job |
|---|---|---|---|
| Customer Groups | Shop Parameters → Customer Settings → Groups | A blanket % off the catalogue, per group, shown on product pages | Permanent tier discount (Bronze/Silver/Gold) |
| Catalog Price Rules | Catalog → Discounts → Catalog Price Rules | Conditional price change on the catalogue, filterable by group/category/currency | Tier discount limited to certain categories |
| Specific Prices | Product → Pricing → Specific prices | Product- or combination-level price override | Member-only price on a single product |
| Cart Rules (vouchers) | Catalog → Discounts → Cart Rules | A code or automatic discount applied at checkout | Time-limited codes: welcome-back, birthday, post-purchase |
The mental model: Groups and Catalog Price Rules change the price the customer sees while browsing (good for permanent membership benefits that should feel built-in), whereas Cart Rules change the price at checkout (good for time-boxed, code-driven offers). Specific Prices sit in between, overriding a single product's price and taking precedence over a Catalog Price Rule on that product. Match the mechanism to the job and most stacking problems disappear before they start.
The permanent layer: tier discounts with Customer Groups
Tiered membership is the backbone of loyalty discounting, and PrestaShop's Customer Groups carry it natively. A group can hold a default percentage reduction that applies automatically to every member, everywhere, with no code to enter — which is exactly the "it's just my price now" feeling a loyal customer should get.
Setting tiers on real data, not round numbers
Don't invent thresholds. Pull your actual spending distribution from the database and set tier boundaries at natural breakpoints, so most repeat customers land in the middle tier and only your genuine top spenders reach the top. A query like this gives you each customer's twelve-month spend to band them:
SELECT c.id_customer, c.email, SUM(o.total_paid_real) AS spend_12m, COUNT(o.id_order) AS orders FROM ps_customer c JOIN ps_orders o ON o.id_customer = c.id_customer WHERE o.valid = 1 AND o.date_add > DATE_SUB(NOW(), INTERVAL 12 MONTH) GROUP BY c.id_customer ORDER BY spend_12m DESC;
For a €65-AOV store, a defensible structure that keeps the top tier reachable:
- Bronze (first purchase – €199/yr): the entry tier — small permanent perk so new buyers feel they've "joined"
- Silver (€200–€499/yr, ~3–7 orders): a modest ongoing % plus a free-shipping threshold
- Gold (€500+/yr): your best customers — highest ongoing %, free shipping, early access
Keep the jump between tiers visible but the top reachable: if Gold needs €2,000/yr in a €65-AOV store, nobody feels the pull and the tier is dead weight. Set it where your top 15–20% actually land.
Wiring tiers into the back office
- Shop Parameters → Customer Settings → Groups → create "Loyalty Bronze/Silver/Gold". Each group's edit screen has a Discount field — set the blanket % here (or leave it 0 and control the discount with Catalog Price Rules for finer reach).
- For free-shipping perks, build a Cart Rule with Free shipping enabled and the customer group set as a condition under the Conditions tab, marked combinable so it sits alongside the tier %.
- To restrict the tier discount to certain categories (protect low-margin lines), use a Catalog Price Rule filtered by group and category instead of the flat group discount.
PrestaShop's one real gap here is automation: there's no native "move this customer to Silver when their 12-month spend crosses €200." Out of the box you reassign groups by hand from the customer's profile, which is fine for a small list and painful at scale. That recurring scheduling and threshold work is what Smart Dynamic & Scheduled Discounts exists to take off your plate — running tier and time-based discount changes on a schedule from the back office instead of a calendar reminder. If you want spendable store credit rather than percentage tiers, that's a different mechanism entirely, covered by Loyalty Credit Revolution and discussed as a strategy in points, credits and repeat purchases.
The time-boxed layer: Cart Rules done deliberately
Cart Rules are where loyalty discounts cause the most damage, because they're the easiest to create and the hardest to keep track of. Three Cart Rule fields decide whether your discounting stays profitable.
The three fields that protect your margin
- Validity dates & usage limits (Conditions tab). Every loyalty code needs an expiry and a "total available / per user" cap. A code with no deadline creates no urgency and lingers in inboxes forever; a code with no per-user limit invites sharing. Set the date range and Total available for each user = 1 for personal offers.
- Combinable checkbox. This is the master switch for stacking. Leave your permanent tier perks combinable (they're earned benefits), but mark promotional codes non-combinable so two campaign codes can't compound on the same cart.
- Priority field. When two non-combinable rules both qualify, the lower priority number wins. Give your earned loyalty rules priority 1 and one-off promos priority 2, and the customer's permanent benefit is the one that survives a conflict.
- Product/category restrictions (Conditions tab). Exclude low-margin lines from aggressive codes — a 20% voucher should never touch a product that only carries 18% margin.
Stacking control: the rule that keeps discounting honest
This is the heart of "discounts that actually work" on PrestaShop, and the part generic loyalty advice never reaches. The four mechanisms apply in a defined sequence, and if you don't design that sequence a Gold customer with a birthday code on a clearance item can end up paying far below cost.
How the final price is resolved
There is no universally safe four-step stack to memorise. The price a customer actually pays is the product of several systems resolved together: specific-price priority (which override wins on a given product), customer-group reductions, Catalog Price Rules, your tax settings, and the combinability of any Cart Rules at checkout. Specific Prices generally take precedence over a Catalog Price Rule on the same product, but group reductions and cart-rule combinability don't slot into one fixed order — they interact through PrestaShop's price calculation and its priority rules. The only reliable way to know what a given combination produces is to test the intended combinations on real products before you rely on them.
A practical, margin-safe architecture for a loyalty store:
- Tier discount (5–12% via group): always on, combinable — the permanent benefit
- Free-shipping threshold: combinable with the tier (they complement, they don't compound a % on a %)
- Promotional Cart Rules (10–20%): non-combinable with each other — the customer gets the single best one, not all of them
- Birthday code (15–20%): sits alongside the tier but not other promos — native cart-rule combinability is rule-to-rule, so you have to configure each rule's compatibility/exclusions explicitly (and test it against the customer-group reduction, which isn't governed by that same checkbox)
- A hard ceiling: decide a maximum effective discount (say 25–30%) and exclude low-margin categories from the rules most likely to breach it
This way your best customers genuinely feel rewarded — tier discount plus free shipping is real, visible value — while no plausible combination quietly sells a product below cost. So what? You can be generous on purpose and never discover a margin disaster in next month's numbers.
When and what to discount across the customer lifecycle
Different points in a customer's life with your store call for different mechanisms. Here's the map — and where a different part of the cluster owns the detail, this hands off rather than repeating it.
New customer (orders 1–2)
Resist the urge to discount the first visit. A "20% off your first order" banner to a cold visitor trains people to expect a discount and discards margin on buyers who'd have paid full price. Lead with value, then put a time-limited code in the order-confirmation email to pull the second purchase — a Cart Rule with a 30-day expiry and one use per customer. What to actually say in those messages is its own craft, covered in post-purchase emails.
Developing customer (orders 3–5)
Promote them into the Silver group at the spend threshold, switching on the ongoing % and free shipping. This is also where birthday and anniversary codes earn their keep: enable birth-date capture under Shop Parameters → Customer Settings (the Ask for birth date option), then trigger a generous once-a-year Cart Rule (15–20%, valid a fortnight around the date). Anniversary offers — the date of their first order — tend to feel even more personal because they celebrate the relationship with your store specifically.
Loyal customer (orders 6+)
Gold group: top ongoing %, free shipping, and exclusivity that isn't a discount at all — early access, or products restricted by Customer Group in the product's visibility settings. Exclusivity is the perk that builds emotional, harder-to-poach loyalty rather than the purely transactional kind; the philosophy of not over-discounting your best people is in keep it simple, keep it honest.
Lapsed customer (60+ days quiet)
A customer who has gone quiet is still far cheaper to re-activate than a stranger is to acquire — they have an account and a purchase history you can target. The discount lever here is an escalating ladder: a modest code first, a bigger one with free shipping if that's ignored, a final hard-deadline offer, then stop emailing the truly gone (continuing hurts deliverability). The discount mechanics are Cart Rules with unique codes and tight expiries; the timing, copy and segmentation that make the ladder convert belong to win-back emails. To find who's lapsed, this query lists customers whose last valid order predates a cutoff:
SELECT c.id_customer, c.email, c.firstname, MAX(o.date_add) AS last_order FROM ps_customer c JOIN ps_orders o ON o.id_customer = c.id_customer WHERE o.valid = 1 GROUP BY c.id_customer HAVING last_order < DATE_SUB(NOW(), INTERVAL 90 DAY) ORDER BY last_order DESC;
Discounts that recruit: referral codes
Referral discounts are the one place a discount does double duty — rewarding an existing customer (retention) while bringing in a new one at a fraction of paid acquisition cost. Mechanically it's two Cart Rule templates: a store-credit or % reward for the referrer, restricted to their account, and a first-order discount for the referee, single-use, that only activates once their order is valid (so the reward can't be farmed). At any real volume, hand-creating unique trackable codes stops being feasible — the full programme design, double-sided structure and tooling are covered in referral programs for PrestaShop.
Measuring whether your discounting actually pays
A discount programme that isn't measured is a slow leak you can't see. Track a handful of numbers monthly, most of them already in the back office:
- Repeat purchase rate — orders from returning customers as a share of all orders. Customers → Customers, sortable by order count; Stats → Best customers for the same view.
- Redemption rate — codes used vs distributed. Catalog → Discounts → Cart Rules shows usage per rule. Very low redemption means the offer or its timing is off; very high redemption may mean you're giving away discount to people who'd have bought anyway.
- Discount cost as a share of revenue — total reductions given divided by revenue. Watch the trend; a creeping number is margin quietly walking out.
- Incremental revenue — the one that matters most and the one no back-office screen gives you. If most discount users would have bought at full price, a "successful" campaign is actually losing money. The only honest way to know is a holdout: withhold the offer from a small random slice of the eligible group and compare. Period-over-period revenue lives in Stats → Sales and orders.
For ongoing reporting that goes beyond the default stats — pulling customer-level spend, tier movement and discount performance into something you can act on — the Loyalty Discounts System module wraps the group-tier-and-rule machinery described here into one back-office screen instead of a folder of SQL queries and a wall of Cart Rules.
The mistakes that turn loyalty discounts into a margin leak
- Discounting the first touch. Front-loaded "% off your first order" trains discount-seeking and burns margin on buyers who'd have paid full price. Reserve discounts for the post-purchase, retention window.
- One discount for everyone. A flat 10% treats your Gold customer like a stranger. Tier your generosity — more loyalty should buy more reward, which is the whole point of Customer Groups.
- Codes with no expiry. No deadline, no urgency. Every Cart Rule should carry a validity window: roughly 30 days post-purchase, a fortnight for birthdays, a few days for a final win-back attempt.
- Ignoring per-category margin. 15% off a 50%-margin product is fine; 15% off an 18%-margin product erases the profit. Use Cart Rule and Catalog Price Rule restrictions to fence off thin-margin lines.
- Never checking incremental revenue. Without a holdout you can't tell a profitable campaign from cannibalised full-price sales. Test before you scale.
- Letting the four mechanisms stack unsupervised. The single most expensive mistake on PrestaShop specifically — control it with the combinable, priority and restriction settings above.
The short version
Discounts build loyalty on PrestaShop only when they're an architecture, not a reflex. Know what each mechanism is for — Customer Groups for permanent tier benefits, Catalog Price Rules and Specific Prices for targeted catalogue pricing, Cart Rules for time-boxed codes. Govern how they stack with the combinable, priority and restriction settings so no combination ever sells below cost. Anchor every offer to your own break-even math, so a discount is the cheapest order you book rather than a giveaway. And measure incremental revenue, not redemption, so you know it's working. Do that, and discounting stops being the thing that erodes your margin and becomes the thing that pays for your next repeat customer — before the leaked profit adds up.
Comments
No comments yet. Be the first!
Be the first to ask a question or share useful feedback.
Leave a comment
Share a question, an installation detail, or feedback that could help another reader.