All segments

Magento 2 Loyalty Program: What Breaks at Catalogue Scale

A Magento 2 loyalty program lives in Adobe Commerce reward points: the earning base, the cart price rule conflict, and the query cost at scale.

  • Published
  • Reading time 16 min read
  • Author Nafiul Hasan
Magento 2 Loyalty Program: What Breaks at Catalogue Scale. Diagram: two records, drifting. RETAIN Magento 2 Loyalty Program: WhatBreaks at Catalogue Scale SYSTEM ASYSTEM B pointerflow.com

Short answer

A Magento 2 loyalty program runs through Adobe Commerce's native reward points module, not Magento Open Source, and the points balance sits alongside cart price rules rather than inside them. Get the earning base and catalogue query cost wrong and you either double-discount orders or slow checkout on a large product set.

What a magento 2 loyalty program actually needs before you touch admin settings

A magento 2 loyalty program is not a plugin you install and switch on. If you’re running Adobe Commerce, the reward points module already exists inside your platform; if you’re on Magento Open Source, it doesn’t exist at all, and everything below is a description of behaviour you’d have to build or buy rather than configure. Before you open a single settings page, confirm which of those two positions you’re actually in, because the rest of this article assumes Adobe Commerce’s native reward points.

Merchants doing $3M–$30M in revenue on Adobe Commerce are the audience for this guide, because at that scale a loyalty programme’s calculation cost is a real engineering question, not an afterthought. A store running a handful of SKUs on Open Source won’t find most of the mechanics here relevant, and a simpler store-credit or coupon-based reward is probably the right call instead.

You also need a decision made before configuration starts: what is the programme actually meant to change? A points balance that sits unused in a customer’s account for a year changes nothing. The earning base, the redemption cap and the expiry window are the levers that decide whether points pull a customer back for a second order inside a useful window, or just sit there as a number on an account page nobody checks.

Step 1: Confirm you’re running Adobe Commerce, not Magento Open Source

Reward points ship as a native feature of Adobe Commerce (the commercial tier, cloud or on-premise), configured through the store’s admin panel rather than installed separately. Magento Open Source has no equivalent built in. If your team has been searching the Open Source admin for a reward points section and not finding one, that’s expected, not a bug in your installation.

If you’re on Open Source and committed to staying there, you’re choosing between building the earning and redemption logic against Magento’s own price rule and customer entity APIs, or bringing in a third-party solution that does the same. Either path changes the cost profile of this whole exercise: you’re not configuring a setting, you’re maintaining a custom module through every future Magento upgrade. Say that plainly to whoever is asking for “a loyalty programme” as a scope item, because the estimate for Open Source and the estimate for Adobe Commerce are not close to each other.

If you are on Adobe Commerce, the rest of this guide is about configuration decisions inside a system you already own, not a build. That’s a materially smaller project, but it still has real ways to go wrong, mostly at the exact points where reward points meet the rest of your pricing logic.

Step 2: Set the points-to-currency rate before you set anything else

Every other decision in the programme depends on one number: how many points equal how much currency at redemption. Set this first, because your earning coefficient, your caps and your marketing copy about “earn points on every order” all have to be consistent with it, and reworking the rate after customers have started accumulating a balance is a genuinely difficult migration — you’re changing the value of money customers believe they already have.

Work the rate backwards from your margin, not forwards from a round number that sounds generous. Decide the smallest reward increment you’re comfortable exposing (a redemption worth a token amount doesn’t move behaviour and just adds calculation load for no benefit), and the largest single-order discount a fully accumulated balance could produce. That second number is the one to stress-test: a customer who never redeems for six months and then tries to zero out a large cart is the edge case that actually costs you margin, not the customer redeeming small amounts regularly.

Confirm the exact conversion field name and scope in your current Adobe Commerce admin before you configure it — Adobe has adjusted labelling and section structure across releases, and the mechanism (a defined points-to-currency ratio, set at store or website scope) is the stable part, not the precise field wording.

Step 3: Decide what counts toward the earning base

The earning base is the order value the points coefficient is applied against, and it’s the single decision most teams skip past without discussing. Your options are broadly: the full order subtotal before any other discount, the subtotal after cart price rule discounts, or a per-item base that excludes certain product types (sale items, gift cards, subscription top-ups) from earning at all.

Choosing the post-discount subtotal is the safer default for margin, because a customer who used a percentage-off code isn’t also earning points calculated on the pre-discount price — you’re not compounding two forms of discount on the same order. Choosing the pre-discount subtotal is more generous and easier to market (“earn points on your full order value”), but it means every promotional campaign you run also inflates the points liability sitting on customer accounts, and that liability is real money you’ll eventually redeem against future orders.

