Skip to content

Commit 2c99ab7

Browse files
[IMP] Sales: Invoicing project milestones
Co-authored-by: theRealThagomizer <96515928+theRealThagomizer@users.noreply.github.com>
1 parent a369cb7 commit 2c99ab7

19 files changed

+62
-205
lines changed

content/applications/sales/sales/invoicing/milestone.rst

Lines changed: 60 additions & 205 deletions
Original file line numberDiff line numberDiff line change
@@ -2,235 +2,90 @@
22
Invoice project milestones
33
==========================
44

5-
Invoicing based on project milestones can be used for expensive or large-scale projects with
6-
discrete, measurable deliverables. The series of milestones in a project represent a clear sequence
7-
of work that will inevitably result in the completion of a project and/or contract.
5+
.. |SO| replace:: :abbr:`SO (Sales Order)`
6+
.. |SOs| replace:: :abbr:`SOs (Sales Orders)`
87

9-
This method of invoicing ensures the company gets a consistent flow of money throughout the lifetime
10-
of the project. Customers can closely monitor every phase of the project's development as it
11-
happens, in addition to paying a large bill in several installments, instead of all at once.
8+
Invoicing based on project milestones allows companies to bill large or long-running projects
9+
progressively as key deliverables are completed. Each milestone represents a measurable stage of
10+
work that triggers invoicing upon completion. This approach helps maintain predictable cash flow and
11+
provides customers with visibility into project progress, all while allowing payments to occur in
12+
manageable installments.
1213

13-
Create milestone products
14-
=========================
15-
16-
In Odoo, each milestone of a project is considered as an individual product.
17-
18-
To create and/or configure products to work like this, first navigate to :menuselection:`Sales app
19-
--> Products --> Products`. Then, click on a product, or create a new one by clicking
20-
:guilabel:`New`.
21-
22-
The option to invoice based on milestones is only available for certain product types.
23-
24-
On the product form, under the :guilabel:`General Information` tab, the :guilabel:`Product Type`
25-
field *must* be set on any of the following options: :guilabel:`Service`, :guilabel:`Event Ticket`,
26-
:guilabel:`Event Booth`, or :guilabel:`Course`.
27-
28-
.. image:: milestone/product-type-field.png
29-
:align: center
30-
:alt: The invoicing policy field drop-down menu with options on product form.
31-
32-
With any of those :guilabel:`Product Type` options selected, choose :guilabel:`Based on Milestones`
33-
from the :guilabel:`Invoicing Policy` drop-down menu.
34-
35-
.. image:: milestone/invoicing-policy-field.png
36-
:align: center
37-
:alt: The invoicing policy field drop-down menu with options on product form.
38-
39-
Beneath that is the :guilabel:`Create on Order` field.
40-
41-
To ensure workflows are as seamless as possible, it is recommended that an option in the
42-
:guilabel:`Create on Order` field is selected.
43-
44-
.. note::
45-
Leaving it on the default :guilabel:`Nothing` option won't negatively affect the desired
46-
workflow. However, a project *must* then be created directly from a sales order form with that
47-
specific product. Once a project is created *then* milestones and tasks can be created and
48-
configured.
49-
50-
When the :guilabel:`Create on Order` default option of :guilabel:`Nothing` is clicked, a drop-down
51-
menu is revealed with the following options:
52-
53-
- :guilabel:`Task`: Odoo creates a task related to this milestone product in the *Projects* app when
54-
this specific product is ordered.
55-
- :guilabel:`Project \& Task`: Odoo creates a project and task related to this milestone product in
56-
the *Projects* app when this specific product is ordered.
57-
- :guilabel:`Project`: Odoo creates a project related to this milestone product in the *Projects*
58-
app when this specific product is ordered.
59-
60-
When :guilabel:`Task` is selected, a :guilabel:`Project` field appears. In this field, select to
61-
which existing project in the *Projects* app this created task should be connected.
62-
63-
.. image:: milestone/task-option-project-field.png
64-
:align: center
65-
:alt: The Project field appears when the Task option is selected in Create on Order field.
66-
67-
When :guilabel:`Project \& Task` or :guilabel:`Project` is selected, two new fields appear:
68-
:guilabel:`Project Template` and :guilabel:`Workspace Template`.
14+
In Odoo, milestone invoicing is configured at the product level in the **Sales** app, with milestone
15+
progress and completion managed in the **Projects** app. When a milestone is marked as reached, the
16+
delivered quantity on the sales order (SO) is updated and can be invoiced.
6917

