Repeat customers are cheaper to keep than new ones are to win, and Odoo's Point of Sale has the tooling to act on that: loyalty cards that accumulate points at the till, gift cards, and eWallets that hold store credit against a customer's account. All three run on a single program engine shared by Point of Sale, Sales, and eCommerce, so a program you define once in the back office behaves the same way at the register, on a sales order, and in the web shop. Most of this machinery is long-standing — the unified program model has been in place for several releases — but Odoo 20 adds two long-requested controls: loyalty points can now expire, and discount codes can be restricted to a single use per customer.
One program engine for every channel
Loyalty cards, gift cards, eWallets, coupons, promotions, discount codes, buy-X-get-Y offers, and next-order coupons are all the same kind of record in Odoo: a program. Each program has a type, and the type decides how it earns, how it is redeemed, and where it applies. Creating or editing a program opens a form with the fields that matter:
- Program Name — internal only; the customer never sees it.
- Program Type — loyalty cards, gift card, eWallet, coupon, promotion, and the other types listed above.
- Currency — the currency the program's values are kept in.
- Pricelist — optionally restrict the program to customers on one or more pricelists; leave it blank and the program applies to everyone.
- Points Unit — for loyalty cards, the customer-facing name of your points (for example,
Loyalty Points). - Start Date / End Date — the program's own validity window; blank means always valid.
- Limit Usage — cap how many times the program can be used during its validity period.
If no programs exist yet, Odoo offers template cards to create the first one; the templates disappear once your first program is saved. Programs also carry conditional rules (such as a minimum purchase amount or required products) and rewards — a discount or a free product — and, depending on the program type, the reward is either applied automatically when the conditions are met or applied manually by the cashier.
Turning it on in the point of sale
The back-office programs only reach the register once the feature is switched on for the POS. In the POS settings, scroll to the Pricing section and enable Promotions, Coupons, Gift Card & Loyalty Program, then save. From that same setting you can jump to Gift cards & eWallet to configure those programs and generate cards. Because the setting is per point of sale, a business can run loyalty at its retail counters and leave it off at a wholesale desk, even though the programs themselves live in one shared list.
Loyalty cards at the register
Loyalty only works when Odoo knows who is buying. To track or spend points, the cashier must first select a customer on the order; with no customer set, there is nowhere for points to accumulate. Once a customer is selected, their loyalty points are displayed at the bottom of the cart and updated in real time as items are added, so the cashier can see what this order earns and what the balance holds.
Earning is automatic: when the order is validated, the points the order qualifies for are added to the customer's card. Spending is deliberate. To redeem points for a reward, the cashier clicks the vertical ellipsis icon in the register, selects Reward, and chooses the reward from the list — a discount or a free item, as defined on the program. The same Reward entry point is used for buy-X-get-Y rewards, which also must be added manually once the order qualifies.
Two consequences follow. First, staff need the habit of attaching the customer before payment, because points cannot be tracked for an anonymous sale. Second, identifying the customer has side benefits: their attributed pricelist applies automatically, and an invoice can be generated for the same order.
New in Odoo 20: points that expire
Until now, a program's Start and End Dates controlled when the program was valid, but points a customer had already earned sat on their card indefinitely — a growing, open-ended liability on your books and a weak reason for the customer to come back soon. Odoo 20 adds loyalty point expiration: you can set an expiration date for loyalty points, so earned points lapse if they are not used in time. That changes program design: an expiry window gives customers a deadline to return, keeps the outstanding points balance bounded, and makes the program's cost easier to forecast. If you migrate an existing program, communicate the change to members before switching expiry on; surprising customers with vanished points is worse than never expiring them.
The second new control sits next door: discount codes can now be used only once per customer. Single-use-per-customer codes close the classic abuse of one welcome code being shared around and redeemed repeatedly, while still letting you hand the same code to your whole mailing list.
Gift cards: selling, handing over, and redeeming
A gift card is a prepaid balance the customer pays with, tracked card by card. Gift cards are sold to a buyer, which distinguishes them from eWallets, covered next. Once a gift card program is configured, selling a new card at the register is a normal sale with one extra step:
- Add the gift card product to the order.
- Select the gift card program in the popover, if more than one program exists.
- Adjust the price and quantity if necessary, then click Payment and complete the transaction.
After payment is validated, the gift card is automatically downloaded as a PDF containing the gift card code, rendered from the template chosen in the program's Print Report field, ready to print for the customer. Cards can also be sent by email from the back office: open the program, click the Gift cards smart button, and use Send on the card's row. Sold cards remain accessible in the back office at any time for reprinting.
Physical gift cards
Pre-printed plastic or card stock works too. The cashier adds the gift card product, chooses the program, clicks Sell physical gift card? under the product in the cart, enters or scans the physical card's code, adjusts the amount and expiration date if needed, and clicks Add Balance before taking payment. If the scanned code already exists in Odoo, Add existing Gift Card attaches it to the order instead.
Redeeming a gift card
Redemption uses the same entry point as coupons and discount codes: click the vertical ellipsis icon, select Enter Code, type or scan the code, and click Apply. The card's balance is drawn down against the order. A warning popover appears if the gift card was not previously purchased through the POS — clicking Ok accepts the card and continues, which is the right path for cards issued from the back office, and a prompt to pause for anything that looks irregular. Gift cards also interact with refunds: when an order total is negative, adding a gift card to the cart automatically adjusts the gift card balance to match that amount, which makes “refund to a gift card” a clean option at the till.
eWallets: store credit tied to a customer
An eWallet is a prepaid balance as well, but instead of living on a transferable card with a code, it is store credit linked to a specific customer's account. That makes eWallets the natural vehicle for refund credit, goodwill gestures, and prepaid accounts for regulars.
To credit a customer's eWallet from the register, select (or create) the customer, add the eWallet top-up product to the order, choose the eWallet program in the popover if several exist, adjust the top-up amount by editing the product price, and take payment as usual. To spend the balance, the customer must be assigned to the order — the option does not even appear otherwise. The cashier then clicks the vertical ellipsis icon and selects eWallet Pay, choosing the program if the customer has more than one. If the customer has only one eWallet program, the available balance is applied automatically.
The design rule of thumb: use gift cards when the value must change hands (gifts, promotions, anonymous buyers) and eWallets when the value belongs to a known customer and should never be transferable.
Running the programs responsibly
- Treat sold balances as a liability. Money taken for gift cards and eWallet top-ups is the customer's money until it is redeemed; watch outstanding balances closely, and let point expiration (new in 20) keep the loyalty side of that liability bounded.
- Scope with pricelists. Attaching a program to a pricelist keeps member-only offers member-only, without duplicating programs.
- Cap what you can. Limit Usage, validity dates, and single-use-per-customer codes (also new in 20) are cheap insurance against a misconfigured or over-shared offer.
- Train the two register gestures. Nearly everything in this article is either Enter Code or Reward behind the ellipsis icon — plus selecting the customer first. If staff master those, loyalty stops slowing the line down.
Further reading
- Odoo 20 Release Notes — loyalty point expiration and single-use discount codes in the Sales section; POS changes in the Point of Sale section.
- Pricing features — Point of Sale documentation — loyalty cards, gift cards, eWallets, codes, and promotions at the register.
- Discount and loyalty programs — Odoo documentation — the program form, program types, conditional rules, and rewards.
