GuideOdoo 20 series, part 19 of 25September 22, 2026By Olivia, Senior Odoo Architect

Odoo 20 Subscriptions, Rental and eCommerce:
loyalty on renewals, fairer proration and rental pick-up

Subscriptions, Rental and eCommerce: Odoo 20 screenshot behind the article title
INTRODUCTION

Three sales-side apps, one set of changes

Odoo 20 does not rebuild Subscriptions, Rental or eCommerce. It fixes the places where the promise made at the point of sale and the invoice that followed did not agree: a loyalty reward that stopped after the first period, a subscription closed mid-month but billed for the whole month, a rental item offered for store pick-up while it was still out with another customer. All three apps sit on the same sales order, so the changes to promotions, quotations and the PDF Quote Builder reach all three at once. We take them one app at a time.

If you bill recurring revenue, rent equipment from a store, or run an online shop on Odoo, the sections below tell you what each screen looks like on the pre-release build, where our capture notes corrected the official feature list, and what we could not exercise on a private demo.

Observed on the Odoo 20.0 Enterprise pre-release build of September 23, 2026. Names, menus and availability can change before general availability; we will update this page when they do.

Loyalty rewards that repeat on every renewal

Loyalty programs can now target subscriptions. With sale_subscription_loyalty installed, a loyalty reward gains a Subscription group with a single Recurring checkbox. Tick it and the reward is applied to every renewed period, as long as the customer still has enough points; leave it off and the reward is granted once, as before. The guide says a loyalty rule gets the same flag so that points are granted at each renewal; on our build we configured the reward side, shown below. The demo program is the gym example from the guide: Gym Club Rewards grants 10 Club points per order, and its reward gives the Guest Session product twice for 10 points.

Reward dialog showing Free Product "Guest Session" x2 for 10 Club points, and a SUBSCRIPTION section with Recurring ticked.
A loyalty reward now has a Subscription group with a Recurring checkbox.

Two limits are worth knowing. Gift cards and eWallets are excluded from the recurring option, so a renewal cannot mint a balance out of nothing. And the menu path in the guide is out of date: on this build promotions live under Sales > Promotions > Discount & Loyalty, not under Products. The Rental app gets the same tooling through sale_renting_loyalty, under a menu named Promotions with Discount & Loyalty and Gift cards & eWallet beneath it, so a promotion code or a discount applies to a rental order too.

Step 1: Animated walkthrough: Sales > Promotions > Discount & Loyalty, open the Gym Club Rewards program, open its reward, tick Recurring in the Subscription group, save.Step 2: Animated walkthrough: Sales > Promotions > Discount & Loyalty, open the Gym Club Rewards program, open its reward, tick Recurring in the Subscription group, save.Step 3: Animated walkthrough: Sales > Promotions > Discount & Loyalty, open the Gym Club Rewards program, open its reward, tick Recurring in the Subscription group, save.
Make a loyalty reward recurring so it is applied on every subscription renewal.

MRR before confirmation, and reminders on your own calendar

The monthly recurring revenue of a subscription is visible earlier than before. On a subscription quotation the MRR is a line in the totals block, under Margin, so a sales manager can weigh a pipeline before anything is signed. The MRR smart button that the guide describes does exist, but it is hidden while the order is a Quotation or a Renewal Quotation and only appears once the subscription is confirmed. On the demo, quotation S00075 showed MRR: $ 230.00 under its totals; confirmed subscription S00076 showed the same figure as a smart button.

Subscription quotation S00075 in the Quotation stage, with "MRR: $ 230.00" highlighted under the totals.
A subscription quotation already shows its MRR, in the totals block.
Confirmed subscription S00076 with the MRR $230.00 smart button highlighted.
After confirmation, the MRR appears as a smart button.

Payment reminders stop being fixed. Two settings control them, and both take a comma-separated list of days rather than one number. Payment failure reminder days lists the days after the invoice date on which a reminder is sent when an automatic payment fails, for example 2,7,14. No-token payment reminder days lists day offsets relative to the next invoice date for subscriptions with no saved payment token, negatives allowed, for example -7,0,3,7. Both fields sit in Sales settings under Invoicing, which is where Subscriptions > Configuration > Settings opens. The guide lists two smaller changes we did not capture: subscription lines no longer need a product, and an order can be linked to a specific website in a multi-website setup.

Sales settings > Invoicing, showing "Payment failure reminder days" set to 2,7,14 and "No-token payment reminder days" set to -7,0,3,7.
The payment reminder timing is now configurable, as lists of days.

Reminder lists

A negative offset in the no-token list is the only reminder that arrives before the invoice exists, so it is the one that prevents a late payment rather than chasing one. Keep both lists short: every entry is an email your customer receives.

Closing mid-period: the last invoice charges the days used

