Skip to content

Conversation

@jero-odoo
Copy link
Contributor

@jero-odoo jero-odoo commented Dec 2, 2025

Rewriting the Sales doc for invoicing based on milestones

@jero-odoo jero-odoo self-assigned this Dec 2, 2025
@robodoo
Copy link
Collaborator

robodoo commented Dec 2, 2025

Pull request status dashboard

@jero-odoo jero-odoo force-pushed the 19.0-sales-invoice-milestones-jero branch from 94cd214 to 2c2fc9d Compare December 3, 2025 21:03
@jero-odoo jero-odoo marked this pull request as ready for review December 3, 2025 21:03
@jero-odoo jero-odoo added the 5 label Dec 3, 2025
@C3POdoo C3POdoo requested review from a team December 3, 2025 21:05
@jero-odoo
Copy link
Contributor Author

Hey @theRealThagomizer this is ready for review. Thanks!

Copy link
Contributor

@theRealThagomizer theRealThagomizer left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hiya, @jero-odoo! This looks good. Certainly it's a heck of a lot more elegant than the sprawling version that proceeded it. I caught a few typos that I made suggestions to correct and a few things that got me pondering where I left comments, but I think this is ready to go forward once the typos are fixed.

I'm not sure what the rest of the review procedure is for you and Lara, so I'm just going to mark this as approved and figure you know if anyone else need to see this before it can be merged. Thanks!

@jero-odoo jero-odoo force-pushed the 19.0-sales-invoice-milestones-jero branch from ff45ac5 to 2c99ab7 Compare December 4, 2025 13:36
@jero-odoo
Copy link
Contributor Author

jero-odoo commented Dec 4, 2025

Thank you @theRealThagomizer !

@StraubCreative this is ready for review!

Copy link
Contributor

@Felicious Felicious left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @jero-odoo!

I appreciate the effort to reduce redundancy from the original version and to streamline content that now lives in the updated Project documentation. The writing in this draft is noticeably more concise. However, the underlying structural issue from the original doc is only partially resolved. Previously, the workflow was buried in procedural detail without a clear explanation of what happens in Sales, what happens in Projects, and what happens during Invoicing. And how clicking one button affects something else (e.g. Reached in projects --> updates Delivered on the SO)

This draft shortens the text, but the lack of a clear, high-level overview remains. Without an explicit breakdown of which actions occur in which app, users still have to infer the workflow. To make the documentation fully actionable, the revision needs clearer guidance and a more explicit framing of the end-to-end process, in addition to the trimmed-down writing. To summarize:

  • Milestone creation steps are unclear. The text references another document but does not clearly indicate that milestone creation is handled elsewhere, leaving the workflow incomplete.
  • Behavior of the Milestones smart button is ambiguous. It is not clear whether users are expected to create milestones directly from the sales order or rely on default milestones provided by a product or project template. This needs explicit clarification.
  • Invoicing instructions lack specificity. The invoicing flow relies on conceptual descriptions instead of concrete field names, menu paths, and button labels. This prevents users from following end-to-end steps.
  • Delivered % explanation is inconsistent. Does Odoo use percentage or cost?

The second revision requires substantial tightening to provide clear procedural steps, unambiguous explanations, and references to related documentation for each step. Looking forward to reviewing that once it's ready!

Comment on lines -155 to -160
To invoice a milestone, first return to the sales order — either via the breadcrumb links, or by
navigating to :menuselection:`Sales app --> Orders --> Orders` and picking the appropriate sales
order.

Back on the sales order form, click the :guilabel:`Milestones` smart button, and check the box in
the :guilabel:`Reached` column for that particular task.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand why this section was removed because it's unrelated to the sales flow, and it's covered in the project milestone doc

However, we should acknowledge that the milestone can be marked as reached and link to the doc that outlines how

Comment on lines +47 to +55
For the :guilabel:`Invoicing Policy`, select :guilabel:`Based on Milestones`. This option ensures
that the product's delivered quantities update automatically once a milestone is completed.

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

When :guilabel:`Register Payment` is clicked, a :guilabel:`Register Payment` pop-up window appears.
Creating milestones from a sales order
======================================
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I like how concise you've managed to write the milestone product creation process!

However, this document is currently missing step-by-step instructions on how to create milestones. You acknowledge that milestone creation is handled in a different document, but the current text does not explicitly indicate which prerequisite steps are external.

The result is a structural gap: users cannot tell where milestone creation actually occurs, nor whether the current doc expects them to arrive with milestones already defined.