70-
.. image:: milestone/project-task-option-project-workspace-fields.png
71-
:align: center
72-
:alt: The Project template and workspace template fields that appear on milestone product.
18+
In Odoo, this workflow is driven by two key elements:
7319

74-
The :guilabel:`Project Template` field provides template options to use for the project that will be
75-
created when this specific product is ordered.
20+
- A service product configured with a *Based on Milestones* invoicing policy
21+
- One or more milestones that represent the phases of work
7622

77-
The :guilabel:`Workspace Template` field provides template options to use for the workspace (for the
78-
*Documents* app, not the *Projects* app) that will be automatically generated for the project when
79-
this specific product is ordered.
23+
As project work is completed, milestones are marked as reached, which automatically updates the
24+
delivered quantities and makes the milestone eligible for invoicing.
8025

81-
.. tip::
82-
For organizational purposes, click the :guilabel:`Sales` tab on the product form, and enter a
83-
custom 'Milestone' related descriptor in the :guilabel:`Sales Description` field. This
84-
information appears in the :guilabel:`Description` column on the :guilabel:`Order Lines` tab of
85-
the sales order.
26+
.. important::
27+
This document covers the **Sales** app configuration and invoicing flow for invoicing based on
28+
project milestones. For more information on creating, managing, and completing milestones, and
29+
how to link them to tasks, see :doc:`Project milestones
30+
<../../../services/project/project_management/project_milestones>`.
8631

87-
Or, directly edit/modify the :guilabel:`Description` field on the :guilabel:`Order Lines` tab of
88-
the sales order.
32+
Create milestone products
33+
=========================
8934

90-
This is *not* a requirement.
35+
To begin, a product must be configured specifically for milestone-based invoicing. Navigate to
36+
:menuselection:`Sales app --> Products --> Products` and click :guilabel:`New`. Enter the necessary
37+
information, including the product title and :guilabel:`Sales Price`.
9138

92-
Invoice milestones
93-
==================
39+
For the :guilabel:`Product Type`, select :guilabel:`Service`. Doing so reveals the :guilabel:`Create
40+
on Order` field. Select either :guilabel:`Project`, :guilabel:`Project and Task`, or
41+
:guilabel:`Task`, depending on how the product is tracked in the **Project** app.
9442