When a subscription is closed in the middle of a period, the last invoice is prorated instead of charging the full period. The Close button opens a dialog with two fields, When and Reason. Pick a date in the future and the subscription is not cut immediately: the order receives an end date, shown as Until Oct 1 on the demo, and the proration appears on the next invoice you create. On S00090, a monthly contract whose period started on September 15, closing on October 1 produced draft invoice lines each described as 17 days 09/15/2026 to 10/01/2026, with prorated unit prices and a total of $149.88 rather than the full monthly amount.

Step 1: Animated walkthrough: subscription S00090 > Close > pick a reason and a close date of Oct 1 > Create Invoice > the draft invoice lines read "17 days 09/15/2026 to 10/01/2026" with prorated prices.Step 2: Animated walkthrough: subscription S00090 > Close > pick a reason and a close date of Oct 1 > Create Invoice > the draft invoice lines read "17 days 09/15/2026 to 10/01/2026" with prorated prices.Step 3: Animated walkthrough: subscription S00090 > Close > pick a reason and a close date of Oct 1 > Create Invoice > the draft invoice lines read "17 days 09/15/2026 to 10/01/2026" with prorated prices.
Close a monthly subscription in the middle of a period: the last invoice only charges the days until the close date.
Draft invoice lines, each described as "17 days 09/15/2026 to 10/01/2026", with prorated unit prices and a total of $149.88.
The last invoice is prorated to the close date.

One rule surprised us. A contract that has never been invoiced cannot be closed: Odoo answers Please cancel the contract instead. That is the right outcome for a subscription that never started, but worth knowing before a support team is trained on the Close button.

Rental proposals built with the PDF Quote Builder

The PDF Quote Builder now works on rental quotations. The documents are not attached to quotation templates as the guide suggests: they are managed in their own menu, Rental > Configuration > Headers/Footers, and templates only link to them. On the demo the kanban held five PDFs: Header, About Us, Project Description, Testimonials, and Terms and Conditions. On a rental quotation, the Quote Builder tab offers the documents that are not restricted to a template; you pick a header and a footer, and Preview or Download produces one file, the brochure page first, then the quotation itself with its Pick-up and Return dates.

Rental > Configuration menu open, with Headers/Footers highlighted under Settings and Quotation Templates.
The Rental app gets a Headers/Footers menu for the PDF Quote Builder.
Rental quotation S00088 with the Quote Builder tab open and the "About Us" header selected.
The Quote Builder tab on a rental quotation.
Quotation S00088 PDF for a Premium Bike rental, Pick-up 09/27/2026 and Return 10/04/2026.
Page 2: the rental quotation itself, with pick-up and return dates.

For an equipment rental company, the proposal sent to a site manager or an event planner now carries the fleet brochure and the damage terms without anyone assembling a PDF by hand.

Click & Collect for rental products, checked against the rental period

On the website, website_sale_collect_renting brings Click & Collect to rental products. A visitor picks the rental period on the product page, and under the price a store line appears next to Shipping: on the demo, My Company (San Francisco) with Pickup from Sep 24. Choosing the store opens a Pickup Location dialog with a map, the store address, its weekday opening hours and a Choose this location button. In the date picker, weekends were greyed out.

Premium Bike product page with the rental period picker and a "My Company (San Francisco) - Pickup from Sep 24" option highlighted.
A rental product page shows store pick-up availability next to delivery.
Pickup Location dialog with a map of Brisbane CA, the store address, weekday hours 08:00-18:00, and a "Choose this location" button.
The pick-up location dialog shows the store's address and opening hours.

According to the guide, the shop checks the stock of the chosen pick-up location for the rental period, counts rentals not yet returned and the preparation time after a return, and only offers pick-up when the item is really available. On the pre-release build that check runs in the location selector and at checkout, not on the product page, whose availability line is computed for the default dates: it still read Pickup from Sep 24 for dates that overlapped a confirmed rental of the only Premium Bike.

A map of where online orders come from

eCommerce managers get a Map view on online orders. Open Website > eCommerce > Orders and the view switcher has a map icon; each confirmed website order is pinned at its address, the order list sits on the right, and an Unlocated group collects orders whose address could not be placed. The view is added by the website_sale_enterprise module. On the demo, ten geolocated orders drew a spread from the West Coast to New England, enough to plan a delivery run or a regional campaign. Until a MapBox token is configured, a banner says that routing needs one.

Website > eCommerce > Orders in Map view, with pins across the United States and the order list on the right.
The new Map view of eCommerce orders.

The guide also lists a margin grid through sale_project_enterprise, which surfaces cost and margin on the timesheet grid of a project sold through a sales order. We did not capture it.

