Pipeline stages#
CRM stages represent the steps in your sales process from first contact to closed deal. In Odoo, stages are shared across sales teams by default but can be scoped to specific teams.
Navigate to CRM → Configuration → Stages to view and edit all stages.
Key stage fields#
- Stage Name: visible in the pipeline Kanban view
- Probability: default win probability for opportunities that reach this stage (0–100%)
- Sales Teams: leave empty to share the stage across all teams, or specify teams to make it exclusive
- Folded in Pipeline: collapses this stage in the Kanban view - useful for "Won" and "Lost" stages
- Requirements: free-text field describing what must be true before moving to this stage; visible to salespeople as a tooltip
Recommended default stages#
| Stage | Probability | Notes |
|---|---|---|
| New / Incoming | 10% | Auto-created from website forms or email |
| Qualified | 25% | Qualification call completed |
| Proposal Sent | 50% | Written proposal delivered |
| Negotiation | 75% | Commercial terms being discussed |
| Won | 100% | Folded, success state |
Avoid creating more than 7–8 stages - salespeople stop updating opportunities when the process feels bureaucratic.
Probability and forecasting#
Each opportunity has a Probability field. Odoo uses this for weighted pipeline forecasting:
Expected Revenue = Expected Closing Amount x Probability%The CRM dashboard and pipeline report aggregate these expected revenues to give a forecast of likely-to-close deals.
AI-assisted probability (Enterprise)#
In Odoo Enterprise 16+, the CRM module includes machine learning-based lead scoring. When enabled (CRM → Configuration → Settings → Predictive Lead Scoring), Odoo analyzes historical won/lost data to set probability automatically based on lead source, country, phone/email presence, and days in current stage.
Lost reasons#
Lost reasons let you analyze why deals fail. Navigate to CRM → Configuration → Lost Reasons to define your list.
Recommended lost reasons:
- No budget / too expensive
- Competitor chosen
- No decision made / project cancelled
- Poor fit / wrong product
- Lost contact
When a salesperson marks an opportunity as lost, they must select a reason. This is enforced - you cannot mark as lost without a reason if any lost reasons exist.
Analyzing lost reasons#
CRM → Reporting → Pipeline Analysis → group by Lost Reason to see where deals fail most often. Filter to a date range and specific teams to spot trends.
Stage requirements enforcement#
Stage requirements are informational only - Odoo does not block moves if requirements are not met. For hard enforcement, add a Python constraint to a custom module.
Example: prevent moving to "Proposal Sent" without a phone number on the partner:
from odoo import models, api, exceptions
class CrmLead(models.Model):
_inherit = 'crm.lead'
@api.constrains('stage_id', 'partner_phone')
def _check_proposal_stage_phone(self):
proposal_stage = self.env.ref('crm.stage_lead2')
for lead in self:
if lead.stage_id == proposal_stage and not lead.partner_phone:
raise exceptions.ValidationError(
'A phone number is required before moving to Proposal Sent.'
)Sales team configuration#
Sales teams (CRM → Configuration → Sales Teams) group salespeople and are the primary reporting dimension in CRM.
Key settings per team#
- Team Leader: receives notifications for team-level events
- Email Alias: incoming emails to this address create leads assigned to the team
- Invoiced Target: monthly revenue target for the team dashboard
Assigning opportunities to teams#
Opportunities can be assigned automatically via:
- Email alias: email to
sales@yourcompany.comassigns to the team that owns that alias - Lead assignment rules (Enterprise): define rules by country, industry, or other fields
- Manual assignment: salesperson changes the team field on the opportunity
Won/lost reporting#
CRM → Reporting → Pipeline Analysis is the primary reporting view. Key filters and groupings:
- Stage = Won + group by salesperson → individual win rate
- Active = False (archived/lost) + group by Lost Reason → failure analysis
- Date: Creation vs Date: Closing - switch between when deals were created vs when they closed
- Expected Revenue vs Prorated Revenue - prorated applies the probability weighting
Export to spreadsheet for custom analysis or use Odoo's built-in spreadsheet pivot to build a sales performance dashboard.