9543
.. note::
96-
The following flow features a trio of milestone products that have :guilabel:`Service` set as
97-
their :guilabel:`Product Type`, and :guilabel:`Task` set on their :guilabel:`Create on Order`
98-
field.
99-
100-
.. image:: milestone/settings-for-workflow.png
101-
:align: center
102-
:alt: Product with Service "Product Type" and "Task" in the Create on Order field on form.
103-
104-
Those tasks are then attached to a pre-existing :guilabel:`Project`, which, in this case, is
105-
titled, :guilabel:`Rebranding Projects`.
106-
107-
To invoice milestones, create a sales order with the milestone product(s). To do that, go to
108-
:menuselection:`Sales app --> New`. Doing so reveals a blank quotation form.
109-
110-
From this quotation form, add a :guilabel:`Customer`. Then, click :guilabel:`Add a product` in the
111-
:guilabel:`Order Lines` tab. Next, add the milestone product(s) to the :guilabel:`Order Lines` tab.
112-
113-
Once the corresponding milestone product(s) have been added, click :guilabel:`Confirm` to confirm
114-
the order, which turns the quotation into a sales order.
115-
116-
When the order is confirmed, new smart buttons appear at the top of the sales order based on what
117-
was selected in the :guilabel:`Create on Order` field on the product form.
118-
119-
From the sales order, click the :guilabel:`Milestones` smart button. Doing so reveals a blank
120-
:guilabel:`Milestones` page. Click :guilabel:`New` to add milestones.
121-
122-
.. image:: milestone/adding-milestones.png
123-
:align: center
124-
:alt: Adding milestones to a sales order with milestone products.
125-
126-
Enter a :guilabel:`Name` for the milestone. Next, apply it to the corresponding :guilabel:`Sales
127-
Order Item`. Lastly, assign a :guilabel:`Deadline` to the milestone, if desired.
128-
129-
Repeat that process for all milestone sales order items.
130-
131-
Then, return to the sales order, via the breadcrumbs. From the sales order, click the
132-
:guilabel:`Tasks` smart button. Doing so reveals a :guilabel:`Tasks` page with a task for each sales
133-
order item with that option designated in the :guilabel:`Create on Order` field.
134-
135-
.. image:: milestone/tasks-page.png
136-
:align: center
137-
:alt: Sample tasks page accessed via the smart button from a sales order with milestone products.
138-
139-
To manually assign a configured milestone to a task, click the desired task, which reveals the task
140-
form. On the task form, select the appropriate milestone to which this task should be connected, in
141-
the :guilabel:`Milestone` field.
142-
143-
.. image:: milestone/milestone-field-on-task-form.png
144-
:align: center
145-
:alt: The milestone field on the task form when dealing with milestone products in Odoo Sales.
146-
147-
Repeat this process for all milestone tasks.
148-
149-
With those tasks properly configured, employees log in their progress as they work on the task, in
150-
addition to adding any notes related to the task.
151-
152-
Then, when that task is complete, that means that milestone has been reached. At that point, it is
153-
time to invoice that milestone.
154-
155-
To invoice a milestone, first return to the sales order — either via the breadcrumb links, or by
156-
navigating to :menuselection:`Sales app --> Orders --> Orders` and picking the appropriate sales
157-
order.
158-
159-
Back on the sales order form, click the :guilabel:`Milestones` smart button, and check the box in
160-
the :guilabel:`Reached` column for that particular task.
161-
162-
.. image:: milestone/reached-milestone.png
163-
:align: center
164-
:alt: What it looks like to mark a milestone as reached via the milestone smart button.
165-
166-
Next, return to the sales order — either by clicking :guilabel:`View Sales Order` on the
167-
:guilabel:`Milestones` page, or via the breadcrumb links.
168-
169-
Back on the sales order, the line item for the milestone that's been reached has its
170-
:guilabel:`Delivered` column filled. That's because the milestone has been reached, and therefore
171-
delivered.
172-
173-
.. image:: milestone/delivered-milestone-product-sales-order.png
174-
:align: center
175-
:alt: A milestone product that's been reached marked as delivered on the sales order in Odoo.
176-
177-
Click :guilabel:`Create Invoice` in the upper-left corner. Doing so reveals a :guilabel:`Create
178-
invoices` pop-up window.
179-
180-
.. image:: milestone/create-invoices-pop-up.png
181-
:align: center
182-
:alt: The create invoices pop-up window that appears when create invoice button is clicked.
183-
184-
On the :guilabel:`Create invoices` pop-up window, leave the :guilabel:`Create Invoice` option on the
185-
default :guilabel:`Regular Invoice` selection, and click the :guilabel:`Create Draft Invoice`
186-
button.
187-
188-
Upon clicking :guilabel:`Create Draft Invoice`, Odoo reveals the :guilabel:`Customer Invoice Draft`,
189-
*only* showing that reached milestone in the :guilabel:`Invoice Lines` tab.
44+
A :guilabel:`Project Template` can also be selected for the product. See :doc:`Project templates
45+
<../../../services/project/project_management/project_templates>` for more information.
19046