How to try it on a demo database

  1. Install Sales, Subscriptions, Rental, Website and eCommerce on a demo database, and enable the Click & Collect delivery option.
  2. Sales > Promotions > Discount & Loyalty. Create a program with a points rule and a Free Product reward, open the reward, tick Recurring in the Subscription group and save.
  3. Subscriptions > Subscriptions > Quotations. Open a monthly quotation and find the MRR line under the totals; confirm it and watch the MRR smart button appear.
  4. Subscriptions > Configuration > Settings, search for reminder, and fill both reminder day fields with comma-separated lists.
  5. Open a confirmed, already invoiced subscription, click Close, set When to a date inside the current period, then Create Invoice and read the line descriptions.
  6. Rental > Configuration > Headers/Footers, add a header PDF. Open a rental quotation, pick it in the Quote Builder tab, then Preview.
  7. Mark a rental product as available in store, open the shop as a visitor, pick rental dates and click the store line to open the Pickup Location dialog.
  8. Website > eCommerce > Orders, switch to the Map view.
Step 1: Animated walkthrough: a visitor opens Premium Bike in the shop, picks Oct 13 to Oct 16 in the rental date picker (weekends greyed out), selects in-store pick-up, and sees the Pickup Location dialog with the store address and opening hours.Step 2: Animated walkthrough: a visitor opens Premium Bike in the shop, picks Oct 13 to Oct 16 in the rental date picker (weekends greyed out), selects in-store pick-up, and sees the Pickup Location dialog with the store address and opening hours.Step 3: Animated walkthrough: a visitor opens Premium Bike in the shop, picks Oct 13 to Oct 16 in the rental date picker (weekends greyed out), selects in-store pick-up, and sees the Pickup Location dialog with the store address and opening hours.
Click & Collect for rentals: pick the rental dates on the product page, then choose the store for pick-up.

What we could not verify on the pre-release build

We did not see the loyalty point balance in the customer portal, which needs a portal user with a renewed subscription, and we set the Recurring flag on a reward, not on a rule. We did not see Click & Collect refuse a pick-up for dates when the item is already rented, because we did not drive a visitor checkout. The rental quotation PDF was downloaded and rendered to an image, since headless Chromium has no PDF viewer. Product-less subscription lines, the order-to-website link and the sale project margin grid are described from the guide only. Everything else on this page was clicked through on the 20.0 Enterprise build of 23 September 2026.

What this means for an upgrade

If you run Subscriptions on Odoo 17 to 19, list the loyalty programs and custom reminder logic you have today: recurring rewards and the two day-list settings may replace a customisation, and proration on closing changes your last invoices, so warn accounting before go-live. Rental companies should prepare the header and footer PDFs and the store opening hours before switching on Click & Collect. Online stores that talk to payment providers, carriers or a marketplace connector through the old RPC endpoints need our RPC migration audit first, because Odoo has scheduled the removal of the XML-RPC and JSON-RPC endpoints for Odoo 20. We check this during the scoping of our migration service, and the series hub lists the other changes that land in the same upgrade.

FAQ

Frequently asked questions

Can a loyalty reward apply on every subscription renewal in Odoo 20?

Yes. With the sale_subscription_loyalty module, a reward has a Recurring checkbox in its Subscription group. When it is ticked, the reward is applied to each renewed period as long as the customer has enough points. Gift cards and eWallets are excluded from the option.

What happens to the invoice when a subscription is closed mid-period?

The next invoice charges only the days between the period start and the close date. On the pre-release build, each line is described with the number of days and the date range, and unit prices are reduced to that fraction of the period. A contract that was never invoiced cannot be closed and must be cancelled.

Where are payment reminder days configured in Odoo 20 Subscriptions?

In Sales settings under Invoicing, which is where Subscriptions > Configuration > Settings opens. Payment failure reminder days takes a comma-separated list of days after the invoice date; No-token payment reminder days takes offsets relative to the next invoice date, negatives allowed.

Does a subscription quotation show an MRR smart button?

Not while it is a quotation. On the pre-release build the MRR appears as a line in the totals block of a Quotation or Renewal Quotation, and the smart button only appears in the header after the subscription is confirmed.

Can rental products be picked up in store from the Odoo 20 website?

Yes. The website_sale_collect_renting module adds a store line with a pick-up date to the rental product page and a Pickup Location dialog with the address and opening hours. According to the guide, the stock check for the rental period runs in the location selector and at checkout.

Which module adds the Map view of eCommerce orders?

The website_sale_enterprise module. It adds a Map view to Website > eCommerce > Orders, pins each confirmed online order at its address, and groups orders whose address could not be placed under Unlocated. Routing on the map needs a MapBox token; the pins do not.

Want to see your loyalty rules and closing invoices on Odoo 20 before you commit?

We can load a copy of your subscriptions, rental products and website orders on a 20.0 database, configure a recurring reward and the reminder day lists, and show you what your last invoices and rental proposals look like.

Book a free consultation