To do for the next revision: Add a clear, unambiguous pointer that milestone creation is not covered here, e.g., “Milestones must be created in the Project app; see Project milestones for step-by-step instructions.” Without this, the workflow appears incomplete.

Comment on lines +57 to +61
After the milestone product has been sold, a *Milestones* smart button is added to the |SO|. Click
the smart button to view, edit, or create new milestones.

On this pop-up window, confirm the accuracy of the auto-populated fields, then click
:guilabel:`Create Payment`.
.. image:: milestone/view-milestones.png
:alt: The milestones for a sales order line.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To me, this is concise but has an ambiguous implication that milestones can be manually created from the SO

This section suggests that users can click the Milestones smart button and create milestones directly from the SO. You need to clarify whether this is a supported workflow or merely an editing surface.

The text also avoids addressing whether Odoo supports default milestone sets tied to a milestone product (via a project template or project task structure). That is a major functional assumption the reader needs resolved.

Todo for the next revision:

  • Explicitly confirm whether milestones can be created manually from the SO.
  • If default milestone sets are expected to come from a project template or from another Project configuration, state that explicitly and point to the exact documentation.
  • If this behavior depends on product configuration, and isn't explicitly covered in the other doc, include the precise field names involved (“Project Template,” “Create on Order,” etc.).

Note: making this doc clearer may also imply we need to make changes to the project doc. If you feel that is the case, let me know and we can begin communicating with BE!

:align: center
:alt: The Invoiced column of a milestone product that's been paid for is filled.
Each of these milestones has a *Delivered %* of `25%`. As each milestone is marked complete, a
corresponding `25%` of the total number of hours is marked as *Delievered* on the invoice.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
corresponding `25%` of the total number of hours is marked as *Delievered* on the invoice.
corresponding `25%` of the total number of hours is marked as *Delivered* on the invoice.

Comment on lines +63 to +72
From here, the :guilabel:`Delivered %` can be altered. This amount equates to the total cost of the
|SO| that is billed when the milestone is reached.

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

Then, return to the sales order, via the breadcrumb links. Back on the sales order, in the
:guilabel:`Order Lines` tab, the reached milestone that's been invoiced and paid for, now has its
:guilabel:`Invoiced` column filled.
- Initial design consult
- Preliminary designs submitted
- Final design submission
- Final product delivered
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

this example is clear but seems to be in the wrong place, in my opinion? It's trying to do two things at once:

  • Give context as to what milestones are and how they can be added (good, but seems to belong in an explicit "project milestones setup" section
  • Give procedural instructions to navigate to milestones, (doesn't explicitly say how to mark them as reached), and navigate back to the SO to show the invoiced column is filled. Let's rewrite to include operational specificity of the whole invoicing workflow! (my feedback given in the next comment)

Comment on lines +77 to +86
Invoicing a completed milestone
===============================

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

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

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The invoicing workflow is described in conceptual terms but leaves out necessary navigational and field-level instructions. Users cannot reconstruct the actual UI path or the required field interactions.
Examples of missing specificity:

  • The path to reach milestones in the Sales or Project apps.
  • The explicit field name that must be toggled to mark a milestone as reached.
  • The menu path and button labels to return to the SO.
  • What appears on the invoice after clicking Create Invoice.

Todo: Rewrite the invoicing steps with explicit UI elements, e.g.:

  • "After a sales order is created, navigate to the milestones by going to [menuselection path]".
  • “Enable the Reached checkbox on the milestone line.”
  • “Go back to the SO by [navigational steps]. Then, click Create Invoice.”

Avoid abstract phrases like “can be tracked through” and “is updated”; replace them with concrete instructions and field names.

Comment on lines +63 to +64
From here, the :guilabel:`Delivered %` can be altered. This amount equates to the total cost of the
|SO| that is billed when the milestone is reached.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I might be overthinking here, but the draft mixes two concepts—percentage-based delivery and cost of the SO delivered—without defining how Odoo interprets the Delivered % field. There is an implicit assumption that the system prorates invoiceable quantity strictly by percentage, which may not match actual configuration.

I believe there are two methods: invoicing based on milestone percentage or sales price, so I'd like your help doing some testing to find out how this works, and likely need to document them separately using different examples or workflows.

Todo:

  • Define the Delivered % field precisely.
  • Clarify whether it translates into delivered hours, amount, or quantity depending on product setup.
    • document multiple methods if applicable

@Felicious Felicious removed request for a team and StraubCreative December 5, 2025 18:11
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants