Skip to main content
iVentureTeam

activity_exception

That small orange or red icon that appears at the end of some list rows is the activity_exception widget: a zero-option renderer for the activity_exception_decoration field that stays invisible until a record needs attention.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
August 12, 2026Updated August 12, 20265 min read
Technical nameactivity_exception
Field typesselection (activity_exception_decoration)
Viewslist
Modulemail, installed in practically every Odoo database
Used in core19 occurrences across 14 modules, including hr_holidays, fleet, event, maintenance, mrp, stock
VersionsOdoo 20.0, Odoo 19.0, Odoo 18.0
No-code setupNo. Added in list view XML on activity_exception_decoration (core lists ship it already)
Alternativeslist_activity, kanban_activity, web_ribbon

What the Activity Exception widget does

activity_exception is the quietest widget in Odoo: on most rows it renders literally nothing. Its template starts with a condition on the field value, and only when the record carries an exception activity does the icon appear, floated to the end of the cell, colored by the value, with a fixed tooltip: This record has an exception activity.

It sits on activity_exception_decoration, a selection field from mail.activity.mixin whose two values are Bootstrap color names, warning and danger. The CSS class is assembled directly from them (text-warning, text-danger), and the glyph comes from the companion char field activity_exception_icon, which the widget declares as its one field dependency so it loads without a view element.

The descriptor registers with zero options and label: false, an unusual descriptor key that suppresses the column header. That is why the exception column in core lists is a slim, unlabeled strip.

What this means for your team

Exception activities are Odoo's way of saying something changed behind this document's back. The classic producer: a confirmed sales order whose customer or delivery data is modified afterward, prompting Odoo to attach a warning activity so someone reviews the impact. Deliveries, manufacturing orders and maintenance requests do the same.

The widget is the surfacing half of that system. In a fifty-row picking list, the one delivery whose sale order was tampered with shows a red flag; everything else stays visually silent. Zero configuration, zero noise, exactly one meaning.

The management takeaway: if your team sees these icons often, the icons are not the problem. They are pointing at a process that changes confirmed documents, and the fix belongs there, not in hiding the column.

Working examples

The standard slim column

<list>
    <field name="name"/>
    <field name="activity_exception_decoration" widget="activity_exception"/>
</list>

No options, no string attribute needed: the descriptor's label: false keeps the header empty. The icon field loads automatically.

Creating an exception activity in code

record.activity_schedule(
    "mail.mail_activity_data_warning",
    summary="Customer changed after confirmation",
    note="Review pricing and delivery address.",
)

The warning activity type carries the decoration and icon; the mixin's computed fields propagate them to the record and the icon appears in every list using the widget.

Two fields, one class string

The entire rendering logic is one getter. When the decoration field has a value, the widget builds its class string as text- plus the value, plus fa, plus the icon field's value, producing for example text-warning fa fa-warning. When the field is empty the template's guard renders nothing, not even an empty span.

Both inputs are computed on mail.activity.mixin from the record's activities: the decoration is the most severe decoration among the record's exception activities, and the icon follows it. Which is why you never write these fields; you schedule or resolve activities and the fields follow.

Because the widget renders nothing for empty values, it costs almost nothing to keep in every list. The only weight is the two extra fields in the data fetch, one of which you already placed in the view as the widget's anchor.

Version compatibility

VersionStatusNotes
Odoo 20.0In developmentNot released. Same behavior, new icon set on the development branch; see below.
Odoo 19.0VerifiedVerified against the shipped source: zero options, one field dependency.
Odoo 18.0VerifiedThe 18.0 and 19.0 files are byte-identical. Verified directly.

What is changing in Odoo 20

Odoo 20 is expected at Odoo Experience in Brussels, 24 to 26 September 2026. The changes below are read from the public development branch and are not final until release.

The widget keeps zero options and its registration, but the rendering changes visibly: the FontAwesome classes are dropped for Odoo's own oi icon set. The class string becomes oi text- plus the decoration, and the glyph moves to a dedicated icon getter. Custom CSS targeting .fa inside this widget, or custom activity types declaring FontAwesome icon names, will need review. We re-verify after release.

Common problems and fixes

SymptomCause and fix
No icon although the record has activitiesOnly exception activities set the decoration field; ordinary planned activities do not. Nothing to fix. Use list_activity to visualize normal activities; this widget is only the alarm.
Column shows an empty header spaceA string attribute was added to the field element, overriding the descriptor's label: false. Remove the string attribute; the widget is designed to render headerless.
Icon color is wrong or unstyledThe decoration value feeds the CSS class directly (text-warning, text-danger); a custom activity type declared a non-Bootstrap decoration. Keep decorations to warning and danger, the two values the selection declares.
Icon missing but color square appearsThe activity_exception_icon field carries an invalid icon class. Check the activity type's icon value; it must be a FontAwesome class name in Odoo 19.
Cannot click the icon to see the activityThe widget is display-only; it renders a div with a tooltip, not a button. Open the record or use the list_activity column, whose popover lists the exception activity.

Activity Exception widget vs the alternatives

WidgetBest forKey difference
activity_exceptionA silent alarm column that only appears on troubled recordsRenders nothing unless an exception activity exists; zero options, headerless by design
list_activityThe full next-activity column with summary textAlways renders; exceptions are just its highest-precedence state
kanban_activityActivity indicators on kanban cardsSame activity system, card rendering, clickable popover
web_ribbonUnmissable record state on formsView element with a title, not bound to the activity system

The division of labor in list views: list_activity shows the whole next-activity picture, this widget shows only the alarm bell, and web_ribbon is the form-view equivalent of unmissable state. They stack; core lists often carry both activity widgets.

Frequently asked questions

What creates an exception activity in Odoo?+
Odoo itself, when something changes behind a confirmed document: the classic case is a sales order modified after confirmation, which attaches a warning activity to the delivery. You can also schedule one in code with the mail.mail_activity_data_warning activity type.
What do the orange and red icons mean?+
They are the two values of activity_exception_decoration: warning renders text-warning (orange), danger renders text-danger (red). The most severe decoration among the record's exception activities wins.
How do I get rid of the icon on a record?+
Resolve the underlying exception activity, mark it done or unlink it, typically after reviewing what changed. The mixin recomputes the decoration and the icon disappears from every list.
Can I configure what the widget shows?+
No. It has zero options by design. The icon glyph and color are data, coming from the activity type, so customization happens on activity types, not in the view.
Why does the column have no header?+
The descriptor sets label: false, an uncommon registry key that suppresses the header text. Core uses it to keep the column as a slim strip.
Does this widget work on kanban or form views?+
It is designed for list cells and registered without view restriction; forms show exceptions in the chatter instead, and kanban cards use kanban_activity. Core keeps it in lists.

Documents changing behind your team's back?

Exception icons are symptoms. The causes are process: who may edit confirmed orders, what triggers a review, which changes propagate to deliveries and invoices. We audit and rebuild these control points in Odoo, approval flows, tracked fields, automatic exception activities, so surprises become visible and rare.

Book a free consultation

How this page was produced

This page was verified by reading activity_exception.js and its QWeb template in the Odoo 19.0 mail module, including the class assembly, the label: false descriptor key and the field dependency. The same file was compared on the 18.0 branch (byte-identical) and on the development branch, where the icon set change was found. Spotted an error or a version difference? Tell us and we will correct the page.