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.
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.