191-
.. image:: milestone/invoice-draft-milestone.png
192-
:align: center
193-
:alt: A customer invoice draft showing only the milestone product that's been reached.
47+
For the :guilabel:`Invoicing Policy`, select :guilabel:`Based on Milestones`. This option ensures
48+
that the product's delivered quantities update automatically once a milestone is completed.
19449

195-
From this invoice page, click the :guilabel:`Confirm` button to confirm the invoice. Then, when the
196-
customer has paid for this milestone, click :guilabel:`Register Payment`.
50+
.. important::
51+
*Based on Milestones* is only available if there is at least one project with *Milestones*
52+
enabled.
19753

198-
When :guilabel:`Register Payment` is clicked, a :guilabel:`Register Payment` pop-up window appears.
54+
Creating milestones from a sales order
55+
======================================
19956

200-
.. image:: milestone/register-payment-pop-up.png
201-
:align: center
202-
:alt: The Register Payment pop-up window that appears when Register Payment is clicked.
57+
After the milestone product has been sold, a *Milestones* smart button is added to the |SO|. Click
58+
the smart button to view, edit, or create new milestones.
20359

204-
On this pop-up window, confirm the accuracy of the auto-populated fields, then click
205-
:guilabel:`Create Payment`.
60+
.. image:: milestone/view-milestones.png
61+
:alt: The milestones for a sales order line.
20662

207-
When clicked, the pop-up window disappears, and Odoo returns to the invoice for that milestone,
208-
which now has a green :guilabel:`In Payment` banner in the upper-right corner. This banner signifies
209-
the invoice has been paid.
63+
From here, the :guilabel:`Delivered %` can be altered. This amount equates to the total cost of the
64+
|SO| that is billed when the milestone is reached.
21065

211-
.. image:: milestone/in-payment-invoice.png
212-
:align: center
213-
:alt: An invoice with a milestone product that has been paid with an In Payment banner.
66+
.. example::
67+
A company sells a *Custom furniture design* product with four milestones:
21468

215-
Then, return to the sales order, via the breadcrumb links. Back on the sales order, in the
216-
:guilabel:`Order Lines` tab, the reached milestone that's been invoiced and paid for, now has its
217-
:guilabel:`Invoiced` column filled.
69+
- Initial design consult
70+
- Preliminary designs submitted
71+
- Final design submission
72+
- Final product delivered
21873

219-
.. image:: milestone/invoiced-column-filled-milestone.png
220-
:align: center
221-
:alt: The Invoiced column of a milestone product that's been paid for is filled.
74+
Each of these milestones has a *Delivered %* of `25%`. As each milestone is marked complete, a
75+
corresponding `25%` of the total number of hours is marked as *Delievered* on the invoice.
22276

223-
There is also a new :guilabel:`Invoices` smart button at the top of the sales order. Clicking that
224-
reveals all the invoices that are connected to this sales order.
77+
Invoicing a completed milestone
78+
===============================
22579

226-
.. image:: milestone/invoices-smart-button.png
227-
:align: center
228-
:alt: The invoices smart button that appears at the top of a sales order with milestones.
80+
Milestones can be tracked through the **Project** app (see :ref:`Using milestones
81+
<project/using-milestones>`). Additionally, a milestone can be marked as :guilabel:`Reached` on the
82+
*Milestones* page by ticking the checkbox for that milestone.
22983

230-
Simply repeat the above process for each milestone as it is worked on, and subsequently, completed.
84+
Then, click :guilabel:`View Sales Order` or use the breadcrumbs to return to the |SO|. The
85+
:guilabel:`Delivered` column will be updated to reflect the *Delivered %* for the milestone reached.
86+
Click :guilabel:`Create Invoice`.
23187

232-
Continue that process until the entire project has been completed, each milestone has been invoiced,
233-
and the entire order has been paid for in full.
88+
These steps can be repeated as additional milestones are reached until the |SO| has been fulfilled.
23489

23590
.. seealso::
23691
- :doc:`time_materials`
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)