Exclude gift cards and store-credit top-ups from the earning base entirely. A customer who buys a gift card and earns points on it, then earns points again when the gift card is spent on a second order, is earning points twice on the same underlying revenue. This is one of the more common configuration misses, because it’s not visible until someone reconciles the points liability against actual order value months later.

Step 4: Map reward points against your cart price rules

Step 4 is where most magento loyalty program setups actually go wrong, and it’s a sequencing problem, not a bug. Catalogue price rules apply first, changing the price a customer sees on the product and category pages. Cart price rules apply next, at the cart, adjusting the order total based on conditions like coupon codes, cart value thresholds or customer group. Reward points redemption is applied after both, at checkout, as a further reduction against whatever total is left.

1. Catalogue price rule Sets the shown price 2. Cart price rule Coupon, threshold, group 3. Points redemption Applied to what's left

This order of operations is fine on its own — a defensible sequence. The failure is that nothing in the default setup stops a cart price rule and points redemption applying to the same order at the same time unless you explicitly build that exclusion. A customer stacking a large cart discount and a large points redemption on the same order can end up buying close to nothing, and because both mechanisms fire independently, neither one “sees” the other unless you configure a check.

The fix is a cart price rule condition that checks whether reward points redemption is active on the quote, and either blocks the rule from applying or reduces its value proportionally. You build this as a rule condition, using the same condition builder you already use for coupon eligibility, not as a setting you flip. Test it with your highest-value cart price rule and your most generous points redemption together, on the same test order, before launch — this is the one combination that will surface every other configuration mistake made upstream of it.

Step 5: Set expiry, caps and the minimum redemption balance

Three settings do most of the work of keeping the programme’s liability predictable: point expiry, the maximum redemption value per order, and the minimum balance required before redemption is offered at all.

Point expiry should run on calendar days from the date points were earned, not from account creation, and the expiry job runs on a schedule rather than in real time — confirm the current schedule and grace-period behaviour in your admin, since a points balance that silently vanishes with no warning email is a support complaint waiting to happen, not a technical problem. Pair expiry with a notification a set number of days before it takes effect if your customer communication platform supports it; an unannounced expiry reads as a broken promise to the customer holding the balance.

A maximum redemption value, expressed either as a fixed points ceiling or a percentage of order total, stops a customer with a large accumulated balance from zeroing out an order at checkout. Set it low enough that no single order’s margin is at real risk, and test it against your highest average order value segment specifically, because a cap that’s safe for a modest order can still be too generous against a high-value one.

The minimum redemption balance exists to stop the calculation overhead of processing negligible redemptions. A customer with eleven points worth a fraction of a currency unit gains nothing from redeeming them, but your checkout still has to calculate, display and process that redemption if you allow it. Set a floor that makes every redemption meaningful to the customer and worth the calculation cost to you.

Step 6: Handle reward points across multi-store and multi-currency setups

If you run more than one store view or website under the same Magento instance, the points balance is typically tied to the customer entity globally, while the points-to-currency conversion rate is set at store or website scope. That combination is where multi-store loyalty programmes usually go wrong: a customer earns points shopping on one store view and finds they’re worth a different amount when redeemed on another, because the two store views convert points to currency at different rates or in different base currencies.

Decide, deliberately, whether that’s the behaviour you want. A single global conversion rate across every store view is the simplest to reason about and the easiest to explain to a customer who emails asking why their balance “changed value.” A per-store rate is defensible if your stores genuinely serve different markets with different margin structures, but it needs to be documented somewhere a support agent can find it, because “your points are worth less on this site” is not an answer most support teams can give confidently without a clear internal reference.

Test the actual customer journey across store views before launch: earn points on one, log into another, and check what the checkout displays as the redemption value. This is a manual test, not something the default configuration validates for you, and it’s the multi-store equivalent of the cart price rule collision in Step 4 — the failure only shows up when two systems that don’t know about each other are exercised together.

Step 7: Turn on the customer-facing balance and redemption at checkout

The last configuration step is deciding where and how the balance is visible: the account dashboard, the mini-cart, the cart page, and the checkout step itself. Each additional place you surface a live balance is an additional query against the points transaction history, and on a large catalogue with high cart-update frequency, that adds up in ways that show directly in checkout and mini-cart response times.

A sensible default is to show the balance on the account page and at the cart or checkout step, where it can actually influence a purchase decision, rather than on every product page as a projected “you’ll earn N points” label. The product-page version is the one most likely to be requested by a marketing team wanting maximum visibility, and it’s also the one with the worst performance profile, because it means a points calculation runs on every product page view rather than once per cart action.

If you do want product-page visibility, cache the projected earnings value rather than calculating it live per request. The number only needs to update when the earning rule or the product price changes, not on every page load, and treating it as a cached, periodically-refreshed value rather than a live query is the difference between a negligible performance cost and a measurable one.

The step most teams get wrong

