badge_rotting
The badge_rotting widget renders a stage column that carries a red 12d pill when the record has been sitting in that stage too long. It is the list-view member of Odoo 19's rotting family.
| Technical name | badge_rotting |
|---|---|
| Field types | many2one (stage field) |
| Views | list |
| Also registered as | list.badge_rotting is the only registration |
| Module | mail, shipped with every Odoo database |
| Used in core | 3 occurrences across 3 modules: crm, hr_recruitment, project |
| Versions | Odoo 20.0, Odoo 19.0 |
| No-code setup | No. The stage threshold is no-code, but placing the widget needs XML |
| Alternatives | rotting, rotting_statusbar_duration, many2one |
What the badge_rotting widget does
What this means for your team
Supported options in Odoo 19
| Option | Type | What it does |
|---|---|---|
no_open | boolean | Inherited from many2one. Disables navigating to the stage record when the cell is clicked in readonly. Core CRM ships the widget with this option on. |
no_create | boolean | Inherited from many2one. Removes both creation routes from the autocomplete in editable lists. |
no_quick_create | boolean | Inherited from many2one. Removes only the inline create entry; the create-and-edit dialog remains. |
no_create_edit | boolean | Inherited from many2one. Removes only the create-and-edit dialog entry; inline quick create remains. |
search_threshold | number | Inherited from many2one, new in 19. Minimum characters typed before the autocomplete queries the server.(since Odoo 19.0) |
placeholder_field | field name | Inherited from many2one, new in 19. Char field on the record supplying a dynamic placeholder for the empty cell.(since Odoo 19.0) |
The pill needs two extra columns loaded. The component reads is_rotting and rotting_days straight off the record without declaring field dependencies. Core list views add both with column_invisible="True". Drop them from a custom list and the widget degrades to a plain many2one with no badge and no error.
Working examples
A real many2one wearing a badge
Version compatibility
| Version | Status | Notes |
|---|---|---|
| Odoo 20.0 | In development | Not released. Registered as plain rotting on the development branch, while the kanban widget takes rotting_days. See below. |
| Odoo 19.0 | Verified | Introduced in 19.0 as list.badge_rotting, part of the rotting family. |
| Odoo 18.0 | Not available | The rotting feature does not exist. |
| Odoo 17.0 | Not available | The rotting feature does not exist. |
| Odoo 16.0 | Not available | The rotting feature does not exist. |
Upgrade note. The whole rotting family is new in Odoo 19. After upgrading, stages arrive with the threshold at 0, so lists stay badge-free until stages are configured.
What is changing in Odoo 20
Common problems and fixes
| Symptom | Cause and fix |
|---|---|
| Stage shows but the day pill never appears | is_rotting or rotting_days is not loaded in the list; the widget reads both without declaring dependencies. Add both fields with column_invisible="True", as core does. |
| Widget does nothing in a form or kanban view | Registered as list.badge_rotting, lists only. Use rotting_statusbar_duration on forms and rotting on kanbans. |
| No row in the whole database shows a pill | All stages have rotting_threshold_days at 0, the shipped default. Set Days to rot on the stages that should alert. |
| Clicking the stage opens the stage record and loses the list | The inherited many2one still navigates by default. Add options="{'no_open': True}" like the core views. |
| Won or lost leads never show as rotting | CRM's _get_rotting_domain restricts rotting to pending leads. Designed behavior; override the domain in a custom module if you truly need it. |
Badge_rotting widget vs the alternatives
| Widget | Best for | Key difference |
|---|---|---|
badge_rotting | Stage columns that should flag stale rows | Full many2one plus a conditional day pill, list views only |
| rotting | The same flag on kanban cards | Day pill only, no stage editing, kanban registration |
| rotting_statusbar_duration | The same flag on the form statusbar | Statusbar with per-stage durations and a tooltip |
| many2one | Stage columns without staleness logic | Same editing behavior, no pill, no extra field requirements |
Frequently asked questions
What does the badge_rotting widget do?+
Which options does badge_rotting accept?+
Why is the pill not showing in my custom list view?+
Can I use badge_rotting in a form view?+
Where does the day count come from?+
Is badge_rotting affected by the Odoo 20 changes?+
List views that surface neglected deals on their own
We wire the rotting fields into your custom list views, tune per-stage thresholds with your sales ops team, and audit every widget rename before an Odoo 20 upgrade so a stage column never silently changes behavior. If your pipeline reviews still start with an export to Excel, that is fixable.
Get a pipeline view audit