Short answer: an Odoo CRM pipeline is a list of stage records shown as Kanban columns, and every card is a crm.lead row pointing at one of them. The stage decides the card’s column, its default probability and whether it counts as won. Lost is not a stage at all: a lost opportunity is archived with probability 0. Knowing that makes the board, the reports and any later integration easier to reason about.
Applies to
- Odoo version: 19. I read the stage and pipeline pages in the 20.0 documentation too and found no differences in the parts I describe.
- Edition: Community and Enterprise. The
crmmodule that defines these models is in the open-source repository. - Apps: CRM. Sales is only needed when you start quoting from an opportunity.
What is a pipeline made of?
Two models do most of the work. crm.stage holds the columns, ordered by a sequence number. crm.lead holds the cards, whether they are leads or opportunities, and a type field tells them apart.
A stage can be limited to certain sales teams. If its Teams field is empty, every team sees it. The stage dropdown on a card only offers stages that apply to the card’s team, which is a handy way to give a retail team and a project team different boards in one database.
The default stages in the 19.0 data files are New, Qualified, Proposition and Won.
What do the stage settings do?
The documented path is CRM ‣ Configuration ‣ Stages, and Odoo’s stages page says developer mode must be on to see it. Each stage has these settings:
- Stage Name and sequence, which you can reorder by dragging.
- Is Won Stage? marks the stage as a winning one.
- Folded in Pipeline collapses the column in the Kanban view. The stages page treats cards in a folded stage as closed.
- Days to rot highlights cards in red when they have not been updated for that many days. Zero turns it off.
- Requirements is a tooltip that tells people what must be true before a card enters the stage.
The stages documentation gives one warning that I agree with: fold only the stages that truly mean “finished”. Cards in a folded stage are treated as closed.
How do probability and revenue fit together?
Every card carries an Expected Revenue and a Probability. The probability starts from Odoo’s predictive scoring, which always considers stage and team, and moves as the card moves. You can overwrite it by hand, and the AI icon beside the number restores the computed value.
The forecast report multiplies the two. The documentation’s formula is expected revenue times probability, which it calls prorated revenue. So a card with no revenue contributes nothing, and a card sitting at the start of the pipeline contributes only a small slice.
The scoring model itself gets its own post, because it is easy to misread what it does and does not learn.
What do won and lost mean in the data?
This is where reading the source helps.
Won means the card is in an Is Won stage and its probability is 100. The action_set_won method picks the nearest won stage and writes both values. If you edit Is Won Stage? on an existing stage, the code rewrites probabilities on every card in it, and the form warns you about that.
Lost is archive plus zero. action_set_lost archives the record and writes probability 0. The Mark Lost window offers a Lost Reason and a Closing Note, neither required. Restoring recomputes the probability for the stage the card is in.
A stored field, won_status, summarises the result as won, lost or pending. If you build a report or pull data through the API, that one field is easier to filter on than rebuilding the logic yourself.
When it fits and when it doesn’t
A simple stage list suits sales that follow a visible sequence: qualify, propose, agree.
It fits less well when the real work is a long project-style process with many internal handoffs. A pipeline with a dozen stages invites people to skip stages or drag cards forward just to clear a column. I would keep stages to the points where something observable changes, and use activities for everything in between.
Worked example: a web design studio
The studio starts with the defaults, renames Proposition to Proposal Sent, and adds a stage called Waiting on Client with Days to rot set so stuck cards turn red. Only Won has Is Won Stage? ticked. Each stage’s Requirements says, in a sentence, what must be true to enter it.
On Monday the lead walks the board with the team. Red cards get a phone call. Cards without a dated activity get one. Anything that has gone cold is marked lost with a reason.
Common mistakes
- Adding a stage for every internal task.
- Folding a stage that is not really final.
- Overwriting probabilities by hand on many cards, which hides what the scoring would say.
- Marking deals lost with no reason, which wastes the one piece of data that explains the pipeline later.
Related
Fixing the leaks before the pipeline is a separate job. See five places leads leak and getting your team to use the CRM. There is a plainer walkthrough on sajjalbajaj.in.
Official references
- Odoo 19 CRM documentation
- Stages
- Lost opportunities
- Forecast report
- crm.lead model, 19.0 source
- crm.stage model, 19.0 source
How this article was checked: I read the 19.0 documentation pages above, compared them with 20.0, and read the crm.stage and crm.lead models plus the default stage data in the 19.0 source. I did not run a live database.
If you want a pipeline designed around how your team actually sells, see my portfolio and get in touch.