The step almost every Magento loyalty program setup gets wrong is Step 4: nobody builds the explicit exclusion between reward points redemption and cart price rules, because in testing, with a single test account and a handful of orders, the two mechanisms rarely collide by accident. The collision only shows up at volume, when real customers with real accumulated balances happen to also hold a valid coupon code, and by then it’s showing up as a margin variance somewhere in monthly reporting that nobody can immediately trace back to a specific setting.

The earning base decision in Step 3 is the second common miss, specifically forgetting to exclude gift cards from earning points. It’s an easy thing to miss because gift cards are a small fraction of most catalogues, and the double-earning problem it creates is small on any individual order — but it compounds over a full year of gift card sales into a real, quietly growing liability that nobody flagged as a Configuration decision at launch.

Both of these share a pattern worth naming directly: Adobe Commerce’s reward points module is genuinely well built for the earning and redemption mechanics it owns, but it was not designed with built-in awareness of every other pricing mechanism in your store. Every point where it touches another system — cart price rules, gift cards, multi-store currency — is a point you have to configure the interaction explicitly, because the two modules won’t discover the conflict for you.

What a loyalty program does to performance on a heavy catalogue

The performance cost of a Magento 2 loyalty program sits in the live balance and projected-earnings displays that query the points transaction history on pages that get hit constantly: the mini-cart, the account dashboard, and — if you enabled it in Step 7 — the product listing pages.

On a catalogue with a large number of SKUs and category pages carrying dozens of products each, a live “points you’ll earn” calculation running per product, per page load, adds a database query per product shown. That’s a materially different load profile from a single balance lookup on an account page, and it’s the specific setup choice that turns a lightweight feature into a measurable one. The fix is to cache the projected value and refresh it on a schedule or on the specific events that change it (a price update, a rule change), rather than recalculating it on every render or dropping the feature.

The mini-cart balance display carries a similar risk if it queries the full points transaction history rather than reading a maintained running balance on the customer entity. A transaction history query that sums every earn and redeem event a long-tenured customer has ever had, run every time they open the mini-cart, scales badly as that history grows — a customer two years into the programme costs more to serve a balance to than one who joined last week, and that cost is invisible until your highest-tenure, highest-value customers start reporting a slow checkout.

Treat the reward points feature the same way you’d treat any other feature that adds a query to a high-traffic page: measure the actual query cost on a realistic catalogue and cart size before launch, not against the handful of test products most staging environments carry. A configuration that performs fine against twenty SKUs and empty transaction histories tells you very little about how it behaves against thousands of SKUs and customers with a year of order history.

How to verify the program before you launch it

Verification here means testing the collisions, not the happy path. The happy path — a customer earns points, redeems them, gets a discount — will work in almost any configuration, because it’s the one scenario the module is built and tested for by default. The failures live in the combinations.

Run these specific tests before launch, in this order: a customer with an active cart price rule and a redeemable points balance on the same order, to confirm the cart price rule exclusion actually fires. A customer redeeming points on an order that includes a gift card, to confirm the gift card earning exclusion holds. A partial refund on an order where points were both earned and redeemed, to confirm the reversal behaviour matches what you told the business it would do. A customer logging into a second store view after earning points on the first, to confirm the redemption value matches what Step 6 was configured to produce.

Then check the performance side separately: load a product listing page with the points earnings display enabled, on a catalogue-sized data set rather than a handful of test SKUs, and check the response time against the same page with the feature disabled. If there’s a meaningful difference, that’s your signal to move to a cached projected-earnings value rather than a live one before this reaches production traffic.

Finally, confirm the expiry job runs correctly against a test account with an artificially old points balance, since expiry logic on a scheduled job is one of the easiest pieces of the whole setup to configure correctly and then never actually see run until real customer balances start hitting the expiry window months after launch.

Who a magento 2 loyalty program is not for

This setup is not for a store under the platform’s published floor — under $3M in revenue, the engineering time spent getting the earning base, cart price rule exclusion and multi-store conversion right is disproportionate to the retention lift a points programme can realistically produce at that order volume. A simpler mechanism, a flat percentage-off code for a second purchase, will get most of the behavioural benefit for a fraction of the configuration and testing cost.

It’s also not for a store on Magento Open Source without budget for a genuine build. This comparison assumes Adobe Commerce’s native module; recreating that mechanism from scratch on Open Source, correctly handling the same cart price rule and multi-store edge cases, is a project measured in engineering weeks, not admin configuration hours, and it needs to be scoped and costed as one.

And it’s not for a team unwilling to own the ongoing configuration work a reward points programme demands. It isn’t a set-and-forget feature: every new cart price rule you launch afterwards needs to be checked against the points exclusion logic, every new store view needs its conversion rate reviewed, and every catalogue expansion is worth a fresh look at the performance cost of any live balance display you’ve turned on. Treat it as a system with maintenance obligations, because that’s what it is.

A magento 2 loyalty program is ultimately a subscription-retention lever wearing platform-specific clothing: the real goal is pulling a customer back for a second, third and fourth order inside a window where they’d otherwise drift to a competitor or simply forget you. If retention is the actual problem you’re solving, it’s worth looking at it as subscription retention rather than a single feature — model what your current repeat-purchase behaviour looks like with the subscription churn calculator, and see where DTC consumables brands typically lose customers in the subscription churn benchmark before deciding how much of your retention budget a points programme should actually own.

Sources

  • No external figures are quoted in this article. It’s written from the documented mechanics of Adobe Commerce’s native reward points module, Magento’s cart and catalogue price rule architecture, and general database query behaviour on high-traffic storefront pages; confirm exact field names and job schedules against your current Adobe Commerce admin and documentation, since these have changed between releases.

Frequently asked

Does Magento Open Source have a loyalty program feature?

No. Reward points are native to Adobe Commerce (the paid, cloud or on-premise tier), not Magento Open Source. On Open Source you're building the earning and redemption logic yourself or buying it in, which changes the whole cost and maintenance picture.

What's the difference between reward points and store credit in Magento?

Store credit is a fixed currency balance applied directly to an order total. Reward points are a separate unit that converts to currency at a rate you set, expire on a schedule, and are earned through configurable rules tied to orders or specific catalogue items.

Can reward points be redeemed alongside a cart price rule discount code?

Yes, but nothing stops both applying to the same order unless you build the exclusion yourself. Without a rule that checks for an active points redemption, a customer can stack a percentage-off code with points and take more margin than either was meant to give away alone.

Does a Magento 2 loyalty program balance expire?

Adobe Commerce lets you set a point expiry period in calendar days from the date they were earned, run on a scheduled job. Confirm the current field name and job schedule in your admin, because Adobe has renamed configuration sections between releases.

How does Magento calculate the reward points a customer earns?

Points are calculated from an earning base you define, usually the order subtotal after other discounts, multiplied by a coefficient set per rule. The base you choose decides whether a customer earns points on the discounted price or the full price, and those give very different payouts.

Can you run different reward point rules per store view?

Yes. Reward point rules can be scoped to specific websites or store views, the same scoping model Magento uses for catalogue and cart price rules. The trap is a shared customer account earning points at one store's rate and redeeming them at another's conversion rate.

Does redeeming reward points affect tax calculation?

It can, depending on whether your tax engine calculates tax before or after the points discount is applied to the order total. This is a configuration decision, not a fixed behaviour, and it needs testing with your actual tax settings before launch, not assumed.

What happens to reward points when an order is refunded?

Points earned on a refunded order should be reversed, and points spent on a refunded order should generally be reinstated, but the exact behaviour depends on your rule configuration and whether the refund is full or partial. Test partial refunds specifically; they're where this usually breaks.

Can reward points be capped per order?

Yes, through a maximum points value or a maximum percentage of the order total that points can cover. Without a cap, a customer with a large accumulated balance can zero out an order's payable amount, which is rarely the outcome the programme was designed for.

Does a Magento 2 loyalty program slow down the checkout page?

It can, if the balance and projected-earnings display query the points transaction history live on every cart update instead of reading a cached value. On a heavy catalogue with frequent cart changes, this shows up as slower add-to-cart and mini-cart response times.

Can guests earn or redeem reward points?

No. Reward points require a logged-in customer account, because the balance is tied to the customer entity. This is worth stating plainly to marketing teams who plan a points campaign assuming it will influence guest checkout behaviour, because it won't touch that segment at all.

How do reward points interact with catalogue price rules?

Catalogue price rules change the displayed and charged price before the order reaches the cart, so points earned on the earning base already reflect any catalogue-level discount. The collision that actually causes problems is with cart price rules, which apply later, not catalogue rules.

Is there a minimum balance required before redemption?

Adobe Commerce lets you set a minimum points balance a customer must hold before redemption is offered at checkout. Without one, customers can redeem tiny point balances for negligible discounts, which adds calculation overhead for a saving too small to influence the purchase decision.

Can reward points be transferred between customer accounts?

Not as a standard, supported action. Points are tied to the individual customer entity, and any transfer between accounts is a manual database operation outside the intended workflow, which is a strong reason not to promise transferability in customer-facing programme terms.

Do third-party loyalty apps replace the need for native reward points?

They can, and often add tiering, referral and gamification features Adobe Commerce's native module doesn't cover. The trade-off is an additional integration surface, its own API calls against your catalogue and order data, and a second system to keep in sync with store-level changes.

Next step

Is this your subscription retention problem, or a symptom of another one?

Bring your numbers — the churn split, the decline rate, whatever your flows are earning — and we will tell you which of them is the expensive one.

Book a call →