-
Notifications
You must be signed in to change notification settings - Fork 10.3k
[IMP] Subscriptions: Renew subscriptions page rework #14768
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: 18.0
Are you sure you want to change the base?
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
@@ -2,127 +2,95 @@ | |||||||||||||||||
Renew subscriptions | ||||||||||||||||||
=================== | ||||||||||||||||||
|
||||||||||||||||||
The foundation of any subscription business model is recurring payments. This is when customers | ||||||||||||||||||
reliably pay a regular amount at specific intervals, in exchange for access to a subscription | ||||||||||||||||||
product or service. | ||||||||||||||||||
|
||||||||||||||||||
Subscription renewal is the process customers follow when they willingly choose to continue | ||||||||||||||||||
participating in, and paying for, a subscription product or service. | ||||||||||||||||||
|
||||||||||||||||||
Subscribers experience the renewal process at different intervals -- weekly, monthly, annually, etc. | ||||||||||||||||||
-- depending on the duration of the agreed-upon contract. | ||||||||||||||||||
|
||||||||||||||||||
Most companies that offer subscriptions prefer to automate the renewal process for customers. | ||||||||||||||||||
However, manual subscription renewals are still used in some cases. | ||||||||||||||||||
|
||||||||||||||||||
With the Odoo **Subscriptions** application, a company can manage all of its subscriptions in one | ||||||||||||||||||
place. Renewals can be processed automatically, or manually, include additional products or upsells | ||||||||||||||||||
per renewal order, and be filtered in batch views to quickly locate customers who need to renew | ||||||||||||||||||
Subscription renewal is the process customers follow when they willingly choose to continue a | ||||||||||||||||||
subscription product or service. Subscribers go through the renewal process at different intervals | ||||||||||||||||||
-- weekly, monthly, annually, etc. -- depending on the duration of the agreed-upon contract. Most | ||||||||||||||||||
companies that offer subscriptions prefer to automate the renewal process for customers. However, | ||||||||||||||||||
manual subscription renewals are still used in some cases. | ||||||||||||||||||
|
||||||||||||||||||
With the Odoo :guilabel:`Subscriptions` application, a company can manage all of its subscriptions | ||||||||||||||||||
in one place. Renewals can be processed automatically or manually, include additional products or | ||||||||||||||||||
upsells per renewal order, and be filtered in batch views to locate customers who need to renew | ||||||||||||||||||
their subscriptions. | ||||||||||||||||||
|
||||||||||||||||||
Subscription renewals | ||||||||||||||||||
===================== | ||||||||||||||||||
Opening a renewal quotation | ||||||||||||||||||
=========================== | ||||||||||||||||||
Comment on lines
+16
to
+17
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Since we're thinking of distinguishing between the manual and automatic renewal process, let's be more intentional in the naming that this is for the manual process! Here are some ideas for ways we could title this
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. The title above is the most concise option, but if we want to consider SEO and make it more action-oriented, we could try:
Suggested change
I dropped “quotation” from the title since it feels a bit Odoo-specific and might not be something a general user would search for. That said, this is just my take and gut feeling, I don’t have data to back it up! 😅 You’re the one diving deep into the Subscriptions app, so I’d love for you to decide what feels right here! If "renewal quotation" is an industry-standard term or makes more sense for our audience, feel free to keep it! I trust your judgment as you build your expertise in this area. 🙌 |
||||||||||||||||||
|
||||||||||||||||||
In order to renew a subscription, a quotation with a subscription product **must** be confirmed, | ||||||||||||||||||
with a configured *Recurring Plan* selected. | ||||||||||||||||||
In order to create a renewal quotation, there are certain prerequisites that a subscription must | ||||||||||||||||||
meet. | ||||||||||||||||||
Comment on lines
+19
to
+20
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. And a response to the above message about titles, I personally would leave the wording like you have it here on "renewal quotation", since we're getting into the step-by-step instructions in Odoo, so Odoo-isms are expected and encouraged to build the reader's familiarity with our terminology (: (things like smart buttons) |
||||||||||||||||||
|
||||||||||||||||||
To open a subscription quotation, navigate to :menuselection:`Subscriptions app --> Subscriptions | ||||||||||||||||||
--> Quotations`, and select the desired quotation from the list. Or, create a new one by clicking | ||||||||||||||||||
:guilabel:`New` to open a new quotation form. | ||||||||||||||||||
- A quotation with a subscription product must be confirmed. | ||||||||||||||||||
- A configured *recurring plan* must be selected. | ||||||||||||||||||
- Payment from the customer for the initial subscription must be invoiced and registered. | ||||||||||||||||||
|
||||||||||||||||||
.. note:: | ||||||||||||||||||
- Only a singular product is required. | ||||||||||||||||||
- A subscription service counts as a product, as it is considered a recurring product. | ||||||||||||||||||
|
||||||||||||||||||
Subscription quotations **must** be confirmed, and payment from the customer for the | ||||||||||||||||||
initial subscription **must** be invoiced and registered in order to successfully open a *Renewal | ||||||||||||||||||
Quotation*. | ||||||||||||||||||
|
||||||||||||||||||
.. seealso:: | ||||||||||||||||||
For more information on the above process of confirming quotations and invoicing payments, | ||||||||||||||||||
see: | ||||||||||||||||||
- :doc:`../sales/sales_quotations/create_quotations` | ||||||||||||||||||
- :doc:`../sales/sales_quotations/get_paid_to_validate` | ||||||||||||||||||
|
||||||||||||||||||
Once the payment from the subscription quotation is confirmed, the quotation turns into a sales | ||||||||||||||||||
order. An :guilabel:`In Progress` tag is applied to the sales order form, and a series of buttons | ||||||||||||||||||
also appear at the top of the sales order, including a :guilabel:`Renew` button. | ||||||||||||||||||
To check if an existing subscription quotation meets the prerequisites, navigate to | ||||||||||||||||||
:menuselection:`Subscriptions app --> Subscriptions--> Quotations` and select the desired quotation | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||
from the list. Properly configured subscriptions show as being in the :guilabel:`Sales Order` stage, | ||||||||||||||||||
have an :guilabel:`In Progress` tag, and have the :guilabel:`Renew` button in the row of buttons | ||||||||||||||||||
directly above the order form. | ||||||||||||||||||
Comment on lines
+28
to
+30
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Good clarification on the state of a proper subscription! (: |
||||||||||||||||||
|
||||||||||||||||||
.. image:: renewals/renew-button.png | ||||||||||||||||||
:align: center | ||||||||||||||||||
Comment on lines
31
to
33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This doesn’t need to be updated for this PR, since the images are still accurate in version 18. But just for future reference: we’ve updated our style guidelines to stop using red boxes to mark up screenshots. For your next PRs, please take screenshots without them. |
||||||||||||||||||
:alt: Renew button on subscription sales order with Odoo Subscriptions. | ||||||||||||||||||
|
||||||||||||||||||
When the :guilabel:`Renew` button is clicked, Odoo instantly presents a new renewal quotation, | ||||||||||||||||||
complete with a :guilabel:`Renewal Quotation` tag. | ||||||||||||||||||
|
||||||||||||||||||
.. image:: renewals/renewal-quotation.png | ||||||||||||||||||
:align: center | ||||||||||||||||||
:alt: Renewal quotation in the Odoo Subscriptions application. | ||||||||||||||||||
|
||||||||||||||||||
From here, a standard sales flow can occur to confirm the quotation. This typically begins | ||||||||||||||||||
by clicking :guilabel:`Send by Email`, which sends a copy of the quotation to the customer, by | ||||||||||||||||||
email, for them to confirm, and eventually, pay for. | ||||||||||||||||||
|
||||||||||||||||||
.. note:: | ||||||||||||||||||
In the chatter of the :guilabel:`Renewal Quotation`, it is mentioned that this subscription is | ||||||||||||||||||
the renewal of the subscription from the original sales order. | ||||||||||||||||||
|
||||||||||||||||||
Once the :guilabel:`Renewal Quotation` is confirmed, it becomes a sales order, and a | ||||||||||||||||||
:guilabel:`Sales History` smart button appears at the top of the page. | ||||||||||||||||||
|
||||||||||||||||||
.. image:: renewals/sales-history-smart-button.png | ||||||||||||||||||
:align: center | ||||||||||||||||||
:alt: Sales History smart button in the Odoo Subscriptions application. | ||||||||||||||||||
|
||||||||||||||||||
When that :guilabel:`Sales History` smart button is clicked, Odoo reveals a separate page, | ||||||||||||||||||
showcasing the different sales orders attached to this subscription, along with their individual | ||||||||||||||||||
complete with a :guilabel:`Renewal Quotation` tag. Important reference information like the start | ||||||||||||||||||
date and next invoice date are automatically added to the renewal quotation's chatter. | ||||||||||||||||||
|
||||||||||||||||||
From here, follow the standard sales flow to | ||||||||||||||||||
:ref:`confirm the quotation <sales/sales_quotations/send-and-confirm>`, | ||||||||||||||||||
:doc:`invoice the order <../../sales/sales/invoicing/invoicing_policy>`, and :ref:`register payment | ||||||||||||||||||
<finance/accounting/register-payment-invoice-bill>`. | ||||||||||||||||||
|
||||||||||||||||||
Once the renewal quotation is confirmed, it becomes a sale order and a :icon:`fa-usd` | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Just a quick note about terminology here! I know we had this discussion last week that the smart button currently says "Sale Order" but sales order is more correct grammatically. In cases like this, we follow the UI exactly when using a guilabel (even if it's grammatically wrong) and we can submit R&D feedback to Belgium to suggest the fix. Since you’re referring to sales orders in general here (and not using a guilabel), it’s perfectly fine to write “sales order” in the grammatically correct form! (: |
||||||||||||||||||
:guilabel:`Sales History` smart button appears at the top of the page. When the :icon:`fa-usd` | ||||||||||||||||||
:guilabel:`Sales History` smart button is clicked, Odoo loads a new page showcasing the different | ||||||||||||||||||
sales orders attached to this subscription, along with their individual | ||||||||||||||||||
:guilabel:`Subscription Status`. | ||||||||||||||||||
|
||||||||||||||||||
.. image:: renewals/sales-history-page.png | ||||||||||||||||||
:align: center | ||||||||||||||||||
:alt: Renewal quotation in the Odoo Subscriptions application. | ||||||||||||||||||
|
||||||||||||||||||
Additionally, once the :guilabel:`Renewal Quotation` is confirmed, an :guilabel:`MRR` smart button | ||||||||||||||||||
also appears at the top of the sales order. | ||||||||||||||||||
|
||||||||||||||||||
.. image:: renewals/mrr-smart-button.png | ||||||||||||||||||
:align: center | ||||||||||||||||||
:alt: MRR smart button in the Odoo Subscriptions application. | ||||||||||||||||||
|
||||||||||||||||||
When clicked, Odoo reveals an :guilabel:`MRR Analysis` page, detailing the monthly recurring revenue | ||||||||||||||||||
related to this specific subscription. | ||||||||||||||||||
|
||||||||||||||||||
.. important:: | ||||||||||||||||||
On rare occasions, automatic payment can fail, which results in a *Payment Failure* tag on the | ||||||||||||||||||
top-right of the sales order, if there is an error in the payment method. | ||||||||||||||||||
On rare occasions, automatic payments can fail to register properly, which results in a | ||||||||||||||||||
:guilabel:`Payment Failure` tag on the sale order and the :guilabel:`Contract in exception` | ||||||||||||||||||
checkbox being automatically ticked in the :guilabel:`Subscription` section of the sale order's | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||
:guilabel:`Other Info` tab. | ||||||||||||||||||
|
||||||||||||||||||
This is done to prevent the system from charging the customer again the next time a scheduled | ||||||||||||||||||
action is run. Because the status of the payment is unknown, Odoo requests a manual operation to | ||||||||||||||||||
check if the payment has been made, before the payment can be used again. | ||||||||||||||||||
Being marked Contract in exception prevents scheduled actions from running, which keeps the | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
Probably guilabel here since it appears on the UI? (: |
||||||||||||||||||
system from accidentally double-charging the customer if the automatic payment actually went | ||||||||||||||||||
through. Because the status of the payment failed to register with the system, users must | ||||||||||||||||||
manually check if the payment has been made before automatic payments and other scheduled actions | ||||||||||||||||||
can resume. | ||||||||||||||||||
|
||||||||||||||||||
To do this, navigate to :menuselection:`Subscriptions app --> Subscriptions --> Quotations`. | ||||||||||||||||||
Click into the desired subscription, then check the *Chatter* to see if the payment was made. | ||||||||||||||||||
Click into the desired subscription, then check the Chatter to see if the payment was made. | ||||||||||||||||||
|
||||||||||||||||||
If the payment was **not** made, first enter :doc:`debug mode <../../general/developer_mode>`. | ||||||||||||||||||
If the payment *was not* made, first enter :doc:`Developer Mode <../../general/developer_mode>`. | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. no need to capitalize!
Suggested change
|
||||||||||||||||||
Then, click the :guilabel:`Other Info` tab, and untick the checkbox next to :guilabel:`Contract | ||||||||||||||||||
in exception`. Reload the sales order, and the :guilabel:`Payment Failure` tag is gone. | ||||||||||||||||||
in exception`. Reload the sale order and confirm that the :guilabel:`Payment Failure` tag is | ||||||||||||||||||
gone. | ||||||||||||||||||
|
||||||||||||||||||
If the payment **was** made, a new invoice must be made and posted manually. This automatically | ||||||||||||||||||
updates the next invoice date of the subscription. Once created, enter :doc:`debug mode | ||||||||||||||||||
<../../general/developer_mode>`, and navigate to the new sales order. Click the :guilabel:`Other | ||||||||||||||||||
Info` tab, and untick the checkbox next to :guilabel:`Contract in exception`. | ||||||||||||||||||
Reload the sales order, and the :guilabel:`Payment Failure` tag is gone. | ||||||||||||||||||
If the payment *was* made, a new invoice must be made and posted manually. This automatically | ||||||||||||||||||
updates the next invoice date of the subscription. Once the invoice is created, enter | ||||||||||||||||||
:doc:`Developer Mode <../../general/developer_mode>` and navigate to the new sale order. Click | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||
the :guilabel:`Other Info` tab, and untick the checkbox next to | ||||||||||||||||||
:guilabel:`Contract in exception`. Reload the sale order and confirm that the | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||
:guilabel:`Payment Failure` tag is gone. | ||||||||||||||||||
|
||||||||||||||||||
.. figure:: renewals/contract-in-exception.png | ||||||||||||||||||
:align: center | ||||||||||||||||||
:alt: The "contract in exception" option selected with the "payment failure" tag shown. | ||||||||||||||||||
|
||||||||||||||||||
The :guilabel:`contract in exception`` option selected with the :guilabel:`payment failure` | ||||||||||||||||||
The :guilabel:`Contract in exception` option selected with the :guilabel:`Payment Failure` | ||||||||||||||||||
tag shown. | ||||||||||||||||||
|
||||||||||||||||||
In both cases, once the :guilabel:`Contract in exception` option is no longer selected, Odoo | ||||||||||||||||||
handles renewals automatically again. If the subscription remains in *payment failure*, it is | ||||||||||||||||||
skipped by Odoo until the sales order is closed. | ||||||||||||||||||
In both cases, once the :guilabel:`Contract in exception` checkbox is no longer ticked, Odoo | ||||||||||||||||||
handles renewals automatically again. If the subscription remains in Payment Failure, it is | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||
ignored by Odoo until the sale order is closed. | ||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||||||||||||||
|
||||||||||||||||||
.. seealso:: | ||||||||||||||||||
- :doc:`../subscriptions` | ||||||||||||||||||
- :doc:`../sales/sales_quotations/create_quotations` | ||||||||||||||||||
- :doc:`../sales/sales_quotations/get_paid_to_validate` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Amazing paragraph! 💯 this clearly explains the value of the renew feature and nicely distinguishes between manual and automatic renewals. I also like the mention of batch view filters to locate customers who need to renew.
Just a small note: since let's cover how to set up automatic renewals and how to locate customers that need to renew subscriptions in a future PR. And then once the doc section is written, add a ref link here so the reader can jump to those related documents if they're interested in setting it up! Let's talk about that after we merge this.
The only change I have here is that instead of guilabels, when referring to applications, we use bold. Then, I moved some words around to fit 100 characters on each line.